swagger-typed-express-docs
Version:
Simple express runtime parser and documentation swagger generator with 100% support of Typescript static types
225 lines (224 loc) • 11.7 kB
TypeScript
import { DeepPartial } from './utils';
import { NextFunction, Request, Response } from 'express';
import { InferSchemaType, TSchema } from './tsSchema';
export declare const __expressTypedHack_key__ = "__expressTypedHack_key__";
export declare const __expressOpenAPIHack__: unique symbol;
type Config = {
headers?: TSchema;
params?: Record<string, TSchema>;
query?: Record<string, TSchema>;
body?: TSchema;
returns?: TSchema;
};
type UseEmptyObjectAsDefault<T> = T extends Record<any, any> ? T : {};
type WrapToTObject<T> = {
type: 'object';
required: true;
properties: T;
};
export declare const getApiDocInstance: ({ errorFormatter, }?: {
errorFormatter?: ((errors: {
errors: {
headers?: any;
params?: any;
query?: any;
body?: any;
returns?: any;
};
}) => any) | undefined;
}) => <C extends Config>(docs: C) => (handle: (req: Omit<Request<{ [K_1 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_1], "decoded">; } & { [K_2 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_2], "decoded"> | undefined; }, any, InferSchemaType<C["body"]>, { [K_4 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_2 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_2]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) extends infer T_3 ? T_3 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_4 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_4]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) ? T_3 extends Record<any, infer Values> ? Values : never : never : never) & {
required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_4], "decoded">; } & { [K_5 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_5 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_5]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) extends infer T_6 ? T_6 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_7 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_7]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) ? T_6 extends Record<any, infer Values> ? Values : never : never : never) & {
required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_5], "decoded"> | undefined; }, Record<string, any>>, "headers"> & {
headers: { [K_7 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_8 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_8]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) extends infer T_9 ? T_9 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_10 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_10]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) ? T_9 extends Record<any, infer Values> ? Values : never : never : never) & {
required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_7], "decoded">; } & { [K_8 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_11 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_11]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) extends infer T_12 ? T_12 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_13 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_13]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) ? T_12 extends Record<any, infer Values> ? Values : never : never : never) & {
required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_8], "decoded"> | undefined; };
}, res: Omit<Response<any, Record<string, any>>, "send"> & {
send: (data: InferSchemaType<C["returns"]>) => void;
tSend: (data: InferSchemaType<C["returns"]>) => void;
}, next: NextFunction) => void) => any;
export declare const apiDoc: <C extends Config>(docs: C) => (handle: (req: Omit<Request<{ [K_1 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_1], "decoded">; } & { [K_2 in (((UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) extends infer T_1 ? T_1 extends (UseEmptyObjectAsDefault<C["params"]> extends infer T extends Record<any, {
required: boolean;
}> ? { [K in keyof T]: UseEmptyObjectAsDefault<C["params"]>[K] & {
key: K;
}; } : never) ? T_1 extends Record<any, infer Values> ? Values : never : never : never) & {
required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["params"]>[K_2], "decoded"> | undefined; }, any, InferSchemaType<C["body"]>, { [K_4 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_2 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_2]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) extends infer T_3 ? T_3 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_4 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_4]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) ? T_3 extends Record<any, infer Values> ? Values : never : never : never) & {
required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_4], "decoded">; } & { [K_5 in (((UseEmptyObjectAsDefault<C["query"]> extends infer T_5 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_5]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) extends infer T_6 ? T_6 extends (UseEmptyObjectAsDefault<C["query"]> extends infer T_7 extends Record<any, {
required: boolean;
}> ? { [K_3 in keyof T_7]: UseEmptyObjectAsDefault<C["query"]>[K_3] & {
key: K_3;
}; } : never) ? T_6 extends Record<any, infer Values> ? Values : never : never : never) & {
required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["query"]>[K_5], "decoded"> | undefined; }, Record<string, any>>, "headers"> & {
headers: { [K_7 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_8 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_8]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) extends infer T_9 ? T_9 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_10 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_10]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) ? T_9 extends Record<any, infer Values> ? Values : never : never : never) & {
required: true;
})["key"]]: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_7], "decoded">; } & { [K_8 in (((UseEmptyObjectAsDefault<C["headers"]> extends infer T_11 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_11]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) extends infer T_12 ? T_12 extends (UseEmptyObjectAsDefault<C["headers"]> extends infer T_13 extends Record<any, {
required: boolean;
}> ? { [K_6 in keyof T_13]: UseEmptyObjectAsDefault<C["headers"]>[K_6] & {
key: K_6;
}; } : never) ? T_12 extends Record<any, infer Values> ? Values : never : never : never) & {
required: false;
})["key"]]?: import("./tsSchema").InferSchemaTypeEncDec<UseEmptyObjectAsDefault<C["headers"]>[K_8], "decoded"> | undefined; };
}, res: Omit<Response<any, Record<string, any>>, "send"> & {
send: (data: InferSchemaType<C["returns"]>) => void;
tSend: (data: InferSchemaType<C["returns"]>) => void;
}, next: NextFunction) => void) => any;
type ExpressRouterInternalStruct = {
name: 'router';
regexp: RegExp;
keys: {
name: string;
optional: boolean;
offset: number;
}[];
__handle: ExpressRouteInternalStruct;
handle: ExpressRouteInternalStruct;
route: {
stack: {
handle: (...any: any[]) => any;
method: string;
}[];
path: string;
};
};
type ExpressRouteHandlerInternalStruct = {
name: 'bound dispatch';
route: {
stack: {
handle: (a?: symbol) => {
apiRouteSchema: {
paramsSchema: any;
querySchema: any;
bodySchema: any;
returnsSchema: any;
};
handle: (...args: any[]) => any;
};
method: string;
_swaggerTypedExpressDocs__route_cache?: any;
}[];
path: string;
};
};
type ExpressRouteInternalStruct = {
stack: (ExpressRouteHandlerInternalStruct | ExpressRouterInternalStruct)[];
};
type OpenAPIShape = DeepPartial<{
openapi: '3.0.0';
info: {
description: string;
version: string;
title: string;
termsOfService: string;
contact: {
email: string;
};
};
servers: {
url: string;
}[];
paths: any;
}>;
export declare const initApiDocs: (expressApp: {
_router: ExpressRouteInternalStruct;
}, customOpenAPIType?: OpenAPIShape) => any;
export declare const getMock_apiDocInstance: ({ errorFormatter }?: {
errorFormatter?: ((err: any) => any) | undefined;
}) => <T extends (req: Request, res: Response, next: NextFunction) => any>(a: Parameters<typeof apiDoc>[0]) => (_handler: T) => any;
export declare const mock_apiDoc: <T extends (req: Request, res: Response, next: NextFunction) => any>(a: Parameters<typeof apiDoc>[0]) => (_handler: T) => any;
export {};