api-def 0.4.1-alpha3 → 0.5.1

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.
Files changed (167) hide show
  1. package/README.md +1 -1
  2. package/cjs/Api.d.ts +13 -15
  3. package/cjs/Api.js +28 -41
  4. package/cjs/ApiConstants.d.ts +28 -0
  5. package/cjs/ApiConstants.js +28 -0
  6. package/cjs/ApiTypes.d.ts +2 -7
  7. package/cjs/ApiUtils.d.ts +2 -10
  8. package/cjs/ApiUtils.js +24 -37
  9. package/cjs/Endpoint.d.ts +21 -5
  10. package/cjs/Endpoint.js +16 -31
  11. package/cjs/MockingTypes.d.ts +28 -0
  12. package/cjs/{lib/Utils.js → MockingTypes.js} +0 -0
  13. package/cjs/RequestContext.d.ts +9 -4
  14. package/cjs/RequestContext.js +4 -2
  15. package/cjs/RequestError.d.ts +21 -0
  16. package/cjs/RequestError.js +23 -0
  17. package/cjs/Requester.d.ts +2 -1
  18. package/cjs/Requester.js +153 -67
  19. package/cjs/TextDecoding.d.ts +1 -0
  20. package/cjs/TextDecoding.js +139 -0
  21. package/cjs/Utils.d.ts +9 -0
  22. package/cjs/Utils.js +30 -1
  23. package/cjs/backend/AxiosRequestBackend.d.ts +4 -3
  24. package/cjs/backend/AxiosRequestBackend.js +3 -0
  25. package/cjs/backend/FetchRequestBackend.d.ts +2 -1
  26. package/cjs/backend/FetchRequestBackend.js +12 -7
  27. package/cjs/backend/MockRequestBackend.d.ts +10 -0
  28. package/cjs/backend/MockRequestBackend.js +149 -0
  29. package/cjs/backend/RequestBackend.d.ts +4 -0
  30. package/cjs/cache/LocalForageCacheBackend.js +1 -0
  31. package/cjs/index.d.ts +1 -1
  32. package/cjs/index.js +2 -2
  33. package/cjs/util/retry/index.d.ts +3 -0
  34. package/cjs/util/retry/index.js +52 -0
  35. package/cjs/util/retry/lib/retry.d.ts +3 -0
  36. package/cjs/util/retry/lib/retry.js +54 -0
  37. package/cjs/util/retry/lib/retryOperation.d.ts +27 -0
  38. package/cjs/util/retry/lib/retryOperation.js +134 -0
  39. package/esm/Api.d.ts +13 -15
  40. package/esm/Api.js +24 -39
  41. package/esm/ApiConstants.d.ts +28 -0
  42. package/esm/ApiConstants.js +28 -0
  43. package/esm/ApiTypes.d.ts +2 -7
  44. package/esm/ApiUtils.d.ts +2 -10
  45. package/esm/ApiUtils.js +22 -35
  46. package/esm/Endpoint.d.ts +21 -5
  47. package/esm/Endpoint.js +16 -31
  48. package/esm/MockingTypes.d.ts +28 -0
  49. package/esm/{lib/backend/RequestBackend.js → MockingTypes.js} +0 -0
  50. package/esm/RequestContext.d.ts +9 -4
  51. package/esm/RequestContext.js +4 -2
  52. package/esm/RequestError.d.ts +21 -0
  53. package/esm/RequestError.js +18 -0
  54. package/esm/Requester.d.ts +2 -1
  55. package/esm/Requester.js +153 -67
  56. package/esm/TextDecoding.d.ts +1 -0
  57. package/esm/TextDecoding.js +135 -0
  58. package/esm/Utils.d.ts +9 -0
  59. package/esm/Utils.js +26 -0
  60. package/esm/backend/AxiosRequestBackend.d.ts +4 -3
  61. package/esm/backend/AxiosRequestBackend.js +3 -0
  62. package/esm/backend/FetchRequestBackend.d.ts +2 -1
  63. package/esm/backend/FetchRequestBackend.js +12 -7
  64. package/esm/backend/MockRequestBackend.d.ts +10 -0
  65. package/esm/backend/MockRequestBackend.js +147 -0
  66. package/esm/backend/RequestBackend.d.ts +4 -0
  67. package/esm/cache/LocalForageCacheBackend.js +1 -0
  68. package/esm/index.d.ts +1 -1
  69. package/esm/index.js +1 -1
  70. package/esm/util/retry/index.d.ts +3 -0
  71. package/esm/util/retry/index.js +50 -0
  72. package/esm/util/retry/lib/retry.d.ts +3 -0
  73. package/esm/util/retry/lib/retry.js +50 -0
  74. package/esm/util/retry/lib/retryOperation.d.ts +27 -0
  75. package/esm/util/retry/lib/retryOperation.js +132 -0
  76. package/package.json +29 -19
  77. package/CHANGELOG.md +0 -39
  78. package/cjs/Mocking.d.ts +0 -23
  79. package/cjs/Mocking.js +0 -81
  80. package/cjs/__tests__/mock/ExampleApis.d.ts +0 -3
  81. package/cjs/__tests__/mock/ExampleApis.js +0 -19
  82. package/cjs/lib/Api.d.ts +0 -32
  83. package/cjs/lib/Api.js +0 -126
  84. package/cjs/lib/ApiTypes.d.ts +0 -102
  85. package/cjs/lib/ApiTypes.js +0 -31
  86. package/cjs/lib/ApiUtils.d.ts +0 -13
  87. package/cjs/lib/ApiUtils.js +0 -60
  88. package/cjs/lib/Caching.d.ts +0 -9
  89. package/cjs/lib/Caching.js +0 -85
  90. package/cjs/lib/Endpoint.d.ts +0 -30
  91. package/cjs/lib/Endpoint.js +0 -121
  92. package/cjs/lib/EndpointBuilder.d.ts +0 -12
  93. package/cjs/lib/EndpointBuilder.js +0 -27
  94. package/cjs/lib/Mocking.d.ts +0 -23
  95. package/cjs/lib/Mocking.js +0 -80
  96. package/cjs/lib/RequestContext.d.ts +0 -28
  97. package/cjs/lib/RequestContext.js +0 -166
  98. package/cjs/lib/Requester.d.ts +0 -2
  99. package/cjs/lib/Requester.js +0 -164
  100. package/cjs/lib/Utils.d.ts +0 -1
  101. package/cjs/lib/backend/AxiosBackend.d.ts +0 -10
  102. package/cjs/lib/backend/AxiosBackend.js +0 -98
  103. package/cjs/lib/backend/AxiosRequestBackend.d.ts +0 -11
  104. package/cjs/lib/backend/AxiosRequestBackend.js +0 -99
  105. package/cjs/lib/backend/FetchBackend.d.ts +0 -8
  106. package/cjs/lib/backend/FetchBackend.js +0 -145
  107. package/cjs/lib/backend/FetchRequestBackend.d.ts +0 -9
  108. package/cjs/lib/backend/FetchRequestBackend.js +0 -150
  109. package/cjs/lib/backend/RequestBackend.d.ts +0 -11
  110. package/cjs/lib/backend/RequestBackend.js +0 -2
  111. package/cjs/lib/cache/CacheBackend.d.ts +0 -6
  112. package/cjs/lib/cache/CacheBackend.js +0 -2
  113. package/cjs/lib/cache/Caching.d.ts +0 -10
  114. package/cjs/lib/cache/Caching.js +0 -84
  115. package/cjs/lib/cache/LocalForageCacheBackend.d.ts +0 -9
  116. package/cjs/lib/cache/LocalForageCacheBackend.js +0 -25
  117. package/cjs/lib/cache/LocalStorageCacheBackend.d.ts +0 -7
  118. package/cjs/lib/cache/LocalStorageCacheBackend.js +0 -78
  119. package/cjs/lib/middleware/CacheMiddleware.d.ts +0 -7
  120. package/cjs/lib/middleware/CacheMiddleware.js +0 -107
  121. package/cjs/lib/middleware/LoggingMiddleware.d.ts +0 -7
  122. package/cjs/lib/middleware/LoggingMiddleware.js +0 -95
  123. package/esm/Mocking.d.ts +0 -23
  124. package/esm/Mocking.js +0 -77
  125. package/esm/__tests__/mock/ExampleApis.d.ts +0 -3
  126. package/esm/__tests__/mock/ExampleApis.js +0 -16
  127. package/esm/lib/Api.d.ts +0 -32
  128. package/esm/lib/Api.js +0 -123
  129. package/esm/lib/ApiTypes.d.ts +0 -102
  130. package/esm/lib/ApiTypes.js +0 -28
  131. package/esm/lib/ApiUtils.d.ts +0 -13
  132. package/esm/lib/ApiUtils.js +0 -57
  133. package/esm/lib/Caching.d.ts +0 -9
  134. package/esm/lib/Caching.js +0 -82
  135. package/esm/lib/Endpoint.d.ts +0 -30
  136. package/esm/lib/Endpoint.js +0 -119
  137. package/esm/lib/EndpointBuilder.d.ts +0 -12
  138. package/esm/lib/EndpointBuilder.js +0 -25
  139. package/esm/lib/Mocking.d.ts +0 -23
  140. package/esm/lib/Mocking.js +0 -77
  141. package/esm/lib/RequestContext.d.ts +0 -28
  142. package/esm/lib/RequestContext.js +0 -164
  143. package/esm/lib/Requester.d.ts +0 -2
  144. package/esm/lib/Requester.js +0 -161
  145. package/esm/lib/Utils.d.ts +0 -1
  146. package/esm/lib/Utils.js +0 -0
  147. package/esm/lib/backend/AxiosBackend.d.ts +0 -10
  148. package/esm/lib/backend/AxiosBackend.js +0 -95
  149. package/esm/lib/backend/AxiosRequestBackend.d.ts +0 -11
  150. package/esm/lib/backend/AxiosRequestBackend.js +0 -96
  151. package/esm/lib/backend/FetchBackend.d.ts +0 -8
  152. package/esm/lib/backend/FetchBackend.js +0 -143
  153. package/esm/lib/backend/FetchRequestBackend.d.ts +0 -9
  154. package/esm/lib/backend/FetchRequestBackend.js +0 -148
  155. package/esm/lib/backend/RequestBackend.d.ts +0 -11
  156. package/esm/lib/cache/CacheBackend.d.ts +0 -6
  157. package/esm/lib/cache/CacheBackend.js +0 -1
  158. package/esm/lib/cache/Caching.d.ts +0 -10
  159. package/esm/lib/cache/Caching.js +0 -81
  160. package/esm/lib/cache/LocalForageCacheBackend.d.ts +0 -9
  161. package/esm/lib/cache/LocalForageCacheBackend.js +0 -23
  162. package/esm/lib/cache/LocalStorageCacheBackend.d.ts +0 -7
  163. package/esm/lib/cache/LocalStorageCacheBackend.js +0 -76
  164. package/esm/lib/middleware/CacheMiddleware.d.ts +0 -7
  165. package/esm/lib/middleware/CacheMiddleware.js +0 -105
  166. package/esm/lib/middleware/LoggingMiddleware.d.ts +0 -7
  167. package/esm/lib/middleware/LoggingMiddleware.js +0 -92
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # [api-def](https://github.com/Censkh/api-def/) · [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/Censkh/api-def/blob/master/LICENSE) [![npm version](https://img.shields.io/npm/v/api-def.svg?style=flat)](https://www.npmjs.com/package/api-def)
1
+ # [api-def](https://github.com/Censkh/api-def/) · [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/Censkh/api-def/blob/master/LICENSE) [![npm version](https://img.shields.io/npm/v/api-def.svg?style=flat)](https://www.npmjs.com/package/api-def) [![build status](https://img.shields.io/github/workflow/status/censkh/api-def/Node.js%20CI)](https://github.com/Censkh/api-def/actions)
2
2
 
