UNPKG

winterspec

Version:

Write Winter-CG compatible routes with filesystem routing and tons of features

71 lines (70 loc) 3.6 kB
import type { FetchEvent } from "@edge-runtime/primitives"; import { WinterSpecRouteBundle } from "./winter-spec.js"; import { Primitive } from "type-fest"; import { z } from "zod"; import { ResponseTypeToContext } from "./context.js"; import type { RouteSpec } from "./route-spec.js"; import type { GlobalSpec } from "./global-spec.js"; export type HTTPMethods = "GET" | "POST" | "DELETE" | "PUT" | "PATCH" | "HEAD" | "OPTIONS"; export type WinterSpecRouteParams = { [routeParam: string]: string | string[]; }; export type HeadersDescriptor = Headers | HeadersInit; export interface WinterSpecRequestOptions { routeParams: WinterSpecRouteParams; winterSpec: WinterSpecRouteBundle; } export type WinterSpecRequest<T = {}> = WinterSpecRequestOptions & Request & T; export interface SerializableToResponse { /** * Serialize the response to a Response object * * @throws z.ZodError if the response does not match the schema * @param schema - the schema to validate the response against */ serializeToResponse(schema: z.ZodTypeAny): Response; statusCode(): number; } export type ValidFormDataValue = Primitive | Blob; export declare abstract class WinterSpecResponse implements SerializableToResponse { protected options: ResponseInit; abstract serializeToResponse(schema: z.ZodTypeAny): Response; statusCode(): number; status(status: number): this; header(key: string, value: string): this; headers(headers: HeadersInit): this; statusText(statusText: string): this; constructor(options?: ResponseInit); static json<T>(...args: ConstructorParameters<typeof WinterSpecJsonResponse<T>>): WinterSpecJsonResponse<T>; static multipartFormData<T extends Record<string, ValidFormDataValue>>(...args: ConstructorParameters<typeof WinterSpecMultiPartFormDataResponse<T>>): WinterSpecMultiPartFormDataResponse<T>; static custom<T, const C extends string>(...args: ConstructorParameters<typeof WinterSpecCustomResponse<T, C>>): WinterSpecCustomResponse<T, C>; } export declare class WinterSpecJsonResponse<T> extends WinterSpecResponse { data: T; constructor(data: T, options?: ResponseInit); serializeToResponse(schema: z.ZodTypeAny): Response; } export declare class WinterSpecCustomResponse<T, const C extends string> extends WinterSpecResponse { data: T; contentType: C; constructor(data: T, contentType: C, options?: ResponseInit); serializeToResponse(schema: z.ZodTypeAny): Response; } export declare class MiddlewareResponseData extends WinterSpecResponse { constructor(options?: ResponseInit); serializeToResponse(): Response; } export declare class WinterSpecMultiPartFormDataResponse<T extends Record<string, ValidFormDataValue>> extends WinterSpecResponse { data: T; constructor(data: T, options?: ResponseInit); serializeToResponse(schema: z.ZodTypeAny): Response; } export type WinterSpecRouteFn<RequestOptions = WinterSpecRequestOptions, ResponseType extends SerializableToResponse | Response = Response, Context = ResponseTypeToContext<ResponseType>> = ((req: WinterSpecRequest<RequestOptions>, ctx: Context) => ResponseType | Promise<ResponseType>) & { _globalSpec?: GlobalSpec; _routeSpec?: RouteSpec<any>; }; export type WinterSpecFetchEvent = FetchEvent & { request: WinterSpecRequest; }; export declare function createWinterSpecRequest(request: Request, options: WinterSpecRequestOptions): WinterSpecRequest; export declare function mergeHeaders(h1: HeadersDescriptor | undefined | null, h2: HeadersDescriptor | undefined | null): Headers;