winterspec
Version:
Write Winter-CG compatible routes with filesystem routing and tons of features
71 lines (70 loc) • 3.6 kB
TypeScript
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;