aspi 1.1.0-beta.0 → 1.2.1

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/dist/index.d.cts CHANGED
@@ -67,6 +67,10 @@ declare const getHttpErrorStatus: (status: HttpErrorCodes) => HttpErrorStatus;
67
67
  */
68
68
  type HttpMethods = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'TRACE' | 'CONNECT';
69
69
 
70
+ type Prettify<Type> = Type extends Function ? Type : Extract<{
71
+ [Key in keyof Type]: Type[Key];
72
+ }, Type>;
73
+ type Merge<Object1, Object2> = Prettify<Omit<Object1, keyof Object2> & Object2>;
70
74
  type AspiConfigBase = {
71
75
  baseUrl: string;
72
76
  retryConfig?: AspiRetryConfig<AspiRequestInit>;
@@ -91,6 +95,7 @@ type RequestOptions<TRequest extends AspiRequestInit> = {
91
95
  retryConfig?: AspiRetryConfig<TRequest>;
92
96
  middlewares?: Middleware<TRequest, TRequest>[];
93
97
  errorCbs?: ErrorCallbacks;
98
+ throwOnError?: boolean;
94
99
  };
95
100
  type ErrorCallbacks = Record<number, {
96
101
  cb: (input: {
@@ -104,6 +109,7 @@ type AspiResultOk<TRequest extends AspiRequestInit, TData> = {
104
109
  request: AspiRequest<TRequest>;
105
110
  response: AspiResponse;
106
111
  };
112
+ type AspiPlainResponse<TRequest extends AspiRequestInit, TData> = AspiResultOk<TRequest, TData>;
107
113
 
108
114
  /**
109
115
  * Response interface used in error handling
@@ -195,6 +201,8 @@ interface JSONParseError extends CustomError<'jsonParseError', {
195
201
  message: string;
196
202
  }> {
197
203
  }
204
+ declare const isAspiError: <TReq extends AspiRequestInit>(error: unknown) => error is AspiError<TReq>;
205
+ declare const isCustomError: <Tag extends string, A>(error: unknown) => error is CustomError<Tag, A>;
198
206
 
199
207
  type Ok<T> = {
200
208
  __tag: 'ok';
@@ -452,63 +460,43 @@ declare function catchErrors<T, E extends {
452
460
  tag: keyof typeof handlers;
453
461
  }>>;
454
462
  /**
455
- * Creates a chainable pipeline to transform a Result through a series of operations.
456
- * @param result - The initial Result to transform
457
- * @param ab - First transformation function to apply to the Result
458
- * @returns A chainable function with pipe() for adding more transformations and execute() to run the pipeline
463
+ * Pipes a value through a series of functions from left to right
459
464
  * @example
465
+ * // Pipe a value through multiple transformations
460
466
  * pipe(
461
- * ok(5),
462
- * (a) => ok(a.value * 2)
463
- * )
464
- * .pipe(b => ok(b.value + 1))
465
- * .execute() // { __tag: "ok", value: 11 }
467
+ * 5,
468
+ * x => x * 2,
469
+ * x => x + 1
470
+ * ) // 11
471
+ *
472
+ * // Each function receives the result of the previous function
473
+ * pipe(
474
+ * "hello",
475
+ * str => str.toUpperCase(),
476
+ * str => `${str}!`
477
+ * ) // "HELLO!"
466
478
  */
467
- declare const pipe: <AI, AE, BI, BE>(result: Result<AI, AE>, ab: (a: Result<AI, AE>) => Result<BI, BE>) => {
468
- (a: Result<AI, AE>): Result<BI, BE>;
469
- pipe<CI, CE>(bc: (b: Result<BI, BE>) => Result<CI, CE>): {
470
- (a: Result<AI, AE>): Result<CI, CE>;
471
- pipe<CI_1, CE_1>(bc: (b: Result<CI, CE>) => Result<CI_1, CE_1>): {
472
- (a: Result<AI, AE>): Result<CI_1, CE_1>;
473
- pipe<CI_2, CE_2>(bc: (b: Result<CI_1, CE_1>) => Result<CI_2, CE_2>): {
474
- (a: Result<AI, AE>): Result<CI_2, CE_2>;
475
- pipe<CI_3, CE_3>(bc: (b: Result<CI_2, CE_2>) => Result<CI_3, CE_3>): {
476
- (a: Result<AI, AE>): Result<CI_3, CE_3>;
477
- pipe<CI_4, CE_4>(bc: (b: Result<CI_3, CE_3>) => Result<CI_4, CE_4>): {
478
- (a: Result<AI, AE>): Result<CI_4, CE_4>;
479
- pipe<CI_5, CE_5>(bc: (b: Result<CI_4, CE_4>) => Result<CI_5, CE_5>): {
480
- (a: Result<AI, AE>): Result<CI_5, CE_5>;
481
- pipe<CI_6, CE_6>(bc: (b: Result<CI_5, CE_5>) => Result<CI_6, CE_6>): {
482
- (a: Result<AI, AE>): Result<CI_6, CE_6>;
483
- pipe<CI_7, CE_7>(bc: (b: Result<CI_6, CE_6>) => Result<CI_7, CE_7>): {
484
- (a: Result<AI, AE>): Result<CI_7, CE_7>;
485
- pipe<CI_8, CE_8>(bc: (b: Result<CI_7, CE_7>) => Result<CI_8, CE_8>): {
486
- (a: Result<AI, AE>): Result<CI_8, CE_8>;
487
- pipe<CI_9, CE_9>(bc: (b: Result<CI_8, CE_8>) => Result<CI_9, CE_9>): {
488
- (a: Result<AI, AE>): Result<CI_9, CE_9>;
489
- pipe<CI_10, CE_10>(bc: (b: Result<CI_9, CE_9>) => Result<CI_10, CE_10>): /*elided*/ any;
490
- execute(): Result<CI_9, CE_9>;
491
- };
492
- execute(): Result<CI_8, CE_8>;
493
- };
494
- execute(): Result<CI_7, CE_7>;
495
- };
496
- execute(): Result<CI_6, CE_6>;
497
- };
498
- execute(): Result<CI_5, CE_5>;
499
- };
500
- execute(): Result<CI_4, CE_4>;
501
- };
502
- execute(): Result<CI_3, CE_3>;
503
- };
504
- execute(): Result<CI_2, CE_2>;
505
- };
506
- execute(): Result<CI_1, CE_1>;
507
- };
508
- execute(): Result<CI, CE>;
509
- };
510
- execute(): Result<BI, BE>;
511
- };
479
+ declare function pipe<A>(a: A): A;
480
+ declare function pipe<A, B = never>(a: A, ab: (a: A) => B): B;
481
+ declare function pipe<A, B = never, C = never>(a: A, ab: (a: A) => B, bc: (b: B) => C): C;
482
+ declare function pipe<A, B = never, C = never, D = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D;
483
+ declare function pipe<A, B = never, C = never, D = never, E = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E): E;
484
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F): F;
485
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G): G;
486
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H): H;
487
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I): I;
488
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J): J;
489
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K): K;
490
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L): L;
491
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M): M;
492
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N): N;
493
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N, op: (n: N) => O): O;
494
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N, op: (n: N) => O, pq: (o: O) => P): P;
495
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N, op: (n: N) => O, pq: (o: O) => P, qr: (p: P) => Q): Q;
496
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N, op: (n: N) => O, pq: (o: O) => P, qr: (p: P) => Q, rs: (q: Q) => R): R;
497
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N, op: (n: N) => O, pq: (o: O) => P, qr: (p: P) => Q, rs: (q: Q) => R, st: (r: R) => S): S;
498
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N, op: (n: N) => O, pq: (o: O) => P, qr: (p: P) => Q, rs: (q: Q) => R, st: (r: R) => S, tu: (s: S) => T): T;
499
+ declare function pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J, kl: (j: J) => K, lm: (k: K) => L, mn: (l: L) => M, no: (m: M) => N, op: (n: N) => O, pq: (o: O) => P, qr: (p: P) => Q, rs: (q: Q) => R, st: (r: R) => S, tu: (s: S) => T, uv: (t: T) => U): U;
512
500
 