3
3
  Typed APIs with middleware support
4
4
 
package/cjs/Api.d.ts CHANGED
@@ -1,33 +1,31 @@
1
- import { ApiResponse, BaseRequestConfig, ModulePossiblyDefault, RequestConfig, RequestEventHandlers, RequestMiddleware } from "./ApiTypes";
2
- import { EndpointMockingInfo, MockingConfig } from "./Mocking";
1
+ import Endpoint from "./Endpoint";
2
+ import { ApiResponse, BaseRequestConfig, RequestConfig, RequestMiddleware } from "./ApiTypes";
3
3
  import RequestBackend from "./backend/RequestBackend";
4
4
  import EndpointBuilder from "./EndpointBuilder";
5
- export declare let requestBackend: RequestBackend | null;
6
- export declare let requestBackendIsDefault: boolean;
5
+ import { ApiMockingConfig } from "./MockingTypes";
6
+ export declare const getRequestBackend: () => RequestBackend | null;
7
+ export declare const isRequestBackendDefault: () => boolean;
7
8
  export declare const setRequestBackend: (backend: RequestBackend) => void;
8
9
  export interface ApiInfo {
9
10
  readonly name: string;
10
11
  readonly baseUrl: string;
11
12
  readonly middleware?: RequestMiddleware[];
12
13
  readonly config?: BaseRequestConfig | (() => BaseRequestConfig);
13
- readonly mocking?: MockingConfig;
14
- }
15
- export interface ApiMocking extends MockingConfig {
16
- loaderPromise: null | Promise<ModulePossiblyDefault<any>>;
17
- loaded: boolean;
14
+ readonly mocking?: ApiMockingConfig;
18
15
  }
