@rvoh/psychic-spec-helpers 0.7.2 → 0.7.3

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.
@@ -4,7 +4,6 @@ import {
4
4
  ExcludeNever,
5
5
  ExtractOpenapiParams,
6
6
  First,
7
- GetOpenapiUrl,
8
7
  GetResolvedOpenapiUrl,
9
8
  RoutesWithHttpMethod,
10
9
  } from './helpers/openapiTypeHelpers.js'
@@ -13,19 +12,14 @@ import {
13
12
  OpenapiSpecRequestOptsPost,
14
13
  OpenapiSpecResponse,
15
14
  } from './OpenapiSpecRequest.js'
16
- import supersession from './supersession.js'
17
15
  import { SpecRequestOptsAll } from './SpecRequest.js'
16
+ import supersession from './supersession.js'
18
17
 
19
18
  // like SpecRequest, but meant to be bound to an instance
20
19
  // of supersession, enabling chained requests to collect cookies
21
20
  export class OpenapiSpecSession<OpenapiPaths> {
22
21
  constructor(private _session: ReturnType<typeof supersession>) {}
23
22
 
24
- //
25
- //
26
- //
27
- // begin: GET
28
- // has Params
29
23
  public async get<
30
24
  const Uri extends RoutesWithHttpMethod<
31
25
  OpenapiPaths,
@@ -106,118 +100,9 @@ export class OpenapiSpecSession<OpenapiPaths> {
106
100
  * @param opts.headers - headers you would like to send with your request.
107
101
  * (Optional)
108
102
  */
109
- opts: Params['length'] extends 0
110
- ? never
103
+ opts?: Params['length'] extends 0
104
+ ? OpenapiSpecRequestOptsGet<QueryMap>
111
105
  : 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
221
106
  ): Promise<OpenapiSpecResponse<JsonContent>> {
222
107
  return (await this.makeRequest(
223
108
  'get',
@@ -238,9 +123,7 @@ export class OpenapiSpecSession<OpenapiPaths> {
238
123
  'post' & keyof OpenapiPaths[keyof OpenapiPaths]
239
124
  > &
240
125
  string,
241
- const ResponseCode extends Params['length'] extends 0
242
- ? never
243
- : keyof ExcludeNever<ResponseMap> & number,
126
+ const ResponseCode extends keyof ResponseMap & number,
244
127
  HttpMethodMap extends OpenapiPaths[ResolvedUri & keyof OpenapiPaths],
245
128
  ResolvedUri extends First<GetResolvedOpenapiUrl<OpenapiPaths, Uri> & keyof OpenapiPaths>,
246
129
  Params extends string[] & ExtractOpenapiParams<Uri>,
@@ -323,22 +206,24 @@ export class OpenapiSpecSession<OpenapiPaths> {
323
206
  * @param opts.headers - headers you would like to send with your request.
324
207
  * (Optional)
325
208
  */
326
- opts: OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & { [K in Params[number]]: string }
327
- ): Promise<OpenapiSpecResponse<JsonContent>>
328
- // DOESNT have Params
329
- public async post<
209
+ opts?: Params['length'] extends 0
210
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
211
+ : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & { [K in Params[number]]: string }
212
+ ): Promise<OpenapiSpecResponse<JsonContent>> {
213
+ return await this.makeRequest('post', uri, expectedStatus, opts as SpecRequestOptsAll)
214
+ }
215
+
216
+ public async put<
330
217
  const Uri extends RoutesWithHttpMethod<
331
218
  OpenapiPaths,
332
- 'post' & keyof OpenapiPaths[keyof OpenapiPaths]
219
+ 'put' & keyof OpenapiPaths[keyof OpenapiPaths]
333
220
  > &
334
221
  string,
335
- const ResponseCode extends Params['length'] extends 0
336
- ? keyof ExcludeNever<ResponseMap> & number
337
- : never,
222
+ const ResponseCode extends keyof ResponseMap & number,
338
223
  HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
339
224
  Params extends string[] & ExtractOpenapiParams<Uri>,
340
- ResponseMap extends HttpMethodMap['post' & keyof HttpMethodMap]['responses' &
341
- keyof HttpMethodMap['post' & keyof HttpMethodMap]],
225
+ ResponseMap extends HttpMethodMap['put' & keyof HttpMethodMap]['responses' &
226
+ keyof HttpMethodMap['put' & keyof HttpMethodMap]],
342
227
  Content extends ResponseMap extends undefined
343
228
  ? undefined
344
229
  : ResponseCode extends undefined
@@ -350,8 +235,8 @@ export class OpenapiSpecSession<OpenapiPaths> {
350
235
  JsonContent extends Content extends undefined
351
236
  ? undefined
352
237
  : Content['application/json' & keyof Content],
353
- RequestBodyMap extends HttpMethodMap['post' & keyof HttpMethodMap]['requestBody' &
354
- keyof HttpMethodMap['post' & keyof HttpMethodMap]],
238
+ RequestBodyMap extends HttpMethodMap['put' & keyof HttpMethodMap]['requestBody' &
239
+ keyof HttpMethodMap['put' & keyof HttpMethodMap]],
355
240
  RequestBodyContent extends RequestBodyMap extends undefined
356
241
  ? undefined
357
242
  : RequestBodyMap['content' & keyof RequestBodyMap],
@@ -366,7 +251,7 @@ export class OpenapiSpecSession<OpenapiPaths> {
366
251
  * ```ts
367
252
  * const request = new OpenapiSpecRequest<openapiPaths>()
368
253
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
369
- * const res = await session.post('/user', 200)
254
+ * const res = await session.put('/posts/{id}', 200, { id: '123', data: { name: 'new name' }})
370
255
  * ```
371
256
  */
372
257
  uri: Uri,
@@ -380,22 +265,26 @@ export class OpenapiSpecSession<OpenapiPaths> {
380
265
  * ```ts
381
266
  * const request = new OpenapiSpecRequest<openapiPaths>()
382
267
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
383
- * const res = await session.post('/user', 200)
268
+ * const res = await session.put('/posts/{id}', 200, { id: '123', data: { name: 'new name' }})
384
269
  * ```
385
270
  */
386
271
  expectedStatus: ResponseCode,
387
272
 
388
273
  /**
389
- * Data, headers, and other options to send with
390
- * your request.
274
+ * An object containing the path fields required to
275
+ * fill your uri in, as well as any additional PUT
276
+ * arguments, like `data`, for example.
391
277
  *
392
278
  * ```ts
393
279
  * const request = new OpenapiSpecRequest<openapiPaths>()
394
280
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
395
- * const res = await session.post(
396
- * '/user',
281
+ * const res = await session.put(
282
+ * '/posts/{id}/comments/{commentId}',
397
283
  * 200,
398
284
  * {
285
+ * postId: '123',
286
+ * id: '456',
287
+ *
399
288
  * data: {
400
289
  * ...request body here
401
290
  * },
@@ -413,56 +302,31 @@ export class OpenapiSpecSession<OpenapiPaths> {
413
302
  * @param opts.headers - headers you would like to send with your request.
414
303
  * (Optional)
415
304
  */
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 = {}
305
+ opts?: Params['length'] extends 0
306
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
307
+ : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & {
308
+ [K in Params[number]]: string | IdType
309
+ }
444
310
  ): Promise<OpenapiSpecResponse<JsonContent>> {
445
- return await this.makeRequest('post', uri, expectedStatus, opts as SpecRequestOptsAll)
311
+ return await this.makeRequest(
312
+ 'put',
313
+ fillOpenapiParams(uri, opts || {}),
314
+ expectedStatus,
315
+ opts as SpecRequestOptsAll
316
+ )
446
317
  }
447
318
 
448
- //
449
- //
450
- //
451
- // begin: PUT
452
- // has Params
453
- public async put<
319
+ public async patch<
454
320
  const Uri extends RoutesWithHttpMethod<
455
321
  OpenapiPaths,
456
- 'put' & keyof OpenapiPaths[keyof OpenapiPaths]
322
+ 'patch' & keyof OpenapiPaths[keyof OpenapiPaths]
457
323
  > &
458
324
  string,
459
- const ResponseCode extends Params['length'] extends 0
460
- ? never
461
- : keyof ExcludeNever<ResponseMap> & number,
325
+ const ResponseCode extends keyof ResponseMap & number,
462
326
  HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
463
327
  Params extends string[] & ExtractOpenapiParams<Uri>,
464
- ResponseMap extends HttpMethodMap['put' & keyof HttpMethodMap]['responses' &
465
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
328
+ ResponseMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['responses' &
329
+ keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
466
330
  Content extends ResponseMap extends undefined
467
331
  ? undefined
468
332
  : ResponseCode extends undefined
@@ -474,8 +338,8 @@ export class OpenapiSpecSession<OpenapiPaths> {
474
338
  JsonContent extends Content extends undefined
475
339
  ? undefined
476
340
  : Content['application/json' & keyof Content],
477
- RequestBodyMap extends HttpMethodMap['put' & keyof HttpMethodMap]['requestBody' &
478
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
341
+ RequestBodyMap extends HttpMethodMap['patch' & keyof HttpMethodMap]['requestBody' &
342
+ keyof HttpMethodMap['patch' & keyof HttpMethodMap]],
479
343
  RequestBodyContent extends RequestBodyMap extends undefined
480
344
  ? undefined
481
345
  : RequestBodyMap['content' & keyof RequestBodyMap],
@@ -485,12 +349,12 @@ export class OpenapiSpecSession<OpenapiPaths> {
485
349
  >(
486
350
  /**
487
351
  * The uri on your background you are trying to hit.
488
- * This should be a path, like '/users'.
352
+ * This should be a path, like '/posts'.
489
353
  *
490
354
  * ```ts
491
355
  * const request = new OpenapiSpecRequest<openapiPaths>()
492
356
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
493
- * const res = await session.put('/posts/{id}', 200, { id: '123', data: { name: 'new name' }})
357
+ * const res = await session.patch('/posts/{id}', 200, { data: { name: 'new name' }})
494
358
  * ```
495
359
  */
496
360
  uri: Uri,
@@ -504,26 +368,25 @@ export class OpenapiSpecSession<OpenapiPaths> {
504
368
  * ```ts
505
369
  * const request = new OpenapiSpecRequest<openapiPaths>()
506
370
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
507
- * const res = await session.put('/posts/{id}', 200, { id: '123', data: { name: 'new name' }})
371
+ * const res = await session.patch('/posts/{id}', 200, { data: { name: 'new name' }})
508
372
  * ```
509
373
  */
510
374
  expectedStatus: ResponseCode,
511
375
 
512
376
  /**
513
377
  * An object containing the path fields required to
514
- * fill your uri in, as well as any additional PUT
378
+ * fill your uri in, as well as any additional PATCH
515
379
  * arguments, like `data`, for example.
516
380
  *
517
381
  * ```ts
518
382
  * const request = new OpenapiSpecRequest<openapiPaths>()
519
383
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
520
- * const res = await session.put(
521
- * '/posts/{id}/comments/{commentId}',
384
+ * const res = await session.patch(
385
+ * '/posts/{postId}/comments/{id}',
522
386
  * 200,
523
387
  * {
524
388
  * postId: '123',
525
- * id: '456',
526
- *
389
+ * commentId: '456',
527
390
  * data: {
528
391
  * ...request body here
529
392
  * },
@@ -541,26 +404,33 @@ export class OpenapiSpecSession<OpenapiPaths> {
541
404
  * @param opts.headers - headers you would like to send with your request.
542
405
  * (Optional)
543
406
  */
544
- opts: Params['length'] extends 0
545
- ? never
407
+ opts?: Params['length'] extends 0
408
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
546
409
  : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & {
547
410
  [K in Params[number]]: string | IdType
548
411
  }
549
- ): Promise<OpenapiSpecResponse<JsonContent>>
550
- // DOESNT have params
551
- public async put<
412
+ ): Promise<OpenapiSpecResponse<JsonContent>> {
413
+ return await this.makeRequest(
414
+ 'patch',
415
+ fillOpenapiParams(uri, opts || {}),
416
+ expectedStatus,
417
+ opts as SpecRequestOptsAll
418
+ )
419
+ }
420
+
421
+ public async delete<
552
422
  const Uri extends RoutesWithHttpMethod<
553
423
  OpenapiPaths,
554
- 'put' & keyof OpenapiPaths[keyof OpenapiPaths]
424
+ 'delete' & keyof OpenapiPaths[keyof OpenapiPaths]
555
425
  > &
556
426
  string,
557
427
  const ResponseCode extends Params['length'] extends 0
558
- ? keyof ExcludeNever<ResponseMap> & number
559
- : never,
428
+ ? never
429
+ : keyof ExcludeNever<ResponseMap> & number,
560
430
  HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
561
431
  Params extends string[] & ExtractOpenapiParams<Uri>,
562
- ResponseMap extends HttpMethodMap['put' & keyof HttpMethodMap]['responses' &
563
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
432
+ ResponseMap extends HttpMethodMap['delete' & keyof HttpMethodMap]['responses' &
433
+ keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
564
434
  Content extends ResponseMap extends undefined
565
435
  ? undefined
566
436
  : ResponseCode extends undefined
@@ -572,8 +442,8 @@ export class OpenapiSpecSession<OpenapiPaths> {
572
442
  JsonContent extends Content extends undefined
573
443
  ? undefined
574
444
  : Content['application/json' & keyof Content],
575
- RequestBodyMap extends HttpMethodMap['put' & keyof HttpMethodMap]['requestBody' &
576
- keyof HttpMethodMap['put' & keyof HttpMethodMap]],
445
+ RequestBodyMap extends HttpMethodMap['delete' & keyof HttpMethodMap]['requestBody' &
446
+ keyof HttpMethodMap['delete' & keyof HttpMethodMap]],
577
447
  RequestBodyContent extends RequestBodyMap extends undefined
578
448
  ? undefined
579
449
  : RequestBodyMap['content' & keyof RequestBodyMap],
@@ -588,7 +458,7 @@ export class OpenapiSpecSession<OpenapiPaths> {
588
458
  * ```ts
589
459
  * const request = new OpenapiSpecRequest<openapiPaths>()
590
460
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
591
- * const res = await session.put('/user', 200, { data: { name: 'new name' })
461
+ * const res = await session.delete('/posts/{id}', 200, { id: '123' })
592
462
  * ```
593
463
  */
594
464
  uri: Uri,
@@ -602,24 +472,25 @@ export class OpenapiSpecSession<OpenapiPaths> {
602
472
  * ```ts
603
473
  * const request = new OpenapiSpecRequest<openapiPaths>()
604
474
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
605
- * const res = await session.put('/user', 200, { data: { name: 'new name' })
475
+ * const res = await session.delete('/posts/{id}', 200, { id: '123' })
606
476
  * ```
607
477
  */
608
478
  expectedStatus: ResponseCode,
609
479
 
610
480
  /**
611
481
  * An object containing the path fields required to
612
- * fill your uri in, as well as any additional PUT
482
+ * fill your uri in, as well as any additional DELETE
613
483
  * arguments, like `data`, for example.
614
484
  *
615
- *
616
485
  * ```ts
617
486
  * const request = new OpenapiSpecRequest<openapiPaths>()
618
487
  * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
619
- * const res = await session.put(
620
- * '/user',
488
+ * const res = await session.delete(
489
+ * '/posts/{postId}/comments/{commentId}',
621
490
  * 200,
622
491
  * {
492
+ * postId: '123',
493
+ * commentId: '456',
623
494
  * data: {
624
495
  * ...request body here
625
496
  * },
@@ -637,500 +508,15 @@ export class OpenapiSpecSession<OpenapiPaths> {
637
508
  * @param opts.headers - headers you would like to send with your request.
638
509
  * (Optional)
639
510
  */
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
- ): Promise<OpenapiSpecResponse<JsonContent>> {
669
- return await this.makeRequest(
670
- 'put',
671
- fillOpenapiParams(uri, opts || {}),
672
- expectedStatus,
673
- opts as SpecRequestOptsAll
674
- )
675
- }
676
-
677
- //
678
- //
679
- //
680
- // begin: PATCH
681
- // has Params
682
- public async patch<
683
- const Uri extends RoutesWithHttpMethod<
684
- OpenapiPaths,
685
- 'patch' & keyof OpenapiPaths[keyof OpenapiPaths]
686
- > &
687
- string,
688
- const ResponseCode extends Params['length'] extends 0
689
- ? never
690
- : keyof ExcludeNever<ResponseMap> & number,
691
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
692
- 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],
714
- >(
715
- /**
716
- * The uri on your background you are trying to hit.
717
- * This should be a path, like '/posts'.
718
- *
719
- * ```ts
720
- * const request = new OpenapiSpecRequest<openapiPaths>()
721
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
722
- * const res = await session.patch('/posts/{id}', 200, { data: { name: 'new name' }})
723
- * ```
724
- */
725
- uri: Uri,
726
-
727
- /**
728
- * The response status you are expecting to receive
729
- * when making this request. It will need to match
730
- * one of the accepted response statuses for the
731
- * provided uri in your openapi types
732
- *
733
- * ```ts
734
- * const request = new OpenapiSpecRequest<openapiPaths>()
735
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
736
- * const res = await session.patch('/posts/{id}', 200, { data: { name: 'new name' }})
737
- * ```
738
- */
739
- expectedStatus: ResponseCode,
740
-
741
- /**
742
- * An object containing the path fields required to
743
- * fill your uri in, as well as any additional PATCH
744
- * arguments, like `data`, for example.
745
- *
746
- * ```ts
747
- * const request = new OpenapiSpecRequest<openapiPaths>()
748
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
749
- * const res = await session.patch(
750
- * '/posts/{postId}/comments/{id}',
751
- * 200,
752
- * {
753
- * postId: '123',
754
- * commentId: '456',
755
- * data: {
756
- * ...request body here
757
- * },
758
- * headers: {
759
- * ...headers here
760
- * },
761
- * }
762
- * )
763
- * ```
764
- *
765
- * @param opts.data - request body data you want to send up. Must match the
766
- * requestBody shape in the openapi document for this uri.
767
- * (Optional)
768
- *
769
- * @param opts.headers - headers you would like to send with your request.
770
- * (Optional)
771
- */
772
- opts: Params['length'] extends 0
773
- ? never
774
- : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & {
775
- [K in Params[number]]: string | IdType
776
- }
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
- ): Promise<OpenapiSpecResponse<JsonContent>> {
900
- return await this.makeRequest(
901
- 'patch',
902
- fillOpenapiParams(uri, opts),
903
- expectedStatus,
904
- opts as SpecRequestOptsAll
905
- )
906
- }
907
-
908
- //
909
- //
910
- //
911
- // begin: delete
912
- // has Params
913
- public async delete<
914
- const Uri extends RoutesWithHttpMethod<
915
- OpenapiPaths,
916
- 'delete' & keyof OpenapiPaths[keyof OpenapiPaths]
917
- > &
918
- string,
919
- const ResponseCode extends Params['length'] extends 0
920
- ? never
921
- : keyof ExcludeNever<ResponseMap> & number,
922
- HttpMethodMap extends OpenapiPaths[Uri & keyof OpenapiPaths],
923
- 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],
945
- >(
946
- /**
947
- * The uri on your background you are trying to hit.
948
- * This should be a path, like '/users'.
949
- *
950
- * ```ts
951
- * const request = new OpenapiSpecRequest<openapiPaths>()
952
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
953
- * const res = await session.delete('/posts/{id}', 200, { id: '123' })
954
- * ```
955
- */
956
- uri: Uri,
957
-
958
- /**
959
- * The response status you are expecting to receive
960
- * when making this request. It will need to match
961
- * one of the accepted response statuses for the
962
- * provided uri in your openapi types
963
- *
964
- * ```ts
965
- * const request = new OpenapiSpecRequest<openapiPaths>()
966
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
967
- * const res = await session.delete('/posts/{id}', 200, { id: '123' })
968
- * ```
969
- */
970
- expectedStatus: ResponseCode,
971
-
972
- /**
973
- * An object containing the path fields required to
974
- * fill your uri in, as well as any additional DELETE
975
- * arguments, like `data`, for example.
976
- *
977
- * ```ts
978
- * const request = new OpenapiSpecRequest<openapiPaths>()
979
- * const session = await request.session('post', '/sessions/{token}', 200, { token: 'abc' })
980
- * const res = await session.delete(
981
- * '/posts/{postId}/comments/{commentId}',
982
- * 200,
983
- * {
984
- * postId: '123',
985
- * commentId: '456',
986
- * data: {
987
- * ...request body here
988
- * },
989
- * headers: {
990
- * ...headers here
991
- * },
992
- * }
993
- * )
994
- * ```
995
- *
996
- * @param opts.data - request body data you want to send up. Must match the
997
- * requestBody shape in the openapi document for this uri.
998
- * (Optional)
999
- *
1000
- * @param opts.headers - headers you would like to send with your request.
1001
- * (Optional)
1002
- */
1003
- opts: Params['length'] extends 0
1004
- ? never
511
+ opts?: Params['length'] extends 0
512
+ ? OpenapiSpecRequestOptsPost<RequestBodyJsonContent>
1005
513
  : OpenapiSpecRequestOptsPost<RequestBodyJsonContent> & {
1006
514
  [K in Params[number]]: string | IdType
1007
515
  }
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
516
  ): Promise<OpenapiSpecResponse<JsonContent>> {
1131
517
  return await this.makeRequest(
1132
518
  'delete',
1133
- fillOpenapiParams(uri, opts),
519
+ fillOpenapiParams(uri, opts || {}),
1134
520
  expectedStatus,
1135
521
  opts as SpecRequestOptsAll
1136
522
  )