513
501
  type result_Err<E> = Err<E>;
514
502
  type result_Ok<T> = Ok<T>;
@@ -618,7 +606,7 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
618
606
  error: {};
619
607
  }> {
620
608
  #private;
621
- constructor(method: HttpMethods, path: string, { requestConfig, retryConfig, middlewares, errorCbs, }: RequestOptions<TRequest>);
609
+ constructor(method: HttpMethods, path: string, { requestConfig, retryConfig, middlewares, errorCbs, throwOnError, }: RequestOptions<TRequest>);
622
610
  /**
623
611
  * Sets the base URL for the request.
624
612
  * @param url The base URL to set
@@ -710,9 +698,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
710
698
  * age: 30
711
699
  * });
712
700
  */
713
- bodyJson<Body extends StandardSchemaV1.InferInput<Opts['bodySchema']>>(body: Body): Request<Method, TRequest, Omit<Opts, "body"> & {
701
+ bodyJson<Body extends StandardSchemaV1.InferInput<Opts['bodySchema']>>(body: Body): Request<Method, TRequest, Merge<Omit<Opts, "body">, {
714
702
  body: Body;
715
- }>;
703
+ }>>;
716
704
  /**
717
705
  * Sets the raw request body (unsafe, use with caution).
718
706
  * @param body The body content to send with the request
@@ -727,9 +715,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
727
715
  * // or with URLSearchParams
728
716
  * request.unsafeBody(new URLSearchParams({ key: 'value' }));
729
717
  */
730
- unsafeBody(body: BodyInit): Request<Method, TRequest, Omit<Opts, "body"> & {
718
+ unsafeBody(body: BodyInit): Request<Method, TRequest, Merge<Omit<Opts, "body">, {
731
719
  body: BodyInit;
732
- }>;
720
+ }>>;
733
721
  /**
734
722
  * Handles 404 Not Found errors with a custom callback.
735
723
  * @param cb The callback function to handle the error
@@ -741,9 +729,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
741
729
  * return { message: 'Custom not found message' };
742
730
  * });
743
731
  */
744
- notFound<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
732
+ notFound<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
745
733
  error: { [K in "notFoundError" | keyof Opts["error"]]: K extends "notFoundError" ? CustomError<"notFoundError", A> : Opts["error"][K]; };
746
- }>;
734
+ }>>;
747
735
  /**
748
736
  * Handles 429 Too Many Requests errors with a custom callback.
749
737
  * @param cb The callback function to handle the error
@@ -755,9 +743,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
755
743
  * return { message: 'Please try again later' };
756
744
  * });
757
745
  */
