api-def 0.6.0-alpha6 → 0.6.0-alpha9
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 +1 -0
- package/cjs/ApiTypes.d.ts +2 -1
- package/cjs/ApiUtils.js +2 -1
- package/cjs/Requester.js +1 -0
- package/cjs/UtilTypes.d.ts +5 -0
- package/cjs/UtilTypes.js +2 -0
- package/cjs/backend/AxiosRequestBackend.js +5 -3
- package/cjs/backend/FetchRequestBackend.js +13 -8
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +1 -0
- package/esm/ApiTypes.d.ts +2 -1
- package/esm/ApiUtils.js +2 -1
- package/esm/Requester.js +1 -0
- package/esm/UtilTypes.d.ts +5 -0
- package/esm/UtilTypes.js +1 -0
- package/esm/backend/AxiosRequestBackend.js +5 -3
- package/esm/backend/FetchRequestBackend.js +13 -8
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/cjs/ApiTypes.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { CacheSource, EventResultType, RequestEvent, RequestMethod, ResponseType
|
|
|
4
4
|
export declare type AcceptableStatus = number | [min: number, max: number];
|
|
5
5
|
export declare type Headers = Record<string, string | number | boolean | null | undefined>;
|
|
6
6
|
export declare type Params = string;
|
|
7
|
-
export declare type Query = Record<string,
|
|
7
|
+
export declare type Query = Record<string, any>;
|
|
8
8
|
export declare type Body = string | number | Record<string, any>;
|
|
9
9
|
export interface ApiResponse<T = any> {
|
|
10
10
|
status: number;
|
|
@@ -17,6 +17,7 @@ export interface BaseRequestConfig {
|
|
|
17
17
|
retry?: number | false;
|
|
18
18
|
headers?: Readonly<Headers>;
|
|
19
19
|
acceptableStatus?: AcceptableStatus[];
|
|
20
|
+
queryParser?: (query: any) => string;
|
|
20
21
|
}
|
|
21
22
|
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 ? {
|
|
22
23
|
params?: never;
|
package/cjs/ApiUtils.js
CHANGED
|
@@ -23,7 +23,8 @@ var parseResponseDataToObject = function (response) {
|
|
|
23
23
|
response.data = JSON.parse(decodedData);
|
|
24
24
|
}
|
|
25
25
|
catch (e) {
|
|
26
|
-
|
|
26
|
+
// eslint-disable-next-line
|
|
27
|
+
console.warn("[api-def] Couldn't parse array buffer content to JSON response", e);
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
}
|
package/cjs/Requester.js
CHANGED
|
@@ -118,6 +118,7 @@ var makeRequest = function (context) { return __awaiter(void 0, void 0, void 0,
|
|
|
118
118
|
if (process.env.NODE_ENV === "development") {
|
|
119
119
|
if (Api.isRequestBackendDefault() && !defaultBackendMessageShown) {
|
|
120
120
|
defaultBackendMessageShown = true;
|
|
121
|
+
// eslint-disable-next-line
|
|
121
122
|
console.warn("[api-def] Using default fetch backend, you can use a different one with 'setRequestBackend()' (dev only message)");
|
|
122
123
|
}
|
|
123
124
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import Endpoint from "./Endpoint";
|
|
2
|
+
export declare type ResponseOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<infer R, any, any, any> ? R : never;
|
|
3
|
+
export declare type ParamsOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<any, infer P, any, any> ? P : never;
|
|
4
|
+
export declare type QueryOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<any, any, infer Q, any> ? Q : never;
|
|
5
|
+
export declare type BodyOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<any, any, any, infer B> ? B : never;
|
package/cjs/UtilTypes.js
ADDED
|
@@ -62,13 +62,14 @@ var AxiosRequestBackend = /** @class */ (function () {
|
|
|
62
62
|
};
|
|
63
63
|
AxiosRequestBackend.prototype.convertResponse = function (context, response) {
|
|
64
64
|
return __awaiter(this, void 0, void 0, function () {
|
|
65
|
-
var inferredResponseType;
|
|
65
|
+
var contentType, inferredResponseType;
|
|
66
66
|
return __generator(this, function (_a) {
|
|
67
|
-
|
|
67
|
+
contentType = response.headers["content-type"];
|
|
68
|
+
inferredResponseType = ApiUtils_1.inferResponseType(contentType);
|
|
68
69
|
// expand to array buffer once we support that in inferResponseType
|
|
69
70
|
if (inferredResponseType === "text" && context.responseType === "json") {
|
|
70
71
|
throw RequestError_1.convertToRequestError({
|
|
71
|
-
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "'"),
|
|
72
|
+
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "' (from 'Content-Type' of '" + contentType + "')"),
|
|
72
73
|
code: RequestError_1.RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
|
|
73
74
|
});
|
|
74
75
|
}
|
|
@@ -90,6 +91,7 @@ var AxiosRequestBackend = /** @class */ (function () {
|
|
|
90
91
|
cancelToken: new axios.CancelToken(function (cancellerFunc) {
|
|
91
92
|
canceler = cancellerFunc;
|
|
92
93
|
}),
|
|
94
|
+
paramsSerializer: context.computedConfig.queryParser,
|
|
93
95
|
});
|
|
94
96
|
return {
|
|
95
97
|
promise: promise,
|
|
@@ -85,16 +85,17 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
85
85
|
};
|
|
86
86
|
FetchRequestBackend.prototype.convertResponse = function (context, response, error) {
|
|
87
87
|
return __awaiter(this, void 0, void 0, function () {
|
|
88
|
-
var data, inferredResponseType, responseType, _a, error_1, status;
|
|
88
|
+
var data, contentType, inferredResponseType, responseType, _a, error_1, status;
|
|
89
89
|
return __generator(this, function (_b) {
|
|
90
90
|
switch (_b.label) {
|
|
91
91
|
case 0:
|
|
92
|
-
|
|
92
|
+
contentType = response.headers.get("Content-Type");
|
|
93
|
+
inferredResponseType = ApiUtils_1.inferResponseType(contentType);
|
|
93
94
|
responseType = error ? inferredResponseType : context.responseType;
|
|
94
95
|
// expand to array buffer once we support that in inferResponseType
|
|
95
96
|
if (inferredResponseType === "text" && context.responseType === "json") {
|
|
96
97
|
throw RequestError_1.convertToRequestError({
|
|
97
|
-
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "'"),
|
|
98
|
+
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "' (from 'Content-Type' of '" + contentType + "')"),
|
|
98
99
|
code: RequestError_1.RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
|
|
99
100
|
});
|
|
100
101
|
}
|
|
@@ -157,10 +158,15 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
157
158
|
}
|
|
158
159
|
var url = new URL(path, origin);
|
|
159
160
|
if (computedConfig.query) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
161
|
+
if (context.computedConfig.queryParser) {
|
|
162
|
+
url.search = context.computedConfig.queryParser(computedConfig.query);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
var queryKeys = Object.keys(computedConfig.query);
|
|
166
|
+
for (var i = 0; i < queryKeys.length; i++) {
|
|
167
|
+
var key = queryKeys[i];
|
|
168
|
+
url.searchParams.append(key, ((_a = computedConfig.query[key]) === null || _a === void 0 ? void 0 : _a.toString()) || "");
|
|
169
|
+
}
|
|
164
170
|
}
|
|
165
171
|
}
|
|
166
172
|
// abort controller is a newer feature than fetch
|
|
@@ -203,7 +209,6 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
203
209
|
canceler: abortSignal
|
|
204
210
|
? function () { return !responded && abortController.abort(); }
|
|
205
211
|
: function () {
|
|
206
|
-
console.warn("Request aborted");
|
|
207
212
|
softAbort = true;
|
|
208
213
|
},
|
|
209
214
|
};
|
package/cjs/index.d.ts
CHANGED
package/cjs/index.js
CHANGED
|
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.LoggingMiddleware = exports.CacheMiddleware = exports.FetchRequestBackend = exports.AxiosRequestBackend = exports.LocaleForageCacheBackend = exports.LocalStorageCacheBackend = exports.setCacheBackend = exports.clearCache = exports.isRequestError = void 0;
|
|
15
15
|
__exportStar(require("./Api"), exports);
|
|
16
16
|
__exportStar(require("./ApiTypes"), exports);
|
|
17
|
+
__exportStar(require("./UtilTypes"), exports);
|
|
17
18
|
__exportStar(require("./ApiConstants"), exports);
|
|
18
19
|
var RequestError_1 = require("./RequestError");
|
|
19
20
|
Object.defineProperty(exports, "isRequestError", { enumerable: true, get: function () { return RequestError_1.isRequestError; } });
|
package/esm/ApiTypes.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { CacheSource, EventResultType, RequestEvent, RequestMethod, ResponseType
|
|
|
4
4
|
export declare type AcceptableStatus = number | [min: number, max: number];
|
|
5
5
|
export declare type Headers = Record<string, string | number | boolean | null | undefined>;
|
|
6
6
|
export declare type Params = string;
|
|
7
|
-
export declare type Query = Record<string,
|
|
7
|
+
export declare type Query = Record<string, any>;
|
|
8
8
|
export declare type Body = string | number | Record<string, any>;
|
|
9
9
|
export interface ApiResponse<T = any> {
|
|
10
10
|
status: number;
|
|
@@ -17,6 +17,7 @@ export interface BaseRequestConfig {
|
|
|
17
17
|
retry?: number | false;
|
|
18
18
|
headers?: Readonly<Headers>;
|
|
19
19
|
acceptableStatus?: AcceptableStatus[];
|
|
20
|
+
queryParser?: (query: any) => string;
|
|
20
21
|
}
|
|
21
22
|
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 ? {
|
|
22
23
|
params?: never;
|
package/esm/ApiUtils.js
CHANGED
|
@@ -18,7 +18,8 @@ export var parseResponseDataToObject = function (response) {
|
|
|
18
18
|
response.data = JSON.parse(decodedData);
|
|
19
19
|
}
|
|
20
20
|
catch (e) {
|
|
21
|
-
|
|
21
|
+
// eslint-disable-next-line
|
|
22
|
+
console.warn("[api-def] Couldn't parse array buffer content to JSON response", e);
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
}
|
package/esm/Requester.js
CHANGED
|
@@ -114,6 +114,7 @@ var makeRequest = function (context) { return __awaiter(void 0, void 0, void 0,
|
|
|
114
114
|
if (process.env.NODE_ENV === "development") {
|
|
115
115
|
if (Api.isRequestBackendDefault() && !defaultBackendMessageShown) {
|
|
116
116
|
defaultBackendMessageShown = true;
|
|
117
|
+
// eslint-disable-next-line
|
|
117
118
|
console.warn("[api-def] Using default fetch backend, you can use a different one with 'setRequestBackend()' (dev only message)");
|
|
118
119
|
}
|
|
119
120
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import Endpoint from "./Endpoint";
|
|
2
|
+
export declare type ResponseOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<infer R, any, any, any> ? R : never;
|
|
3
|
+
export declare type ParamsOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<any, infer P, any, any> ? P : never;
|
|
4
|
+
export declare type QueryOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<any, any, infer Q, any> ? Q : never;
|
|
5
|
+
export declare type BodyOf<E extends Endpoint<any, any, any, any>> = E extends Endpoint<any, any, any, infer B> ? B : never;
|
package/esm/UtilTypes.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -58,13 +58,14 @@ var AxiosRequestBackend = /** @class */ (function () {
|
|
|
58
58
|
};
|
|
59
59
|
AxiosRequestBackend.prototype.convertResponse = function (context, response) {
|
|
60
60
|
return __awaiter(this, void 0, void 0, function () {
|
|
61
|
-
var inferredResponseType;
|
|
61
|
+
var contentType, inferredResponseType;
|
|
62
62
|
return __generator(this, function (_a) {
|
|
63
|
-
|
|
63
|
+
contentType = response.headers["content-type"];
|
|
64
|
+
inferredResponseType = inferResponseType(contentType);
|
|
64
65
|
// expand to array buffer once we support that in inferResponseType
|
|
65
66
|
if (inferredResponseType === "text" && context.responseType === "json") {
|
|
66
67
|
throw convertToRequestError({
|
|
67
|
-
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "'"),
|
|
68
|
+
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "' (from 'Content-Type' of '" + contentType + "')"),
|
|
68
69
|
code: RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
|
|
69
70
|
});
|
|
70
71
|
}
|
|
@@ -86,6 +87,7 @@ var AxiosRequestBackend = /** @class */ (function () {
|
|
|
86
87
|
cancelToken: new axios.CancelToken(function (cancellerFunc) {
|
|
87
88
|
canceler = cancellerFunc;
|
|
88
89
|
}),
|
|
90
|
+
paramsSerializer: context.computedConfig.queryParser,
|
|
89
91
|
});
|
|
90
92
|
return {
|
|
91
93
|
promise: promise,
|
|
@@ -83,16 +83,17 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
83
83
|
};
|
|
84
84
|
FetchRequestBackend.prototype.convertResponse = function (context, response, error) {
|
|
85
85
|
return __awaiter(this, void 0, void 0, function () {
|
|
86
|
-
var data, inferredResponseType, responseType, _a, error_1, status;
|
|
86
|
+
var data, contentType, inferredResponseType, responseType, _a, error_1, status;
|
|
87
87
|
return __generator(this, function (_b) {
|
|
88
88
|
switch (_b.label) {
|
|
89
89
|
case 0:
|
|
90
|
-
|
|
90
|
+
contentType = response.headers.get("Content-Type");
|
|
91
|
+
inferredResponseType = inferResponseType(contentType);
|
|
91
92
|
responseType = error ? inferredResponseType : context.responseType;
|
|
92
93
|
// expand to array buffer once we support that in inferResponseType
|
|
93
94
|
if (inferredResponseType === "text" && context.responseType === "json") {
|
|
94
95
|
throw convertToRequestError({
|
|
95
|
-
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "'"),
|
|
96
|
+
error: new Error("[api-def] Expected '" + context.responseType + "' response, got '" + inferredResponseType + "' (from 'Content-Type' of '" + contentType + "')"),
|
|
96
97
|
code: RequestErrorCode.REQUEST_MISMATCH_RESPONSE_TYPE,
|
|
97
98
|
});
|
|
98
99
|
}
|
|
@@ -155,10 +156,15 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
155
156
|
}
|
|
156
157
|
var url = new URL(path, origin);
|
|
157
158
|
if (computedConfig.query) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
if (context.computedConfig.queryParser) {
|
|
160
|
+
url.search = context.computedConfig.queryParser(computedConfig.query);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
var queryKeys = Object.keys(computedConfig.query);
|
|
164
|
+
for (var i = 0; i < queryKeys.length; i++) {
|
|
165
|
+
var key = queryKeys[i];
|
|
166
|
+
url.searchParams.append(key, ((_a = computedConfig.query[key]) === null || _a === void 0 ? void 0 : _a.toString()) || "");
|
|
167
|
+
}
|
|
162
168
|
}
|
|
163
169
|
}
|
|
164
170
|
// abort controller is a newer feature than fetch
|
|
@@ -201,7 +207,6 @@ var FetchRequestBackend = /** @class */ (function () {
|
|
|
201
207
|
canceler: abortSignal
|
|
202
208
|
? function () { return !responded && abortController.abort(); }
|
|
203
209
|
: function () {
|
|
204
|
-
console.warn("Request aborted");
|
|
205
210
|
softAbort = true;
|
|
206
211
|
},
|
|
207
212
|
};
|
package/esm/index.d.ts
CHANGED
package/esm/index.js
CHANGED