api-def 0.12.1 → 0.14.0-alpha.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 (87) hide show
  1. package/README.md +3 -0
  2. package/bin/index.js +312 -313
  3. package/cjs/Api.d.ts +1 -1
  4. package/cjs/Api.js +99 -145
  5. package/cjs/ApiTypes.d.ts +3 -2
  6. package/cjs/ApiUtils.js +30 -32
  7. package/cjs/Endpoint.d.ts +1 -1
  8. package/cjs/Endpoint.js +112 -175
  9. package/cjs/EndpointBuilder.d.ts +17 -0
  10. package/cjs/EndpointBuilder.js +55 -36
  11. package/cjs/QueryHandling.js +12 -13
  12. package/cjs/RequestConfig.js +54 -36
  13. package/cjs/RequestContext.d.ts +2 -1
  14. package/cjs/RequestContext.js +143 -180
  15. package/cjs/RequestError.js +16 -19
  16. package/cjs/Requester.js +231 -312
  17. package/cjs/TextDecoding.js +31 -31
  18. package/cjs/Utils.d.ts +1 -0
  19. package/cjs/Utils.js +74 -25
  20. package/cjs/Validation.d.ts +8 -1
  21. package/cjs/backend/AxiosRequestBackend.d.ts +1 -1
  22. package/cjs/backend/AxiosRequestBackend.js +65 -172
  23. package/cjs/backend/FetchRequestBackend.d.ts +1 -1
  24. package/cjs/backend/FetchRequestBackend.js +108 -154
  25. package/cjs/backend/MockRequestBackend.d.ts +1 -1
  26. package/cjs/backend/MockRequestBackend.js +146 -208
  27. package/cjs/cache/ClientCaching.js +26 -74
  28. package/cjs/cache/LocalForageClientCacheBackend.js +15 -83
  29. package/cjs/cache/LocalStorageClientCacheBackend.js +14 -73
  30. package/cjs/index.d.ts +11 -11
  31. package/cjs/index.js +24 -21
  32. package/cjs/middleware/ClientCacheMiddleware.js +80 -103
  33. package/cjs/middleware/LoggingMiddleware.js +71 -42
  34. package/cjs/util/retry/index.js +42 -9
  35. package/cjs/util/retry/lib/retry.js +25 -27
  36. package/cjs/util/retry/lib/retryOperation.d.ts +1 -26
  37. package/cjs/util/retry/lib/retryOperation.js +21 -23
  38. package/esm/Api.d.ts +6 -6
  39. package/esm/Api.js +12 -25
  40. package/esm/ApiConstants.d.ts +1 -1
  41. package/esm/ApiTypes.d.ts +7 -6
  42. package/esm/ApiUtils.d.ts +2 -2
  43. package/esm/ApiUtils.js +4 -5
  44. package/esm/Endpoint.d.ts +6 -6
  45. package/esm/Endpoint.js +22 -28
  46. package/esm/EndpointBuilder.d.ts +21 -4
  47. package/esm/EndpointBuilder.js +38 -10
  48. package/esm/MockingTypes.d.ts +1 -1
  49. package/esm/QueryHandling.d.ts +1 -1
  50. package/esm/QueryHandling.js +2 -3
  51. package/esm/RequestConfig.d.ts +1 -1
  52. package/esm/RequestConfig.js +6 -7
  53. package/esm/RequestContext.d.ts +8 -7
  54. package/esm/RequestContext.js +33 -27
  55. package/esm/RequestError.d.ts +3 -3
  56. package/esm/RequestError.js +2 -3
  57. package/esm/Requester.d.ts +2 -2
  58. package/esm/Requester.js +45 -50
  59. package/esm/UtilTypes.d.ts +1 -1
  60. package/esm/Utils.d.ts +1 -0
  61. package/esm/Utils.js +54 -2
  62. package/esm/Validation.d.ts +8 -1
  63. package/esm/backend/AxiosRequestBackend.d.ts +4 -4
  64. package/esm/backend/AxiosRequestBackend.js +47 -84
  65. package/esm/backend/FetchRequestBackend.d.ts +5 -5
  66. package/esm/backend/FetchRequestBackend.js +50 -64
  67. package/esm/backend/MockRequestBackend.d.ts +4 -4
  68. package/esm/backend/MockRequestBackend.js +105 -136
  69. package/esm/backend/RequestBackend.d.ts +2 -2
  70. package/esm/cache/ClientCaching.d.ts +1 -1
  71. package/esm/cache/ClientCaching.js +8 -17
  72. package/esm/cache/LocalForageClientCacheBackend.d.ts +1 -1
  73. package/esm/cache/LocalForageClientCacheBackend.js +8 -25
  74. package/esm/cache/LocalStorageClientCacheBackend.d.ts +1 -1
  75. package/esm/cache/LocalStorageClientCacheBackend.js +9 -26
  76. package/esm/index.d.ts +16 -16
  77. package/esm/index.js +15 -15
  78. package/esm/middleware/ClientCacheMiddleware.d.ts +1 -1
  79. package/esm/middleware/ClientCacheMiddleware.js +8 -17
  80. package/esm/middleware/LoggingMiddleware.d.ts +1 -1
  81. package/esm/middleware/LoggingMiddleware.js +5 -6
  82. package/esm/util/retry/index.js +1 -1
  83. package/esm/util/retry/lib/retry.d.ts +1 -1
  84. package/esm/util/retry/lib/retry.js +13 -7
  85. package/esm/util/retry/lib/retryOperation.d.ts +1 -26
  86. package/esm/util/retry/lib/retryOperation.js +1 -1
  87. package/package.json +67 -28