758
- tooManyRequests<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
746
+ tooManyRequests<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
759
747
  error: { [K in keyof Opts["error"] | "tooManyRequestsError"]: K extends "tooManyRequestsError" ? CustomError<"tooManyRequestsError", A> : Opts["error"][K]; };
760
- }>;
748
+ }>>;
761
749
  /**
762
750
  * Handles 400 Bad Request errors with a custom callback.
763
751
  * @param cb The callback function to handle the error
@@ -769,9 +757,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
769
757
  * return { message: 'Invalid request parameters' };
770
758
  * });
771
759
  */
772
- badRequest<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
760
+ badRequest<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
773
761
  error: { [K in keyof Opts["error"] | "badRequestError"]: K extends "badRequestError" ? CustomError<"badRequestError", A> : Opts["error"][K]; };
774
- }>;
762
+ }>>;
775
763
  /**
776
764
  * Handles 409 Conflict errors with a custom callback.
777
765
  * @param cb The callback function to handle the error
@@ -783,9 +771,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
783
771
  * return { message: 'Resource conflict detected' };
784
772
  * });
785
773
  */
786
- conflict<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
774
+ conflict<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
787
775
  error: { [K in keyof Opts["error"] | "conflictError"]: K extends "conflictError" ? CustomError<"conflictError", A> : Opts["error"][K]; };
