dbaas
Version:
Database as a service. Expose db to REST and GraphQL.
30 lines (29 loc) • 2.87 kB
TypeScript
import type { ErrorRequestHandler, RequestHandler } from "express";
import type { RouteParameters } from "express-serve-static-core";
import type { ParsedQs } from "qs";
type VoidReqHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>> = RequestHandler<RouteParameters<Route>, ResBody, ReqBody, ParsedQs, Locals>;
export type AsyncReqHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>> = (...args: Parameters<RequestHandler<RouteParameters<Route>, ResBody, ReqBody, ParsedQs, Locals>>) => Promise<ReturnType<RequestHandler<RouteParameters<Route>, ResBody, ReqBody, ParsedQs, Locals>>>;
type ReqHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>> = VoidReqHandler<Route, ReqBody, ResBody, Locals> | AsyncReqHandler<Route, ReqBody, ResBody, Locals>;
type VoidErrHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>> = ErrorRequestHandler<RouteParameters<Route>, ResBody, ReqBody, ParsedQs, Locals>;
type AsyncErrHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>> = (...args: Parameters<ErrorRequestHandler<RouteParameters<Route>, ResBody, ReqBody, ParsedQs, Locals>>) => Promise<ReturnType<ErrorRequestHandler<RouteParameters<Route>, ResBody, ReqBody, ParsedQs, Locals>>>;
type ErrHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>> = VoidErrHandler<Route, ReqBody, ResBody, Locals> | AsyncErrHandler<Route, ReqBody, ResBody, Locals>;
/**
* Handles promises in express app or router middleware.
*
* ### Usage:
*
* ```js
* router.get(
* "/:provider/:override?",
* // eslint-disable-next-line @typescript-eslint/no-misused-promises
* asyncHandler<"/:provider/:override?">(async (req, res, next) => {
* // req.params.provider and req.params.override will be typed here
* }),
* )
* ```
* @param handler express middleware in async/await
* @returns Wrapped express middleware to be added into express app/router
*/
declare function asyncHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>>(handler: ReqHandler<Route, ReqBody, ResBody, Locals>): VoidReqHandler<Route, ReqBody, ResBody, Locals>;
declare function asyncHandler<Route extends string, ReqBody = unknown, ResBody = unknown, Locals extends Record<string, unknown> = Record<string, unknown>>(handler: ErrHandler<Route, ReqBody, ResBody, Locals>): VoidErrHandler<Route, ReqBody, ResBody, Locals>;
export default asyncHandler;