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 { 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; export {};