788
- }>;
776
+ }>>;
789
777
  /**
790
778
  * Handles 401 Unauthorized errors with a custom callback.
791
779
  * @param cb The callback function to handle the error
@@ -797,9 +785,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
797
785
  * return { message: 'Please login first' };
798
786
  * });
799
787
  */
800
- unauthorised<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
788
+ unauthorised<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
801
789
  error: { [K in keyof Opts["error"] | "unauthorisedError"]: K extends "unauthorisedError" ? CustomError<"unauthorisedError", A> : Opts["error"][K]; };
802
- }>;
790
+ }>>;
803
791
  /**
804
792
  * Handles 403 Forbidden errors with a custom callback.
805
793
  * @param cb The callback function to handle the error
@@ -811,9 +799,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
811
799
  * return { message: 'You do not have permission' };
812
800
  * });
813
801
  */
814
- forbidden<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
802
+ forbidden<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
815
803
  error: { [K in keyof Opts["error"] | "forbiddenError"]: K extends "forbiddenError" ? CustomError<"forbiddenError", A> : Opts["error"][K]; };
816
- }>;
804
+ }>>;
817
805
  /**
818
806
  * Handles 501 Not Implemented errors with a custom callback.
819
807
  * @param cb The callback function to handle the error
@@ -825,9 +813,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
825
813
  * return { message: 'This feature is not implemented yet' };
826
814
  * });
827
815
  */
828
- notImplemented<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
816
+ notImplemented<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
829
817
  error: { [K in keyof Opts["error"] | "notImplementedError"]: K extends "notImplementedError" ? CustomError<"notImplementedError", A> : Opts["error"][K]; };
830
- }>;
818
+ }>>;
831
819
  /**
832
820
  * Handles 500 Internal Server Error errors with a custom callback.
833
821
  * @param cb The callback function to handle the error
@@ -839,9 +827,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
839
827
  * return { message: 'An unexpected error occurred' };
840
828
  * });
841
829
  */
842
- internalServerError<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
830
+ internalServerError<A extends {}>(cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Prettify<Omit<Omit<Opts, "error">, "error"> & {
843
831
  error: { [K in keyof Opts["error"] | "internalServerError"]: K extends "internalServerError" ? CustomError<"internalServerError", A> : Opts["error"][K]; };
844
- }>;
832
+ }>>;
845
833
  /**
846
834
  * Sets a custom error handler for a specific HTTP status code.
847
835
  * @param tag A string identifier for the error type
@@ -867,9 +855,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
867
855
  * console.log(result.error.data.message); // 'Invalid input'
868
856
  * }
869
857
  */
