@rvoh/psychic-spec-helpers 0.7.2 → 0.7.4

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.
@@ -1,11 +1,11 @@
1
1
  import { IdType } from '@rvoh/dream'
2
2
  import fillOpenapiParams from './helpers/fillOpenapiParams.js'
3
3
  import {
4
- ExcludeNever,
5
4
  ExtractOpenapiParams,
6
- First,
7
- GetOpenapiUrl,
8
- GetResolvedOpenapiUrl,
5
+ RequestBody,
6
+ RequestQueryParameters,
7
+ ResponseBody,
8
+ ResponseCodeForUri,
9
9
  RoutesWithHttpMethod,
10
10
  } from './helpers/openapiTypeHelpers.js'
11
11
  import {
@@ -13,44 +13,24 @@ import {
13
13
  OpenapiSpecRequestOptsPost,
14
14
  OpenapiSpecResponse,
15
15
  } from './OpenapiSpecRequest.js'
16
- import supersession from './supersession.js'
17
16
  import { SpecRequestOptsAll } from './SpecRequest.js'
17
+ import supersession from './supersession.js'
18
18
 
19
19
  // like SpecRequest, but meant to be bound to an instance
20
20
  // of supersession, enabling chained requests to collect cookies
21
21
  export class OpenapiSpecSession<OpenapiPaths> {
22
22
  constructor(private _session: ReturnType<typeof supersession>) {}
23
23
 
24
- //
25
- //
26
- //
27
- // begin: GET
28
- // has Params
29
24
  public async get<
30
25
  const Uri extends RoutesWithHttpMethod<
31
26
  OpenapiPaths,
32
27
  'get' & keyof OpenapiPaths[keyof OpenapiPaths]
33
28
  > &
34
29
  string,
35
- const ResponseCode extends keyof ResponseMap & number,
36
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
37
- ResponseMap extends HttpMethodMap['get' & keyof HttpMethodMap]['responses' &
38
- keyof HttpMethodMap['get' & keyof HttpMethodMap]],
39
- ParametersMap extends HttpMethodMap['get' & keyof HttpMethodMap]['parameters' &
40
- keyof HttpMethodMap['get' & keyof HttpMethodMap]],
41
- QueryMap extends ParametersMap['query' & keyof ParametersMap],
30
+ const ResponseCode extends ResponseCodeForUri<OpenapiPaths, Uri, 'get'>,
42
31
  Params extends string[] & ExtractOpenapiParams<Uri>,
43
- Content extends ResponseMap extends undefined
44
- ? undefined
45
- : ResponseCode extends undefined
46
- ? undefined
47
- : ResponseCode extends number
48
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
49
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
50
- : undefined,
51
- JsonContent extends Content extends undefined
52
- ? undefined
53
- : Content['application/json' & keyof Content],
32
+ Query extends OpenapiSpecRequestOptsGet<RequestQueryParameters<OpenapiPaths, 'get', Uri>>,
33
+ JsonContent extends ResponseBody<OpenapiPaths, 'get', Uri, ResponseCode>,
54
34
  >(
55
35
  /**
56
36
  * The uri on your background you are trying to hit.
@@ -106,118 +86,7 @@ export class OpenapiSpecSession<OpenapiPaths> {
106
86
  * @param opts.headers - headers you would like to send with your request.
107
87
  * (Optional)
108
88
  */
109
- opts: Params['length'] extends 0
110
- ? never
111
- : OpenapiSpecRequestOptsGet<QueryMap> & { [K in Params[number]]: string | IdType }
112
- ): Promise<OpenapiSpecResponse<JsonContent>>
113
- // doesn't have Params
114
- public async get<
115
- const Uri extends RoutesWithHttpMethod<
116
- OpenapiPaths,
117
- 'get' & keyof OpenapiPaths[keyof OpenapiPaths]
118
- > &
119
- string,
120
- const ResponseCode extends Params['length'] extends 0
121
- ? keyof ExcludeNever<ResponseMap> & number
122
- : never,
123
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
124
- ResponseMap extends HttpMethodMap['get' & keyof HttpMethodMap]['responses' &
125
- keyof HttpMethodMap['get' & keyof HttpMethodMap]],
126
- ParametersMap extends HttpMethodMap['get' & keyof HttpMethodMap]['parameters' &
127
- keyof HttpMethodMap['get' & keyof HttpMethodMap]],
128
- QueryMap extends ParametersMap['query' & keyof ParametersMap],
129
- Params extends string[] & ExtractOpenapiParams<Uri>,
130
- Content extends ResponseMap extends undefined
131
- ? undefined
132
- : ResponseCode extends undefined
133
- ? undefined
134
- : ResponseCode extends number
135
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
136
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
137
- : undefined,
138
- JsonContent extends Content extends undefined
139
- ? undefined
140
- : Content['application/json' & keyof Content],
141
- >(
142
- /**
143
- * The uri on your background you are trying to hit.
144
- * This should be a path, like '/users'.
145
- *
146
- * ```ts
147
- * const request = new OpenapiSpecRequest<openapiPaths>()
148
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
149
- * const res = await session.get('/user', 200)
150
- * ```
151
- */
152
- uri: Uri,
153
-
154
- /**
155
- * The response status you are expecting to receive
156
- * when making this request. It will need to match
157
- * one of the accepted response statuses for the
158
- * provided uri in your openapi types
159
- *
160
- * ```ts
161
- * const request = new OpenapiSpecRequest<openapiPaths>()
162
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
163
- * const res = await session.get('/user', 200)
164
- * ```
165
- */
166
- expectedStatus: ResponseCode,
167
-
168
- /**
169
- * Query params, headers, and other options to send with
170
- * your request.
171
- *
172
- * ```ts
173
- * const request = new OpenapiSpecRequest<openapiPaths>()
174
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
175
- * const res = await session.get(
176
- * '/user',
177
- * 200,
178
- * {
179
- * query: {
180
- * ...query params here
181
- * }
182
- * }
183
- * )
184
- * ```
185
- *
186
- * @param opts.query - query params you want to send up. Must match the
187
- * query params in the openapi document for this uri.
188
- * (Optional)
189
- *
190
- * @param opts.headers - headers you would like to send with your request.
191
- * (Optional)
192
- */
193
- opts?: OpenapiSpecRequestOptsGet<QueryMap>
194
- ): Promise<OpenapiSpecResponse<JsonContent>>
195
- // final
196
- public async get<
197
- const Uri extends RoutesWithHttpMethod<
198
- OpenapiPaths,
199
- 'get' & keyof OpenapiPaths[keyof OpenapiPaths]
200
- > &
201
- string,
202
- const ResponseCode extends keyof ExcludeNever<ResponseMap> & number,
203
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
204
- ResponseMap extends HttpMethodMap['get' & keyof HttpMethodMap]['responses' &
205
- keyof HttpMethodMap['get' & keyof HttpMethodMap]],
206
- Content extends ResponseMap extends undefined
207
- ? undefined
208
- : ResponseCode extends undefined
209
- ? undefined
210
- : ResponseCode extends number
211
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
212
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
213
- : undefined,
214
- JsonContent extends Content extends undefined
215
- ? undefined
216
- : Content['application/json' & keyof Content],
217
- >(
218
- uri: Uri,
219
- expectedStatus: ResponseCode,
220
- opts: unknown
89
+ opts?: Params['length'] extends 0 ? Query : Query & { [K in Params[number]]: string | IdType }
221
90
  ): Promise<OpenapiSpecResponse<JsonContent>> {
222
91
  return (await this.makeRequest(
223
92
  'get',
@@ -238,33 +107,10 @@ export class OpenapiSpecSession<OpenapiPaths> {
238
107
  'post' & keyof OpenapiPaths[keyof OpenapiPaths]
239
108
  > &
240
109
  string,
241
- const ResponseCode extends Params['length'] extends 0
242
- ? never
243
- : keyof ExcludeNever<ResponseMap> & number,
244
- HttpMethodMap extends OpenapiPaths[ResolvedUri & keyof OpenapiPaths],
245
- ResolvedUri extends First<GetResolvedOpenapiUrl<OpenapiPaths, Uri> & keyof OpenapiPaths>,
110
+ const ResponseCode extends ResponseCodeForUri<OpenapiPaths, Uri, 'post'>,
246
111
  Params extends string[] & ExtractOpenapiParams<Uri>,
247
- ResponseMap extends HttpMethodMap['post' & keyof HttpMethodMap]['responses' &
248
- keyof HttpMethodMap['post' & keyof HttpMethodMap]],
249
- Content extends ResponseMap extends undefined
250
- ? undefined
251
- : ResponseCode extends undefined
252
- ? undefined
253
- : ResponseCode extends number
254
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
255
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
256
- : undefined,
257
- JsonContent extends Content extends undefined
258
- ? undefined
259
- : Content['application/json' & keyof Content],
260
- RequestBodyMap extends HttpMethodMap['post' & keyof HttpMethodMap]['requestBody' &
261
- keyof HttpMethodMap['post' & keyof HttpMethodMap]],
262
- RequestBodyContent extends RequestBodyMap extends undefined
263
- ? undefined
264
- : RequestBodyMap['content' & keyof RequestBodyMap],
265
- RequestBodyJsonContent extends RequestBodyContent extends undefined
266
- ? undefined
267
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
112
+ RequestBodyJsonContent extends RequestBody<OpenapiPaths, 'post', Uri>,
113
+ JsonContent extends ResponseBody<OpenapiPaths, 'post', Uri, ResponseCode>,
268
114
  >(
269
115
  /**
270
116
  * The uri on your background you are trying to hit.
@@ -323,165 +169,23 @@ export class OpenapiSpecSession<OpenapiPaths> {
323
169
  * @param opts.headers - headers you would like to send with your request.
324
170
  * (Optional)
325
171
  */
326
- opts: OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & { [K in Params[number]]: string }
327
- ): Promise<OpenapiSpecResponse<JsonContent>>
328
- // DOESNT have Params
329
- public async post<
330
- const Uri extends RoutesWithHttpMethod<
331
- OpenapiPaths,
332
- 'post' & keyof OpenapiPaths[keyof OpenapiPaths]
333
- > &
334
- string,
335
- const ResponseCode extends Params['length'] extends 0
336
- ? keyof ExcludeNever<ResponseMap> & number
337
- : never,
338
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
339
- Params extends string[] & ExtractOpenapiParams<Uri>,
340
- ResponseMap extends HttpMethodMap['post' & keyof HttpMethodMap]['responses' &
341
- keyof HttpMethodMap['post' & keyof HttpMethodMap]],
342
- Content extends ResponseMap extends undefined
343
- ? undefined
344
- : ResponseCode extends undefined
345
- ? undefined
346
- : ResponseCode extends number
347
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
348
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
349
- : undefined,
350
- JsonContent extends Content extends undefined
351
- ? undefined
352
- : Content['application/json' & keyof Content],
353
- RequestBodyMap extends HttpMethodMap['post' & keyof HttpMethodMap]['requestBody' &
354
- keyof HttpMethodMap['post' & keyof HttpMethodMap]],
355
- RequestBodyContent extends RequestBodyMap extends undefined
356
- ? undefined
357
- : RequestBodyMap['content' & keyof RequestBodyMap],
358
- RequestBodyJsonContent extends RequestBodyContent extends undefined
359
- ? undefined
360
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
361
- >(
362
- /**
363
- * The uri on your background you are trying to hit.
364
- * This should be a path, like '/users'.
365
- *
366
- * ```ts
367
- * const request = new OpenapiSpecRequest<openapiPaths>()
368
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
369
- * const res = await session.post('/user', 200)
370
- * ```
371
- */
372
- uri: Uri,
373
-
374
- /**
375
- * The response status you are expecting to receive
376
- * when making this request. It will need to match
377
- * one of the accepted response statuses for the
378
- * provided uri in your openapi types
379
- *
380
- * ```ts
381
- * const request = new OpenapiSpecRequest<openapiPaths>()
382
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
383
- * const res = await session.post('/user', 200)
384
- * ```
385
- */
386
- expectedStatus: ResponseCode,
387
-
388
- /**
389
- * Data, headers, and other options to send with
390
- * your request.
391
- *
392
- * ```ts
393
- * const request = new OpenapiSpecRequest<openapiPaths>()
394
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
395
- * const res = await session.post(
396
- * '/user',
397
- * 200,
398
- * {
399
- * data: {
400
- * ...request body here
401
- * },
402
- * headers: {
403
- * ...headers here
404
- * },
405
- * }
406
- * )
407
- * ```
408
- *
409
- * @param opts.data - request body data you want to send up. Must match the
410
- * requestBody shape in the openapi document for this uri.
411
- * (Optional)
412
- *
413
- * @param opts.headers - headers you would like to send with your request.
414
- * (Optional)
415
- */
416
- opts?: Params['length'] extends 0 ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent> : never
417
- ): Promise<OpenapiSpecResponse<JsonContent>>
418
- // final
419
- public async post<
420
- const Uri extends RoutesWithHttpMethod<
421
- OpenapiPaths,
422
- 'post' & keyof OpenapiPaths[keyof OpenapiPaths]
423
- > &
424
- string,
425
- const ResponseCode extends keyof ExcludeNever<ResponseMap> & number,
426
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
427
- ResponseMap = HttpMethodMap['post' & keyof HttpMethodMap]['responses' &
428
- keyof HttpMethodMap['post' & keyof HttpMethodMap]],
429
- Content = ResponseMap extends undefined
430
- ? undefined
431
- : ResponseCode extends undefined
432
- ? undefined
433
- : ResponseCode extends number
434
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
435
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
436
- : undefined,
437
- JsonContent = Content extends undefined
438
- ? undefined
439
- : Content['application/json' & keyof Content],
440
- >(
441
- uri: Uri,
442
- expectedStatus: ResponseCode,
443
- opts: unknown = {}
172
+ opts?: Params['length'] extends 0
173
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
174
+ : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & { [K in Params[number]]: string }
444
175
  ): Promise<OpenapiSpecResponse<JsonContent>> {
445
176
  return await this.makeRequest('post', uri, expectedStatus, opts as SpecRequestOptsAll)
446
177
  }
447
178
 
448
- //
449
- //
450
- //
451
- // begin: PUT
452
- // has Params
453
179
  public async put<
454
180
  const Uri extends RoutesWithHttpMethod<
455
181
  OpenapiPaths,
456
182
  'put' & keyof OpenapiPaths[keyof OpenapiPaths]
457
183
  > &
458
184
  string,
459
- const ResponseCode extends Params['length'] extends 0
460
- ? never
461
- : keyof ExcludeNever<ResponseMap> & number,
462
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
185
+ const ResponseCode extends ResponseCodeForUri<OpenapiPaths, Uri, 'put'>,
463
186
  Params extends string[] & ExtractOpenapiParams<Uri>,
464
- ResponseMap extends HttpMethodMap['put' & keyof HttpMethodMap]['responses' &
465
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
466
- Content extends ResponseMap extends undefined
467
- ? undefined
468
- : ResponseCode extends undefined
469
- ? undefined
470
- : ResponseCode extends number
471
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
472
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
473
- : undefined,
474
- JsonContent extends Content extends undefined
475
- ? undefined
476
- : Content['application/json' & keyof Content],
477
- RequestBodyMap extends HttpMethodMap['put' & keyof HttpMethodMap]['requestBody' &
478
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
479
- RequestBodyContent extends RequestBodyMap extends undefined
480
- ? undefined
481
- : RequestBodyMap['content' & keyof RequestBodyMap],
482
- RequestBodyJsonContent extends RequestBodyContent extends undefined
483
- ? undefined
484
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
187
+ JsonContent extends ResponseBody<OpenapiPaths, 'put', Uri, ResponseCode>,
188
+ RequestBodyJsonContent extends RequestBody<OpenapiPaths, 'put', Uri>,
485
189
  >(
486
190
  /**
487
191
  * The uri on your background you are trying to hit.
@@ -541,130 +245,11 @@ export class OpenapiSpecSession<OpenapiPaths> {
541
245
  * @param opts.headers - headers you would like to send with your request.
542
246
  * (Optional)
543
247
  */
544
- opts: Params['length'] extends 0
545
- ? never
248
+ opts?: Params['length'] extends 0
249
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
546
250
  : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & {
547
251
  [K in Params[number]]: string | IdType
548
252
  }
549
- ): Promise<OpenapiSpecResponse<JsonContent>>
550
- // DOESNT have params
551
- public async put<
552
- const Uri extends RoutesWithHttpMethod<
553
- OpenapiPaths,
554
- 'put' & keyof OpenapiPaths[keyof OpenapiPaths]
555
- > &
556
- string,
557
- const ResponseCode extends Params['length'] extends 0
558
- ? keyof ExcludeNever<ResponseMap> & number
559
- : never,
560
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
561
- Params extends string[] & ExtractOpenapiParams<Uri>,
562
- ResponseMap extends HttpMethodMap['put' & keyof HttpMethodMap]['responses' &
563
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
564
- Content extends ResponseMap extends undefined
565
- ? undefined
566
- : ResponseCode extends undefined
567
- ? undefined
568
- : ResponseCode extends number
569
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
570
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
571
- : undefined,
572
- JsonContent extends Content extends undefined
573
- ? undefined
574
- : Content['application/json' & keyof Content],
575
- RequestBodyMap extends HttpMethodMap['put' & keyof HttpMethodMap]['requestBody' &
576
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
577
- RequestBodyContent extends RequestBodyMap extends undefined
578
- ? undefined
579
- : RequestBodyMap['content' & keyof RequestBodyMap],
580
- RequestBodyJsonContent extends RequestBodyContent extends undefined
581
- ? undefined
582
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
583
- >(
584
- /**
585
- * The uri on your background you are trying to hit.
586
- * This should be a path, like '/users'.
587
- *
588
- * ```ts
589
- * const request = new OpenapiSpecRequest<openapiPaths>()
590
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
591
- * const res = await session.put('/user', 200, { data: { name: 'new name' })
592
- * ```
593
- */
594
- uri: Uri,
595
-
596
- /**
597
- * The response status you are expecting to receive
598
- * when making this request. It will need to match
599
- * one of the accepted response statuses for the
600
- * provided uri in your openapi types
601
- *
602
- * ```ts
603
- * const request = new OpenapiSpecRequest<openapiPaths>()
604
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
605
- * const res = await session.put('/user', 200, { data: { name: 'new name' })
606
- * ```
607
- */
608
- expectedStatus: ResponseCode,
609
-
610
- /**
611
- * An object containing the path fields required to
612
- * fill your uri in, as well as any additional PUT
613
- * arguments, like `data`, for example.
614
- *
615
- *
616
- * ```ts
617
- * const request = new OpenapiSpecRequest<openapiPaths>()
618
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
619
- * const res = await session.put(
620
- * '/user',
621
- * 200,
622
- * {
623
- * data: {
624
- * ...request body here
625
- * },
626
- * headers: {
627
- * ...headers here
628
- * },
629
- * }
630
- * )
631
- * ```
632
- *
633
- * @param opts.data - request body data you want to send up. Must match the
634
- * requestBody shape in the openapi document for this uri.
635
- * (Optional)
636
- *
637
- * @param opts.headers - headers you would like to send with your request.
638
- * (Optional)
639
- */
640
- opts?: Params['length'] extends 0 ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent> : never
641
- ): Promise<OpenapiSpecResponse<JsonContent>>
642
- // final
643
- public async put<
644
- const Uri extends RoutesWithHttpMethod<
645
- OpenapiPaths,
646
- 'put' & keyof OpenapiPaths[keyof OpenapiPaths]
647
- > &
648
- string,
649
- const ResponseCode extends keyof ExcludeNever<ResponseMap> & number,
650
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
651
- ResponseMap = HttpMethodMap['put' & keyof HttpMethodMap]['responses' &
652
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
653
- Content = ResponseMap extends undefined
654
- ? undefined
655
- : ResponseCode extends undefined
656
- ? undefined
657
- : ResponseCode extends number
658
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
659
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
660
- : undefined,
661
- JsonContent = Content extends undefined
662
- ? undefined
663
- : Content['application/json' & keyof Content],
664
- >(
665
- uri: Uri,
666
- expectedStatus: ResponseCode,
667
- opts: unknown = {}
668
253
  ): Promise<OpenapiSpecResponse<JsonContent>> {
669
254
  return await this.makeRequest(
670
255
  'put',
@@ -674,43 +259,16 @@ export class OpenapiSpecSession<OpenapiPaths> {
674
259
  )
675
260
  }
676
261
 
677
- //
678
- //
679
- //
680
- // begin: PATCH
681
- // has Params
682
262
  public async patch<
683
263
  const Uri extends RoutesWithHttpMethod<
684
264
  OpenapiPaths,
685
265
  'patch' & keyof OpenapiPaths[keyof OpenapiPaths]
686
266
  > &
687
267
  string,
688
- const ResponseCode extends Params['length'] extends 0
689
- ? never
690
- : keyof ExcludeNever<ResponseMap> & number,
691
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
268
+ const ResponseCode extends ResponseCodeForUri<OpenapiPaths, Uri, 'patch'>,
692
269
  Params extends string[] & ExtractOpenapiParams<Uri>,
693
- ResponseMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['responses' &
694
- keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
695
- Content extends ResponseMap extends undefined
696
- ? undefined
697
- : ResponseCode extends undefined
698
- ? undefined
699
- : ResponseCode extends number
700
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
701
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
702
- : undefined,
703
- JsonContent extends Content extends undefined
704
- ? undefined
705
- : Content['application/json' & keyof Content],
706
- RequestBodyMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['requestBody' &
707
- keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
708
- RequestBodyContent extends RequestBodyMap extends undefined
709
- ? undefined
710
- : RequestBodyMap['content' & keyof RequestBodyMap],
711
- RequestBodyJsonContent extends RequestBodyContent extends undefined
712
- ? undefined
713
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
270
+ JsonContent extends ResponseBody<OpenapiPaths, 'patch', Uri, ResponseCode>,
271
+ RequestBodyJsonContent extends RequestBody<OpenapiPaths, 'patch', Uri>,
714
272
  >(
715
273
  /**
716
274
  * The uri on your background you are trying to hit.
@@ -769,179 +327,30 @@ export class OpenapiSpecSession<OpenapiPaths> {
769
327
  * @param opts.headers - headers you would like to send with your request.
770
328
  * (Optional)
771
329
  */
772
- opts: Params['length'] extends 0
773
- ? never
330
+ opts?: Params['length'] extends 0
331
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
774
332
  : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & {
775
333
  [K in Params[number]]: string | IdType
776
334
  }
777
- ): Promise<OpenapiSpecResponse<JsonContent>>
778
- // DOESNT have params
779
- public async patch<
780
- const Uri extends RoutesWithHttpMethod<
781
- OpenapiPaths,
782
- 'patch' & keyof OpenapiPaths[keyof OpenapiPaths]
783
- > &
784
- string,
785
- const ResponseCode extends Params['length'] extends 0
786
- ? keyof ExcludeNever<ResponseMap> & number
787
- : never,
788
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
789
- Params extends string[] & ExtractOpenapiParams<Uri>,
790
- ResponseMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['responses' &
791
- keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
792
- Content extends ResponseMap extends undefined
793
- ? undefined
794
- : ResponseCode extends undefined
795
- ? undefined
796
- : ResponseCode extends number
797
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
798
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
799
- : undefined,
800
- JsonContent extends Content extends undefined
801
- ? undefined
802
- : Content['application/json' & keyof Content],
803
- RequestBodyMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['requestBody' &
804
- keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
805
- RequestBodyContent extends RequestBodyMap extends undefined
806
- ? undefined
807
- : RequestBodyMap['content' & keyof RequestBodyMap],
808
- RequestBodyJsonContent extends RequestBodyContent extends undefined
809
- ? undefined
810
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
811
- >(
812
- /**
813
- * The uri on your background you are trying to hit.
814
- * This should be a path, like '/user'.
815
- *
816
- * ```ts
817
- * const request = new OpenapiSpecRequest<openapiPaths>()
818
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
819
- * const res = await session.patch('/user', 200, { data: { name: 'new name' }})
820
- * ```
821
- */
822
- uri: Uri,
823
-
824
- /**
825
- * The response status you are expecting to receive
826
- * when making this request. It will need to match
827
- * one of the accepted response statuses for the
828
- * provided uri in your openapi types
829
- *
830
- * ```ts
831
- * const request = new OpenapiSpecRequest<openapiPaths>()
832
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
833
- * const res = await session.patch('/user', 200, { data: { name: 'new name' }})
834
- * ```
835
- */
836
- expectedStatus: ResponseCode,
837
-
838
- /**
839
- * Data, headers, and other options to send with
840
- * your request.
841
- *
842
- * ```ts
843
- * const request = new OpenapiSpecRequest<openapiPaths>()
844
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
845
- * const res = await session.patch(
846
- * '/user',
847
- * 200,
848
- * {
849
- * data: {
850
- * ...request body here
851
- * },
852
- * headers: {
853
- * ...headers here
854
- * },
855
- * }
856
- * )
857
- * ```
858
- *
859
- * @param opts.data - request body data you want to send up. Must match the
860
- * requestBody shape in the openapi document for this uri.
861
- * (Optional)
862
- *
863
- * @param opts.headers - headers you would like to send with your request.
864
- * (Optional)
865
- */
866
- opts?: Params['length'] extends 0 ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent> : never
867
- ): Promise<OpenapiSpecResponse<JsonContent>>
868
- // final
869
- public async patch<
870
- const Uri extends GetOpenapiUrl<OpenapiPaths>,
871
- const ResponseCode extends keyof ResponseMap & number,
872
- HttpMethodMap extends OpenapiPaths[ResolvedUri & keyof OpenapiPaths],
873
- ResolvedUri extends GetResolvedOpenapiUrl<OpenapiPaths, Uri> & keyof OpenapiPaths,
874
- ResponseMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['responses' &
875
- keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
876
- Content extends ResponseMap extends undefined
877
- ? undefined
878
- : ResponseCode extends undefined
879
- ? undefined
880
- : ResponseCode extends number
881
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
882
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
883
- : undefined,
884
- JsonContent extends Content extends undefined
885
- ? undefined
886
- : Content['application/json' & keyof Content],
887
- RequestBodyMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['requestBody' &
888
- keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
889
- RequestBodyContent extends RequestBodyMap extends undefined
890
- ? undefined
891
- : RequestBodyMap['content' & keyof RequestBodyMap],
892
- RequestBodyJsonContent extends RequestBodyContent extends undefined
893
- ? undefined
894
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
895
- >(
896
- uri: Uri,
897
- expectedStatus: ResponseCode,
898
- opts: OpenapiSpecRequestOptsPost<RequestBodyJsonContent> = {}
899
335
  ): Promise<OpenapiSpecResponse<JsonContent>> {
900
336
  return await this.makeRequest(
901
337
  'patch',
902
- fillOpenapiParams(uri, opts),
338
+ fillOpenapiParams(uri, opts || {}),
903
339
  expectedStatus,
904
340
  opts as SpecRequestOptsAll
905
341
  )
906
342
  }
907
343
 
908
- //
909
- //
910
- //
911
- // begin: delete
912
- // has Params
913
344
  public async delete<
914
345
  const Uri extends RoutesWithHttpMethod<
915
346
  OpenapiPaths,
916
347
  'delete' & keyof OpenapiPaths[keyof OpenapiPaths]
917
348
  > &
918
349
  string,
919
- const ResponseCode extends Params['length'] extends 0
920
- ? never
921
- : keyof ExcludeNever<ResponseMap> & number,
922
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
350
+ const ResponseCode extends ResponseCodeForUri<OpenapiPaths, Uri, 'delete'>,
923
351
  Params extends string[] & ExtractOpenapiParams<Uri>,
924
- ResponseMap extends HttpMethodMap['delete' & keyof HttpMethodMap]['responses' &
925
- keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
926
- Content extends ResponseMap extends undefined
927
- ? undefined
928
- : ResponseCode extends undefined
929
- ? undefined
930
- : ResponseCode extends number
931
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
932
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
933
- : undefined,
934
- JsonContent extends Content extends undefined
935
- ? undefined
936
- : Content['application/json' & keyof Content],
937
- RequestBodyMap extends HttpMethodMap['delete' & keyof HttpMethodMap]['requestBody' &
938
- keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
939
- RequestBodyContent extends RequestBodyMap extends undefined
940
- ? undefined
941
- : RequestBodyMap['content' & keyof RequestBodyMap],
942
- RequestBodyJsonContent extends RequestBodyContent extends undefined
943
- ? undefined
944
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
352
+ JsonContent extends ResponseBody<OpenapiPaths, 'delete', Uri, ResponseCode>,
353
+ RequestBodyJsonContent extends RequestBody<OpenapiPaths, 'delete', Uri>,
945
354
  >(
946
355
  /**
947
356
  * The uri on your background you are trying to hit.
@@ -1000,137 +409,15 @@ export class OpenapiSpecSession<OpenapiPaths> {
1000
409
  * @param opts.headers - headers you would like to send with your request.
1001
410
  * (Optional)
1002
411
  */
1003
- opts: Params['length'] extends 0
1004
- ? never
412
+ opts?: Params['length'] extends 0
413
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
1005
414
  : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & {
1006
415
  [K in Params[number]]: string | IdType
1007
416
  }
1008
- ): Promise<OpenapiSpecResponse<JsonContent>>
1009
- // DOESNT have params
1010
- public async delete<
1011
- const Uri extends RoutesWithHttpMethod<
1012
- OpenapiPaths,
1013
- 'delete' & keyof OpenapiPaths[keyof OpenapiPaths]
1014
- > &
1015
- string,
1016
- const ResponseCode extends Params['length'] extends 0
1017
- ? keyof ExcludeNever<ResponseMap> & number
1018
- : never,
1019
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
1020
- Params extends string[] & ExtractOpenapiParams<Uri>,
1021
- ResponseMap extends HttpMethodMap['delete' & keyof HttpMethodMap]['responses' &
1022
- keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
1023
- Content extends ResponseMap extends undefined
1024
- ? undefined
1025
- : ResponseCode extends undefined
1026
- ? undefined
1027
- : ResponseCode extends number
1028
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
1029
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
1030
- : undefined,
1031
- JsonContent extends Content extends undefined
1032
- ? undefined
1033
- : Content['application/json' & keyof Content],
1034
- RequestBodyMap extends HttpMethodMap['delete' & keyof HttpMethodMap]['requestBody' &
1035
- keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
1036
- RequestBodyContent extends RequestBodyMap extends undefined
1037
- ? undefined
1038
- : RequestBodyMap['content' & keyof RequestBodyMap],
1039
- RequestBodyJsonContent extends RequestBodyContent extends undefined
1040
- ? undefined
1041
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
1042
- >(
1043
- /**
1044
- * The uri on your background you are trying to hit.
1045
- * This should be a path, like '/users'.
1046
- *
1047
- * ```ts
1048
- * const request = new OpenapiSpecRequest<openapiPaths>()
1049
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
1050
- * const res = await session.delete('/user', 200)
1051
- * ```
1052
- */
1053
- uri: Uri,
1054
-
1055
- /**
1056
- * The response status you are expecting to receive
1057
- * when making this request. It will need to match
1058
- * one of the accepted response statuses for the
1059
- * provided uri in your openapi types
1060
- *
1061
- * ```ts
1062
- * const request = new OpenapiSpecRequest<openapiPaths>()
1063
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
1064
- * const res = await session.delete('/user', 200)
1065
- * ```
1066
- */
1067
- expectedStatus: ResponseCode,
1068
-
1069
- /**
1070
- * Data, headers, and other options to send with
1071
- * your request.
1072
- *
1073
- * ```ts
1074
- * const request = new OpenapiSpecRequest<openapiPaths>()
1075
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
1076
- * const res = await session.delete(
1077
- * '/user',
1078
- * 200,
1079
- * {
1080
- * data: {
1081
- * ...request body here
1082
- * },
1083
- * headers: {
1084
- * ...headers here
1085
- * },
1086
- * }
1087
- * )
1088
- * ```
1089
- *
1090
- * @param opts.data - request body data you want to send up. Must match the
1091
- * requestBody shape in the openapi document for this uri.
1092
- * (Optional)
1093
- *
1094
- * @param opts.headers - headers you would like to send with your request.
1095
- * (Optional)
1096
- */
1097
- opts?: Params['length'] extends 0 ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent> : never
1098
- ): Promise<OpenapiSpecResponse<JsonContent>>
1099
- // final
1100
- public async delete<
1101
- const Uri extends GetOpenapiUrl<OpenapiPaths>,
1102
- const ResponseCode extends keyof ResponseMap & number,
1103
- HttpMethodMap extends OpenapiPaths[ResolvedUri & keyof OpenapiPaths],
1104
- ResolvedUri extends GetResolvedOpenapiUrl<OpenapiPaths, Uri> & keyof OpenapiPaths,
1105
- ResponseMap = HttpMethodMap['delete' & keyof HttpMethodMap]['responses' &
1106
- keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
1107
- Content = ResponseMap extends undefined
1108
- ? undefined
1109
- : ResponseCode extends undefined
1110
- ? undefined
1111
- : ResponseCode extends number
1112
- ? ResponseMap[ResponseCode & keyof ResponseMap]['content' &
1113
- keyof ResponseMap[ResponseCode & keyof ResponseMap]]
1114
- : undefined,
1115
- JsonContent = Content extends undefined
1116
- ? undefined
1117
- : Content['application/json' & keyof Content],
1118
- RequestBodyMap = HttpMethodMap['delete' & keyof HttpMethodMap]['requestBody' &
1119
- keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
1120
- RequestBodyContent = RequestBodyMap extends undefined
1121
- ? undefined
1122
- : RequestBodyMap['content' & keyof RequestBodyMap],
1123
- RequestBodyJsonContent = RequestBodyContent extends undefined
1124
- ? undefined
1125
- : RequestBodyContent['application/json' & keyof RequestBodyContent],
1126
- >(
1127
- uri: Uri,
1128
- expectedStatus: ResponseCode,
1129
- opts: OpenapiSpecRequestOptsPost<RequestBodyJsonContent> = {}
1130
417
  ): Promise<OpenapiSpecResponse<JsonContent>> {
1131
418
  return await this.makeRequest(
1132
419
  'delete',
1133
- fillOpenapiParams(uri, opts),
420
+ fillOpenapiParams(uri, opts || {}),
1134
421
  expectedStatus,
1135
422
  opts as SpecRequestOptsAll
1136
423
  )