import { AwilixContainer, Constructor, NameAndRegistrationPair } from 'awilix' import { NameFormatter } from 'awilix/lib/load-modules' import { EnvService } from '@diia-inhouse/env' import { GenericObject, OnInit } from '@diia-inhouse/types' import { BaseConfig } from './config.js' import { BaseDeps } from './deps.js' import { OnInitResults } from './onInitResults.js' export interface ServiceContext { config: TConfig container: AwilixContainer } export type AppConfigType = TContext extends ServiceContext ? T : never export type AppDepsType = TContext extends ServiceContext ? T : never export type AppDepsTypeWithBase = TContext extends ServiceContext ? T & BaseDeps : never export type DepsType = AppDepsType & BaseDeps> export type ConfigFactoryFn = ( envService: EnvService, serviceName: string, ) => Promise export type DepsFactory = Partial & Omit export type DepsFactoryFn = ( config: TConfig, baseDeps: AwilixContainer>, ) => Promise>> export interface ServiceOperator extends ServiceContext< BaseConfig & TConfig, BaseDeps & TDeps > { start(): Promise stop(): Promise } export interface LoadDepsFromFolderOptions { folderName: string fileMask?: string nameFormatter?: NameFormatter groupName?: string depsDir?: string } export interface ContainerDependency { registrationName: string dependency: Constructor groupName?: string } export interface OnInitInstance { name: keyof AppDepsTypeWithBase instance: OnInit } export type OnStartHooksResult = { [K in keyof BaseDeps]: K extends keyof OnInitResults ? OnInitResults[K] : never } export type InitOrder = 0 | 1 | 2 | 3 | 4 type Max = { b: T['length'] r: Max }[[N] extends [Partial['length']] ? 'b' : 'r'] export type MaxInitOrder = Max