api-def 0.7.4 → 0.8.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 (49) hide show
  1. package/cjs/Api.js +6 -2
  2. package/cjs/ApiTypes.d.ts +30 -10
  3. package/cjs/ApiTypes.js +2 -0
  4. package/cjs/ApiUtils.js +1 -1
  5. package/cjs/Endpoint.d.ts +3 -3
  6. package/cjs/Endpoint.js +13 -8
  7. package/cjs/QueryHandling.d.ts +3 -0
  8. package/cjs/QueryHandling.js +24 -0
  9. package/cjs/RequestConfig.d.ts +2 -0
  10. package/cjs/RequestConfig.js +74 -0
  11. package/cjs/RequestContext.d.ts +4 -4
  12. package/cjs/RequestContext.js +5 -24
  13. package/cjs/RequestError.js +1 -1
  14. package/cjs/Requester.d.ts +1 -1
  15. package/cjs/Requester.js +2 -2
  16. package/cjs/Utils.js +1 -1
  17. package/cjs/backend/AxiosRequestBackend.js +4 -4
  18. package/cjs/backend/FetchRequestBackend.js +4 -3
  19. package/cjs/backend/MockRequestBackend.js +3 -1
  20. package/esm/Api.js +34 -70
  21. package/esm/ApiConstants.js +5 -5
  22. package/esm/ApiTypes.d.ts +30 -10
  23. package/esm/ApiTypes.js +1 -1
  24. package/esm/ApiUtils.js +12 -13
  25. package/esm/Endpoint.d.ts +3 -3
  26. package/esm/Endpoint.js +42 -74
  27. package/esm/EndpointBuilder.js +14 -16
  28. package/esm/QueryHandling.d.ts +3 -0
  29. package/esm/QueryHandling.js +19 -0
  30. package/esm/RequestConfig.d.ts +2 -0
  31. package/esm/RequestConfig.js +56 -0
  32. package/esm/RequestContext.d.ts +4 -4
  33. package/esm/RequestContext.js +71 -148
  34. package/esm/RequestError.js +7 -7
  35. package/esm/Requester.d.ts +1 -1
  36. package/esm/Requester.js +182 -266
  37. package/esm/TextDecoding.js +20 -20
  38. package/esm/Utils.js +16 -16
  39. package/esm/backend/AxiosRequestBackend.js +34 -67
  40. package/esm/backend/FetchRequestBackend.js +66 -134
  41. package/esm/backend/MockRequestBackend.js +92 -136
  42. package/esm/cache/Caching.js +24 -66
  43. package/esm/cache/LocalForageCacheBackend.js +11 -13
  44. package/esm/cache/LocalStorageCacheBackend.js +19 -62
  45. package/esm/middleware/CacheMiddleware.js +44 -91
  46. package/esm/middleware/LoggingMiddleware.js +36 -39
  47. package/esm/util/retry/index.js +8 -8
  48. package/esm/util/retry/lib/retry.js +11 -22
  49. package/package.json +4 -2
