Files
diachron/express/types.ts
2026-01-01 17:22:04 -06:00

60 lines
1.4 KiB
TypeScript

// types.ts
// FIXME: split this up into types used by app developers and types internal
// to the framework.
import {
type Request as ExpressRequest,
Response as ExpressResponse,
} from "express";
import type { MatchFunction } from "path-to-regexp";
import { z } from "zod";
import { type ContentType, contentTypes } from "./content-types";
import { type HttpCode, httpCodes } from "./http-codes";
const methodParser = z.union([
z.literal("GET"),
z.literal("POST"),
z.literal("PUT"),
z.literal("PATCH"),
z.literal("DELETE"),
]);
export type Method = z.infer<typeof methodParser>;
const massageMethod = (input: string): Method => {
const r = methodParser.parse(input.toUpperCase());
return r;
};
export type Call = {
pattern: string;
path: string;
method: Method;
parameters: object;
request: ExpressRequest;
};
export type InternalHandler = (req: ExpressRequest) => Promise<Result>;
export type Handler = (call: Call) => Promise<Result>;
export type ProcessedRoute = {
matcher: MatchFunction<Record<string, string>>;
method: Method;
handler: InternalHandler;
};
export type Result = {
code: HttpCode;
contentType: ContentType;
result: string;
};
export type Route = {
path: string;
methods: Method[];
handler: Handler;
interruptable?: boolean;
};
export { methodParser, massageMethod };