|
1 | | -import ky, { type Hooks } from "ky"; |
| 1 | +import ky, { |
| 2 | + type Hooks, |
| 3 | + type Options, |
| 4 | + type NormalizedOptions, |
| 5 | + type BeforeErrorHook, |
| 6 | + HTTPError, |
| 7 | +} from "ky"; |
2 | 8 | import type { ZodError, ZodType } from "zod"; |
3 | 9 |
|
4 | | -export interface ClientOptions { |
| 10 | +// Ky types |
| 11 | +export type { Hooks, Options }; |
| 12 | + |
| 13 | +export class HTTPPayloadError extends HTTPError { |
| 14 | + payload: any; |
| 15 | + constructor(response: Response, request: Request, options: NormalizedOptions, payload: any) { |
| 16 | + super(response, request, options); |
| 17 | + this.payload = payload; |
| 18 | + } |
| 19 | +} |
| 20 | + |
| 21 | +export { HTTPError }; |
| 22 | + |
| 23 | +export interface ClientOptions extends Options { |
5 | 24 | baseUrl: string; |
6 | | - headers?: Record<string, string>; |
7 | 25 | validate?: boolean; |
8 | | - hooks?: Hooks; |
9 | | - validationHelpers?: ValidationHelpers; |
| 26 | + disableErrorParsing?: boolean; |
10 | 27 | } |
11 | 28 |
|
12 | 29 | export interface OperationParameter { |
@@ -413,38 +430,60 @@ export class ApiClient { |
413 | 430 | private validationHelpers?: ValidationHelpers; |
414 | 431 |
|
415 | 432 | constructor(baseUrl: string, operations: Operations, options?: Omit<ClientOptions, "baseUrl">) { |
| 433 | + const { validate, disableErrorParsing, ...kyOptions } = options ?? {}; |
416 | 434 | this.operations = operations; |
417 | 435 |
|
418 | | - const shouldValidate = options?.validate !== false; |
| 436 | + const shouldValidate = validate !== false; |
| 437 | + |
| 438 | + const beforeError: BeforeErrorHook = async (error) => { |
| 439 | + const { response, request, options } = error; |
| 440 | + try { |
| 441 | + const newError = new HTTPPayloadError(response, request, options, await response.json()); |
| 442 | + return newError; |
| 443 | + } catch (e) { |
| 444 | + return error; |
| 445 | + } |
| 446 | + }; |
419 | 447 |
|
420 | 448 | if (!shouldValidate) { |
421 | 449 | this.ky = ky.create({ |
422 | 450 | prefixUrl: baseUrl, |
423 | | - ...options, |
| 451 | + ...kyOptions, |
| 452 | + hooks: { |
| 453 | + ...kyOptions.hooks, |
| 454 | + beforeError: [ |
| 455 | + ...(disableErrorParsing ? [beforeError] : []), |
| 456 | + ...(kyOptions.hooks?.beforeError ?? []), |
| 457 | + ], |
| 458 | + }, |
424 | 459 | }); |
425 | 460 | return; |
426 | 461 | } |
427 | 462 |
|
428 | | - this.validationHelpers = options?.validationHelpers ?? createValidationHelpers(); |
| 463 | + this.validationHelpers = createValidationHelpers(); |
429 | 464 | const hooks = createKyValidationHooks(this.validationHelpers); |
430 | 465 |
|
431 | 466 | this.ky = ky.create({ |
432 | 467 | prefixUrl: baseUrl, |
433 | | - ...(options?.headers && { headers: options.headers }), |
| 468 | + ...kyOptions, |
434 | 469 | hooks: { |
| 470 | + beforeError: [ |
| 471 | + ...(disableErrorParsing ? [beforeError] : []), |
| 472 | + ...(kyOptions.hooks?.beforeError ?? []), |
| 473 | + ], |
435 | 474 | beforeRequest: [ |
436 | 475 | (request, options) => { |
437 | 476 | const operation = (options as any).operation as Operation; |
438 | 477 | return hooks.beforeRequest?.(request, options, operation) ?? request; |
439 | 478 | }, |
440 | | - ...(options?.hooks?.beforeRequest ?? []), |
| 479 | + ...(kyOptions?.hooks?.beforeRequest ?? []), |
441 | 480 | ], |
442 | 481 | afterResponse: [ |
443 | 482 | (request, options, response) => { |
444 | 483 | const operation = (options as any).operation as Operation; |
445 | 484 | return hooks.afterResponse?.(request, options, response, operation) ?? response; |
446 | 485 | }, |
447 | | - ...(options?.hooks?.afterResponse ?? []), |
| 486 | + ...(kyOptions?.hooks?.afterResponse ?? []), |
448 | 487 | ], |
449 | 488 | }, |
450 | 489 | }); |
@@ -497,7 +536,7 @@ export class ApiClient { |
497 | 536 | } |
498 | 537 | } |
499 | 538 |
|
500 | | - const requestOptions: any = { |
| 539 | + const requestOptions: Record<string, any> = { |
501 | 540 | method: operation.method.toUpperCase(), |
502 | 541 | headers, |
503 | 542 | searchParams, |
|
0 commit comments