UNPKG

workery

Version:

Modern web framework for building APIs on Cloudflare Workers.

92 lines (91 loc) 3.82 kB
/// <reference types="@cloudflare/workers-types" /> import type { z } from "zod"; import type { LinksObject } from "openapi3-ts/oas31"; import type { Dependency } from "./dependencies"; import type { Route } from "./routing"; export type HTTPMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS" | "TRACE"; export type HTTPMethodLower = "get" | "post" | "put" | "patch" | "delete" | "head" | "options" | "trace"; export type ResponseClass = new (body: any, init?: ResponseInit) => Response; export type Next = () => Promise<Response>; export type Later = (fn: (res: Response) => void) => void; export type Preprocessor = <Out = any, In = any>(value: In) => Out | In; export interface RouteParameterOptions { altName?: string; mediaType?: string; description?: string; includeInSchema?: boolean; preprocessor?: Preprocessor; } export interface RespondsOptions { mediaType?: string; description?: string; headers?: Record<string, z.ZodType>; links?: LinksObject; } export type ZodBodyable = z.ZodType | typeof String | typeof Blob | typeof ReadableStream; export type RouteParameterLocation = "path" | "query" | "header" | "cookie" | "body" | "$depends"; export interface RouteParameter<S extends z.ZodType> { location: RouteParameterLocation; schema?: S; schemaOr?: any; dependency?: Dependency<any, RouteParameters, any>; options: RouteParameterOptions; } export type PathParameter<S extends z.ZodType> = RouteParameter<S> & { location: "path"; schema: S; }; export type QueryParameter<S extends z.ZodType> = RouteParameter<S> & { location: "query"; schema: S; }; export type HeaderParameter<S extends z.ZodType> = RouteParameter<S> & { location: "header"; schema: S; }; export type CookieParameter<S extends z.ZodType> = RouteParameter<S> & { location: "cookie"; schema: S; }; export type BodyParameter<S extends z.ZodType> = RouteParameter<S> & { location: "body"; schema: S; options: { mediaType: string; }; }; export type DependsParameter<S extends z.ZodType> = RouteParameter<S> & { location: "$depends"; dependency: Dependency<any, RouteParameters, any>; }; export type RouteParameters = { [k: string]: RouteParameter<z.ZodType>; } & { req?: never; }; export type TypeOf<T> = T extends RouteParameter<infer S extends z.ZodType> ? z.TypeOf<S> : T extends z.ZodType ? z.TypeOf<T> : T extends Dependency<infer R, any, any> ? R : unknown; export type ArgsOf<Ps extends RouteParameters, E = unknown> = { req: Request; env: E; ctx: ExecutionContext; } & { [K in keyof Ps]: TypeOf<Ps[K]>; }; export type InitOf<C extends abstract new (...args: any) => any> = C extends new (init: infer I extends { [k: string]: any; }) => InstanceType<C> ? I : never; export type ExceptionHandler<E = unknown> = ((args: ArgsOf<{}, E>, e: any) => Promise<Response>) | ((args: ArgsOf<{}, E>, e: any) => Response); export type RouteHandler<R, Ps extends RouteParameters, E = unknown> = ((args: ArgsOf<Ps, E>) => Promise<R>) | ((args: ArgsOf<Ps, E>) => R); export type DependencyHandler<R, Ps extends RouteParameters, E = unknown> = ((args: ArgsOf<Ps, E>, later: Later) => Promise<R>) | ((args: ArgsOf<Ps, E>, later: Later) => R); export type MiddlewareHandler<E = unknown> = ((args: ArgsOf<{}, E>, next: Next) => Promise<Response>) | ((args: ArgsOf<{}, E>, next: Next) => Response); export type UnboundRoute<R, Ps extends RouteParameters, E> = Omit<InitOf<typeof Route<R, Ps, E>>, "method" | "path">; export interface ParseArgsError { location: RouteParameterLocation; name: string; issues: z.ZodIssue[]; } export interface ParseArgsInfo<Ps extends RouteParameters, E = unknown> { success: boolean; errors: ParseArgsError[]; args: ArgsOf<Ps, E>; }