19
16
  export declare class Api implements ApiInfo {
20
17
  readonly baseUrl: string;
21
18
  readonly name: string;
22
19
  readonly middleware: RequestMiddleware[];
23
20
  readonly config?: BaseRequestConfig | (() => BaseRequestConfig);
24
- readonly mocking: ApiMocking | undefined;
25
- private readonly endpoints;
21
+ readonly mocking?: ApiMockingConfig;
22
+ protected readonly endpoints: Record<string, Endpoint>;
26
23
  constructor(info: ApiInfo);
27
24
  endpoint(): EndpointBuilder;
28
25
  getConfig(): BaseRequestConfig;
29
- getEventHandlers(): RequestEventHandlers<any>;
30
- get<R = unknown>(path: string, config: RequestConfig): Promise<ApiResponse<R>>;
31
- post<R = unknown>(path: string, config: RequestConfig): Promise<ApiResponse<R>>;
32
- getEndpointMocks(): Record<string, EndpointMockingInfo | null>;
26
+ private hotRequest;
27
+ get: <R = unknown>(path: string, config: RequestConfig) => Promise<ApiResponse<R>>;
28
+ post: <R = unknown>(path: string, config: RequestConfig) => Promise<ApiResponse<R>>;
29
+ put: <R = unknown>(path: string, config: RequestConfig) => Promise<ApiResponse<R>>;
30
+ delete: <R = unknown>(path: string, config: RequestConfig) => Promise<ApiResponse<R>>;
33
31
  }
package/cjs/Api.js CHANGED
@@ -36,18 +36,26 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
36
36
  }
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.Api = exports.setRequestBackend = exports.requestBackendIsDefault = exports.requestBackend = void 0;
39
+ exports.Api = exports.setRequestBackend = exports.isRequestBackendDefault = exports.getRequestBackend = void 0;
40
40
  var Requester = require("./Requester");
41
41
  var EndpointBuilder_1 = require("./EndpointBuilder");
42
42
  var Utils = require("./Utils");
43
43
  var FetchRequestBackend_1 = require("./backend/FetchRequestBackend");
44
44
  var ApiConstants_1 = require("./ApiConstants");
45
45
  // use fetch as default if it is present
46
- exports.requestBackend = Utils.getGlobalFetch() ? new FetchRequestBackend_1.default() : null;
47
- exports.requestBackendIsDefault = true;
46
+ var requestBackend = Utils.getGlobalFetch() ? new FetchRequestBackend_1.default() : null;
47
+ var requestBackendIsDefault = true;
48
+ var getRequestBackend = function () {
49
+ return requestBackend;
50
+ };
51
+ exports.getRequestBackend = getRequestBackend;
52
+ var isRequestBackendDefault = function () {
53
+ return requestBackendIsDefault;
54
+ };
55
+ exports.isRequestBackendDefault = isRequestBackendDefault;
48
56
  var setRequestBackend = function (backend) {
49
- exports.requestBackendIsDefault = false;
50
- exports.requestBackend = backend;
57
+ requestBackendIsDefault = false;
58
+ requestBackend = backend;
51
59
  };
