import type { Schema } from "@/schema/common.js"; import type { ApiRegistry } from "@/types/api.js"; import type { BlankInput, HandlerResponse, Input, Next } from "hono/types"; import type { Context, MiddlewareContext } from "./context.js"; export type Handler< schema extends Schema = Schema, path extends string = any, input extends Input = BlankInput, response extends HandlerResponse = any, > = (c: Context) => response; export type MiddlewareHandler< schema extends Schema = Schema, path extends string = string, input extends Input = {}, > = ( c: MiddlewareContext, next: Next, ) => Promise; type BasePath = "/"; export type HandlerInterface = { // app.get(handler) < path extends string = BasePath, input extends Input = BlankInput, response extends HandlerResponse = any, >( handler: Handler, ): ApiRegistry; // app.get(handler x2) < path extends string = BasePath, input extends Input = BlankInput, input2 extends Input = input, response extends HandlerResponse = any, >( ...handlers: [ Handler, Handler, ] ): ApiRegistry; // app.get(path, handler) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, >( path: path, handler: Handler, ): ApiRegistry; // app.get(handler x 3) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x2) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, >( path: path, ...handlers: [ MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(handler x 4) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x3) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(handler x 5) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x4) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(handler x 6) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x5) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(handler x 7) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x6) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(handler x 8) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, input8 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x7) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(handler x 9) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, input8 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7, input9 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7 & input8, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x8) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, input8 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(handler x 10) < path extends string = BasePath, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, input8 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7, input9 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7 & input8, input10 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7 & input8 & input9, >( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x9) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, input8 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7, input9 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7 & input8, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(path, handler x10) < path extends string, response extends HandlerResponse = any, input extends Input = BlankInput, input2 extends Input = input, input3 extends Input = input & input2, input4 extends Input = input & input2 & input3, input5 extends Input = input & input2 & input3 & input4, input6 extends Input = input & input2 & input3 & input4 & input5, input7 extends Input = input & input2 & input3 & input4 & input5 & input6, input8 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7, input9 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7 & input8, input10 extends Input = input & input2 & input3 & input4 & input5 & input6 & input7 & input8 & input9, >( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, Handler, ] ): ApiRegistry; // app.get(...handlers[]) < path extends string = BasePath, input extends Input = BlankInput, response extends HandlerResponse = any, >( ...handlers: Handler[] ): ApiRegistry; // app.get(path, ...handlers[]) < path extends string, input extends Input = BlankInput, response extends HandlerResponse = any, >( path: path, ...handlers: Handler[] ): ApiRegistry; // app.get(path) (path: path): ApiRegistry; }; export interface MiddlewareHandlerInterface { //// app.use(...handlers[]) (...handlers: MiddlewareHandler[]): ApiRegistry; // app.use(handler) (handler: MiddlewareHandler): ApiRegistry; // app.use(handler x2) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler) ( path: path, handler: MiddlewareHandler, ): ApiRegistry; // app.use(handler x3) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x2) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.use(handler x4) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x3) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.use(handler x5) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x4) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.use(handler x6) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x5) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.use(handler x7) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x6) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.use(handler x8) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x7) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.use(handler x9) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x8) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.use(handler x10) ( ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; // app.get(path, handler x9) ( path: path, ...handlers: [ MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, MiddlewareHandler, ] ): ApiRegistry; //// app.use(path, ...handlers[]) ( path: path, ...handlers: MiddlewareHandler[] ): ApiRegistry; }