import { NO_PROVIDER, type ServiceName, type Disposer, type FatalErrorPromise, type Provider, type Dependencies, type DependencyDeclaration, type AsyncInitializer, type Initializer } from './util.js'; import initFatalError, { type FatalErrorService } from './fatalError.js'; import initDispose from './dispose.js'; import { type Injector } from './injector.js'; import initInitializerBuilder from './build.js'; import './errors.js'; export type * from './build.js'; export * from './build.js'; export type * from './dispose.js'; export * from './dispose.js'; export type * from './fatalError.js'; export * from './fatalError.js'; export type * from './injector.js'; export type * from './overrides.js'; export * from './overrides.js'; export type * from './sequence.js'; export * from './sequence.js'; export type * from './util.js'; export * from './util.js'; export { initInitializerBuilder, initDispose, initFatalError }; export declare const RUN_DEPENDENT_NAME = "__run__"; export declare const SYSTEM_DEPENDENT_NAME = "__system__"; export declare const AUTO_LOAD_DEPENDENT_NAME = "__autoloader__"; export declare const INJECTOR_DEPENDENT_NAME = "__injector__"; export interface KnifecycleOptions { sequential?: boolean; } export type Autoloader>> = (name: DependencyDeclaration) => Promise; export type SiloIndex = string; export interface BaseInitializerStateDescriptor { dependents: { silo?: SiloIndex; name: ServiceName; optional: boolean; }[]; initializerLoadPromise?: Promise>; initializer?: Initializer; autoloaded: boolean; } export type SiloedInitializerStateDescriptor = BaseInitializerStateDescriptor & { silosInstances: Record | typeof NO_PROVIDER>; providerLoadPromise?: Promise; instanceDisposePromise?: Promise; }>; }; export type SingletonInitializerStateDescriptor = BaseInitializerStateDescriptor & { singletonProvider?: NonNullable | typeof NO_PROVIDER>; singletonProviderLoadPromise?: Promise; disposer?: Disposer; fatalErrorPromise?: FatalErrorPromise; }; export type AutoloadedInitializerStateDescriptor = BaseInitializerStateDescriptor & { autoloaded: true; }; export type InitializerStateDescriptor = SingletonInitializerStateDescriptor | SiloedInitializerStateDescriptor | AutoloadedInitializerStateDescriptor; export interface SiloContext { index: SiloIndex; loadingServices: ServiceName[]; loadingSequences: ServiceName[][]; _shutdownPromise?: Promise; } export interface InternalDependencies { $dispose: Disposer; $autoload: Autoloader>>; $injector: Injector>; $instance: Knifecycle; $siloContext: SiloContext; $fatalError: FatalErrorService; } export declare const UNBUILDABLE_SERVICES: string[]; export declare const INTERNAL_SERVICES: string[]; export declare class Knifecycle { private _options; private _silosCounter; _silosContexts: Record; _initializersStates: Record>; private _shutdownPromise?; /** * Create a new Knifecycle instance * @param {Object} options * An object with options * @param {boolean} options.sequential * Allows to load dependencies sequentially (useful for debugging) * @return {Knifecycle} * The Knifecycle instance * @example * * import Knifecycle from 'knifecycle' * * const $ = new Knifecycle(); */ constructor(options?: KnifecycleOptions); /** * List registered initializers * @return {string[]} * The service names registered */ registered(): ServiceName[]; /** * Get a previously registered initializer * @param {string} serviceName * @return {Initializer} * The initializer registered */ getRegisteredInitializer(serviceName: ServiceName): Initializer | undefined; /** * Register an initializer * @param {Function} initializer * An initializer * @return {Knifecycle} * The Knifecycle instance (for chaining) */ register>(initializer: T): Knifecycle; _checkInitializerOverride(serviceName: ServiceName): void; _buildInitializerState(initializerState: InitializerStateDescriptor, initializer: Initializer): void; _checkInitializerDependencies(initializer: AsyncInitializer): void; _lookupCircularDependencies(rootServiceName: ServiceName, dependencyDeclaration: DependencyDeclaration, declarationsStacks?: DependencyDeclaration[]): void; /** * Outputs a Mermaid compatible dependency graph of the declared services. * See [Mermaid docs](https://github.com/knsv/mermaid) * @param {Object} options * Options for generating the graph (destructured) * @param {Array} options.shapes * Various shapes to apply * @param {Array} options.styles * Various styles to apply * @param {Object} options.classes * A hash of various classes contents * @return {String} * Returns a string containing the Mermaid dependency graph * @example * * import Knifecycle, { inject, constant, service } from 'knifecycle'; * import appInitializer from './app'; * * const $ = new Knifecycle(); * * $.register(constant('ENV', process.env)); * $.register(constant('OS', require('os'))); * $.register(service('app', inject(['ENV', 'OS'], appInitializer))); * $.toMermaidGraph(); * * // returns * graph TD * app-->ENV * app-->OS */ toMermaidGraph({ shapes, styles, classes, }?: { shapes?: MermaidShapes; styles?: MermaidStyles; classes?: MermaidClasses; }): string; /** * Creates a new execution silo * @param {String[]} dependenciesDeclarations * Service name. * @return {Promise} * Service descriptor promise * @example * * import Knifecycle, { constant } from 'knifecycle' * * const $ = new Knifecycle(); * * $.register(constant('ENV', process.env)); * $.run(['ENV']) * .then(({ ENV }) => { * // Here goes your code * }) */ run>(dependenciesDeclarations: DependencyDeclaration[]): Promise; _getInitializer(serviceName: ServiceName): Initializer | undefined; _getServiceProvider(siloContext: SiloContext, serviceName: ServiceName): Provider | typeof NO_PROVIDER | undefined; _loadInitializerDependencies(siloContext: SiloContext, parentsNames: ServiceName[], dependenciesDeclarations: DependencyDeclaration[], additionalDeclarations: DependencyDeclaration[]): Promise; _loadProvider(siloContext: SiloContext, serviceName: ServiceName, parentsNames: ServiceName[]): Promise; _getAutoloader(siloContext: SiloContext, parentsNames: ServiceName[]): Promise>> | undefined>; _loadInitializer(siloContext: SiloContext, serviceName: ServiceName, parentsNames: ServiceName[]): Promise; _resolveDependencies(siloContext: SiloContext, loadingServices: ServiceName[], parentsNames: ServiceName[]): Promise; /** * Destroy the Knifecycle instance * @return {Promise} * Full destruction promise * @example * * import Knifecycle, { constant } from 'knifecycle' * * const $ = new Knifecycle(); * * $.register(constant('ENV', process.env)); * $.run(['ENV']) * .then(({ ENV }) => { * // Here goes your code * * // Finally destroy the instance * $.destroy() * }) */ destroy(): Promise; } type MermaidShapes = { pattern: RegExp; template: string; }[]; type MermaidStyles = { pattern: RegExp; className: string; }[]; type MermaidClasses = Record;