870
- error<Tag extends string, A extends {}>(tag: Tag, status: HttpErrorStatus, cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Omit<Opts, "error"> & {
858
+ error<Tag extends string, A extends {}>(tag: Tag, status: HttpErrorStatus, cb: CustomErrorCb<TRequest, A>): Request<Method, TRequest, Merge<Omit<Opts, "error">, {
871
859
  error: { [K in Tag | keyof Opts["error"]]: K extends Tag ? CustomError<Tag, A> : Opts["error"][K]; };
872
- }>;
860
+ }>>;
873
861
  /**
874
862
  * Sets query parameters for the request URL.
875
863
  * @param params An object containing query parameter key-value pairs
@@ -882,9 +870,9 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
882
870
  * sort: 'desc'
883
871
  * });
884
872
  */
885
- setQueryParams<T extends Record<string, string> | string[][] | string | URLSearchParams>(params: T): Request<Method, TRequest, Omit<Opts, "queryParams"> & {
886
- qyeryParams: T;
887
- }>;
873
+ setQueryParams<T extends Record<string, string> | string[][] | string | URLSearchParams>(params: T): Request<Method, TRequest, Merge<Omit<Opts, "queryParams">, {
874
+ queryParams: T;
875
+ }>>;
888
876
  /**
889
877
  * Sets the output schema for validating the response data using Zod.
890
878
  * @param schema The Zod schema to validate the response
@@ -908,12 +896,27 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
908
896
  * const user = result.value; // Typed and validated user data
909
897
  * }
910
898
  */
911
- schema<TSchema extends StandardSchemaV1>(schema: TSchema): Request<Method, TRequest, Omit<Opts, "schema"> & {
899
+ schema<TSchema extends StandardSchemaV1>(schema: TSchema): Request<Method, TRequest, Merge<Omit<Opts, "schema">, {
912
900
  schema: TSchema;
913
- error: Opts["error"] & {
901
+ error: Merge<Opts["error"], {
914
902
  parseError: CustomError<"parseError", StandardSchemaV1.FailureResult["issues"]>;
915
- };
916
- }>;
903
+ }>;
904
+ }>>;
905
+ /**
906
+ * Sets the request to throw an error if the response status is not successful.
907
+ * @returns The request instance for chaining
908
+ * @example
909
+ * const request = new Request('/users', config);
910
+ * const result = await request
911
+ * .withResult()
912
+ * .throwable()
913
+ * .json();
914
+ *
915
+ */
916
+ throwable(): Request<Method, TRequest, Merge<Omit<Opts, "withResult" | "throwable">, {
917
+ withResult: false;
918
+ throwable: true;
919
+ }>>;
917
920
  /**
918
921
  * Executes the request and returns the JSON response.
919
922
  * @returns A Promise containing the Result type with either successful data or error information
@@ -921,7 +924,8 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
921
924
  * const request = new Request('/users', config);
922
925
  * const result = await request
923
926
  * .setQueryParams({ id: '123' })
924
- * .withResult()
927
+ * .
928
+ withResult()
925
929
  * .notFound((error) => ({ message: 'User not found' }))
926
930
  * .json<User>();
927
931
  *
@@ -933,7 +937,7 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
933
937
  */
934
938
  json<T extends StandardSchemaV1.InferOutput<Opts['schema']>>(): Promise<Opts['withResult'] extends true ? Result<AspiResultOk<TRequest, T>, AspiError<TRequest> | (Opts extends {
935
939
  error: any;
936
- } ? Opts['error'][keyof Opts['error']] : never) | JSONParseError> : [
940
+ } ? Opts['error'][keyof Opts['error']] : never) | JSONParseError> : Opts['throwable'] extends true ? AspiPlainResponse<TRequest, T> : [
937
941
  AspiResultOk<TRequest, T> | null,
938
942
  ((AspiError<TRequest> | (Opts extends {
939
943
  error: any;
@@ -958,7 +962,7 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
958
962
  */
959
963
  text(): Promise<Opts['withResult'] extends true ? Result<AspiResultOk<TRequest, string>, AspiError<TRequest> | (Opts extends {
960
964
  error: any;
961
- } ? Opts['error'][keyof Opts['error']] : never)> : [
965
+ } ? Opts['error'][keyof Opts['error']] : never)> : Opts['throwable'] extends true ? AspiPlainResponse<TRequest, string> : [
962
966
  AspiResultOk<TRequest, string> | null,
963
967
  ((AspiError<TRequest> | (Opts extends {
964
968
  error: any;
@@ -983,7 +987,7 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
983
987
  */
984
988
  blob(): Promise<Opts['withResult'] extends true ? Result<AspiResultOk<TRequest, Blob>, AspiError<TRequest> | (Opts extends {
985
989
  error: any;
986
- } ? Opts['error'][keyof Opts['error']] : never)> : [
990
+ } ? Opts['error'][keyof Opts['error']] : never)> : Opts['throwable'] extends true ? AspiPlainResponse<TRequest, Blob> : [
987
991
  AspiResultOk<TRequest, Blob> | null,
988
992
  ((AspiError<TRequest> | (Opts extends {
989
993
  error: any;
@@ -1013,9 +1017,10 @@ declare class Request<Method extends HttpMethods, TRequest extends AspiRequestIn
1013
1017
  * const user = result.value;
1014
1018
  * }
1015
1019
  */
1016
- withResult(): Request<Method, TRequest, Omit<Opts, "withResult"> & {
1020
+ withResult(): Request<Method, TRequest, Merge<Omit<Opts, "withResult" | "throwable">, {
1017
1021
  withResult: true;
1018
- }>;
1022
+ throwable: false;
1023
+ }>>;
1019
1024
  }
1020
1025
 
1021
1026
  /**
@@ -1185,9 +1190,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1185
1190
  * return { message: 'Invalid input' };
1186
1191
  * });
1187
1192
  */
1188
- error<Tag extends string, A extends {}>(tag: Tag, status: HttpErrorStatus, cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1193
+ error<Tag extends string, A extends {}>(tag: Tag, status: HttpErrorStatus, cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1189
1194
  error: { [K in Tag | keyof Opts["error"]]: K extends Tag ? CustomError<Tag, A> : Opts["error"][K]; };
1190
- }>;
1195
+ }>>;
1191
1196
  /**
1192
1197
  * Handles 404 Not Found errors with a custom callback.
1193
1198
  * @param cb The callback function to handle the error
@@ -1199,9 +1204,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1199
1204
  * return { message: 'Resource not found' };
1200
1205
  * });
1201
1206
  */
1202
- notFound<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1207
+ notFound<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1203
1208
  error: { [K in "notFoundError" | keyof Opts["error"]]: K extends "notFoundError" ? CustomError<"notFoundError", A> : Opts["error"][K]; };
1204
- }>;
1209
+ }>>;
1205
1210
  /**
1206
1211
  * Handles 429 Too Many Requests errors with a custom callback.
1207
1212
  * @param cb The callback function to handle the error
@@ -1213,9 +1218,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1213
1218
  * return { message: 'Please try again later' };
1214
1219
  * });
1215
1220
  */
1216
- tooManyRequests<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1221
+ tooManyRequests<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1217
1222
  error: { [K in "tooManyRequestsError" | keyof Opts["error"]]: K extends "tooManyRequestsError" ? CustomError<"tooManyRequestsError", A> : Opts["error"][K]; };
1218
- }>;
1223
+ }>>;
1219
1224
  /**
1220
1225
  * Handles 409 Conflict errors with a custom callback.
1221
1226
  * @param cb The callback function to handle the error
@@ -1227,9 +1232,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1227
1232
  * return { message: 'Resource conflict detected' };
1228
1233
  * });
1229
1234
  */
1230
- conflict<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1235
+ conflict<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1231
1236
  error: { [K in "conflictError" | keyof Opts["error"]]: K extends "conflictError" ? CustomError<"conflictError", A> : Opts["error"][K]; };
1232
- }>;
1237
+ }>>;
1233
1238
  /**
1234
1239
  * Registers a handler for 400 Bad Request errors
1235
1240
  * @param {CustomErrorCb<TRequest, A>} cb - The callback function to handle the error
@@ -1237,9 +1242,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1237
1242
  * @example
1238
1243
  * api.badRequest((req, res) => ({ message: 'Invalid request parameters' }));
1239
1244
  */
1240
- badRequest<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1245
+ badRequest<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1241
1246
  error: { [K in "badRequestError" | keyof Opts["error"]]: K extends "badRequestError" ? CustomError<"badRequestError", A> : Opts["error"][K]; };
1242
- }>;
1247
+ }>>;
1243
1248
  /**
1244
1249
  * Registers a handler for 401 Unauthorized errors
1245
1250
  * @param {CustomErrorCb<TRequest, A>} cb - The callback function to handle the error
@@ -1247,9 +1252,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1247
1252
  * @example
1248
1253
  * api.unauthorized((req, res) => ({ message: 'Authentication required' }));
1249
1254
  */
1250
- unauthorized<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1255
+ unauthorized<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1251
1256
  error: { [K in keyof Opts["error"] | "unauthorizedError"]: K extends "unauthorizedError" ? CustomError<"unauthorizedError", A> : Opts["error"][K]; };
1252
- }>;
1257
+ }>>;
1253
1258
  /**
1254
1259
  * Registers a handler for 403 Forbidden errors
1255
1260
  * @param {CustomErrorCb<TRequest, A>} cb - The callback function to handle the error
@@ -1257,9 +1262,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1257
1262
  * @example
1258
1263
  * api.forbidden((req, res) => ({ message: 'Access denied' }));
1259
1264
  */
1260
- forbidden<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1265
+ forbidden<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1261
1266
  error: { [K in "forbiddenError" | keyof Opts["error"]]: K extends "forbiddenError" ? CustomError<"forbiddenError", A> : Opts["error"][K]; };
1262
- }>;
1267
+ }>>;
1263
1268
  /**
1264
1269
  * Registers a handler for 501 Not Implemented errors
1265
1270
  * @param {CustomErrorCb<TRequest, A>} cb - The callback function to handle the error
@@ -1267,9 +1272,9 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1267
1272
  * @example
1268
1273
  * api.notImplemented((req, res) => ({ message: 'Feature not implemented' }));
1269
1274
  */
