@assassinonz/exzodus-client
Version:
Axios wrapper with end to end type safety
39 lines • 1.77 kB
TypeScript
import { z } from "zod";
export declare const METHODS: readonly ["get", "post", "put", "delete", "patch"];
export type Method = (typeof METHODS)[number];
export type Api = Record<string, {
[M in Method]?: RouteDescription;
}>;
type RouteDescription = {
request: z.ZodType | undefined;
parameters: {
path: z.ZodType | undefined;
query: z.ZodType | undefined;
header: z.ZodType | undefined;
};
responses: Record<number | "default", z.ZodType>;
errors: Record<number, z.ZodType>;
};
export type Path<A extends Api> = keyof A;
export type MethodByPath<A extends Api, P extends Path<A>> = keyof A[P];
export type PathByMethod<A extends Api, M extends Method> = keyof {
[P in Path<A> as A[P] extends {
[K in M]: unknown;
} ? P : never]: A[P];
};
export type EndpointInputs<A extends Api, M extends MethodByPath<A, P>, P extends Path<A>> = A[P][M] extends {
parameters: infer T;
request: infer R;
} ? T & {
body: R;
} : never;
type EndpointResponses<A extends Api, M extends MethodByPath<A, P>, P extends Path<A>> = A[P][M] extends {
responses: infer T;
} ? T : never;
export type ResponseCode<A extends Api, M extends MethodByPath<A, P>, P extends Path<A>> = Exclude<keyof EndpointResponses<A, M, P>, "default">;
export type ResponseBody<A extends Api, M extends MethodByPath<A, P>, P extends Path<A>, C extends ResponseCode<A, M, P>> = EndpointResponses<A, M, P>[C] extends z.ZodType ? z.infer<EndpointResponses<A, M, P>[C]> : never;
export type DefaultResponseBody<A extends Api, M extends MethodByPath<A, P>, P extends Path<A>> = EndpointResponses<A, M, P> extends {
default: infer T;
} ? T extends z.ZodType ? z.infer<T> : never : never;
export {};
//# sourceMappingURL=index.d.ts.map