52
60
  exports.setRequestBackend = setRequestBackend;
53
61
  var HotRequestHost = /** @class */ (function () {
@@ -75,18 +83,27 @@ var HotRequestHost = /** @class */ (function () {
75
83
  }());
76
84
  var Api = /** @class */ (function () {
77
85
  function Api(info) {
86
+ var _this = this;
87
+ var _a;
78
88
  this.endpoints = {};
89
+ this.hotRequest = function (requestMethod) { return function (path, config) { return __awaiter(_this, void 0, void 0, function () {
90
+ return __generator(this, function (_a) {
91
+ switch (_a.label) {
92
+ case 0: return [4 /*yield*/, Requester.submit(new HotRequestHost(this, path, requestMethod), config, null)];
93
+ case 1: return [2 /*return*/, (_a.sent())];
94
+ }
95
+ });
96
+ }); }; };
97
+ this.get = this.hotRequest(ApiConstants_1.RequestMethod.GET);
98
+ this.post = this.hotRequest(ApiConstants_1.RequestMethod.POST);
99
+ this.put = this.hotRequest(ApiConstants_1.RequestMethod.PUT);
100
+ this.delete = this.hotRequest(ApiConstants_1.RequestMethod.DELETE);
79
101
  this.name = info.name;
80
102
  this.baseUrl = info.baseUrl;
81
103
  this.middleware = info.middleware || [];
82
104
  this.endpoints = {};
83
105
  this.config = info.config;
84
- this.mocking =
85
- info.mocking &&
86
- Utils.assign(info.mocking, {
87
- loaderPromise: null,
88
- loaded: false,
89
- });
106
+ this.mocking = (_a = info.mocking) !== null && _a !== void 0 ? _a : undefined;
90
107
  }
91
108
  Api.prototype.endpoint = function () {
92
109
  return new EndpointBuilder_1.default(this);
@@ -95,36 +112,6 @@ var Api = /** @class */ (function () {
95
112
  return ((typeof this.config === "function" ? this.config() : this.config) ||
96
113
  {});
97
114
  };
98
- Api.prototype.getEventHandlers = function () {
99
- return {};
100
- };
101
- Api.prototype.get = function (path, config) {
102
- return __awaiter(this, void 0, void 0, function () {
103
- return __generator(this, function (_a) {
104
- switch (_a.label) {
105
- case 0: return [4 /*yield*/, Requester.submit(new HotRequestHost(this, path, ApiConstants_1.RequestMethod.Get), config)];
106
- case 1: return [2 /*return*/, _a.sent()];
107
- }
108
- });
109
- });
110
- };
111
- Api.prototype.post = function (path, config) {
112
- return __awaiter(this, void 0, void 0, function () {
113
- return __generator(this, function (_a) {
114
- switch (_a.label) {
115
- case 0: return [4 /*yield*/, Requester.submit(new HotRequestHost(this, path, ApiConstants_1.RequestMethod.Post), config)];
116
- case 1: return [2 /*return*/, _a.sent()];
117
- }
118
- });
119
- });
120
- };
121
- Api.prototype.getEndpointMocks = function () {
122
- var _this = this;
123
- return Object.keys(this.endpoints).reduce(function (mocks, key) {
124
- mocks[key] = _this.endpoints[key].mocking;
125
- return mocks;
126
- }, {});
127
- };
128
115
  return Api;
129
116
  }());
130
117
  exports.Api = Api;
@@ -1,29 +1,57 @@
1
1
  import { EnumOf } from "./Utils";
2
2
  export declare const RequestMethod: {
3
+ /** @deprecated use 'POST' */
3
4
  readonly Post: "post";
5
+ /** @deprecated use 'GET' */
4
6
  readonly Get: "get";
7
+ readonly POST: "post";
8
+ readonly GET: "get";
9
+ readonly PUT: "put";
10
+ readonly DELETE: "delete";
5
11
  };
6
12
  export declare type RequestMethod = EnumOf<typeof RequestMethod>;
7
13
  export declare const RequestEvent: {
14
+ /** @deprecated use 'BEFORE_SEND' */
8
15
  readonly BeforeSend: "beforeSend";
16
+ /** @deprecated use 'SUCCESS' */
9
17
  readonly Success: "success";
18
+ /** @deprecated use 'ERROR' */
10
19
  readonly Error: "error";
20
+ /** @deprecated use 'UNRECOVERABLE_ERROR' */
11
21
  readonly UnrecoverableError: "unrecoverableError";
22
+ readonly BEFORE_SEND: "beforeSend";
23
+ readonly SUCCESS: "success";
24
+ readonly ERROR: "error";
25
+ readonly UNRECOVERABLE_ERROR: "unrecoverableError";
12
26
  };
13
27
  export declare type RequestEvent = EnumOf<typeof RequestEvent>;
14
28
  export declare const EventResultType: {
29
+ /** @deprecated use 'RESPOND' */
15
30
  readonly Respond: "respond";
31
+ /** @deprecated use 'RETRY' */
16
32
  readonly Retry: "retry";
33
+ readonly RESPOND: "respond";
34
+ readonly RETRY: "retry";
17
35
  };
18
36
  export declare type EventResultType = EnumOf<typeof EventResultType>;
19
37
  export declare const CacheSource: {
38
+ /** @deprecated use 'API' */
20
39
  readonly Api: "api";
40
+ /** @deprecated use 'LOCAL' */
21
41
  readonly Local: "local";
42
+ readonly API: "api";
43
+ readonly LOCAL: "local";
22
44
  };
23
45
  export declare type CacheSource = EnumOf<typeof CacheSource>;
24
46
  export declare const ResponseType: {
47
+ /** @deprecated use 'JSON' */
25
48
  readonly Json: "json";
49
+ /** @deprecated use 'TEXT' */
26
50
  readonly Text: "text";
51
+ /** @deprecated use 'ARRAY_BUFFER' */
27
52
  readonly ArrayBuffer: "arraybuffer";
53
+ readonly JSON: "json";
54
+ readonly TEXT: "text";
55
+ readonly ARRAY_BUFFER: "arraybuffer";
28
56
  };
29
57
  export declare type ResponseType = EnumOf<typeof ResponseType>;
@@ -2,25 +2,53 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ResponseType = exports.CacheSource = exports.EventResultType = exports.RequestEvent = exports.RequestMethod = void 0;
4
4
  exports.RequestMethod = {
5
+ /** @deprecated use 'POST' */
5
6
  Post: "post",
7
+ /** @deprecated use 'GET' */
6
8
  Get: "get",
9
+ POST: "post",
10
+ GET: "get",
11
+ PUT: "put",
12
+ DELETE: "delete",
7
13
  };
8
14
  exports.RequestEvent = {
15
+ /** @deprecated use 'BEFORE_SEND' */
9
16
  BeforeSend: "beforeSend",
17
+ /** @deprecated use 'SUCCESS' */
10
18
  Success: "success",
19
+ /** @deprecated use 'ERROR' */
11
20
  Error: "error",
21
+ /** @deprecated use 'UNRECOVERABLE_ERROR' */
12
22
  UnrecoverableError: "unrecoverableError",
23
+ BEFORE_SEND: "beforeSend",
24
+ SUCCESS: "success",
25
+ ERROR: "error",
26
+ UNRECOVERABLE_ERROR: "unrecoverableError",
13
27
  };
14
28
  exports.EventResultType = {
29
+ /** @deprecated use 'RESPOND' */
15
30
  Respond: "respond",
31
+ /** @deprecated use 'RETRY' */
16
32
  Retry: "retry",
33
+ RESPOND: "respond",
34
+ RETRY: "retry",
17
35
  };
18
36
  exports.CacheSource = {
37
+ /** @deprecated use 'API' */
19
38
  Api: "api",
39
+ /** @deprecated use 'LOCAL' */
20
40
  Local: "local",
41
+ API: "api",
42
+ LOCAL: "local",
21
43
  };
22
44
  exports.ResponseType = {
45
+ /** @deprecated use 'JSON' */
23
46
  Json: "json",
47
+ /** @deprecated use 'TEXT' */
24
48
  Text: "text",
49
+ /** @deprecated use 'ARRAY_BUFFER' */
25
50
  ArrayBuffer: "arraybuffer",
51
+ JSON: "json",
52
+ TEXT: "text",
53
+ ARRAY_BUFFER: "arraybuffer",
26
54
  };
package/cjs/ApiTypes.d.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  import RequestContext from "./RequestContext";
2
2
  import { Api } from "./Api";
3
3
  import { CacheSource, EventResultType, RequestEvent, RequestMethod, ResponseType } from "./ApiConstants";
4
- export declare type ModulePossiblyDefault<T> = T & {
5
- default?: T;
6
- };
4
+ export declare type AcceptableStatus = number | [min: number, max: number];
7
5
  export declare type Headers = Record<string, string | number | boolean | null | undefined>;
8
6
  export declare type Params = string;
9
7
  export declare type Query = Record<string, string | number | boolean | undefined | null>;
@@ -18,6 +16,7 @@ export interface BaseRequestConfig {
18
16
  lock?: string | false;
19
17
  retry?: number | false;
20
18
  headers?: Readonly<Headers>;
19
+ acceptableStatus?: AcceptableStatus[];
21
20
  }
22
21
  export declare type RequestConfig<P extends Params | undefined = Params | undefined, Q extends Query | undefined = Query | undefined, B extends Body | undefined = Body | undefined> = (P extends undefined ? {
23
22
  params?: never;
@@ -54,10 +53,6 @@ export interface RequestContextStats {
54
53
  };
55
54
  attempt: number;
56
55
  }
57
- export interface RequestError extends Error {
58
- name: "RequestError";
59
- response?: ApiResponse;
60
- }
61
56
  export interface RequestHost {
62
57
  readonly method: RequestMethod;
63
58
  readonly api: Api;
package/cjs/ApiUtils.d.ts CHANGED
@@ -1,13 +1,5 @@
1
- import { ApiResponse, CancelledRequestError, RequestError } from "./ApiTypes";
2
- export declare class ResponseBuilder<R> {
3
- private _data;
4
- private _status;
5
- send(data: R): ApiResponse<R>;
6
- data(data: R): this;
7
- status(status: number): this;
8
- build(): ApiResponse<R>;
9
- }
1
+ import { AcceptableStatus, ApiResponse, CancelledRequestError } from "./ApiTypes";
10
2
  export declare const isCancelledError: (error: Error) => error is CancelledRequestError;
11
3
  export declare const isNetworkError: (error: Error) => boolean;
12
- export declare const isRequestError: (error: Error) => error is RequestError;
13
4
  export declare const parseResponseDataToObject: (response: ApiResponse) => void;
5
+ export declare const isAcceptableStatus: (status: number, acceptableStatus?: AcceptableStatus[] | undefined) => boolean;
package/cjs/ApiUtils.js CHANGED
@@ -1,35 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseResponseDataToObject = exports.isRequestError = exports.isNetworkError = exports.isCancelledError = exports.ResponseBuilder = void 0;
4
- var ResponseBuilder = /** @class */ (function () {
5
- function ResponseBuilder() {
6
- this._status = 200;
7
- }
8
- ResponseBuilder.prototype.send = function (data) {
9
- this.data(data);
10
- return this.build();
11
- };
12
- ResponseBuilder.prototype.data = function (data) {
13
- this._data = data;
14
- return this;
15
- };
16
- ResponseBuilder.prototype.status = function (status) {
17
- this._status = status;
18
- return this;
19
- };
20
- ResponseBuilder.prototype.build = function () {
21
- if (this._data === undefined) {
22
- throw new Error("Response builder doesn't have a response");
23
- }
24
- return {
25
- headers: {},
26
- data: this._data,
27
- status: this._status,
28
- };
29
- };
30
- return ResponseBuilder;
31
- }());
32
- exports.ResponseBuilder = ResponseBuilder;
3
+ exports.isAcceptableStatus = exports.parseResponseDataToObject = exports.isNetworkError = exports.isCancelledError = void 0;
4
+ var TextDecoding_1 = require("./TextDecoding");
33
5
  var isCancelledError = function (error) {
34
6
  return "isCancelledRequest" in error;
35
7
  };
@@ -41,18 +13,13 @@ var isNetworkError = function (error) {
41
13
  ((_a = error.constructor) === null || _a === void 0 ? void 0 : _a.name) === "NetworkError");
42
14
  };
43
15
  exports.isNetworkError = isNetworkError;
44
- var isRequestError = function (error) {
45
- return "response" in error;
46
- };
47
- exports.isRequestError = isRequestError;
48
16
  var parseResponseDataToObject = function (response) {
49
- if (TextDecoder &&
50
- response.data &&
17
+ if (response.data &&
51
18
  typeof response.data === "object") {
52
19
  var data = response.data;
53
20
  if (data.constructor && data.constructor.name === "ArrayBuffer") {
54
21
  try {
55
- var decodedData = (response.data = new TextDecoder("utf-8").decode(data));
22
+ var decodedData = (response.data = TextDecoding_1.textDecode(data));
56
23
  response.data = JSON.parse(decodedData);
57
24
  }
58
25
  catch (e) {
@@ -62,3 +29,23 @@ var parseResponseDataToObject = function (response) {
62
29
  }
63
30
  };
64
31
  exports.parseResponseDataToObject = parseResponseDataToObject;
32
+ var DEFAULT_ACCEPTABLE_STATUS = [[200, 299], 304];
33
+ var isAcceptableStatus = function (status, acceptableStatus) {
34
+ var acceptable = acceptableStatus !== null && acceptableStatus !== void 0 ? acceptableStatus : DEFAULT_ACCEPTABLE_STATUS;
35
+ for (var _i = 0, acceptable_1 = acceptable; _i < acceptable_1.length; _i++) {
36
+ var cmpStatus = acceptable_1[_i];
37
+ if (Array.isArray(cmpStatus)) {
38
+ var min = cmpStatus[0], max = cmpStatus[1];
39
+ if (status >= min && status <= max) {
40
+ return (true);
41
+ }
42
+ }
43
+ else if (!isNaN(cmpStatus)) {
44
+ if (status === cmpStatus) {
45
+ return (true);
46
+ }
47
+ }
48
+ }
49
+ return (false);
50
+ };
51
+ exports.isAcceptableStatus = isAcceptableStatus;
package/cjs/Endpoint.d.ts CHANGED
@@ -1,15 +1,33 @@
1
1
  import { Api } from "./Api";
2
2
  import { ApiResponse, BaseRequestConfig, Body, Params, Query, RequestConfig, RequestHost } from "./ApiTypes";
3
- import { EndpointMockingInfo, MockingFunction } from "./Mocking";
3
+ import * as Mocking from "./MockingTypes";
4
4
  import { RequestMethod, ResponseType } from "./ApiConstants";
5
5
  export interface EndpointConfig<R, P extends Params | undefined, Q extends Query | undefined, B extends Body | undefined> {
6
6
  readonly id: string;
7
7
  readonly method: RequestMethod;
8
+ readonly path: string;
9
+ /**
10
+ * Name your endpoint to help with debugging and documentation
11
+ * @default `id` is used as the name if no name is supplied
12
+ */
8
13
  readonly name?: string;
14
+ /**
15
+ * Describe your endpoint to help with debugging and documentation
16
+ */
9
17
  readonly description?: string;
10
- readonly path: string;
11
18
  readonly config?: BaseRequestConfig;
19
+ /**
20
+ * Let the backend requestor (fetch, axios, etc.) know what type of response
21
+ * you are expecting from this endpoint
22
+ * @default `application/json`
23
+ */
12
24
  readonly responseType?: ResponseType;
25
+ /**
26
+ * Specify mocking for your endpoint upfront to help with disconnected dev,
27
+ * and testing.
28
+ * Enable/disable mocked returns for all endpoints on your API object.
29
+ */
30
+ readonly mocking?: Mocking.EndpointMockingConfig<R, P, Q, B>;
13
31
  }
14
32
  export default class Endpoint<R = any, P extends Params | undefined = Params | undefined, Q extends Query | undefined = Query | undefined, B extends Body | undefined = Body | undefined> implements EndpointConfig<R, P, Q, B>, RequestHost {
15
33
  readonly api: Api;
@@ -20,12 +38,10 @@ export default class Endpoint<R = any, P extends Params | undefined = Params | u
20
38
  readonly path: string;
21
39
  readonly config?: BaseRequestConfig;
22
40
  readonly responseType: ResponseType;
23
- mocking: EndpointMockingInfo<R, P, Q, B> | null;
41
+ readonly mocking?: Mocking.EndpointMockingConfig<R, P, Q, B>;
24
42
  constructor(api: Api, info: EndpointConfig<R, P, Q, B>);
25
43
  submit(config: RequestConfig<P, Q, B>): Promise<ApiResponse<R>>;
26
44
  computePath(path: string, request: RequestConfig): string;
27
- mock(mocker: MockingFunction<R, P, Q, B>): this;
28
- mockBypass(): this;
29
45
  get baseUrl(): string;
30
46
  computeConfig<P extends Params | undefined, Q extends Query | undefined, B extends Body | undefined>(config: RequestConfig<P, Q, B>): RequestConfig<P, Q, B>;
31
47
  }
package/cjs/Endpoint.js CHANGED
@@ -37,12 +37,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  var Requester = require("./Requester");
40
- var Mocking = require("./Mocking");
41
40
  var Utils = require("./Utils");
42
41
  var ApiConstants_1 = require("./ApiConstants");
43
42
  var Endpoint = /** @class */ (function () {
44
43
  function Endpoint(api, info) {
45
- this.mocking = null;
46
44
  this.api = api;
47
45
  this.id = info.id;
48
46
  this.method = info.method;
@@ -51,26 +49,25 @@ var Endpoint = /** @class */ (function () {
51
49
  this.path = info.path;
52
50
  this.config = info.config;
53
51
  this.responseType = info.responseType || ApiConstants_1.ResponseType.Json;
52
+ this.mocking = info.mocking;
54
53
  }
55
54
  Endpoint.prototype.submit = function (config) {
56
- var _a;
55
+ var _a, _b;
57
56
  return __awaiter(this, void 0, void 0, function () {
58
- var apiMocking;
59
- return __generator(this, function (_b) {
60
- switch (_b.label) {
61
- case 0:
62
- apiMocking = this.api.mocking;
63
- if (!(!((_a = this.mocking) === null || _a === void 0 ? void 0 : _a.bypass) && (apiMocking === null || apiMocking === void 0 ? void 0 : apiMocking.predicate()))) return [3 /*break*/, 3];
64
- if (!((apiMocking === null || apiMocking === void 0 ? void 0 : apiMocking.loader) && !apiMocking.loaded)) return [3 /*break*/, 2];
65
- return [4 /*yield*/, (apiMocking.loaderPromise ||
66
- (apiMocking.loaderPromise = apiMocking.loader()))];
67
- case 1:
68
- _b.sent();
69
- apiMocking.loaded = true;
70
- _b.label = 2;
71
- case 2: return [2 /*return*/, Mocking.mockRequest(this, config)];
72
- case 3: return [2 /*return*/, Requester.submit(this, config)];
57
+ var mock, apiMocking, mockingEnabled;
58
+ return __generator(this, function (_c) {
59
+ mock = false;
60
+ apiMocking = this.api.mocking;
61
+ if (apiMocking) {
62
+ mockingEnabled = (_a = (typeof apiMocking.enabled === "function" ? apiMocking.enabled() : apiMocking.enabled)) !== null && _a !== void 0 ? _a : false;
63
+ if (mockingEnabled) {
64
+ if (!((_b = this.mocking) === null || _b === void 0 ? void 0 : _b.handler)) {
65
+ throw new Error("[api-def] Endpoint for '" + this.path + "' has no mocking");
66
+ }
67
+ mock = true;
68
+ }
73
69
  }
70
+ return [2 /*return*/, Requester.submit(this, config, mock ? this.mocking : null)];
74
71
  });
75
72
  });
76
73
  };
@@ -84,22 +81,10 @@ var Endpoint = /** @class */ (function () {
84
81
  }
85
82
  }
86
83
  if (computedPath.includes(":")) {
87
- throw new Error("Not all path params have been resolved: '" + computedPath + "'");
84
+ throw new Error("[api-def] Not all path params have been resolved: '" + computedPath + "'");
88
85
  }
89
86
  return computedPath;
90
87
  };
91
- Endpoint.prototype.mock = function (mocker) {
92
- this.mocking = {
93
- func: mocker,
94
- };
95
- return this;
96
- };
97
- Endpoint.prototype.mockBypass = function () {
98
- this.mocking = {
99
- bypass: true,
100
- };
101
- return this;
102
- };
103
88
  Object.defineProperty(Endpoint.prototype, "baseUrl", {
104
89
  get: function () {
105
90
  return this.api.baseUrl;
@@ -0,0 +1,28 @@
1
+ import { ApiResponse, Body, Headers, Params, Query } from "./ApiTypes";
2
+ export interface ApiMockingConfig {
3
+ enabled: boolean | (() => boolean);
4
+ }
5
+ export interface MockRequest<R = any, P extends Params | undefined = Params | undefined, Q extends Query | undefined = Query | undefined, B extends Body | undefined = Body | undefined> {
6
+ params: P extends Params ? Record<P, string> : {};
7
+ body: B;
8
+ query: Q;
9
+ headers: Readonly<Headers>;
10
+ }
11
+ export interface MockResponse<R = any, P extends Params | undefined = Params | undefined, Q extends Query | undefined = Query | undefined, B extends Body | undefined = Body | undefined> {
12
+ statusCode: number;
13
+ response: R | undefined;
14
+ status(statusCode: number): this;
15
+ send(response: R): this;
16
+ }
17
+ export declare type MockRequestError = Error & {
18
+ response?: ApiResponse;
19
+ };
20
+ export declare type EndpointMockingFunction<R = any, P extends Params | undefined = Params | undefined, Q extends Query | undefined = Query | undefined, B extends Body | undefined = Body | undefined> = (req: MockRequest<R, P, Q, B>, res: MockResponse<R, P, Q, B>) => Promise<MockResponse<R, P, Q, B>> | MockResponse<R, P, Q, B>;
21
+ export interface EndpointMockingConfig<R = any, P extends Params | undefined = Params | undefined, Q extends Query | undefined = Query | undefined, B extends Body | undefined = Body | undefined> {
22
+ /**-
23
+ * The range supplied will be used to simulate the lag in obtaining a response
24
+ * your endpoint. If no values are supplied, a response will be returned immediately
25
+ */
26
+ delay?: number | [minMs: number, maxMs: number];
27
+ handler: EndpointMockingFunction<R, P, Q, B>;
28
+ }
File without changes
@@ -1,6 +1,9 @@
1
- import { ApiResponse, Body, EventResult, Headers, Params, Query, RequestCacheInfo, RequestConfig, RequestContextStats, RequestError, RequestEventHandlers, RequestHost } from "./ApiTypes";
1
+ import { ApiResponse, Body, EventResult, Headers, Params, Query, RequestCacheInfo, RequestConfig, RequestContextStats, RequestEventHandlers, RequestHost } from "./ApiTypes";
2
2
  import { Api } from "./Api";
3
3
  import { RequestEvent, RequestMethod, ResponseType } from "./ApiConstants";
4
+ import { EndpointMockingConfig } from "./MockingTypes";
5
+ import { RequestError } from "./RequestError";
6
+ import RequestBackend from "./backend/RequestBackend";
4
7
  export default class RequestContext<R = any, P extends Params | undefined = Params | undefined, Q extends Query | undefined = Query | undefined, B extends Body | undefined = Body | undefined> {
5
8
  readonly id: number;
6
9
  readonly key: string;
@@ -8,18 +11,20 @@ export default class RequestContext<R = any, P extends Params | undefined = Para
8
11
  readonly stats: RequestContextStats;
9
12
  private readonly host;
10
13
  readonly eventHandlers: RequestEventHandlers<R>;
14
+ readonly backend: RequestBackend;
11
15
  private canceler;
12
- response: ApiResponse<R> | null;
16
+ response: ApiResponse<R> | null | undefined;
13
17
  error: RequestError | null;
14
18
  readonly cacheInfo: RequestCacheInfo;
15
19
  cancelled: boolean;
16
20
  readonly computedConfig: RequestConfig<P, Q, B>;
17
- constructor(host: RequestHost, config: RequestConfig<P, Q, B>, computedPath: string);
21
+ readonly mocking: EndpointMockingConfig<R, P, Q, B> | null | undefined;
22
+ constructor(backend: RequestBackend, host: RequestHost, config: RequestConfig<P, Q, B>, computedPath: string, mocking: EndpointMockingConfig<R, P, Q, B> | null | undefined);
18
23
  get method(): RequestMethod;
19
24
  get api(): Api;
20
25
  get baseUrl(): string;
21
26
  get responseType(): ResponseType;
22
- initMiddleware(): void;
27
+ private initMiddleware;
23
28
  private generateKey;
24
29
  updateHeaders(newHeaders: Headers): this;
25
30
  updateQuery(newQuery: Partial<Q>): this;
@@ -39,12 +39,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  var Utils = require("./Utils");
40
40
  var contextIdCounter = 0;
41
41
  var RequestContext = /** @class */ (function () {
42
- function RequestContext(host, config, computedPath) {
42
+ function RequestContext(backend, host, config, computedPath, mocking) {
43
43
  this.canceler = null;
44
- this.response = null;
44
+ this.response = undefined;
45
45
  this.error = null;
46
46
  this.cacheInfo = { cached: false, source: null };
47
47
  this.cancelled = false;
48
+ this.backend = backend;
48
49
  this.id = contextIdCounter++;
49
50
  this.host = host;
50
51
  this.computedConfig = config;
@@ -56,6 +57,7 @@ var RequestContext = /** @class */ (function () {
56
57
  cached: false,
57
58
  };
58
59
  this.eventHandlers = {};
60
+ this.mocking = mocking;
59
61
  this.initMiddleware();
60
62
  }
61
63
  Object.defineProperty(RequestContext.prototype, "method", {
@@ -0,0 +1,21 @@
1
+ import { ApiResponse } from "./ApiTypes";
2
+ import { EnumOf } from "./Utils";
3
+ export declare const RequestErrorCode: {
4
+ readonly MISC_UNKNOWN_ERROR: "misc/unknown-error";
5
+ readonly REQUEST_NETWORK_ERROR: "request/network-error";
6
+ readonly REQUEST_INVALID_STATUS: "request/invalid-status";
7
+ readonly REQUEST_INVALID_CONFIG: "request/invalid-config";
8
+ };
9
+ export declare type RequestErrorCode = EnumOf<typeof RequestErrorCode>;
10
+ export interface RequestError extends Error {
11
+ isRequestError: true;
12
+ response: ApiResponse | undefined | null;
13
+ code: string;
14
+ }
15
+ export declare const isRequestError: (error: Error) => error is RequestError;
16
+ export interface RequestErrorConfig {
17
+ error: Error;
18
+ code: string;
19
+ response?: ApiResponse | null;
20
+ }
21
+ export declare const convertToRequestError: (config: RequestErrorConfig) => RequestError;