1270
- notImplemented<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1275
+ notImplemented<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1271
1276
  error: { [K in "notImplementedError" | keyof Opts["error"]]: K extends "notImplementedError" ? CustomError<"notImplementedError", A> : Opts["error"][K]; };
1272
- }>;
1277
+ }>>;
1273
1278
  /**
1274
1279
  * Registers a handler for 500 Internal Server errors
1275
1280
  * @param {CustomErrorCb<TRequest, A>} cb - The callback function to handle the error
@@ -1277,9 +1282,23 @@ declare class Aspi<TRequest extends AspiRequestInit = AspiRequestInit, Opts exte
1277
1282
  * @example
1278
1283
  * api.internalServerError((req, res) => ({ message: 'Server error occurred' }));
1279
1284
  */
1280
- internalServerError<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Opts & {
1285
+ internalServerError<A extends {}>(cb: CustomErrorCb<TRequest, A>): Aspi<TRequest, Prettify<Opts & {
1281
1286
  error: { [K in keyof Opts["error"] | "internalServerErrorError"]: K extends "internalServerErrorError" ? CustomError<"internalServerErrorError", A> : Opts["error"][K]; };
1282
- }>;
1287
+ }>>;
1288
+ /**
1289
+ * Sets the aspi to throw an error if the response status is not successful.
1290
+ * @returns The request instance for chaining
1291
+ * @example
1292
+ * const aspi = new Aspi({baseUrl: 'https://example.com'});
1293
+ * const result = await aspi.get('/users')
1294
+ * .withResult()
1295
+ * .throwable()
1296
+ * .json();
1297
+ *
1298
+ */
1299
+ throwable(): Aspi<TRequest, Prettify<Opts & {
1300
+ throwable: true;
1301
+ }>>;
1283
1302
  }
1284
1303
 
1285
- export { Aspi, type AspiConfig, type AspiConfigBase, AspiError, type AspiRequest, type AspiRequestInit, type AspiResponse, type AspiResultOk, type AspiRetryConfig, CustomError, type CustomErrorCb, type ErrorCallbacks, type HttpErrorCodes, type HttpErrorStatus, type HttpMethods, type JSONParseError, type Middleware, Request, type RequestOptions, result as Result, getHttpErrorStatus, httpErrors };
1304
+ export { Aspi, type AspiConfig, type AspiConfigBase, AspiError, type AspiPlainResponse, type AspiRequest, type AspiRequestInit, type AspiResponse, type AspiResultOk, type AspiRetryConfig, CustomError, type CustomErrorCb, type ErrorCallbacks, type HttpErrorCodes, type HttpErrorStatus, type HttpMethods, type JSONParseError, type Merge, type Middleware, type Prettify, Request, type RequestOptions, result as Result, getHttpErrorStatus, httpErrors, isAspiError, isCustomError };