/// /// import Koa from 'koa'; import stream from 'stream'; import { AsyncOrSync, Get, JSON_MIME_TYPE, Lookup, MimeType, OperationType, OperationTypes, ResponsesType, Values } from 'yasdk-runtime'; export type KoaHandlersFor = DefaultOperationTypes, S = {}, M extends MimeType = typeof JSON_MIME_TYPE> = { readonly [K in keyof O]?: KoaHandlerFor; }; export type KoaHandlerFor = (ctx: KoaContext) => AsyncOrSync>; export interface DefaultOperationTypes { readonly [id: string]: DefaultOperationType; } export type DefaultOperationType = OperationType; interface DefaultParametersType { readonly path: UnknownRecord; readonly query: UnknownRecord; readonly headers: UnknownRecord; } type UnknownRecord = Record; export type KoaContextsFor, S = {}> = { readonly [K in keyof O]: KoaContext; }; type KoaContext = Koa.ParameterizedContext>; export type DefaultOperationContext = KoaContext; type ContextFor = ContextForBody> & ContextWithParams>; type ContextForBody = undefined extends B ? {} : B extends undefined ? ContextWithBody> | {} : ContextWithBody; type ContextWithBody = Values<{ [M in keyof B]: { readonly request: { readonly type: M; readonly body: B[M]; }; }; }>; type OperationBody = Lookup, 'content'>; interface ContextWithParams

{ readonly params: LookupObject & LookupObject & LookupObject; } type LookupObject = Partialize>; type Partialize = V extends undefined ? Partial> : V; type OperationParams = O extends OperationType ? P : {}; export type KoaValuesFor, M extends MimeType = typeof JSON_MIME_TYPE> = { readonly [K in keyof O]: KoaValue; }; type KoaValue = O extends OperationType ? EmptyData | NonEmptyData : never; type EmptyData = Values<{ [C in keyof R]: Get extends never ? StatusesMatching : never; }>; type NonEmptyData = Values<{ [C in keyof R]: DataForCode, keyof R, M>; }>; type DataForCode = Values<{ [K in keyof D]: { readonly data: D[K] | (D[K] extends string ? Buffer | stream.Readable : never); } & WithType & WithStatus>; }>; type WithType = K extends M ? { readonly type?: K; } : { readonly type: K; }; type WithStatus = C extends 200 ? { readonly status?: C; } : { readonly status: C; }; type StatusPrefix = '2' | '3' | '4' | '5'; type StatusDigit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'; type StatusString

= `${P}${D1}${D2}`; type CodeRangeFor

= `${P}XX`; type AllCodes = StatusString extends `${infer N extends number}` ? N : never; type StatusesMatching = C extends number ? `${C}` extends StatusString ? C : never : C extends CodeRangeFor ? StatusString

extends `${infer N extends number}` ? Exclude : never : C extends 'default' ? Exclude>> : never; export {};