import type Koa from 'koa'; import { type Logger } from '@restorecommerce/logger'; import { type Server } from 'node:http'; import { type AddressInfo } from 'node:net'; type RequireAtLeastOne = Pick> & { [K in Keys]-?: Required> & Partial>>; }[Keys]; export interface FacadeBaseContext extends Koa.Context { logger: Logger; facade: Facade; } export interface FacadeModuleBase { moduleName: string; } export interface FacadeModule extends FacadeModuleBase { (facade: Facade<[FacadeModule]>): void; } export interface FacadeModuleFactory extends FacadeModuleBase { (config: TConfig): FacadeModule; } export type ExtractModuleContext = TModule extends FacadeModuleFactory ? TContext : TModule extends FacadeModule ? TContext : never; export type FacadeModulesContext = (T[0] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[1] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[2] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[3] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[4] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[5] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[6] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[7] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[8] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext) & (T[9] extends FacadeModuleBase ? ExtractModuleContext : FacadeBaseContext); export type FacadeContext = []> = T extends FacadeModuleBase[] ? FacadeModulesContext : T extends Facade ? FacadeModulesContext : FacadeBaseContext; export interface Facade { readonly logger: Logger; readonly koa: Koa>; readonly server?: Server; readonly address?: string | AddressInfo; readonly listening: boolean; readonly env: string; start(): Promise; onStart(fn: () => Promise): void; onStop(fn: () => Promise): void; stop(): Promise; addApolloService({ name, schema, url }: RequireAtLeastOne<{ name: string; url: string; schema: any; }, 'url' | 'schema'>): void; useMiddleware(middleware: Koa.Middleware>): Facade; useModule(mod: TNewModule): Facade<[...TModules, TNewModule]>; supportsModule(mod: TSupportedModule): this is Facade<[TSupportedModule, ...TModules]> & Facade<[...TModules]>; } export interface FileUploadOptionsConfig { fileUploadOptions: FileUploadOptions; } interface FileUploadOptions { maxFileSize: number; maxFiles: number; } export {}; //# sourceMappingURL=interfaces.d.ts.map