@grace-js/grace
Version:
An opinionated API framework
45 lines • 4.21 kB
TypeScript
import { AnyResponseSchema, PossibleResponses } from "./response.js";
import { AfterRoute, BeforeRoute, ContextExtra } from "./middleware.js";
import { ZodSchema } from "zod";
import { Grace } from "../grace.js";
export type Context<Body = any, Query = Record<string, string>, Params = Record<string, string>, Headers = Record<string, string>, Extras = Record<string, unknown>> = {
request: Request;
body: Body;
query: Query;
params: Params;
headers: Headers;
extras: Extras;
app: Grace;
} & Extras;
export type Route<Body, Query, Params, Response extends AnyResponseSchema, Before extends Array<BeforeRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>, After extends Array<AfterRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>, Headers = Record<string, string>, ContextExtras = ContextExtra, ContextSchema = Context<Body, Query, Params, Headers, ContextExtras>> = {
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
format?: 'json' | 'multipart' | 'text';
path?: string;
schema?: {
body?: ZodSchema<Body>;
query?: ZodSchema<Query>;
params?: ZodSchema<Params>;
headers?: ZodSchema<Headers>;
response?: Response;
};
before?: Before;
after?: After;
handler: (context: ContextSchema) => Promise<PossibleResponses<Response>>;
};
export type AnyRoute = Route<any, any, any, any, any, any, any, any, any>;
export type InferContext<R extends AnyRoute> = R extends Route<any, any, any, any, any, any, any, any, infer ContextSchema> ? ContextSchema : never;
export type InferResponse<R extends AnyRoute> = R extends Route<any, any, any, infer Response, any, any, any, any, any> ? Response : never;
export declare function createRoute<Body, Query, Params, Headers, Response extends AnyResponseSchema, ContextExtras extends ContextExtra, Before extends Array<BeforeRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>, After extends Array<AfterRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>>(route: Route<Body, Query, Params, Response, Before, After, Headers, ContextExtras>): Route<Body, Query, Params, Response, Before, After, Headers, ContextExtras>;
export declare function createRouteWithExtras<ContextExtras extends ContextExtra>(): <Body_1, Query, Params, Headers_1, Response_1 extends AnyResponseSchema, Before extends BeforeRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[], After extends AfterRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[]>(route: Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>) => Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>;
export declare function createRouteTemplate<ContextExtras extends ContextExtra>({ before, after, schema, }?: {
before?: Array<BeforeRoute<Route<any, any, any, any, any, any, any, ContextExtras>>>;
after?: Array<AfterRoute<Route<any, any, any, any, any, any, any, ContextExtras>>>;
schema?: {
body?: ZodSchema;
query?: ZodSchema;
params?: ZodSchema;
headers?: ZodSchema | Record<string, string>;
response?: AnyResponseSchema;
};
}): <Body_1, Query, Params, Headers_1, Response_1 extends AnyResponseSchema, Before extends BeforeRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[], After extends AfterRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[]>(route: Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>) => Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>;
//# sourceMappingURL=route.d.ts.map