@@ -7,37 +7,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- var __generator = (this && this.__generator) || function (thisArg, body) {
11
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
- function verb(n) { return function (v) { return step([n, v]); }; }
14
- function step(op) {
15
- if (f) throw new TypeError("Generator is already executing.");
16
- while (_) try {
17
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
- if (y = 0, t) op = [op[0] & 2, t.value];
19
- switch (op[0]) {
20
- case 0: case 1: t = op; break;
21
- case 4: _.label++; return { value: op[1], done: false };
22
- case 5: _.label++; y = op[1]; op = [0]; continue;
23
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
- default:
25
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
- if (t[2]) _.ops.pop();
30
- _.trys.pop(); continue;
31
- }
32
- op = body.call(thisArg, _);
33
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
- }
36
- };
37
10
  import * as Utils from "./Utils";
38
- var contextIdCounter = 0;
39
- var RequestContext = /** @class */ (function () {
40
- function RequestContext(backend, host, config, computedPath, mocking) {
11
+ let contextIdCounter = 0;
12
+ export default class RequestContext {
13
+ constructor(backend, host, config, computedPath, mocking) {
41
14
  this.canceler = null;
42
15
  this.response = undefined;
43
16
  this.error = null;
@@ -59,80 +32,54 @@ var RequestContext = /** @class */ (function () {
59
32
  this.initMiddleware();
60
33
  this.parseRequestBody();
61
34
  }
62
- Object.defineProperty(RequestContext.prototype, "method", {
63
- get: function () {
64
- return this.host.method;
65
- },
66
- enumerable: false,
67
- configurable: true
68
- });
69
- Object.defineProperty(RequestContext.prototype, "api", {
70
- get: function () {
71
- return this.host.api;
72
- },
73
- enumerable: false,
74
- configurable: true
75
- });
76
- Object.defineProperty(RequestContext.prototype, "baseUrl", {
77
- get: function () {
78
- return this.host.baseUrl;
79
- },
80
- enumerable: false,
81
- configurable: true
82
- });
83
- Object.defineProperty(RequestContext.prototype, "responseType", {
84
- get: function () {
85
- return this.host.responseType;
86
- },
87
- enumerable: false,
88
- configurable: true
89
- });
90
- RequestContext.prototype.initMiddleware = function () {
91
- var middleware = this.api.middleware;
92
- for (var i = 0; i < middleware.length; i++) {
93
- var events = middleware[i];
94
- var eventTypes = Object.keys(events);
95
- for (var n = 0; n < eventTypes.length; n++) {
96
- var eventType = eventTypes[n];
97
- var eventHandlersForType = this.eventHandlers[eventType] || (this.eventHandlers[eventType] = []);
98
- var middlewareEventHandlers = events[eventType];
35
+ get method() {
36
+ return this.host.method;
37
+ }
38
+ get api() {
39
+ return this.host.api;
40
+ }
41
+ get baseUrl() {
42
+ return this.host.baseUrl;
43
+ }
44
+ get responseType() {
45
+ return this.host.responseType;
46
+ }
47
+ initMiddleware() {
48
+ const { middleware } = this.api;
49
+ for (let i = 0; i < middleware.length; i++) {
50
+ const events = middleware[i];
51
+ const eventTypes = Object.keys(events);
52
+ for (let n = 0; n < eventTypes.length; n++) {
53
+ const eventType = eventTypes[n];
54
+ const eventHandlersForType = this.eventHandlers[eventType] || (this.eventHandlers[eventType] = []);
55
+ const middlewareEventHandlers = events[eventType];
99
56
  if (middlewareEventHandlers) {
100
57
  eventHandlersForType.push(middlewareEventHandlers);
101
58
  }
102
59
  }
103
60
  }
104
- };
105
- RequestContext.prototype.generateKey = function () {
106
- var computedConfig = this.computedConfig;
107
- var key = this.computedPath.trim();
108
- var queryStrings = [];
109
- if (computedConfig.query) {
110
- var queryKeys = Object.keys(computedConfig.query);
111
- for (var i = 0; i < queryKeys.length; i++) {
112
- var queryKey = queryKeys[i];
113
- queryStrings.push("".concat(queryKey, "=").concat(computedConfig.query[queryKey]));
114
- }
115
- }
116
- if (queryStrings.length > 0) {
117
- key += "?" + queryStrings.join("&");
61
+ }
62
+ generateKey() {
63
+ let key = this.computedPath.trim();
64
+ if (this.computedConfig.queryString) {
65
+ key += "?" + this.computedConfig.queryString;
118
66
  }
119
67
  return key;
120
- };
121
- RequestContext.prototype.updateHeaders = function (newHeaders) {
68
+ }
69
+ updateHeaders(newHeaders) {
122
70
  this.computedConfig.headers = Utils.assign({}, this.computedConfig.headers, newHeaders);
123
71
  this.parseRequestBody();
124
72
  return this;
125
- };
126
- RequestContext.prototype.parseRequestBody = function () {
73
+ }
74
+ parseRequestBody() {
127
75
  var _a;
128
76
  if (this.computedConfig.body && this.computedConfig.headers) {
129
- var contentTypeKey = Object.keys(this.computedConfig.headers).find(function (key) { return key.toLowerCase() === "content-type"; });
130
- var contentType = contentTypeKey && ((_a = this.computedConfig.headers[contentTypeKey]) === null || _a === void 0 ? void 0 : _a.toString().split(";")[0].trim());
77
+ const contentTypeKey = Object.keys(this.computedConfig.headers).find(key => key.toLowerCase() === "content-type");
78
+ const contentType = contentTypeKey && ((_a = this.computedConfig.headers[contentTypeKey]) === null || _a === void 0 ? void 0 : _a.toString().split(";")[0].trim());
131
79
  if (contentType === "application/x-www-form-urlencoded") {
132
- var searchParams = new URLSearchParams();
133
- for (var _i = 0, _b = Object.keys(this.computedConfig.body); _i < _b.length; _i++) {
134
- var key = _b[_i];
135
- var value = this.computedConfig.body[key];
80
+ const searchParams = new URLSearchParams();
81
+ for (const key of Object.keys(this.computedConfig.body)) {
82
+ const value = this.computedConfig.body[key];
136
83
  searchParams.append(key, value === null || value === void 0 ? void 0 : value.toString());
137
84
  }
138
85
  this.parsedBody = searchParams;
@@ -144,83 +91,59 @@ var RequestContext = /** @class */ (function () {
144
91
  else {
145
92
  this.parsedBody = undefined;
146
93
  }
147
- };
148
- RequestContext.prototype.getParsedBody = function () {
94
+ }
95
+ getParsedBody() {
149
96
  return this.parsedBody;
150
- };
151
- RequestContext.prototype.updateQuery = function (newQuery) {
152
- this.computedConfig.query = Utils.assign(this.computedConfig.query || {}, newQuery);
97
+ }
98
+ updateQuery(newQuery) {
99
+ this.computedConfig.queryObject = Utils.assign({}, this.computedConfig.queryObject, newQuery);
153
100
  return this;
154
- };
155
- RequestContext.prototype.triggerEvent = function (eventType) {
156
- return __awaiter(this, void 0, void 0, function () {
157
- var eventHandlers, i, eventHandler, eventResult;
158
- return __generator(this, function (_a) {
159
- switch (_a.label) {
160
- case 0:
161
- eventHandlers = this.eventHandlers[eventType];
162
- if (!eventHandlers) return [3 /*break*/, 4];
163
- i = 0;
164
- _a.label = 1;
165
- case 1:
166
- if (!(i < eventHandlers.length)) return [3 /*break*/, 4];
167
- eventHandler = eventHandlers[i];
168
- return [4 /*yield*/, eventHandler(this)];
169
- case 2:
170
- eventResult = _a.sent();
171
- if (eventResult) {
172
- return [2 /*return*/, eventResult];
173
- }
174
- _a.label = 3;
175
- case 3:
176
- i++;
177
- return [3 /*break*/, 1];
178
- case 4: return [2 /*return*/, undefined];
101
+ }
102
+ triggerEvent(eventType) {
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ const eventHandlers = this.eventHandlers[eventType];
105
+ if (eventHandlers) {
106
+ for (let i = 0; i < eventHandlers.length; i++) {
107
+ const eventHandler = eventHandlers[i];
108
+ // eslint-disable-next-line no-await-in-loop
109
+ const eventResult = yield eventHandler(this);
110
+ if (eventResult) {
111
+ return eventResult;
112
+ }
179
113
  }
180
- });
114
+ }
115
+ return undefined;
181
116
  });
182
- };
183
- RequestContext.prototype.addCanceller = function (canceler) {
117
+ }
118
+ addCanceller(canceler) {
184
119
  this.canceler = canceler;
185
- };
186
- RequestContext.prototype.cancel = function () {
120
+ }
121
+ cancel() {
187
122
  this.cancelled = true;
188
123
  if (this.canceler) {
189
124
  this.canceler();
190
125
  }
191
- };
192
- RequestContext.prototype.getRequestUrl = function () {
193
- var _a;
194
- var path = !this.baseUrl.endsWith("/")
126
+ }
127
+ getRequestUrl() {
128
+ let path = !this.baseUrl.endsWith("/")
195
129
  ? this.baseUrl + "/"
196
130
  : this.baseUrl;
197
131
  path += this.computedPath.startsWith("/")
198
132
  ? this.computedPath.substring(1)
199
133
  : this.computedPath;
200
- var origin = undefined;
134
+ let origin = undefined;
201
135
  if (typeof window !== "undefined") {
202
136
  origin = window.origin;
203
137
  }
204
138
  if (!origin) {
205
139
  if (path.indexOf("://") === -1) {
206
- path = "https://".concat(path);
140
+ path = `https://${path}`;
207
141
  }
208
142
  }
209
- var url = new URL(path, origin);
210
- if (this.computedConfig.query) {
211
- if (this.computedConfig.queryParser) {
212
- url.search = this.computedConfig.queryParser(this.computedConfig.query);
213
- }
214
- else {
215
- var queryKeys = Object.keys(this.computedConfig.query);
216
- for (var i = 0; i < queryKeys.length; i++) {
217
- var key = queryKeys[i];
218
- url.searchParams.append(key, ((_a = this.computedConfig.query[key]) === null || _a === void 0 ? void 0 : _a.toString()) || "");
219
- }
220
- }
143
+ const url = new URL(path, origin);
144
+ if (this.computedConfig.queryString) {
145
+ url.search = this.computedConfig.queryString;
221
146
  }
222
147
  return url;
223
- };
224
- return RequestContext;
225
- }());
226
- export default RequestContext;
148
+ }
149
+ }
@@ -1,24 +1,24 @@
1
- export var RequestErrorCode = {
1
+ export const RequestErrorCode = {
2
2
  MISC_UNKNOWN_ERROR: "misc/unknown-error",
3
3
  REQUEST_NETWORK_ERROR: "request/network-error",
4
4
  REQUEST_INVALID_STATUS: "request/invalid-status",
5
5
  REQUEST_INVALID_CONFIG: "request/invalid-config",
6
6
  REQUEST_MISMATCH_RESPONSE_TYPE: "request/mismatch-response-type",
7
7
  };
8
- export var isRequestError = function (error) {
8
+ export const isRequestError = (error) => {
9
9
  return "isRequestError" in error;
10
10
  };
11
- export var convertToRequestError = function (config) {
12
- var error = config.error, context = config.context, response = config.response, code = config.code;
13
- var body = context.getParsedBody();
14
- var resultError = Object.assign(error, {
11
+ export const convertToRequestError = (config) => {
12
+ const { error, context, response, code } = config;
13
+ const body = context.getParsedBody();
14
+ const resultError = Object.assign(error, {
15
15
  name: "RequestError",
16
16
  response: response,
17
17
  code: code,
18
18
  isRequestError: true,
19
19
  request: {
20
20
  url: context.getRequestUrl().href,
21
- query: context.computedConfig.query,
21
+ query: context.computedConfig.queryObject,
22
22
  headers: context.computedConfig.headers,
23
23
  body: body,
24
24
  },
@@ -1,3 +1,3 @@
1
1
  import { ApiResponse, Body, Query, RequestConfig, RequestHost } from "./ApiTypes";
2
2
  import { EndpointMockingConfig } from "./MockingTypes";
3
- export declare const submit: <R, P extends string | undefined, Q extends Query | undefined, B extends Body | undefined>(host: RequestHost, config: RequestConfig<P, Q, B>, mocking: EndpointMockingConfig<R, P, Q, B> | null | undefined) => Promise<ApiResponse<R>>;
3
+ export declare const submit: <R, P extends string | undefined, Q extends Query, B extends Body | undefined>(host: RequestHost, config: RequestConfig<P, Q, B>, mocking: EndpointMockingConfig<R, P, Q, B> | null | undefined) => Promise<ApiResponse<R>>;