@data-client/rest 0.9.8 → 0.10.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/README.md +16 -0
- package/dist/index.js +8 -1
- package/dist/index.umd.min.js +1 -1
- package/legacy/OptionsToFunction.js +1 -1
- package/legacy/RestEndpoint.js +7 -2
- package/legacy/RestEndpointTypeHelp.js +1 -1
- package/legacy/RestEndpointTypes.js +1 -1
- package/legacy/createResource.js +1 -1
- package/legacy/extractCollection.js +1 -1
- package/legacy/index.js +2 -1
- package/legacy/mapCollection.js +1 -1
- package/legacy/paramsToString.js +1 -1
- package/legacy/paramsToString.native.js +1 -1
- package/legacy/pathTypes.js +1 -1
- package/legacy/resourceExtensionTypes.js +1 -1
- package/legacy/resourceTypes.js +1 -1
- package/legacy/utiltypes.js +1 -1
- package/lib/OptionsToFunction.d.ts.map +1 -1
- package/lib/OptionsToFunction.js +1 -1
- package/lib/RestEndpoint.js +7 -2
- package/lib/RestEndpointTypeHelp.d.ts.map +1 -1
- package/lib/RestEndpointTypeHelp.js +1 -1
- package/lib/RestEndpointTypes.d.ts +29 -7
- package/lib/RestEndpointTypes.d.ts.map +1 -1
- package/lib/RestEndpointTypes.js +1 -1
- package/lib/createResource.js +1 -1
- package/lib/extractCollection.d.ts +2 -2
- package/lib/extractCollection.d.ts.map +1 -1
- package/lib/extractCollection.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -1
- package/lib/mapCollection.d.ts.map +1 -1
- package/lib/mapCollection.js +1 -1
- package/lib/paramsToString.d.ts +1 -1
- package/lib/paramsToString.d.ts.map +1 -1
- package/lib/paramsToString.js +1 -1
- package/lib/paramsToString.native.d.ts +1 -1
- package/lib/paramsToString.native.d.ts.map +1 -1
- package/lib/paramsToString.native.js +1 -1
- package/lib/pathTypes.d.ts.map +1 -1
- package/lib/pathTypes.js +1 -1
- package/lib/resourceExtensionTypes.d.ts.map +1 -1
- package/lib/resourceExtensionTypes.js +1 -1
- package/lib/resourceTypes.d.ts.map +1 -1
- package/lib/resourceTypes.js +1 -1
- package/lib/utiltypes.d.ts.map +1 -1
- package/lib/utiltypes.js +1 -1
- package/package.json +4 -2
- package/src/OptionsToFunction.ts +17 -15
- package/src/RestEndpoint.js +9 -4
- package/src/RestEndpointTypeHelp.ts +2 -3
- package/src/RestEndpointTypes.ts +173 -178
- package/src/__tests__/RestEndpoint.ts +54 -2
- package/src/createResource.ts +2 -2
- package/src/extractCollection.ts +13 -13
- package/src/index.ts +1 -0
- package/src/mapCollection.ts +14 -21
- package/src/paramsToString.native.ts +6 -1
- package/src/paramsToString.ts +7 -2
- package/src/pathTypes.ts +27 -36
- package/src/resourceExtensionTypes.ts +33 -48
- package/src/resourceTypes.ts +76 -80
- package/src/utiltypes.ts +3 -3
- package/ts4.0/RestEndpointTypes.d.ts +29 -7
- package/ts4.0/extractCollection.d.ts +2 -2
- package/ts4.0/index.d.ts +1 -0
- package/ts4.0/paramsToString.d.ts +1 -1
- package/ts4.0/paramsToString.native.d.ts +1 -1
- package/ts4.1/RestEndpointTypes.d.ts +29 -7
- package/ts4.1/extractCollection.d.ts +2 -2
- package/ts4.1/index.d.ts +1 -0
- package/ts4.1/paramsToString.d.ts +1 -1
- package/ts4.1/paramsToString.native.d.ts +1 -1
package/src/OptionsToFunction.ts
CHANGED
|
@@ -7,30 +7,31 @@ export type OptionsToFunction<
|
|
|
7
7
|
O extends PartialRestGenerics,
|
|
8
8
|
E extends { body?: any; path?: string; method?: string },
|
|
9
9
|
F extends FetchFunction,
|
|
10
|
-
> =
|
|
11
|
-
?
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
> =
|
|
11
|
+
'path' extends keyof O ?
|
|
12
|
+
RestFetch<
|
|
13
|
+
'searchParams' extends keyof O ?
|
|
14
|
+
O['searchParams'] & PathArgs<Exclude<O['path'], undefined>>
|
|
15
|
+
: PathArgs<Exclude<O['path'], undefined>>,
|
|
15
16
|
OptionsToBodyArgument<
|
|
16
17
|
'body' extends keyof O ? O : E,
|
|
17
18
|
'method' extends keyof O ? O['method'] : E['method']
|
|
18
19
|
>,
|
|
19
20
|
O['process'] extends {} ? ReturnType<O['process']> : ResolveType<F>
|
|
20
21
|
>
|
|
21
|
-
: 'body' extends keyof O
|
|
22
|
-
|
|
23
|
-
'searchParams' extends keyof O
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
: 'body' extends keyof O ?
|
|
23
|
+
RestFetch<
|
|
24
|
+
'searchParams' extends keyof O ?
|
|
25
|
+
O['searchParams'] & PathArgs<Exclude<E['path'], undefined>>
|
|
26
|
+
: PathArgs<Exclude<E['path'], undefined>>,
|
|
26
27
|
OptionsToBodyArgument<
|
|
27
28
|
O,
|
|
28
29
|
'method' extends keyof O ? O['method'] : E['method']
|
|
29
30
|
>,
|
|
30
31
|
O['process'] extends {} ? ReturnType<O['process']> : ResolveType<F>
|
|
31
32
|
>
|
|
32
|
-
: 'searchParams' extends keyof O
|
|
33
|
-
|
|
33
|
+
: 'searchParams' extends keyof O ?
|
|
34
|
+
RestFetch<
|
|
34
35
|
O['searchParams'] & PathArgs<Exclude<E['path'], undefined>>,
|
|
35
36
|
OptionsToBodyArgument<
|
|
36
37
|
E,
|
|
@@ -48,8 +49,9 @@ export type OptionsToFunction<
|
|
|
48
49
|
export type OptionsToBodyArgument<
|
|
49
50
|
O extends { body?: any },
|
|
50
51
|
Method extends string | undefined,
|
|
51
|
-
> =
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
> =
|
|
53
|
+
Method extends 'POST' | 'PUT' | 'PATCH' | 'DELETE' ?
|
|
54
|
+
'body' extends keyof O ?
|
|
55
|
+
O['body']
|
|
54
56
|
: any
|
|
55
57
|
: undefined;
|
package/src/RestEndpoint.js
CHANGED
|
@@ -36,9 +36,9 @@ export default class RestEndpoint extends Endpoint {
|
|
|
36
36
|
('method' in options && !('sideEffect' in options))
|
|
37
37
|
) {
|
|
38
38
|
this.sideEffect =
|
|
39
|
-
options.method === 'GET' || options.method === undefined
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
options.method === 'GET' || options.method === undefined ?
|
|
40
|
+
undefined
|
|
41
|
+
: true;
|
|
42
42
|
}
|
|
43
43
|
if (this.method === undefined) {
|
|
44
44
|
this.method = this.sideEffect ? 'POST' : 'GET';
|
|
@@ -76,11 +76,16 @@ export default class RestEndpoint extends Endpoint {
|
|
|
76
76
|
}
|
|
77
77
|
});
|
|
78
78
|
if (Object.keys(searchParams).length) {
|
|
79
|
-
return `${this.urlPrefix}${urlBase}?${
|
|
79
|
+
return `${this.urlPrefix}${urlBase}?${this.searchToString(searchParams)}`;
|
|
80
80
|
}
|
|
81
81
|
return `${this.urlPrefix}${urlBase}`;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
/** Encode the url searchParams */
|
|
85
|
+
searchToString(searchParams) {
|
|
86
|
+
return paramsToString(searchParams);
|
|
87
|
+
}
|
|
88
|
+
|
|
84
89
|
getHeaders(headers) {
|
|
85
90
|
return headers;
|
|
86
91
|
}
|
|
@@ -15,6 +15,5 @@ export type EndpointUpdateFunction<
|
|
|
15
15
|
[K in keyof Updaters]: (result: Updaters[K]) => Updaters[K];
|
|
16
16
|
};
|
|
17
17
|
export type ResultEntry<E extends FetchFunction & { schema: any }> =
|
|
18
|
-
E['schema'] extends undefined | null
|
|
19
|
-
|
|
20
|
-
: Normalize<E['schema']>;
|
|
18
|
+
E['schema'] extends undefined | null ? ResolveType<E>
|
|
19
|
+
: Normalize<E['schema']>;
|
package/src/RestEndpointTypes.ts
CHANGED
|
@@ -29,10 +29,9 @@ export interface RestInstanceBase<
|
|
|
29
29
|
/** @see https://dataclient.io/rest/api/RestEndpoint#body */
|
|
30
30
|
readonly body?: 'body' extends keyof O ? O['body'] : any;
|
|
31
31
|
/** @see https://dataclient.io/rest/api/RestEndpoint#searchParams */
|
|
32
|
-
readonly searchParams?: 'searchParams' extends keyof O
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
unknown;
|
|
32
|
+
readonly searchParams?: 'searchParams' extends keyof O ? O['searchParams']
|
|
33
|
+
: // unknown is identity with '&' type operator
|
|
34
|
+
unknown;
|
|
36
35
|
|
|
37
36
|
/** Pattern to construct url based on Url Parameters
|
|
38
37
|
* @see https://dataclient.io/rest/api/RestEndpoint#path
|
|
@@ -43,31 +42,53 @@ export interface RestInstanceBase<
|
|
|
43
42
|
*/
|
|
44
43
|
readonly urlPrefix: string;
|
|
45
44
|
readonly requestInit: RequestInit;
|
|
46
|
-
/**
|
|
45
|
+
/** HTTP request method
|
|
46
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#method
|
|
47
|
+
*/
|
|
47
48
|
readonly method: (O & { method: string })['method'];
|
|
48
49
|
readonly signal: AbortSignal | undefined;
|
|
50
|
+
/** @see https://dataclient.io/rest/api/RestEndpoint#paginationField */
|
|
49
51
|
readonly paginationField?: string;
|
|
50
52
|
|
|
51
53
|
/* fetch lifecycles */
|
|
52
54
|
/* before-fetch */
|
|
55
|
+
/** Builds the URL to fetch
|
|
56
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#url
|
|
57
|
+
*/
|
|
53
58
|
url(...args: Parameters<F>): string;
|
|
54
|
-
/**
|
|
59
|
+
/** Encode the searchParams component of the url
|
|
60
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#searchToString
|
|
61
|
+
*/
|
|
62
|
+
searchToString(searchParams: Record<string, any>): string;
|
|
63
|
+
/** Prepares RequestInit used in fetch. This is sent to fetchResponse()
|
|
64
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#getRequestInit
|
|
65
|
+
*/
|
|
55
66
|
getRequestInit(
|
|
56
67
|
this: any,
|
|
57
68
|
body?: RequestInit['body'] | Record<string, unknown>,
|
|
58
69
|
): Promise<RequestInit> | RequestInit;
|
|
59
|
-
/**
|
|
70
|
+
/** Called by getRequestInit to determine HTTP Headers
|
|
71
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#getHeaders
|
|
72
|
+
*/
|
|
60
73
|
getHeaders(headers: HeadersInit): Promise<HeadersInit> | HeadersInit;
|
|
61
74
|
/* after-fetch */
|
|
62
|
-
/**
|
|
75
|
+
/** Performs the fetch call
|
|
76
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#fetchResponse
|
|
77
|
+
*/
|
|
63
78
|
fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
|
|
64
|
-
/**
|
|
79
|
+
/** Takes the Response and parses via .text() or .json()
|
|
80
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#parseResponse
|
|
81
|
+
*/
|
|
65
82
|
parseResponse(response: Response): Promise<any>;
|
|
66
|
-
/**
|
|
83
|
+
/** Perform any transforms with the parsed result.
|
|
84
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#process
|
|
85
|
+
*/
|
|
67
86
|
process(value: any, ...args: Parameters<F>): ResolveType<F>;
|
|
68
87
|
|
|
69
88
|
/* utilities */
|
|
70
|
-
/**
|
|
89
|
+
/** Returns true if the provided (fetch) key matches this endpoint.
|
|
90
|
+
* @see https://dataclient.io/rest/api/RestEndpoint#testKey
|
|
91
|
+
*/
|
|
71
92
|
testKey(key: string): boolean;
|
|
72
93
|
|
|
73
94
|
/* extenders */
|
|
@@ -121,14 +142,14 @@ export interface RestInstance<
|
|
|
121
142
|
/** Endpoint to append the next page extending a list for pagination
|
|
122
143
|
* @see https://dataclient.io/rest/api/RestEndpoint#getPage
|
|
123
144
|
*/
|
|
124
|
-
getPage: 'paginationField' extends keyof O
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
145
|
+
getPage: 'paginationField' extends keyof O ?
|
|
146
|
+
O['paginationField'] extends string ?
|
|
147
|
+
PaginationFieldEndpoint<
|
|
148
|
+
F & { schema: S; sideEffect: M } & O,
|
|
149
|
+
O['paginationField']
|
|
150
|
+
>
|
|
151
|
+
: undefined
|
|
152
|
+
: undefined;
|
|
132
153
|
/** Endpoint that pushes (place at end) a newly created entity to this Collection
|
|
133
154
|
* @see https://dataclient.io/rest/api/RestEndpoint#push
|
|
134
155
|
*/
|
|
@@ -173,9 +194,8 @@ export type RestEndpointExtendOptions<
|
|
|
173
194
|
F extends FetchFunction,
|
|
174
195
|
> = RestEndpointOptions<
|
|
175
196
|
OptionsToFunction<O, E, F>,
|
|
176
|
-
'schema' extends keyof O
|
|
177
|
-
|
|
178
|
-
: E['schema']
|
|
197
|
+
'schema' extends keyof O ? Extract<O['schema'], Schema | undefined>
|
|
198
|
+
: E['schema']
|
|
179
199
|
> &
|
|
180
200
|
Partial<
|
|
181
201
|
Omit<
|
|
@@ -188,13 +208,14 @@ type OptionsToRestEndpoint<
|
|
|
188
208
|
O extends PartialRestGenerics,
|
|
189
209
|
E extends RestInstanceBase & { body?: any; paginationField?: string },
|
|
190
210
|
F extends FetchFunction,
|
|
191
|
-
> =
|
|
192
|
-
?
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
: PathArgs<Exclude<O['path'], undefined
|
|
211
|
+
> =
|
|
212
|
+
'path' extends keyof O ?
|
|
213
|
+
RestType<
|
|
214
|
+
'searchParams' extends keyof O ?
|
|
215
|
+
O['searchParams'] extends undefined ?
|
|
216
|
+
PathArgs<Exclude<O['path'], undefined>>
|
|
217
|
+
: O['searchParams'] & PathArgs<Exclude<O['path'], undefined>>
|
|
218
|
+
: PathArgs<Exclude<O['path'], undefined>>,
|
|
198
219
|
OptionsToBodyArgument<
|
|
199
220
|
'body' extends keyof O ? O : E,
|
|
200
221
|
'method' extends keyof O ? O['method'] : E['method']
|
|
@@ -205,22 +226,21 @@ type OptionsToRestEndpoint<
|
|
|
205
226
|
{
|
|
206
227
|
path: Exclude<O['path'], undefined>;
|
|
207
228
|
body: 'body' extends keyof O ? O['body'] : E['body'];
|
|
208
|
-
searchParams: 'searchParams' extends keyof O
|
|
209
|
-
|
|
210
|
-
: E['searchParams'];
|
|
229
|
+
searchParams: 'searchParams' extends keyof O ? O['searchParams']
|
|
230
|
+
: E['searchParams'];
|
|
211
231
|
method: 'method' extends keyof O ? O['method'] : E['method'];
|
|
212
|
-
paginationField: 'paginationField' extends keyof O
|
|
213
|
-
|
|
214
|
-
|
|
232
|
+
paginationField: 'paginationField' extends keyof O ?
|
|
233
|
+
O['paginationField']
|
|
234
|
+
: E['paginationField'];
|
|
215
235
|
}
|
|
216
236
|
>
|
|
217
|
-
: 'body' extends keyof O
|
|
218
|
-
|
|
219
|
-
'searchParams' extends keyof O
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
237
|
+
: 'body' extends keyof O ?
|
|
238
|
+
RestType<
|
|
239
|
+
'searchParams' extends keyof O ?
|
|
240
|
+
O['searchParams'] extends undefined ?
|
|
241
|
+
PathArgs<Exclude<O['path'], undefined>>
|
|
242
|
+
: O['searchParams'] & PathArgs<Exclude<E['path'], undefined>>
|
|
243
|
+
: PathArgs<Exclude<E['path'], undefined>>,
|
|
224
244
|
OptionsToBodyArgument<
|
|
225
245
|
O,
|
|
226
246
|
'method' extends keyof O ? O['method'] : E['method']
|
|
@@ -231,20 +251,19 @@ type OptionsToRestEndpoint<
|
|
|
231
251
|
{
|
|
232
252
|
path: E['path'];
|
|
233
253
|
body: O['body'];
|
|
234
|
-
searchParams: 'searchParams' extends keyof O
|
|
235
|
-
|
|
236
|
-
: E['searchParams'];
|
|
254
|
+
searchParams: 'searchParams' extends keyof O ? O['searchParams']
|
|
255
|
+
: E['searchParams'];
|
|
237
256
|
method: 'method' extends keyof O ? O['method'] : E['method'];
|
|
238
|
-
paginationField: 'paginationField' extends keyof O
|
|
239
|
-
|
|
240
|
-
|
|
257
|
+
paginationField: 'paginationField' extends keyof O ?
|
|
258
|
+
O['paginationField']
|
|
259
|
+
: Extract<E['paginationField'], string>;
|
|
241
260
|
}
|
|
242
261
|
>
|
|
243
|
-
: 'searchParams' extends keyof O
|
|
244
|
-
|
|
245
|
-
O['searchParams'] extends undefined
|
|
246
|
-
|
|
247
|
-
|
|
262
|
+
: 'searchParams' extends keyof O ?
|
|
263
|
+
RestType<
|
|
264
|
+
O['searchParams'] extends undefined ?
|
|
265
|
+
PathArgs<Exclude<O['path'], undefined>>
|
|
266
|
+
: O['searchParams'] & PathArgs<Exclude<E['path'], undefined>>,
|
|
248
267
|
OptionsToBodyArgument<
|
|
249
268
|
E,
|
|
250
269
|
'method' extends keyof O ? O['method'] : E['method']
|
|
@@ -257,9 +276,9 @@ type OptionsToRestEndpoint<
|
|
|
257
276
|
body: E['body'];
|
|
258
277
|
searchParams: O['searchParams'];
|
|
259
278
|
method: 'method' extends keyof O ? O['method'] : E['method'];
|
|
260
|
-
paginationField: 'paginationField' extends keyof O
|
|
261
|
-
|
|
262
|
-
|
|
279
|
+
paginationField: 'paginationField' extends keyof O ?
|
|
280
|
+
O['paginationField']
|
|
281
|
+
: Extract<E['paginationField'], string>;
|
|
263
282
|
}
|
|
264
283
|
>
|
|
265
284
|
: RestInstance<
|
|
@@ -267,17 +286,15 @@ type OptionsToRestEndpoint<
|
|
|
267
286
|
'schema' extends keyof O ? O['schema'] : E['schema'],
|
|
268
287
|
'method' extends keyof O ? MethodToSide<O['method']> : E['sideEffect'],
|
|
269
288
|
{
|
|
270
|
-
path: 'path' extends keyof O
|
|
271
|
-
|
|
272
|
-
: E['path'];
|
|
289
|
+
path: 'path' extends keyof O ? Exclude<O['path'], undefined>
|
|
290
|
+
: E['path'];
|
|
273
291
|
body: 'body' extends keyof O ? O['body'] : E['body'];
|
|
274
|
-
searchParams: 'searchParams' extends keyof O
|
|
275
|
-
|
|
276
|
-
: E['searchParams'];
|
|
292
|
+
searchParams: 'searchParams' extends keyof O ? O['searchParams']
|
|
293
|
+
: E['searchParams'];
|
|
277
294
|
method: 'method' extends keyof O ? O['method'] : E['method'];
|
|
278
|
-
paginationField: 'paginationField' extends keyof O
|
|
279
|
-
|
|
280
|
-
|
|
295
|
+
paginationField: 'paginationField' extends keyof O ?
|
|
296
|
+
O['paginationField']
|
|
297
|
+
: E['paginationField'];
|
|
281
298
|
}
|
|
282
299
|
>;
|
|
283
300
|
|
|
@@ -287,15 +304,14 @@ export type RestExtendedEndpoint<
|
|
|
287
304
|
> = OptionsToRestEndpoint<
|
|
288
305
|
O,
|
|
289
306
|
E &
|
|
290
|
-
(E extends { getPage: { paginationField: string } }
|
|
291
|
-
|
|
292
|
-
|
|
307
|
+
(E extends { getPage: { paginationField: string } } ?
|
|
308
|
+
{ paginationField: E['getPage']['paginationField'] }
|
|
309
|
+
: unknown),
|
|
293
310
|
RestInstance<
|
|
294
311
|
(
|
|
295
312
|
...args: Parameters<E>
|
|
296
|
-
) => O['process'] extends {}
|
|
297
|
-
|
|
298
|
-
: ReturnType<E>,
|
|
313
|
+
) => O['process'] extends {} ? Promise<ReturnType<O['process']>>
|
|
314
|
+
: ReturnType<E>,
|
|
299
315
|
'schema' extends keyof O ? O['schema'] : E['schema'],
|
|
300
316
|
'method' extends keyof O ? MethodToSide<O['method']> : E['sideEffect']
|
|
301
317
|
>
|
|
@@ -361,11 +377,11 @@ export type AddEndpoint<
|
|
|
361
377
|
} = { path: string; body: any },
|
|
362
378
|
> = RestInstanceBase<
|
|
363
379
|
RestFetch<
|
|
364
|
-
'searchParams' extends keyof O
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
380
|
+
'searchParams' extends keyof O ?
|
|
381
|
+
O['searchParams'] extends undefined ?
|
|
382
|
+
PathArgs<Exclude<O['path'], undefined>>
|
|
383
|
+
: O['searchParams'] & PathArgs<Exclude<O['path'], undefined>>
|
|
384
|
+
: PathArgs<Exclude<O['path'], undefined>>,
|
|
369
385
|
O['body'],
|
|
370
386
|
ResolveType<F>
|
|
371
387
|
>,
|
|
@@ -374,10 +390,9 @@ export type AddEndpoint<
|
|
|
374
390
|
Omit<O, 'method'> & { method: 'POST' }
|
|
375
391
|
>;
|
|
376
392
|
|
|
377
|
-
type OptionsBodyDefault<O extends RestGenerics> =
|
|
378
|
-
? O
|
|
379
|
-
: O['method'] extends 'POST' | 'PUT' | 'PATCH'
|
|
380
|
-
? O & { body: any }
|
|
393
|
+
type OptionsBodyDefault<O extends RestGenerics> =
|
|
394
|
+
'body' extends keyof O ? O
|
|
395
|
+
: O['method'] extends 'POST' | 'PUT' | 'PATCH' ? O & { body: any }
|
|
381
396
|
: O & { body: undefined };
|
|
382
397
|
|
|
383
398
|
type OptionsToAdderBodyArgument<O extends { body?: any }> =
|
|
@@ -406,22 +421,19 @@ export interface RestEndpointOptions<
|
|
|
406
421
|
export type RestEndpointConstructorOptions<O extends RestGenerics = any> =
|
|
407
422
|
RestEndpointOptions<
|
|
408
423
|
RestFetch<
|
|
409
|
-
'searchParams' extends keyof O
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
424
|
+
'searchParams' extends keyof O ?
|
|
425
|
+
O['searchParams'] extends undefined ?
|
|
426
|
+
PathArgs<O['path']>
|
|
427
|
+
: O['searchParams'] & PathArgs<O['path']>
|
|
428
|
+
: PathArgs<O['path']>,
|
|
414
429
|
OptionsToBodyArgument<
|
|
415
430
|
O,
|
|
416
|
-
'method' extends keyof O
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
? 'POST'
|
|
420
|
-
: 'GET'
|
|
431
|
+
'method' extends keyof O ? O['method']
|
|
432
|
+
: O extends { sideEffect: true } ? 'POST'
|
|
433
|
+
: 'GET'
|
|
421
434
|
>,
|
|
422
|
-
O['process'] extends {}
|
|
423
|
-
|
|
424
|
-
: any /*Denormalize<O['schema']>*/
|
|
435
|
+
O['process'] extends {} ? ReturnType<O['process']>
|
|
436
|
+
: any /*Denormalize<O['schema']>*/
|
|
425
437
|
>,
|
|
426
438
|
O['schema']
|
|
427
439
|
>;
|
|
@@ -434,39 +446,35 @@ export interface RestEndpointConstructor {
|
|
|
434
446
|
...options
|
|
435
447
|
}: RestEndpointConstructorOptions<O> & Readonly<O>): RestInstance<
|
|
436
448
|
RestFetch<
|
|
437
|
-
'searchParams' extends keyof O
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
449
|
+
'searchParams' extends keyof O ?
|
|
450
|
+
O['searchParams'] extends undefined ?
|
|
451
|
+
PathArgs<O['path']>
|
|
452
|
+
: O['searchParams'] & PathArgs<O['path']>
|
|
453
|
+
: PathArgs<O['path']>,
|
|
442
454
|
OptionsToBodyArgument<
|
|
443
455
|
O,
|
|
444
|
-
'method' extends keyof O
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
? 'POST'
|
|
448
|
-
: 'GET'
|
|
456
|
+
'method' extends keyof O ? O['method']
|
|
457
|
+
: O extends { sideEffect: true } ? 'POST'
|
|
458
|
+
: 'GET'
|
|
449
459
|
>,
|
|
450
|
-
O['process'] extends {}
|
|
451
|
-
|
|
452
|
-
: any /*Denormalize<O['schema']>*/
|
|
460
|
+
O['process'] extends {} ? ReturnType<O['process']>
|
|
461
|
+
: any /*Denormalize<O['schema']>*/
|
|
453
462
|
>,
|
|
454
463
|
'schema' extends keyof O ? O['schema'] : undefined,
|
|
455
|
-
'sideEffect' extends keyof O
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
method: O extends { sideEffect: true } ? 'POST' : 'GET';
|
|
462
|
-
}
|
|
464
|
+
'sideEffect' extends keyof O ? Extract<O['sideEffect'], undefined | true>
|
|
465
|
+
: MethodToSide<O['method']>,
|
|
466
|
+
'method' extends keyof O ? O
|
|
467
|
+
: O & {
|
|
468
|
+
method: O extends { sideEffect: true } ? 'POST' : 'GET';
|
|
469
|
+
}
|
|
463
470
|
>;
|
|
464
471
|
readonly prototype: RestInstanceBase;
|
|
465
472
|
}
|
|
466
473
|
|
|
467
|
-
export type MethodToSide<M> =
|
|
468
|
-
|
|
469
|
-
?
|
|
474
|
+
export type MethodToSide<M> =
|
|
475
|
+
M extends string ?
|
|
476
|
+
M extends 'GET' ?
|
|
477
|
+
undefined
|
|
470
478
|
: true
|
|
471
479
|
: undefined;
|
|
472
480
|
|
|
@@ -486,29 +494,27 @@ export type RestType<
|
|
|
486
494
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
487
495
|
> = IfTypeScriptLooseNull<
|
|
488
496
|
RestInstance<
|
|
489
|
-
keyof UrlParams extends never
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
| ((
|
|
496
|
-
this: EndpointInstanceInterface,
|
|
497
|
-
params: UrlParams,
|
|
498
|
-
body?: Body,
|
|
499
|
-
) => Promise<R>)
|
|
500
|
-
: (
|
|
497
|
+
keyof UrlParams extends never ?
|
|
498
|
+
(this: EndpointInstanceInterface, body?: Body) => Promise<R>
|
|
499
|
+
: // even with loose null, this will only be true when all members are optional
|
|
500
|
+
{} extends UrlParams ?
|
|
501
|
+
| ((this: EndpointInstanceInterface, body?: Body) => Promise<R>)
|
|
502
|
+
| ((
|
|
501
503
|
this: EndpointInstanceInterface,
|
|
502
504
|
params: UrlParams,
|
|
503
505
|
body?: Body,
|
|
504
|
-
) => Promise<R
|
|
506
|
+
) => Promise<R>)
|
|
507
|
+
: (
|
|
508
|
+
this: EndpointInstanceInterface,
|
|
509
|
+
params: UrlParams,
|
|
510
|
+
body?: Body,
|
|
511
|
+
) => Promise<R>,
|
|
505
512
|
S,
|
|
506
513
|
M,
|
|
507
514
|
O
|
|
508
515
|
>,
|
|
509
|
-
Body extends {}
|
|
510
|
-
|
|
511
|
-
: RestTypeNoBody<UrlParams, S, M, R, O>
|
|
516
|
+
Body extends {} ? RestTypeWithBody<UrlParams, S, M, Body, R, O>
|
|
517
|
+
: RestTypeNoBody<UrlParams, S, M, R, O>
|
|
512
518
|
>;
|
|
513
519
|
|
|
514
520
|
export type RestTypeWithBody<
|
|
@@ -545,50 +551,40 @@ export type RestFetch<
|
|
|
545
551
|
> = IfTypeScriptLooseNull<
|
|
546
552
|
| ParamFetchNoBody<UrlParams, Resolve>
|
|
547
553
|
| ParamFetchWithBody<UrlParams, Body, Resolve>,
|
|
548
|
-
Body extends {}
|
|
549
|
-
|
|
550
|
-
: ParamFetchNoBody<UrlParams, Resolve>
|
|
554
|
+
Body extends {} ? ParamFetchWithBody<UrlParams, Body, Resolve>
|
|
555
|
+
: ParamFetchNoBody<UrlParams, Resolve>
|
|
551
556
|
>;
|
|
552
557
|
|
|
553
558
|
export type ParamFetchWithBody<P, B = {}, R = any> =
|
|
554
559
|
// we must always allow undefined in a union and give it a type without params
|
|
555
|
-
P extends undefined
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
:
|
|
563
|
-
|
|
564
|
-
this: EndpointInstanceInterface,
|
|
565
|
-
params: P,
|
|
566
|
-
body: B,
|
|
567
|
-
) => Promise<R>)
|
|
568
|
-
| ((this: EndpointInstanceInterface, body: B) => Promise<R>)
|
|
569
|
-
: (this: EndpointInstanceInterface, params: P, body: B) => Promise<R>;
|
|
560
|
+
P extends undefined ? (this: EndpointInstanceInterface, body: B) => Promise<R>
|
|
561
|
+
: // even with loose null, this will only be true when all members are optional
|
|
562
|
+
{} extends P ?
|
|
563
|
+
// this safely handles PathArgs with no members that results in a simple `unknown` type
|
|
564
|
+
keyof P extends never ?
|
|
565
|
+
(this: EndpointInstanceInterface, body: B) => Promise<R>
|
|
566
|
+
: | ((this: EndpointInstanceInterface, params: P, body: B) => Promise<R>)
|
|
567
|
+
| ((this: EndpointInstanceInterface, body: B) => Promise<R>)
|
|
568
|
+
: (this: EndpointInstanceInterface, params: P, body: B) => Promise<R>;
|
|
570
569
|
|
|
571
570
|
export type ParamFetchNoBody<P, R = any> =
|
|
572
571
|
// we must always allow undefined in a union and give it a type without params
|
|
573
|
-
P extends undefined
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
:
|
|
581
|
-
|
|
582
|
-
| ((this: EndpointInstanceInterface) => Promise<R>)
|
|
583
|
-
: (this: EndpointInstanceInterface, params: P) => Promise<R>;
|
|
572
|
+
P extends undefined ? (this: EndpointInstanceInterface) => Promise<R>
|
|
573
|
+
: // even with loose null, this will only be true when all members are optional
|
|
574
|
+
{} extends P ?
|
|
575
|
+
// this safely handles PathArgs with no members that results in a simple `unknown` type
|
|
576
|
+
keyof P extends never ?
|
|
577
|
+
(this: EndpointInstanceInterface) => Promise<R>
|
|
578
|
+
: | ((this: EndpointInstanceInterface, params: P) => Promise<R>)
|
|
579
|
+
| ((this: EndpointInstanceInterface) => Promise<R>)
|
|
580
|
+
: (this: EndpointInstanceInterface, params: P) => Promise<R>;
|
|
584
581
|
|
|
585
582
|
type IfTypeScriptLooseNull<Y, N> = 1 | undefined extends 1 ? Y : N;
|
|
586
583
|
|
|
587
584
|
export type KeyofRestEndpoint = keyof RestInstance;
|
|
588
585
|
|
|
589
|
-
export type FromFallBack<K extends keyof E, O, E> =
|
|
590
|
-
? O[K]
|
|
591
|
-
: E[K];
|
|
586
|
+
export type FromFallBack<K extends keyof E, O, E> =
|
|
587
|
+
K extends keyof O ? O[K] : E[K];
|
|
592
588
|
|
|
593
589
|
export type FetchMutate<
|
|
594
590
|
A extends readonly any[] = // eslint-disable-next-line @typescript-eslint/ban-types
|
|
@@ -604,9 +600,8 @@ export type FetchGet<A extends readonly any[] = [any], R = any> = (
|
|
|
604
600
|
) => Promise<R>;
|
|
605
601
|
|
|
606
602
|
export type Defaults<O, D> = {
|
|
607
|
-
[K in keyof O | keyof D]: K extends keyof O
|
|
608
|
-
|
|
609
|
-
: D[Extract<K, keyof D>];
|
|
603
|
+
[K in keyof O | keyof D]: K extends keyof O ? Exclude<O[K], undefined>
|
|
604
|
+
: D[Extract<K, keyof D>];
|
|
610
605
|
};
|
|
611
606
|
|
|
612
607
|
export type GetEndpoint<
|
|
@@ -621,11 +616,11 @@ export type GetEndpoint<
|
|
|
621
616
|
schema: Schema;
|
|
622
617
|
},
|
|
623
618
|
> = RestTypeNoBody<
|
|
624
|
-
'searchParams' extends keyof O
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
619
|
+
'searchParams' extends keyof O ?
|
|
620
|
+
O['searchParams'] extends undefined ?
|
|
621
|
+
PathArgs<O['path']>
|
|
622
|
+
: O['searchParams'] & PathArgs<O['path']>
|
|
623
|
+
: PathArgs<O['path']>,
|
|
629
624
|
O['schema'],
|
|
630
625
|
undefined,
|
|
631
626
|
any,
|
|
@@ -646,11 +641,11 @@ export type MutateEndpoint<
|
|
|
646
641
|
schema: Schema;
|
|
647
642
|
},
|
|
648
643
|
> = RestTypeWithBody<
|
|
649
|
-
'searchParams' extends keyof O
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
644
|
+
'searchParams' extends keyof O ?
|
|
645
|
+
O['searchParams'] extends undefined ?
|
|
646
|
+
PathArgs<O['path']>
|
|
647
|
+
: O['searchParams'] & PathArgs<O['path']>
|
|
648
|
+
: PathArgs<O['path']>,
|
|
654
649
|
O['schema'],
|
|
655
650
|
true,
|
|
656
651
|
O['body'],
|