import { Effect } from "@effect/io/Effect"; import { Context } from "@fp-ts/data/Context"; import { ParsedShapeOf } from "@effect-ts-app/boilerplate-prelude/schema"; import type { _E, _R } from "@effect-ts-app/boilerplate-prelude/_ext/Prelude.ext"; import type { GetRequest, GetResponse } from "@effect-ts-app/boilerplate-prelude/schema"; import * as MO from "@effect-ts-app/boilerplate-prelude/schema"; import * as Ex from "@effect-ts-app/infra/express/index"; import type { Encode, RequestHandler, RequestHandlerOptRes, RequestParsers } from "@effect-ts-app/infra/express/schema/requestHandler"; import type { RouteDescriptorAny } from "@effect-ts-app/infra/express/schema/routing"; import type express from "express"; import type { ValidationError } from "../../errors.js"; import { RequestContext } from "../../lib/RequestContext.js"; import type { SupportedErrors } from "./defaultErrorHandler.js"; export declare function makeRequestParsers(Request: RequestHandler["Request"]): RequestParsers; export type MakeMiddlewareContext = (req: express.Request, res: express.Response, context: RequestContext) => Effect>; export type Middleware = (handler: RequestHandler) => { handler: typeof handler; makeContext: MakeMiddlewareContext; }; export declare function match(requestHandler: RequestHandler, errorHandler: (req: express.Request, res: express.Response, requestContext: RequestContext, r2: Effect) => Effect, middleware?: Middleware): import("@effect/io/Effect").Effect>; export declare function respondSuccess(encodeResponse: (req: ReqA) => Encode): (req: ReqA, res: express.Response, a: A) => import("@effect/io/Effect").Effect; export declare function makeRequestHandler(handler: RequestHandlerOptRes, errorHandler: (req: express.Request, res: express.Response, requestContext: RequestContext, r2: Effect) => Effect, makeMiddlewareContext?: MakeMiddlewareContext): (req: express.Request, res: express.Response) => Effect; export type RequestHandlers = { [key: string]: BasicRequestHandler; }; export type BasicRequestHandler = RequestHandler; export type AnyRequestHandler = RequestHandler; type RouteAll = { [K in keyof T]: T[K] extends RequestHandler ? RouteMatch : never; }; export type RouteMatch = Effect, never, RouteDescriptorAny>; /** * Gather all handlers of a module and attach them to the Server. * Requires no login. */ export declare function matchAll(handlers: T): RouteAll; /** * Gather all handlers of a module and attach them to the Server. * Requires no login. */ export declare function matchAllAlt(handlers: T): Flatten>; export type RequestHandlersTest = { [key: string]: Record; }; export type RouteAllTest = { [K in keyof T]: RouteAll; }; export type Flatten = object extends T ? object : { [K in keyof T]-?: (x: NonNullable extends infer V ? V extends object ? V extends readonly any[] ? Pick : FlattenLVL1 extends infer FV ? ({ [P in keyof FV as `${Extract}.${Extract}`]: FV[P]; }) : never : Pick : never) => void; } extends Record void> ? O extends unknown ? { [K in keyof O]: O[K]; } : never : never; type FlattenLVL1 = object extends T ? object : { [K in keyof T]-?: (x: NonNullable extends infer V ? V extends object ? V extends readonly any[] ? Pick : Pick : never : never) => void; } extends Record void> ? O extends unknown ? { [K in keyof O]: O[K]; } : never : never; export declare function handle>(_: TModule & { ResponseOpenApi?: any; }, adaptResponse?: any): (h: (r: InstanceType extends new (...args: any[]) => any ? GetRequest : never>) => import("@effect/io/Effect").Effect>>>) => ReqHandler extends new (...args: any[]) => any ? GetRequest : never>, R, E, MO.ParsedShapeOf>>, GetRequest, GetResponse, any>; export type Extr = T extends { Model: MO.SchemaAny; } ? T["Model"] : T extends MO.SchemaAny ? T : never; export interface ReqHandler { h: (r: Req, ctx: CTX) => Effect; Request: ReqSchema; Response: ResSchema; ResponseOpenApi: any; } /** * Provided a module with resources, and provided an Object with resource handlers, will prepare route handlers to be attached to server. * @param mod The module with Resources you want to match. * @returns A function that must be called with an Object with a handler "Request -> Effect" for each resource defined in the Module. * * Example: * ``` * class SayHelloRequest extends Get("/say-hello")()({ name: prop(ReasonableString) }) {} * class SayHelloResponse extends Model()({ message: prop(LongString) }) {} * * export const SayHelloControllers = matchResource({ SayHello: { SayHelloRequest, SayHelloResponse } })({ * SayHello: (req) => Effect({ message: `Hi ${req.name}` }) * }) * ``` */ export declare function matchResource>>(mod: TModules): extends infer T ? T extends GetRequest ? T extends new (...args: any[]) => any ? T : never : never : never>) => import("@effect/io/Effect").Effect>>>; }>(handlers: THandlers) => { [K_1 in keyof TModules]: ReqHandler extends infer T_1 ? T_1 extends GetRequest ? T_1 extends new (...args: any[]) => any ? T_1 : never : never : never>, _R>, _E>, MO.ParsedShapeOf>>, GetRequest, GetResponse, any>; }; export type ReqFromSchema = InstanceType; export type ResFromSchema = ParsedShapeOf>; export {}; //# sourceMappingURL=routing.d.ts.map