@@ -1,69 +1,46 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
8
26
  };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
15
33
  };
16
34
  })();
17
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
- return new (P || (P = Promise))(function (resolve, reject) {
20
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
- step((generator = generator.apply(thisArg, _arguments || [])).next());
24
- });
25
- };
26
- var __generator = (this && this.__generator) || function (thisArg, body) {
27
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
28
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
- function verb(n) { return function (v) { return step([n, v]); }; }
30
- function step(op) {
31
- if (f) throw new TypeError("Generator is already executing.");
32
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
- 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;
34
- if (y = 0, t) op = [op[0] & 2, t.value];
35
- switch (op[0]) {
36
- case 0: case 1: t = op; break;
37
- case 4: _.label++; return { value: op[1], done: false };
38
- case 5: _.label++; y = op[1]; op = [0]; continue;
39
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
- default:
41
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
- if (t[2]) _.ops.pop();
46
- _.trys.pop(); continue;
47
- }
48
- op = body.call(thisArg, _);
49
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
- }
52
- };
53
35
  Object.defineProperty(exports, "__esModule", { value: true });
54
- var ApiUtils_1 = require("../ApiUtils");
55
- var RequestError_1 = require("../RequestError");
56
- var Utils = require("../Utils");
57
- var Utils_1 = require("../Utils");
58
- var FetchError = /** @class */ (function (_super) {
59
- __extends(FetchError, _super);
60
- function FetchError() {
61
- return _super !== null && _super.apply(this, arguments) || this;
62
- }
63
- return FetchError;
64
- }(Error));
65
- var FetchRequestBackend = /** @class */ (function () {
66
- function FetchRequestBackend(fetchLibrary) {
36
+ const ApiUtils_1 = require("../ApiUtils");
37
+ const RequestError_1 = require("../RequestError");
38
+ const Utils = __importStar(require("../Utils"));
39
+ const Utils_1 = require("../Utils");
40
+ class FetchError extends Error {
41
+ }
42
+ class FetchRequestBackend {
43
+ constructor(fetchLibrary) {
67
44
  this.fetch = (0, Utils_1.getGlobalFetch)();
68
45
  this.id = "fetch";
69
46
  if (fetchLibrary !== undefined) {
@@ -74,102 +51,80 @@ var FetchRequestBackend = /** @class */ (function () {
74
51
  }
75
52
  }
76
53
  }
77
- FetchRequestBackend.prototype.extractResponseFromError = function (error) {
78
- return __awaiter(this, void 0, void 0, function () {
79
- var fetchError;
80
- return __generator(this, function (_a) {
81
- if ("response" in error) {
82
- fetchError = error;
83
- return [2 /*return*/, fetchError.response ? fetchError.response : null];
84
- }
85
- return [2 /*return*/, undefined];
86
- });
87
- });
88
- };
89
- FetchRequestBackend.prototype.convertResponse = function (context, response) {
90
- return __awaiter(this, void 0, void 0, function () {
91
- var status, headers, convertedResponse, responseType, text, data, error_1;
92
- var _a;
93
- return __generator(this, function (_b) {
94
- switch (_b.label) {
95
- case 0:
96
- status = response.status, headers = response.headers;
97
- convertedResponse = {
98
- method: context.method,
99
- url: response.url,
100
- data: undefined,
101
- status: status,
102
- headers: headers,
103
- state: context.requestConfig.state,
104
- stats: context.stats,
105
- };
106
- responseType = (_a = context.responseType) !== null && _a !== void 0 ? _a : (0, ApiUtils_1.inferResponseType)(response.headers.get("Content-Type"));
107
- _b.label = 1;
108
- case 1:
109
- _b.trys.push([1, 9, , 10]);
110
- if (!(responseType === "arraybuffer")) return [3 /*break*/, 3];
111
- return [4 /*yield*/, response.arrayBuffer()];
112
- case 2:
113
- data = _b.sent();
114
- return [3 /*break*/, 8];
115
- case 3:
116
- if (!(responseType === "json")) return [3 /*break*/, 5];
117
- return [4 /*yield*/, response.text()];
118
- case 4:
119
- text = _b.sent();
120
- data = JSON.parse(text);
121
- return [3 /*break*/, 8];
122
- case 5:
123
- if (!(responseType === "stream")) return [3 /*break*/, 6];
124
- data = response.body;
125
- return [3 /*break*/, 8];
126
- case 6: return [4 /*yield*/, response.text()];
127
- case 7:
128
- data = _b.sent();
129
- _b.label = 8;
130
- case 8: return [3 /*break*/, 10];
131
- case 9:
132
- error_1 = _b.sent();
133
- throw (0, RequestError_1.convertToRequestError)({
134
- error: Object.assign(new Error("[api-def] Failed to parse response as '".concat(responseType, "'").concat(text ? ", got: ".concat(text) : "")), {
135
- cause: error_1,
136
- }),
137
- code: RequestError_1.RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
138
- context: context,
139
- response: convertedResponse,
140
- });
141
- case 10:
142
- convertedResponse.data = data;
143
- return [2 /*return*/, convertedResponse];
144
- }
54
+ async extractResponseFromError(error) {
55
+ if ("response" in error) {
56
+ const fetchError = error;
57
+ return fetchError.response ? fetchError.response : null;
58
+ }
59
+ return undefined;
60
+ }
61
+ async convertResponse(context, response) {
62
+ const { status, headers } = response;
63
+ const convertedResponse = {
64
+ method: context.method,
65
+ url: response.url,
66
+ data: undefined,
67
+ status: status,
68
+ headers: headers,
69
+ state: context.requestConfig.state,
70
+ stats: context.stats,
71
+ };
72
+ const responseType = context.responseType ?? (0, ApiUtils_1.inferResponseType)(response.headers.get("Content-Type"));
73
+ let text;
74
+ let data;
75
+ try {
76
+ if (responseType === "arraybuffer") {
77
+ data = await response.arrayBuffer();
78
+ }
79
+ else if (responseType === "json") {
80
+ text = await response.text();
81
+ data = JSON.parse(text);
82
+ }
83
+ else if (responseType === "stream") {
84
+ data = response.body;
85
+ }
86
+ else {
87
+ data = await response.text();
88
+ }
89
+ }
90
+ catch (error) {
91
+ throw (0, RequestError_1.convertToRequestError)({
92
+ error: Object.assign(new Error(`[api-def] Failed to parse response as '${responseType}'${text ? `, got: ${text}` : ""}`), {
93
+ cause: error,
94
+ }),
95
+ code: RequestError_1.RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
96
+ context: context,
97
+ response: convertedResponse,
145
98
  });
146
- });
147
- };
148
- FetchRequestBackend.prototype.makeRequest = function (context) {
99
+ }
100
+ convertedResponse.data = data;
101
+ return convertedResponse;
102
+ }
103
+ makeRequest(context) {
149
104
  if (!this.fetch) {
150
105
  throw new Error("[api-def] No fetch impl was provided to FetchRequestBackend");
151
106
  }
152
- var requestConfig = context.requestConfig;
107
+ const { requestConfig } = context;
153
108
  // abort controller is a newer feature than fetch
154
- var abortController = AbortController && new AbortController();
155
- var abortSignal = abortController ? abortController.signal : undefined;
156
- var softAbort = false;
157
- var responded = false;
158
- var body = context.getParsedBody();
159
- var bodyJsonify = body !== null && typeof body === "object" && !Utils.isFormData(body);
160
- var headers = Utils.assign({
109
+ const abortController = AbortController && new AbortController();
110
+ const abortSignal = abortController ? abortController.signal : undefined;
111
+ let softAbort = false;
112
+ let responded = false;
113
+ const body = context.getParsedBody();
114
+ const bodyJsonify = body !== null && typeof body === "object" && !Utils.isFormData(body) && !(body instanceof URLSearchParams);
115
+ const headers = Utils.assign({
161
116
  // logic from axios
162
117
  "Content-Type": bodyJsonify ? "application/json;charset=utf-8" : undefined,
163
118
  }, requestConfig.headers);
164
- var parsedHeaders = Object.keys(headers).reduce(function (parsedHeaders, key) {
165
- var value = headers[key];
119
+ const parsedHeaders = Object.keys(headers).reduce((parsedHeaders, key) => {
120
+ const value = headers[key];
166
121
  if (value !== undefined) {
167
122
  parsedHeaders[key] = value;
168
123
  }
169
124
  return parsedHeaders;
170
125
  }, {});
171
- var url = context.requestUrl;
172
- var fetchOptions = {
126
+ const url = context.requestUrl;
127
+ const fetchOptions = {
173
128
  method: context.method.toUpperCase(),
174
129
  body: bodyJsonify ? JSON.stringify(body) : body,
175
130
  headers: parsedHeaders,
@@ -183,12 +138,12 @@ var FetchRequestBackend = /** @class */ (function () {
183
138
  fetchOptions.credentials = requestConfig.credentials ? "include" : undefined;
184
139
  }
185
140
  if (requestConfig.debug) {
186
- console.log("[api-def] Fetching '".concat(url.href, "' with options"), JSON.stringify(fetchOptions, null, 2));
141
+ console.log(`[api-def] Fetching '${url.href}' with options`, JSON.stringify(fetchOptions, null, 2));
187
142
  }
188
- var promise = this.fetch(url.href, fetchOptions).then(function (response) {
143
+ const promise = this.fetch(url.href, fetchOptions).then((response) => {
189
144
  responded = true;
190
145
  if (!response.ok) {
191
- var error = new FetchError("Fetch failed");
146
+ const error = new FetchError("Fetch failed");
192
147
  error.response = response;
193
148
  throw error;
194
149
  }
@@ -200,15 +155,14 @@ var FetchRequestBackend = /** @class */ (function () {
200
155
  return {
201
156
  promise: promise,
202
157
  canceler: abortSignal
203
- ? function () { return !responded && abortController.abort(); }
204
- : function () {
158
+ ? () => !responded && abortController.abort()
159
+ : () => {
205
160
  softAbort = true;
206
161
  },
207
162
  };
208
- };
209
- FetchRequestBackend.prototype.getErrorInfo = function (error, response) {
163
+ }
164
+ getErrorInfo(error, response) {
210
165
  return undefined;
211
- };
212
- return FetchRequestBackend;
213
- }());
166
+ }
167
+ }
214
168
  exports.default = FetchRequestBackend;
@@ -1,7 +1,7 @@
1
1
  import type { ApiResponse } from "../ApiTypes";
2
2
  import type RequestContext from "../RequestContext";
3
- import type { RequestBackendErrorInfo, RequestOperation } from "./RequestBackend";
4
3
  import type RequestBackend from "./RequestBackend";
4
+ import type { RequestBackendErrorInfo, RequestOperation } from "./RequestBackend";
5
5
  export default class MockRequestBackend implements RequestBackend<ApiResponse> {
6
6
  readonly id = "mock";
7
7
  convertResponse<T>(context: RequestContext, response: ApiResponse, error?: boolean): Promise<ApiResponse<T>>;