knifecycle
Advanced tools
+9
-0
@@ -0,1 +1,10 @@ | ||
| # [16.0.0](https://github.com/nfroidure/knifecycle/compare/v15.0.1...v16.0.0) (2023-08-16) | ||
| ### Bug Fixes | ||
| * **build:** fix deps lock file ([ab9114e](https://github.com/nfroidure/knifecycle/commit/ab9114e2f6d89cffbcf442c1a0199d920a3dc438)) | ||
| ## [15.0.1](https://github.com/nfroidure/knifecycle/compare/v15.0.0...v15.0.1) (2023-05-28) | ||
@@ -2,0 +11,0 @@ |
+1
-2
@@ -86,4 +86,3 @@ import { SPECIAL_PROPS, parseDependencyDeclaration, initializer, } from './util.js'; | ||
| .map((name) => { | ||
| if ('constant' === | ||
| dependenciesHash[name].__initializer[SPECIAL_PROPS.TYPE]) { | ||
| if ('constant' === dependenciesHash[name].__initializer[SPECIAL_PROPS.TYPE]) { | ||
| return ` | ||
@@ -90,0 +89,0 @@ ${name}: Promise.resolve(${name}),`; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAsB5D;;;;;;;;;;;;;;;EAeE;AAEF,eAAe,WAAW,CACxB;IACE,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,CAAC,WAAW,CAAC;CACtB,EACD,sBAAsB,CACvB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,sBAAsB,CAAC,EACpC,SAAS,GAGV;IACC,OAAO,gBAAgB,CAAC;IAExB;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,UAAU,gBAAgB,CAC7B,YAAqC;QAErC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAC9B,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,CAC/C,CACF,CAAC;QACF,MAAM,gBAAgB,GAAG,qBAAqB,CAC5C,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAyB,CACzD,CAAC;QACF,MAAM,OAAO,GAAG,2BAA2B,CAAC;YAC1C,MAAM,EAAE,MAAM;YACd,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAyB;SACvE,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,OAAO,GAAG,OAAO;aACd,GAAG,CACF,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;uBACH,KAAK,GAAG,KAAK;aACzB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IACE,UAAU;gBACV,gBAAgB,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,EACxD;gBACA,OAAO;QACb,IAAI,MAAM,IAAI,CAAC,SAAS,CAChB,gBAAgB,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,EACzD,IAAI,EACJ,CAAC,CACF,GAAG,CAAC;aACN;YAED,OAAO;SACV,gBAAgB,CAAC,IAAI,CAAC,CAAC,iBAAiB,UAAU,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;QACnF,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,EAAE,CACd;aACA,IAAI,CAAC,IAAI,CAAC;;mDAEkC,OAAO;aACnD,GAAG,CACF,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;6BACG,KAAK;eACnB,KAAK,OAAO,KAAK;aACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IACE,UAAU;gBACV,gBAAgB,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,EACxD;gBACA,OAAO;MACf,IAAI,qBAAqB,IAAI,IAAI,CAAC;aAC3B;YACD,OAAO;MACb,IAAI,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,iBAAiB,KACzC,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ;gBAC7B,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ;qBAC/B,GAAG,CAAC,0BAA0B,CAAC;qBAC/B,GAAG,CACF,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CAC9B;QAChB,WAAW,eAAe,UAAU,KAAK,CAC5B;qBACA,IAAI,CAAC,EAAE,CAAC,EAAE;gBACf,CAAC,CAAC,EACN;QAEN,UAAU,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM;gBAC1C,CAAC,CAAC,qCAAqC;gBACvC,CAAC,CAAC,EACN,GAAG,CAAC;QACE,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC;;;;uBAII,KAAK;uBACL,KAAK;;EAE1B,KAAK;aACJ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,OAAO;cACG,IAAI,mBAAmB,KAAK,KAAK,IAAI,KAAK,CAAC;QACvD,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC;CACV,CACM;aACA,IAAI,CAAC,EAAE,CAAC;YACH,YAAY;aACnB,GAAG,CAAC,0BAA0B,CAAC;aAC/B,GAAG,CACF,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CAC9B;MACF,WAAW,eAAe,UAAU,KAAK,CAC1C;aACA,IAAI,CAAC,EAAE,CAAC;;;CAGZ,CAAC;IACA,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,EACE,SAAS,GACgE,EAC3E,qBAAqB;IAErB,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,0BAA0B,CACzD,qBAAqB,CACtB,CAAC;IAEF,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAuB;YAC/B,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,WAAW;YAC1B,QAAQ,EACN,WAAW,IAAI,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC;gBAC9C,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC;gBACnC,CAAC,CAAC,EAAE;YACR,MAAM,EACJ,WAAW,IAAI,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC5C,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC;gBACjC,CAAC,CAAC,UAAU;YAChB,iBAAiB,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC;YACtD,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,EAAE;SACjB,CAAC;QAEF,IACE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC;YACjC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,EACxC;YACA,MAAM,UAAU,GAAyB,MAAM,OAAO,CAAC,GAAG,CACxD,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,0BAA0B,EAAE,EAAE,CACnE,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,CAAC,CAC/D,CACF,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;SACb;aAAM;YACL,OAAO,IAAI,CAAC;SACb;KACF;IAAC,OAAO,GAAG,EAAE;QACZ,IAAI,QAAQ,EAAE;YACZ,OAAO,IAAI,CAAC;SACb;QACD,MAAM,GAAG,CAAC;KACX;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,eAAqC,EACrC,OAA2C,EAAE;IAE7C,OAAO,eAAe,CAAC,MAAM,CAC3B,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,EAC7C,IAAI,CACL,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAwB,EACxB,OAA2C,EAAE;IAE7C,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAErE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAEzB,IAAI,WAAW,EAAE;QACf,OAAO,IAAI,CAAC;KACb;IAED,CAAC,IAAI,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC/C,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAc,CAAI;IACjC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"} | ||
| {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"} |
+81
-0
@@ -0,1 +1,2 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| import { describe, test } from '@jest/globals'; | ||
@@ -117,3 +118,83 @@ import assert from 'assert'; | ||
| }); | ||
| // TODO: allow building with internal dependencies | ||
| test.skip('should work with simple internal services dependencies', async () => { | ||
| const $ = new Knifecycle(); | ||
| $.register(constant('PWD', '~/my-project')); | ||
| $.register(initAutoloader); | ||
| $.register(initInitializerBuilder); | ||
| $.register(constant('$fatalError', {})); | ||
| const { buildInitializer } = await $.run(['buildInitializer']); | ||
| const content = await buildInitializer([ | ||
| 'dep1', | ||
| 'finalMappedDep>dep3', | ||
| '$fatalError', | ||
| '$dispose', | ||
| '$siloContext', | ||
| ]); | ||
| assert.equal(content, ` | ||
| // Definition batch #0 | ||
| import initDep1 from './services/dep1'; | ||
| const NODE_ENV = "development"; | ||
| // Definition batch #1 | ||
| import initDep2 from './services/dep2'; | ||
| // Definition batch #2 | ||
| import initDep3 from './services/dep3'; | ||
| export async function initialize(services = {}) { | ||
| // Initialization batch #0 | ||
| const batch0 = { | ||
| dep1: initDep1({ | ||
| }), | ||
| NODE_ENV: Promise.resolve(NODE_ENV), | ||
| }; | ||
| await Promise.all( | ||
| Object.keys(batch0) | ||
| .map(key => batch0[key]) | ||
| ); | ||
| services['dep1'] = await batch0['dep1']; | ||
| services['NODE_ENV'] = await batch0['NODE_ENV']; | ||
| // Initialization batch #1 | ||
| const batch1 = { | ||
| dep2: initDep2({ | ||
| dep1: services['dep1'], | ||
| NODE_ENV: services['NODE_ENV'], | ||
| }).then(provider => provider.service), | ||
| }; | ||
| await Promise.all( | ||
| Object.keys(batch1) | ||
| .map(key => batch1[key]) | ||
| ); | ||
| services['dep2'] = await batch1['dep2']; | ||
| // Initialization batch #2 | ||
| const batch2 = { | ||
| dep3: initDep3({ | ||
| dep2: services['dep2'], | ||
| dep1: services['dep1'], | ||
| depOpt: services['depOpt'], | ||
| }), | ||
| }; | ||
| await Promise.all( | ||
| Object.keys(batch2) | ||
| .map(key => batch2[key]) | ||
| ); | ||
| services['dep3'] = await batch2['dep3']; | ||
| return { | ||
| dep1: services['dep1'], | ||
| finalMappedDep: services['dep3'], | ||
| }; | ||
| } | ||
| `); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=build.test.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"build.test.js","sourceRoot":"","sources":["../src/build.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,sBAAsB,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG/D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,KAAK,UAAU,SAAS;QACtB,OAAO;YACL,OAAO,EAAE,kBAAkB;SAC5B,CAAC;IACJ,CAAC;IACD,MAAM,cAAc,GAAG;QACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;QAC7C,IAAI,EAAE,WAAW,CACf;YACE,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM;SACb,EACD,SAAS,CACV;QACD,IAAI,EAAE,WAAW,CACf;YACE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;YAC5B,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,MAAM;SACb,EACD,SAAS,CACV;QACD,IAAI,EAAE,WAAW,CACf;YACE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM;SACb,EACD,SAAS,CACV;KACF,CAAC;IACF,MAAM,cAAc,GAAG,WAAW,CAChC;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,IAAI;KAChB,EACD,KAAK,IAAI,EAAE;QACT,OAAO,KAAK,UAAU,SAAS,CAAC,IAAI;YAClC,OAAO,cAAc,CAAC,IAAI,CAAC;gBACzB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;oBACd,IAAI,EAAE,cAAc,IAAI,EAAE;oBAC1B,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC;iBAClC,CAAC;gBACJ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QAE3B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3B,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QAEnC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAErC,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAEzB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DL,CACI,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} | ||
| {"version":3,"file":"build.test.js","sourceRoot":"","sources":["../src/build.test.ts"],"names":[],"mappings":"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"} |
+61
-80
@@ -6,2 +6,10 @@ import { SPECIAL_PROPS, SPECIAL_PROPS_PREFIX, DECLARATION_SEPARATOR, OPTIONAL_FLAG, ALLOWED_INITIALIZER_TYPES, ALLOWED_SPECIAL_PROPS, parseInjections, readFunctionName, reuseSpecialProps, parseName, name, autoName, inject, useInject, mergeInject, autoInject, alsoInject, type, extra, singleton, initializer, constant, service, autoService, provider, autoProvider, wrapInitializer, handler, autoHandler, parseDependencyDeclaration, stringifyDependencyDeclaration, unwrapInitializerProperties } from './util.js'; | ||
| export type { ServiceName, Service, Disposer, FatalErrorPromise, Provider, Dependencies, DependencyDeclaration, ExtraInformations, ParsedDependencyDeclaration, ConstantProperties, ConstantInitializer, ProviderInitializerBuilder, ProviderProperties, ProviderInitializer, ProviderInputProperties, ServiceInitializerBuilder, ServiceProperties, ServiceInitializer, ServiceInputProperties, AsyncInitializerBuilder, AsyncInitializer, PartialAsyncInitializer, Initializer, ServiceInitializerWrapper, ProviderInitializerWrapper, HandlerFunction, Parameters, BuildInitializer, }; | ||
| export declare const RUN_DEPENDENT_NAME = "__run__"; | ||
| export declare const SYSTEM_DEPENDENT_NAME = "__system__"; | ||
| export declare const AUTOLOAD_DEPENDENT_NAME = "__autoloader__"; | ||
| export declare const INJECTOR_DEPENDENT_NAME = "__injector__"; | ||
| export declare const NO_PROVIDER: unique symbol; | ||
| export type KnifecycleOptions = { | ||
| sequential?: boolean; | ||
| }; | ||
| export interface Injector<T extends Record<string, unknown>> { | ||
@@ -16,9 +24,37 @@ (dependencies: DependencyDeclaration[]): Promise<T>; | ||
| } | ||
| export interface SiloContext<S> { | ||
| name: string; | ||
| servicesDescriptors: Map<DependencyDeclaration, Promise<Provider<S>>>; | ||
| servicesSequence: DependencyDeclaration[][]; | ||
| servicesShutdownsPromises: Map<DependencyDeclaration, Promise<void>>; | ||
| export type SiloIndex = string; | ||
| export type BaseInitializerStateDescriptor<S, D extends Dependencies> = { | ||
| dependents: { | ||
| silo?: SiloIndex; | ||
| name: ServiceName; | ||
| optional: boolean; | ||
| }[]; | ||
| initializerLoadPromise?: Promise<Initializer<S, D>>; | ||
| initializer?: Initializer<S, D>; | ||
| autoloaded: boolean; | ||
| }; | ||
| export type SiloedInitializerStateDescriptor<S, D extends Dependencies> = BaseInitializerStateDescriptor<S, D> & { | ||
| silosInstances: Record<SiloIndex, { | ||
| dependency?: ServiceName; | ||
| provider?: NonNullable<Provider<S> | typeof NO_PROVIDER>; | ||
| providerLoadPromise?: Promise<void>; | ||
| instanceDisposePromise?: Promise<S>; | ||
| }>; | ||
| }; | ||
| export type SingletonInitializerStateDescriptor<S, D extends Dependencies> = BaseInitializerStateDescriptor<S, D> & { | ||
| singletonProvider?: NonNullable<Provider<S> | typeof NO_PROVIDER>; | ||
| singletonProviderLoadPromise?: Promise<void>; | ||
| disposer?: Disposer; | ||
| fatalErrorPromise?: FatalErrorPromise; | ||
| }; | ||
| export type AutoloadedInitializerStateDescriptor<S, D extends Dependencies> = BaseInitializerStateDescriptor<S, D> & { | ||
| autoloaded: true; | ||
| }; | ||
| export type InitializerStateDescriptor<S, D extends Dependencies> = SingletonInitializerStateDescriptor<S, D> | SiloedInitializerStateDescriptor<S, D> | AutoloadedInitializerStateDescriptor<S, D>; | ||
| export interface SiloContext { | ||
| index: SiloIndex; | ||
| loadingServices: ServiceName[]; | ||
| loadingSequences: ServiceName[][]; | ||
| errorsPromises: Promise<void>[]; | ||
| shutdownPromise?: Promise<void>; | ||
| _shutdownPromise?: Promise<void>; | ||
| throwFatalError?: (err: Error) => void; | ||
@@ -34,16 +70,17 @@ } | ||
| $instance: Knifecycle; | ||
| $siloContext: SiloContext<unknown>; | ||
| $siloContext: SiloContext; | ||
| $fatalError: FatalErrorService; | ||
| }; | ||
| declare class Knifecycle { | ||
| private _options; | ||
| private _silosCounter; | ||
| private _silosContexts; | ||
| private _initializers; | ||
| private _initializerResolvers; | ||
| private _singletonsServicesHandles; | ||
| private _singletonsServicesDescriptors; | ||
| private _singletonsServicesShutdownsPromises; | ||
| private shutdownPromise?; | ||
| private _initializersStates; | ||
| private _shutdownPromise?; | ||
| /** | ||
| * Create a new Knifecycle instance | ||
| * @param {Object} options | ||
| * An object with options | ||
| * @param {boolean} options.sequential | ||
| * Allows to load dependencies sequentially (usefull for debugging) | ||
| * @return {Knifecycle} | ||
@@ -57,3 +94,3 @@ * The Knifecycle instance | ||
| */ | ||
| constructor(); | ||
| constructor(options?: KnifecycleOptions); | ||
| /** | ||
@@ -67,2 +104,5 @@ * Register an initializer | ||
| register<T extends Initializer<unknown, any>>(initializer: T): Knifecycle; | ||
| _checkInitializerOverride(serviceName: ServiceName): void; | ||
| _buildInitializerState(initializerState: InitializerStateDescriptor<any, any>, initializer: Initializer<unknown, any>): void; | ||
| _checkInitializerDependencies(initializer: Initializer<any, any>): void; | ||
| _lookupCircularDependencies(rootServiceName: ServiceName, dependencyDeclaration: DependencyDeclaration, declarationsStacks?: DependencyDeclaration[]): void; | ||
@@ -123,2 +163,9 @@ /** | ||
| run<ID extends Record<string, unknown>>(dependenciesDeclarations: DependencyDeclaration[]): Promise<ID>; | ||
| _getInitializer(serviceName: ServiceName): Initializer<unknown, Dependencies> | undefined; | ||
| _getServiceProvider(siloContext: SiloContext, serviceName: ServiceName): Provider<unknown> | typeof NO_PROVIDER | undefined; | ||
| _loadInitializerDependencies(siloContext: SiloContext, parentsNames: ServiceName[], dependenciesDeclarations: DependencyDeclaration[], additionalDeclarations: DependencyDeclaration[]): Promise<Dependencies>; | ||
| _loadProvider(siloContext: SiloContext, serviceName: ServiceName, parentsNames: ServiceName[]): Promise<void>; | ||
| _getAutoloader(siloContext: SiloContext, parentsNames: ServiceName[]): Promise<Autoloader<Initializer<unknown, Dependencies<unknown>>> | undefined>; | ||
| _loadInitializer(siloContext: SiloContext, serviceName: ServiceName, parentsNames: ServiceName[]): Promise<void>; | ||
| _resolveDependencies(siloContext: SiloContext, loadingServices: ServiceName[], parentsNames: ServiceName[]): Promise<void>; | ||
| /** | ||
@@ -144,68 +191,2 @@ * Destroy the Knifecycle instance | ||
| destroy(): Promise<void>; | ||
| /** | ||
| * Initialize or return a service descriptor | ||
| * @param {Object} siloContext | ||
| * Current execution silo context | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependencies on the fly loading | ||
| * @param {String} serviceProvider | ||
| * Service provider. | ||
| * @return {Promise} | ||
| * Service descriptor promise. | ||
| */ | ||
| _getServiceDescriptor(siloContext: SiloContext<unknown>, serviceName: ServiceName, { injectorContext, autoloading, }: { | ||
| injectorContext: boolean; | ||
| autoloading: boolean; | ||
| }): Promise<Provider<unknown>>; | ||
| _findInitializer(siloContext: SiloContext<unknown>, serviceName: ServiceName, { injectorContext, autoloading, }: { | ||
| injectorContext: boolean; | ||
| autoloading: boolean; | ||
| }): Promise<ProviderInitializer<Record<string, unknown>, unknown>>; | ||
| _pickupSingletonServiceDescriptorPromise(serviceName: ServiceName): Promise<Provider<unknown>> | void; | ||
| /** | ||
| * Initialize a service descriptor | ||
| * @param {Object} siloContext | ||
| * Current execution silo context | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependendencies on the fly loading. | ||
| * @return {Promise} | ||
| * Service dependencies hash promise. | ||
| */ | ||
| _initializeServiceDescriptor(siloContext: SiloContext<unknown>, serviceName: ServiceName, initializer: ProviderInitializer<Record<string, unknown>, unknown>, { autoloading, injectorContext, }: { | ||
| autoloading: boolean; | ||
| injectorContext: boolean; | ||
| }): Promise<Provider<unknown>>; | ||
| /** | ||
| * Initialize a service dependencies | ||
| * @param {Object} siloContext | ||
| * Current execution silo siloContext | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {String} servicesDeclarations | ||
| * Dependencies declarations. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependendencies on the fly loading. | ||
| * @return {Promise} | ||
| * Service dependencies hash promise. | ||
| */ | ||
| _initializeDependencies(siloContext: SiloContext<unknown>, serviceName: ServiceName, servicesDeclarations: DependencyDeclaration[], { injectorContext, autoloading, }: { | ||
| autoloading: boolean; | ||
| injectorContext: boolean; | ||
| }): Promise<Dependencies>; | ||
| } | ||
@@ -212,0 +193,0 @@ export { SPECIAL_PROPS, SPECIAL_PROPS_PREFIX, DECLARATION_SEPARATOR, OPTIONAL_FLAG, ALLOWED_INITIALIZER_TYPES, ALLOWED_SPECIAL_PROPS, parseInjections, readFunctionName, parseName, Knifecycle, initializer, name, autoName, type, inject, useInject, mergeInject, autoInject, alsoInject, extra, singleton, reuseSpecialProps, wrapInitializer, constant, service, autoService, provider, autoProvider, handler, autoHandler, parseDependencyDeclaration, stringifyDependencyDeclaration, unwrapInitializerProperties, initInitializerBuilder, }; |
+543
-433
@@ -0,1 +1,2 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint max-len: ["warn", { "ignoreComments": true }] @typescript-eslint/no-this-alias: "warn" */ | ||
@@ -6,2 +7,7 @@ import { SPECIAL_PROPS, SPECIAL_PROPS_PREFIX, DECLARATION_SEPARATOR, OPTIONAL_FLAG, ALLOWED_INITIALIZER_TYPES, ALLOWED_SPECIAL_PROPS, parseInjections, readFunctionName, reuseSpecialProps, parseName, name, autoName, inject, useInject, mergeInject, autoInject, alsoInject, type, extra, singleton, initializer, constant, service, autoService, provider, autoProvider, wrapInitializer, handler, autoHandler, parseDependencyDeclaration, stringifyDependencyDeclaration, unwrapInitializerProperties, } from './util.js'; | ||
| import initDebug from 'debug'; | ||
| export const RUN_DEPENDENT_NAME = '__run__'; | ||
| export const SYSTEM_DEPENDENT_NAME = '__system__'; | ||
| export const AUTOLOAD_DEPENDENT_NAME = '__autoloader__'; | ||
| export const INJECTOR_DEPENDENT_NAME = '__injector__'; | ||
| export const NO_PROVIDER = Symbol('NO_PROVIDER'); | ||
| const debug = initDebug('knifecycle'); | ||
@@ -14,13 +20,2 @@ const DISPOSE = '$dispose'; | ||
| const FATAL_ERROR = '$fatalError'; | ||
| const E_BAD_AUTOLOADED_INITIALIZER = 'E_BAD_AUTOLOADED_INITIALIZER'; | ||
| const E_AUTOLOADED_INITIALIZER_MISMATCH = 'E_AUTOLOADED_INITIALIZER_MISMATCH'; | ||
| const E_UNMATCHED_DEPENDENCY = 'E_UNMATCHED_DEPENDENCY'; | ||
| const E_CIRCULAR_DEPENDENCY = 'E_CIRCULAR_DEPENDENCY'; | ||
| const E_BAD_SERVICE_PROVIDER = 'E_BAD_SERVICE_PROVIDER'; | ||
| const E_BAD_SERVICE_PROMISE = 'E_BAD_SERVICE_PROMISE'; | ||
| const E_INSTANCE_DESTROYED = 'E_INSTANCE_DESTROYED'; | ||
| const E_AUTOLOADER_DYNAMIC_DEPENDENCY = 'E_AUTOLOADER_DYNAMIC_DEPENDENCY'; | ||
| const E_BAD_CLASS = 'E_BAD_CLASS'; | ||
| const E_UNDEFINED_CONSTANT_INITIALIZER = 'E_UNDEFINED_CONSTANT_INITIALIZER'; | ||
| const E_BAD_VALUED_NON_CONSTANT_INITIALIZER = 'E_BAD_VALUED_NON_CONSTANT_INITIALIZER'; | ||
| /* Architecture Note #1: Knifecycle | ||
@@ -42,2 +37,5 @@ | ||
| set as a property. | ||
| In fact, the Knifecycle API is aimed to allow to statically | ||
| build its services load/unload code once in production. | ||
| */ | ||
@@ -55,12 +53,13 @@ /* Architecture Note #1.1: OOP | ||
| class Knifecycle { | ||
| _options; | ||
| _silosCounter; | ||
| _silosContexts; | ||
| _initializers; | ||
| _initializerResolvers; | ||
| _singletonsServicesHandles; | ||
| _singletonsServicesDescriptors; | ||
| _singletonsServicesShutdownsPromises; | ||
| shutdownPromise; | ||
| _initializersStates; | ||
| _shutdownPromise; | ||
| /** | ||
| * Create a new Knifecycle instance | ||
| * @param {Object} options | ||
| * An object with options | ||
| * @param {boolean} options.sequential | ||
| * Allows to load dependencies sequentially (usefull for debugging) | ||
| * @return {Knifecycle} | ||
@@ -74,14 +73,38 @@ * The Knifecycle instance | ||
| */ | ||
| constructor() { | ||
| constructor(options) { | ||
| this._options = options || {}; | ||
| this._silosCounter = 0; | ||
| this._silosContexts = new Set(); | ||
| this._initializers = new Map(); | ||
| this._initializerResolvers = new Map(); | ||
| this._singletonsServicesHandles = new Map(); | ||
| this._singletonsServicesDescriptors = new Map(); | ||
| this._singletonsServicesShutdownsPromises = new Map(); | ||
| this._silosContexts = {}; | ||
| this._initializersStates = { | ||
| [FATAL_ERROR]: { | ||
| initializer: service(async () => { | ||
| throw new YError('E_UNEXPECTED_INIT', FATAL_ERROR); | ||
| }, FATAL_ERROR), | ||
| autoloaded: false, | ||
| dependents: [], | ||
| silosInstances: {}, | ||
| }, | ||
| [SILO_CONTEXT]: { | ||
| initializer: service(async () => { | ||
| throw new YError('E_UNEXPECTED_INIT', SILO_CONTEXT); | ||
| }, SILO_CONTEXT), | ||
| autoloaded: false, | ||
| dependents: [], | ||
| silosInstances: {}, | ||
| }, | ||
| [DISPOSE]: { | ||
| initializer: service(async () => { | ||
| throw new YError('E_UNEXPECTED_INIT', DISPOSE); | ||
| }, DISPOSE), | ||
| autoloaded: false, | ||
| dependents: [], | ||
| silosInstances: {}, | ||
| }, | ||
| }; | ||
| this.register(constant(INSTANCE, this)); | ||
| const initInjectorProvider = provider(async ({ $siloContext }) => ({ | ||
| service: async (dependenciesDeclarations) => _buildFinalHash(await this._initializeDependencies($siloContext, $siloContext.name, dependenciesDeclarations, { injectorContext: true, autoloading: false }), dependenciesDeclarations), | ||
| }), INJECTOR, [SILO_CONTEXT], | ||
| const initInjectorProvider = provider(async ({ $siloContext, $instance, }) => ({ | ||
| service: async (dependenciesDeclarations) => { | ||
| return $instance._loadInitializerDependencies($siloContext, [INJECTOR_DEPENDENT_NAME], dependenciesDeclarations, []); | ||
| }, | ||
| }), INJECTOR, [SILO_CONTEXT, INSTANCE], | ||
| // Despite its global definition, the injector | ||
@@ -101,3 +124,3 @@ // depends on the silo context and then needs | ||
| - constants: a `constant` initializer resolves to | ||
| a constant value. | ||
| any constant value. | ||
| - services: a `service` initializer directly | ||
@@ -111,8 +134,9 @@ resolve to the actual service it builds. It can | ||
| `fatalErrorPromise` that will be rejected if an | ||
| unrecoverable error happens. | ||
| unrecoverable error happens allowing Knifecycle | ||
| to terminate. | ||
| Initializers can be declared as singletons. This means | ||
| that they will be instanciated once for all for each | ||
| executions silos using them (we will cover this | ||
| topic later on). | ||
| Initializers can be declared as singletons (constants are | ||
| of course only singletons). This means that they will be | ||
| instanciated once for all for each executions silos using | ||
| them (we will cover this topic later on). | ||
| */ | ||
@@ -127,37 +151,88 @@ /** | ||
| register(initializer) { | ||
| if (this.shutdownPromise) { | ||
| throw new YError(E_INSTANCE_DESTROYED); | ||
| if (this._shutdownPromise) { | ||
| throw new YError('E_INSTANCE_DESTROYED'); | ||
| } | ||
| const initializerState = { | ||
| initializer, | ||
| autoloaded: false, | ||
| dependents: [], | ||
| }; | ||
| this._checkInitializerOverride(initializer[SPECIAL_PROPS.NAME]); | ||
| this._buildInitializerState(initializerState, initializer); | ||
| this._initializersStates[initializer[SPECIAL_PROPS.NAME]] = | ||
| initializerState; | ||
| debug(`Registered an initializer: ${initializer[SPECIAL_PROPS.NAME]}`); | ||
| return this; | ||
| } | ||
| _checkInitializerOverride(serviceName) { | ||
| if (this._initializersStates[serviceName]) { | ||
| if ('initializer' in this._initializersStates[serviceName]) { | ||
| if (this._initializersStates[serviceName]?.dependents?.length) { | ||
| debug(`Override attempt of an already used initializer: ${serviceName}`); | ||
| throw new YError('E_INITIALIZER_ALREADY_INSTANCIATED', serviceName); | ||
| } | ||
| debug(`Overridden an initializer: ${serviceName}`); | ||
| } | ||
| } | ||
| } | ||
| _buildInitializerState(initializerState, initializer) { | ||
| unwrapInitializerProperties(initializer); | ||
| // Temporary cast constants into providers | ||
| // Best would be to threat each differently | ||
| // at dependencies initialization level to boost performances | ||
| if (initializer[SPECIAL_PROPS.TYPE] === 'constant') { | ||
| const value = initializer[SPECIAL_PROPS.VALUE]; | ||
| if ('undefined' === typeof value) { | ||
| throw new YError(E_UNDEFINED_CONSTANT_INITIALIZER, initializer[SPECIAL_PROPS.NAME]); | ||
| const provider = { | ||
| service: initializer[SPECIAL_PROPS.VALUE], | ||
| }; | ||
| initializerState.singletonProvider = provider; | ||
| initializerState.singletonProviderLoadPromise = Promise.resolve(); | ||
| } | ||
| else { | ||
| this._checkInitializerDependencies(initializer); | ||
| if (!initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| initializerState.silosInstances = {}; | ||
| } | ||
| initializer = provider(async () => ({ | ||
| service: value, | ||
| }), initializer[SPECIAL_PROPS.NAME], [], true); | ||
| // Needed for the build utils to still recognize | ||
| // this initializer as a constant value | ||
| initializer[SPECIAL_PROPS.VALUE] = value; | ||
| initializer[SPECIAL_PROPS.TYPE] = 'constant'; | ||
| } | ||
| else if ('undefined' !== typeof initializer[SPECIAL_PROPS.VALUE]) { | ||
| throw new YError(E_BAD_VALUED_NON_CONSTANT_INITIALIZER, initializer[SPECIAL_PROPS.NAME]); | ||
| } | ||
| // Temporary cast service initializers into | ||
| // providers. Best would be to threat each differently | ||
| // at dependencies initialization level to boost performances | ||
| if ('service' === initializer[SPECIAL_PROPS.TYPE]) { | ||
| initializer = reuseSpecialProps(initializer, serviceAdapter.bind(null, initializer[SPECIAL_PROPS.NAME], initializer)); | ||
| initializer[SPECIAL_PROPS.TYPE] = 'provider'; | ||
| } | ||
| } | ||
| _checkInitializerDependencies(initializer) { | ||
| const initializerDependsOfItself = initializer[SPECIAL_PROPS.INJECT] | ||
| .map(_pickServiceNameFromDeclaration) | ||
| .map((dependencyDeclaration) => { | ||
| const serviceName = _pickServiceNameFromDeclaration(dependencyDeclaration); | ||
| if ( | ||
| // TEMPFIX: let's build | ||
| initializer[SPECIAL_PROPS.NAME] !== 'BUILD_CONSTANTS' && | ||
| // TEMPFIX: Those services are special... | ||
| ![FATAL_ERROR, INJECTOR, SILO_CONTEXT].includes(serviceName) && | ||
| initializer[SPECIAL_PROPS.SINGLETON] && | ||
| this._initializersStates[serviceName] && | ||
| 'initializer' in this._initializersStates[serviceName] && | ||
| this._initializersStates[serviceName]?.initializer && | ||
| !this._initializersStates[serviceName]?.initializer?.[SPECIAL_PROPS.SINGLETON]) { | ||
| debug(`Found an inconsistent singleton initializer dependency: ${initializer[SPECIAL_PROPS.NAME]}`, serviceName, initializer); | ||
| throw new YError('E_BAD_SINGLETON_DEPENDENCIES', initializer[SPECIAL_PROPS.NAME], serviceName); | ||
| } | ||
| return serviceName; | ||
| }) | ||
| .includes(initializer[SPECIAL_PROPS.NAME]); | ||
| if ( | ||
| // TEMPFIX: let's build | ||
| initializer[SPECIAL_PROPS.NAME] !== 'BUILD_CONSTANTS' && | ||
| !initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| Object.keys(this._initializersStates) | ||
| .filter((serviceName) => ![ | ||
| // TEMPFIX: Those services are special... | ||
| FATAL_ERROR, | ||
| INJECTOR, | ||
| SILO_CONTEXT, | ||
| ].includes(serviceName)) | ||
| .forEach((serviceName) => { | ||
| if (this._initializersStates[serviceName]?.initializer && | ||
| this._initializersStates[serviceName]?.initializer?.[SPECIAL_PROPS.SINGLETON] && | ||
| (this._initializersStates[serviceName]?.initializer?.[SPECIAL_PROPS.INJECT] || []) | ||
| .map(_pickServiceNameFromDeclaration) | ||
| .includes(initializer[SPECIAL_PROPS.NAME])) { | ||
| debug(`Found an inconsistent dependent initializer: ${initializer[SPECIAL_PROPS.NAME]}`, serviceName, initializer); | ||
| throw new YError('E_BAD_SINGLETON_DEPENDENCIES', serviceName, initializer[SPECIAL_PROPS.NAME]); | ||
| } | ||
| }); | ||
| } | ||
| if (initializerDependsOfItself) { | ||
| throw new YError(E_CIRCULAR_DEPENDENCY, initializer[SPECIAL_PROPS.NAME]); | ||
| throw new YError('E_CIRCULAR_DEPENDENCY', initializer[SPECIAL_PROPS.NAME]); | ||
| } | ||
@@ -167,42 +242,14 @@ initializer[SPECIAL_PROPS.INJECT].forEach((dependencyDeclaration) => { | ||
| }); | ||
| if (this._initializers.has(initializer[SPECIAL_PROPS.NAME])) { | ||
| const initializedAsSingleton = this._singletonsServicesHandles.has(initializer[SPECIAL_PROPS.NAME]) && | ||
| this._singletonsServicesDescriptors.has(initializer[SPECIAL_PROPS.NAME]) && | ||
| !this._singletonsServicesDescriptors.get(initializer[SPECIAL_PROPS.NAME])?.preloaded; | ||
| const initializedAsInstance = [...this._silosContexts.values()].some((siloContext) => siloContext.servicesSequence.some((sequence) => sequence.includes(initializer[SPECIAL_PROPS.NAME]))); | ||
| if (initializedAsSingleton || initializedAsInstance) { | ||
| throw new YError('E_INITIALIZER_ALREADY_INSTANCIATED', initializer[SPECIAL_PROPS.NAME]); | ||
| } | ||
| debug(`Overridden an initializer: ${initializer[SPECIAL_PROPS.NAME]}`); | ||
| } | ||
| else { | ||
| debug(`Registered an initializer: ${initializer[SPECIAL_PROPS.NAME]}`); | ||
| } | ||
| // Constants are singletons and constant so we can set it | ||
| // to singleton services descriptors map directly | ||
| if ('constant' === initializer[SPECIAL_PROPS.TYPE]) { | ||
| const handlesSet = new Set(); | ||
| this._singletonsServicesHandles.set(initializer[SPECIAL_PROPS.NAME], handlesSet); | ||
| this._singletonsServicesDescriptors.set(initializer[SPECIAL_PROPS.NAME], { | ||
| preloaded: true, | ||
| // We do not directly use initializer[SPECIAL_PROPS.VALUE] here | ||
| // since it looks like there is a bug with Babel build that | ||
| // change functions to empty litteral objects | ||
| promise: initializer({}), | ||
| }); | ||
| } | ||
| this._initializers.set(initializer[SPECIAL_PROPS.NAME], initializer); | ||
| return this; | ||
| } | ||
| _lookupCircularDependencies(rootServiceName, dependencyDeclaration, declarationsStacks = []) { | ||
| const serviceName = _pickServiceNameFromDeclaration(dependencyDeclaration); | ||
| const dependencyProvider = this._initializers.get(serviceName); | ||
| if (!dependencyProvider) { | ||
| const initializersState = this._initializersStates[serviceName]; | ||
| if (!initializersState || !initializersState.initializer) { | ||
| return; | ||
| } | ||
| declarationsStacks = declarationsStacks.concat(dependencyDeclaration); | ||
| dependencyProvider[SPECIAL_PROPS.INJECT].forEach((childDependencyDeclaration) => { | ||
| (initializersState.initializer[SPECIAL_PROPS.INJECT] || []).forEach((childDependencyDeclaration) => { | ||
| const childServiceName = _pickServiceNameFromDeclaration(childDependencyDeclaration); | ||
| if (rootServiceName === childServiceName) { | ||
| throw new YError(E_CIRCULAR_DEPENDENCY, ...[rootServiceName] | ||
| throw new YError('E_CIRCULAR_DEPENDENCY', ...[rootServiceName] | ||
| .concat(declarationsStacks) | ||
@@ -249,11 +296,13 @@ .concat(childDependencyDeclaration)); | ||
| }) { | ||
| const servicesProviders = this._initializers; | ||
| const links = Array.from(servicesProviders.keys()) | ||
| const initializersStates = this._initializersStates; | ||
| const links = Object.keys(initializersStates) | ||
| .filter((provider) => !provider.startsWith('$')) | ||
| .reduce((links, serviceName) => { | ||
| const serviceProvider = servicesProviders.get(serviceName); | ||
| if (!serviceProvider[SPECIAL_PROPS.INJECT].length) { | ||
| const initializerState = initializersStates[serviceName]; | ||
| if (!initializerState || | ||
| !initializerState.initializer || | ||
| !initializerState.initializer[SPECIAL_PROPS.INJECT]?.length) { | ||
| return links; | ||
| } | ||
| return links.concat(serviceProvider[SPECIAL_PROPS.INJECT].map((dependencyDeclaration) => { | ||
| return links.concat(initializerState.initializer[SPECIAL_PROPS.INJECT].map((dependencyDeclaration) => { | ||
| const dependedServiceName = _pickServiceNameFromDeclaration(dependencyDeclaration); | ||
@@ -303,361 +352,442 @@ return { serviceName, dependedServiceName }; | ||
| async run(dependenciesDeclarations) { | ||
| const _this = this; | ||
| const internalDependencies = [ | ||
| ...new Set(dependenciesDeclarations.concat(DISPOSE)), | ||
| ]; | ||
| const siloIndex = `silo-${this._silosCounter++}`; | ||
| const siloContext = { | ||
| name: `silo-${this._silosCounter++}`, | ||
| servicesDescriptors: new Map(), | ||
| servicesSequence: [], | ||
| servicesShutdownsPromises: new Map(), | ||
| index: siloIndex, | ||
| loadingServices: [], | ||
| loadingSequences: [], | ||
| errorsPromises: [], | ||
| }; | ||
| if (this.shutdownPromise) { | ||
| throw new YError(E_INSTANCE_DESTROYED); | ||
| if (this._shutdownPromise) { | ||
| throw new YError('E_INSTANCE_DESTROYED'); | ||
| } | ||
| // Create a provider for the special fatal error service | ||
| siloContext.servicesDescriptors.set(FATAL_ERROR, Promise.resolve({ | ||
| service: { | ||
| promise: new Promise((_resolve, reject) => { | ||
| siloContext.throwFatalError = (err) => { | ||
| debug('Handled a fatal error', err); | ||
| reject(err); | ||
| }; | ||
| }), | ||
| this._initializersStates[FATAL_ERROR].silosInstances[siloIndex] = { | ||
| provider: { | ||
| service: { | ||
| promise: new Promise((_resolve, reject) => { | ||
| siloContext.throwFatalError = (err) => { | ||
| debug('Handled a fatal error', err); | ||
| reject(err); | ||
| }; | ||
| }), | ||
| }, | ||
| }, | ||
| })); | ||
| }; | ||
| // Make the siloContext available for internal injections | ||
| siloContext.servicesDescriptors.set(SILO_CONTEXT, Promise.resolve({ | ||
| service: siloContext, | ||
| })); | ||
| this._initializersStates[SILO_CONTEXT].silosInstances[siloIndex] = { | ||
| provider: { service: siloContext }, | ||
| }; | ||
| // Create a provider for the shutdown special dependency | ||
| siloContext.servicesDescriptors.set(DISPOSE, Promise.resolve({ | ||
| service: async () => { | ||
| siloContext.shutdownPromise = | ||
| siloContext.shutdownPromise || | ||
| _shutdownNextServices(siloContext.servicesSequence); | ||
| debug('Shutting down services'); | ||
| await siloContext.shutdownPromise; | ||
| this._silosContexts.delete(siloContext); | ||
| // Shutdown services in their instanciation order | ||
| async function _shutdownNextServices(reversedServiceSequence) { | ||
| if (0 === reversedServiceSequence.length) { | ||
| return; | ||
| } | ||
| await Promise.all(reversedServiceSequence.pop().map(async (serviceName) => { | ||
| const singletonServiceDescriptor = await _this._pickupSingletonServiceDescriptorPromise(serviceName); | ||
| const serviceDescriptor = singletonServiceDescriptor || | ||
| (await siloContext.servicesDescriptors.get(serviceName)); | ||
| let serviceShutdownPromise = _this._singletonsServicesShutdownsPromises.get(serviceName) || | ||
| siloContext.servicesShutdownsPromises.get(serviceName); | ||
| if (serviceShutdownPromise) { | ||
| debug('Reusing a service shutdown promise:', serviceName); | ||
| return serviceShutdownPromise; | ||
| this._initializersStates[DISPOSE].silosInstances[siloIndex] = { | ||
| provider: { | ||
| service: async () => { | ||
| const _this = this; | ||
| siloContext._shutdownPromise = | ||
| siloContext._shutdownPromise || | ||
| _shutdownNextServices(siloContext.loadingSequences.concat()); | ||
| await siloContext._shutdownPromise; | ||
| delete this._silosContexts[siloContext.index]; | ||
| // Shutdown services in their instanciation order | ||
| async function _shutdownNextServices(serviceLoadSequences) { | ||
| if (0 === serviceLoadSequences.length) { | ||
| return; | ||
| } | ||
| if (reversedServiceSequence.some((servicesDeclarations) => servicesDeclarations.includes(serviceName))) { | ||
| debug('Delaying service shutdown:', serviceName); | ||
| return Promise.resolve(); | ||
| } | ||
| if (singletonServiceDescriptor) { | ||
| const handleSet = _this._singletonsServicesHandles.get(serviceName); | ||
| handleSet.delete(siloContext.name); | ||
| if (handleSet.size) { | ||
| debug('Singleton is used elsewhere:', serviceName, handleSet); | ||
| return Promise.resolve(); | ||
| const currentServiceLoadSequence = serviceLoadSequences.pop() || []; | ||
| // First ensure to remove services that are depend on | ||
| // by another service loaded in the same batch (may | ||
| // happen depending on the load sequence) | ||
| const dependendedByAServiceInTheSameBatch = currentServiceLoadSequence.filter((serviceName) => { | ||
| if (currentServiceLoadSequence | ||
| .filter((anotherServiceName) => anotherServiceName !== serviceName) | ||
| .some((anotherServiceName) => (_this._initializersStates[anotherServiceName] | ||
| ?.initializer?.[SPECIAL_PROPS.INJECT] || []) | ||
| .map(_pickServiceNameFromDeclaration) | ||
| .includes(serviceName))) { | ||
| debug(`Delaying service "${serviceName}" dependencies shutdown to a dedicated batch.'`); | ||
| return true; | ||
| } | ||
| _this._singletonsServicesDescriptors.delete(serviceName); | ||
| }); | ||
| await Promise.all(currentServiceLoadSequence | ||
| .filter((serviceName) => !dependendedByAServiceInTheSameBatch.includes(serviceName)) | ||
| .map(async (serviceName) => { | ||
| const initializeState = _this._initializersStates[serviceName]; | ||
| if ('silosInstances' in initializeState) { | ||
| const provider = _this._getServiceProvider(siloContext, serviceName); | ||
| if (serviceLoadSequences.some((servicesLoadSequence) => servicesLoadSequence.includes(serviceName))) { | ||
| debug('Delaying service shutdown to another batch:', serviceName); | ||
| return Promise.resolve(); | ||
| } | ||
| if (!initializeState.silosInstances[siloContext.index] | ||
| .instanceDisposePromise) { | ||
| debug('Shutting down a service:', serviceName); | ||
| initializeState.silosInstances[siloContext.index].instanceDisposePromise = | ||
| provider && | ||
| provider !== NO_PROVIDER && | ||
| 'dispose' in provider && | ||
| provider.dispose | ||
| ? provider.dispose() | ||
| : Promise.resolve(); | ||
| } | ||
| else { | ||
| debug('Reusing a service shutdown promise:', serviceName); | ||
| } | ||
| await initializeState.silosInstances[siloContext.index] | ||
| .instanceDisposePromise; | ||
| } | ||
| else if ('singletonProvider' in initializeState) { | ||
| initializeState.dependents = | ||
| initializeState.dependents.filter(({ silo }) => silo !== siloContext.index); | ||
| if (initializeState.dependents.length) { | ||
| debug(`Will not shut down the ${serviceName} singleton service (still used ${initializeState.dependents.length} times).`, initializeState.dependents); | ||
| } | ||
| else { | ||
| const provider = _this._getServiceProvider(siloContext, serviceName); | ||
| debug('Shutting down a singleton service:', serviceName); | ||
| delete initializeState.singletonProviderLoadPromise; | ||
| delete initializeState.singletonProvider; | ||
| return provider && | ||
| provider !== NO_PROVIDER && | ||
| 'dispose' in provider && | ||
| provider.dispose | ||
| ? provider.dispose() | ||
| : Promise.resolve(); | ||
| } | ||
| } | ||
| })); | ||
| if (dependendedByAServiceInTheSameBatch.length) { | ||
| serviceLoadSequences.unshift(dependendedByAServiceInTheSameBatch); | ||
| } | ||
| debug('Shutting down a service:', serviceName); | ||
| serviceShutdownPromise = serviceDescriptor?.dispose | ||
| ? serviceDescriptor.dispose() | ||
| : Promise.resolve(); | ||
| if (singletonServiceDescriptor) { | ||
| _this._singletonsServicesShutdownsPromises.set(serviceName, serviceShutdownPromise); | ||
| } | ||
| siloContext.servicesShutdownsPromises.set(serviceName, serviceShutdownPromise); | ||
| return serviceShutdownPromise; | ||
| })); | ||
| await _shutdownNextServices(reversedServiceSequence); | ||
| } | ||
| await _shutdownNextServices(serviceLoadSequences); | ||
| } | ||
| }, | ||
| dispose: Promise.resolve.bind(Promise), | ||
| }, | ||
| dispose: Promise.resolve.bind(Promise), | ||
| })); | ||
| this._silosContexts.add(siloContext); | ||
| const servicesHash = await this._initializeDependencies(siloContext, siloContext.name, internalDependencies, { injectorContext: false, autoloading: false }); | ||
| }; | ||
| this._silosContexts[siloContext.index] = siloContext; | ||
| const services = await this._loadInitializerDependencies(siloContext, [RUN_DEPENDENT_NAME], dependenciesDeclarations, [DISPOSE]); | ||
| // TODO: recreate error promise when autoloaded/injected things? | ||
| debug('Handling fatal errors:', siloContext.errorsPromises); | ||
| Promise.all(siloContext.errorsPromises).catch(siloContext.throwFatalError); | ||
| return _buildFinalHash(servicesHash, dependenciesDeclarations); | ||
| debug('All dependencies now loaded:', siloContext.loadingSequences); | ||
| return services; | ||
| } | ||
| /** | ||
| * 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() | ||
| * }) | ||
| */ | ||
| async destroy() { | ||
| this.shutdownPromise = | ||
| this.shutdownPromise || | ||
| Promise.all([...this._silosContexts].map(async (siloContext) => { | ||
| const $dispose = (await siloContext.servicesDescriptors.get(DISPOSE)) | ||
| ?.service; | ||
| return $dispose(); | ||
| })).then(() => undefined); | ||
| debug('Shutting down Knifecycle instance.'); | ||
| return this.shutdownPromise; | ||
| _getInitializer(serviceName) { | ||
| return this._initializersStates[serviceName]?.initializer; | ||
| } | ||
| /** | ||
| * Initialize or return a service descriptor | ||
| * @param {Object} siloContext | ||
| * Current execution silo context | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependencies on the fly loading | ||
| * @param {String} serviceProvider | ||
| * Service provider. | ||
| * @return {Promise} | ||
| * Service descriptor promise. | ||
| */ | ||
| async _getServiceDescriptor(siloContext, serviceName, { injectorContext, autoloading, }) { | ||
| // Try to get service descriptior early from the silo context | ||
| let serviceDescriptorPromise = siloContext.servicesDescriptors.get(serviceName); | ||
| if (serviceDescriptorPromise) { | ||
| if (autoloading) { | ||
| debug(`⚠️ - Possible dead lock due to reusing "${serviceName}" from the silo context while autoloading.`); | ||
| _getServiceProvider(siloContext, serviceName) { | ||
| const initializerState = this._initializersStates[serviceName]; | ||
| // This method expect the initialized to have a state | ||
| // so failing early if not to avoid programming errors | ||
| if (!initializerState) { | ||
| throw new YError('E_UNEXPECTED_SERVICE_READ'); | ||
| } | ||
| if ('initializer' in initializerState) { | ||
| if ('singletonProvider' in initializerState) { | ||
| const provider = initializerState.singletonProvider; | ||
| if (provider) { | ||
| return provider; | ||
| } | ||
| } | ||
| return serviceDescriptorPromise; | ||
| if ('silosInstances' in initializerState && | ||
| initializerState.silosInstances && | ||
| initializerState.silosInstances[siloContext.index] && | ||
| 'provider' in initializerState.silosInstances[siloContext.index]) { | ||
| const provider = initializerState.silosInstances[siloContext.index].provider; | ||
| if (provider) { | ||
| return provider; | ||
| } | ||
| } | ||
| } | ||
| const initializer = await this._findInitializer(siloContext, serviceName, { | ||
| injectorContext, | ||
| autoloading, | ||
| }); | ||
| serviceDescriptorPromise = this._pickupSingletonServiceDescriptorPromise(serviceName); | ||
| if (serviceDescriptorPromise) { | ||
| if (autoloading) { | ||
| debug(`⚠️ - Possible dead lock due to reusing the singleton "${serviceName}" while autoloading.`); | ||
| return; | ||
| } | ||
| async _loadInitializerDependencies(siloContext, parentsNames, dependenciesDeclarations, additionalDeclarations) { | ||
| debug(`${[...parentsNames].join('->')}: Gathering the dependencies (${dependenciesDeclarations.join(', ')}).`); | ||
| const allDependenciesDeclarations = [ | ||
| ...new Set(dependenciesDeclarations.concat(additionalDeclarations)), | ||
| ]; | ||
| const dependencies = []; | ||
| const lackingDependencies = []; | ||
| for (const serviceDeclaration of allDependenciesDeclarations) { | ||
| const { mappedName, optional } = parseDependencyDeclaration(serviceDeclaration); | ||
| const initializerState = this._initializersStates[mappedName] || { | ||
| dependents: [], | ||
| autoloaded: true, | ||
| }; | ||
| this._initializersStates[mappedName] = initializerState; | ||
| initializerState.dependents.push({ | ||
| silo: siloContext.index, | ||
| name: parentsNames[parentsNames.length - 1], | ||
| optional, | ||
| }); | ||
| dependencies.push(mappedName); | ||
| } | ||
| do { | ||
| const previouslyLackingDependencies = [...lackingDependencies]; | ||
| lackingDependencies.length = 0; | ||
| for (const mappedName of dependencies) { | ||
| if (!this._getServiceProvider(siloContext, mappedName)) { | ||
| lackingDependencies.push(mappedName); | ||
| if (!siloContext.loadingServices.includes(mappedName)) { | ||
| siloContext.loadingServices.push(mappedName); | ||
| } | ||
| } | ||
| } | ||
| this._singletonsServicesHandles.get(serviceName).add(siloContext.name); | ||
| if (lackingDependencies.length) { | ||
| await this._resolveDependencies(siloContext, lackingDependencies, parentsNames); | ||
| } | ||
| const loadSequence = previouslyLackingDependencies.filter((previouslyLackingDependency) => !lackingDependencies.includes(previouslyLackingDependency)); | ||
| if (loadSequence.length) { | ||
| siloContext.loadingSequences.push(loadSequence); | ||
| } | ||
| } while (lackingDependencies.length); | ||
| return dependenciesDeclarations.reduce((finalHash, dependencyDeclaration) => { | ||
| const { serviceName, mappedName, optional } = parseDependencyDeclaration(dependencyDeclaration); | ||
| const provider = this._getServiceProvider(siloContext, mappedName); | ||
| // We expect a provider here since everything | ||
| // should be resolved | ||
| if (!provider) { | ||
| throw new YError('E_UNEXPECTED_PROVIDER_STATE', serviceName, parentsNames); | ||
| } | ||
| if (!optional && provider === NO_PROVIDER) { | ||
| throw new YError('E_UNMATCHED_DEPENDENCY', ...parentsNames, serviceName); | ||
| } | ||
| if (provider === NO_PROVIDER) { | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Optional dependency not found.`); | ||
| } | ||
| finalHash[serviceName] = provider.service; | ||
| return finalHash; | ||
| }, {}); | ||
| } | ||
| async _loadProvider(siloContext, serviceName, parentsNames) { | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Loading the provider...`); | ||
| const initializerState = this._initializersStates[serviceName]; | ||
| if (!('initializer' in initializerState) || !initializerState.initializer) { | ||
| // At that point there should be an initialiser property | ||
| throw new YError('E_UNEXPECTED_INITIALIZER_STATE', serviceName); | ||
| } | ||
| const services = await this._loadInitializerDependencies(siloContext, [...parentsNames, serviceName], initializerState.initializer[SPECIAL_PROPS.INJECT], []); | ||
| let providerPromise; | ||
| if (initializerState.initializer[SPECIAL_PROPS.TYPE] === 'service') { | ||
| const servicePromise = initializerState.initializer(services); | ||
| if (!servicePromise || !servicePromise.then) { | ||
| debug('Service initializer did not return a promise:', serviceName); | ||
| throw new YError('E_BAD_SERVICE_PROMISE', serviceName); | ||
| } | ||
| providerPromise = servicePromise.then((service) => ({ service })); | ||
| } | ||
| else if (initializerState.initializer[SPECIAL_PROPS.TYPE] === 'provider') { | ||
| providerPromise = initializerState.initializer(services); | ||
| if (!providerPromise || !providerPromise.then) { | ||
| debug('Provider initializer did not return a promise:', serviceName); | ||
| throw new YError('E_BAD_SERVICE_PROVIDER', serviceName); | ||
| } | ||
| } | ||
| else { | ||
| serviceDescriptorPromise = | ||
| siloContext.servicesDescriptors.get(serviceName); | ||
| providerPromise = Promise.reject(new YError('E_UNEXPECTED_STATE', serviceName, initializer)); | ||
| } | ||
| if (serviceDescriptorPromise) { | ||
| return serviceDescriptorPromise; | ||
| if (initializerState.initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| initializerState.singletonProviderLoadPromise = | ||
| providerPromise; | ||
| } | ||
| // The $injector service is mainly intended to be used as a workaround | ||
| // for unavoidable circular dependencies. It rarely make sense to | ||
| // instanciate new services at this level so printing a warning for | ||
| // debug purposes | ||
| if (injectorContext) { | ||
| debug('Warning: Instantiating a new service via the $injector. It may' + | ||
| ' mean that you no longer need it if your worked around a circular' + | ||
| ' dependency.'); | ||
| else { | ||
| initializerState.silosInstances[siloContext.index] = { | ||
| providerLoadPromise: providerPromise, | ||
| }; | ||
| } | ||
| serviceDescriptorPromise = this._initializeServiceDescriptor(siloContext, serviceName, initializer, { | ||
| autoloading: autoloading || AUTOLOAD === serviceName, | ||
| injectorContext, | ||
| }); | ||
| if (initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| const handlesSet = new Set(); | ||
| handlesSet.add(siloContext.name); | ||
| this._singletonsServicesHandles.set(serviceName, handlesSet); | ||
| this._singletonsServicesDescriptors.set(serviceName, { | ||
| preloaded: false, | ||
| promise: serviceDescriptorPromise, | ||
| }); | ||
| const provider = await providerPromise; | ||
| if (!provider || | ||
| !(typeof provider === 'object') || | ||
| !('service' in provider)) { | ||
| debug('Provider has no `service` property:', serviceName); | ||
| throw new YError('E_BAD_SERVICE_PROVIDER', serviceName); | ||
| } | ||
| if (provider.fatalErrorPromise) { | ||
| debug('Registering service descriptor error promise:', serviceName); | ||
| siloContext.errorsPromises.push(provider.fatalErrorPromise); | ||
| } | ||
| if (initializerState.initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| initializerState.singletonProvider = provider; | ||
| } | ||
| else { | ||
| siloContext.servicesDescriptors.set(serviceName, serviceDescriptorPromise); | ||
| initializerState.silosInstances[siloContext.index] = { provider }; | ||
| } | ||
| // Since the autoloader is a bit special it must be pushed here | ||
| if (AUTOLOAD === serviceName) { | ||
| siloContext.servicesSequence.unshift([AUTOLOAD]); | ||
| } | ||
| return serviceDescriptorPromise; | ||
| } | ||
| async _findInitializer(siloContext, serviceName, { injectorContext, autoloading, }) { | ||
| const initializer = this._initializers.get(serviceName); | ||
| if (initializer) { | ||
| return initializer; | ||
| } | ||
| async _getAutoloader(siloContext, parentsNames) { | ||
| // The auto loader must only have static dependencies | ||
| // and we have to do this check here to avoid caching | ||
| // non-autoloading request and then be blocked by an | ||
| // autoloader dep that waits for that cached load | ||
| if (autoloading) { | ||
| throw new YError(E_AUTOLOADER_DYNAMIC_DEPENDENCY, serviceName); | ||
| // and we have to do this check here to avoid inifinite loop | ||
| if (parentsNames.includes(AUTOLOAD)) { | ||
| debug(`${parentsNames.join('->')}: Won't try to autoload autoloader dependencies...`); | ||
| return; | ||
| } | ||
| debug('No service provider:', serviceName); | ||
| let initializerPromise = this._initializerResolvers.get(serviceName); | ||
| if (initializerPromise) { | ||
| return await initializerPromise; | ||
| const autoloaderState = this._initializersStates[AUTOLOAD]; | ||
| if (!autoloaderState) { | ||
| return; | ||
| } | ||
| initializerPromise = (async () => { | ||
| if (!this._initializers.get(AUTOLOAD)) { | ||
| throw new YError(E_UNMATCHED_DEPENDENCY, serviceName); | ||
| if (!('singletonProviderLoadPromise' in autoloaderState)) { | ||
| debug(`${parentsNames.join('->')}: Instanciating the autoloader...`); | ||
| // Trick to ensure the singletonProviderLoadPromise is set | ||
| let resolveAutoloder; | ||
| autoloaderState.singletonProviderLoadPromise = new Promise((_resolve) => { | ||
| resolveAutoloder = _resolve; | ||
| }); | ||
| resolveAutoloder(await this._loadProvider(siloContext, AUTOLOAD, parentsNames)); | ||
| } | ||
| await autoloaderState.singletonProviderLoadPromise; | ||
| const autoloader = (await this._getServiceProvider(siloContext, AUTOLOAD)); | ||
| debug(`${parentsNames.join('->')}: Loaded the autoloader...`); | ||
| if (!autoloader) { | ||
| throw new YError('E_UNEXPECTED_AUTOLOADER'); | ||
| } | ||
| return autoloader.service; | ||
| } | ||
| async _loadInitializer(siloContext, serviceName, parentsNames) { | ||
| const initializerState = this._initializersStates[serviceName]; | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Loading an initializer...`); | ||
| // At that point there should be an initialiser state | ||
| if (!initializerState) { | ||
| throw new YError('E_UNEXPECTED_INITIALIZER_STATE', serviceName); | ||
| } | ||
| // When no initializer try to autoload it | ||
| if (!('initializer' in initializerState)) { | ||
| debug(`${[...parentsNames, serviceName].join('->')}: No registered initializer...`); | ||
| if (initializerState.initializerLoadPromise) { | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Wait for pending initializer registration...`); | ||
| await initializerState.initializerLoadPromise; | ||
| } | ||
| debug(`Loading the $autoload service to lookup for: ${serviceName}.`); | ||
| try { | ||
| const autoloadingDescriptor = (await this._getServiceDescriptor(siloContext, AUTOLOAD, { injectorContext, autoloading: true })); | ||
| const { initializer, path } = await autoloadingDescriptor.service(serviceName); | ||
| if (typeof initializer !== 'function' && | ||
| (typeof initializer !== 'object' || | ||
| initializer[SPECIAL_PROPS.TYPE] !== 'constant')) { | ||
| throw new YError(E_BAD_AUTOLOADED_INITIALIZER, serviceName, initializer); | ||
| else { | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Try to autoload the initializer...`); | ||
| initializerState.autoloaded = true; | ||
| // Trick to ensure the singletonProviderLoadPromise is set | ||
| let resolveInitializer, rejectInitializer; | ||
| initializerState.initializerLoadPromise = new Promise((_resolve, _reject) => { | ||
| resolveInitializer = _resolve; | ||
| rejectInitializer = _reject; | ||
| }); | ||
| try { | ||
| const autoloader = await this._getAutoloader(siloContext, [ | ||
| ...parentsNames, | ||
| serviceName, | ||
| ]); | ||
| if (!autoloader) { | ||
| debug(`${parentsNames.join('->')}: No autoloader found, leaving initializer undefined...`); | ||
| initializerState.initializer = undefined; | ||
| resolveInitializer(undefined); | ||
| return; | ||
| } | ||
| const result = await autoloader(serviceName); | ||
| if (typeof result !== 'object' || | ||
| !('initializer' in result) || | ||
| !('path' in result)) { | ||
| throw new YError('E_BAD_AUTOLOADER_RESULT', serviceName, result); | ||
| } | ||
| const { initializer, path } = result; | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Loaded the initializer at path ${path}...`); | ||
| if (initializer[SPECIAL_PROPS.NAME] !== serviceName) { | ||
| throw new YError('E_AUTOLOADED_INITIALIZER_MISMATCH', serviceName, initializer[SPECIAL_PROPS.NAME]); | ||
| } | ||
| initializerState.dependents.push({ | ||
| silo: siloContext.index, | ||
| name: AUTOLOAD, | ||
| optional: false, | ||
| }); | ||
| initializerState.initializer = initializer; | ||
| this._buildInitializerState(initializerState, initializer); | ||
| resolveInitializer(initializer); | ||
| return; | ||
| } | ||
| if (initializer[SPECIAL_PROPS.NAME] !== serviceName) { | ||
| throw new YError(E_AUTOLOADED_INITIALIZER_MISMATCH, serviceName, initializer[SPECIAL_PROPS.NAME]); | ||
| catch (err) { | ||
| if (err.code === 'E_AULOADER_DEPENDS_ON_AUTOLOAD') { | ||
| initializerState.initializer = undefined; | ||
| rejectInitializer(err); | ||
| await initializerState.initializerLoadPromise; | ||
| return; | ||
| } | ||
| if (!['E_UNMATCHED_DEPENDENCY'].includes(err.code)) { | ||
| initializerState.initializer = undefined; | ||
| rejectInitializer(YError.wrap(err, 'E_BAD_AUTOLOADED_INITIALIZER', serviceName)); | ||
| await initializerState.initializerLoadPromise; | ||
| return; | ||
| } | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Could not autoload the initializer...`, err); | ||
| initializerState.initializer = undefined; | ||
| resolveInitializer(undefined); | ||
| await initializerState.initializerLoadPromise; | ||
| } | ||
| debug(`Loaded the ${serviceName} initializer at path ${path}.`); | ||
| this.register(initializer); | ||
| this._initializerResolvers.delete(serviceName); | ||
| // Here we need to pick-up the registered initializer to | ||
| // have a universally usable intitializer | ||
| return this._initializers.get(serviceName); | ||
| return; | ||
| } | ||
| catch (err) { | ||
| debug(`Could not load ${serviceName} via the auto loader.`); | ||
| throw err; | ||
| } | ||
| })(); | ||
| this._initializerResolvers.set(serviceName, initializerPromise); | ||
| return await initializerPromise; | ||
| } | ||
| _pickupSingletonServiceDescriptorPromise(serviceName) { | ||
| const serviceDescriptor = this._singletonsServicesDescriptors.get(serviceName); | ||
| if (!serviceDescriptor) { | ||
| return; | ||
| } | ||
| serviceDescriptor.preloaded = false; | ||
| return serviceDescriptor.promise; | ||
| } | ||
| /** | ||
| * Initialize a service descriptor | ||
| * @param {Object} siloContext | ||
| * Current execution silo context | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependendencies on the fly loading. | ||
| * @return {Promise} | ||
| * Service dependencies hash promise. | ||
| */ | ||
| async _initializeServiceDescriptor(siloContext, serviceName, initializer, { autoloading, injectorContext, }) { | ||
| let serviceDescriptor; | ||
| debug('Initializing a service descriptor:', serviceName); | ||
| try { | ||
| // A singleton service may use a reserved resource | ||
| // like a TCP socket. This is why we have to be aware | ||
| // of singleton services full shutdown before creating | ||
| // a new one | ||
| await (this._singletonsServicesShutdownsPromises.get(serviceName) || | ||
| Promise.resolve()); | ||
| // Anyway delete any shutdown promise before instanciating | ||
| // a new service | ||
| this._singletonsServicesShutdownsPromises.delete(serviceName); | ||
| siloContext.servicesShutdownsPromises.delete(serviceName); | ||
| const servicesHash = await this._initializeDependencies(siloContext, serviceName, initializer[SPECIAL_PROPS.INJECT], { injectorContext, autoloading }); | ||
| debug('Successfully gathered service dependencies:', serviceName); | ||
| serviceDescriptor = await initializer(initializer[SPECIAL_PROPS.INJECT].reduce((finalHash, dependencyDeclaration) => { | ||
| const { serviceName, mappedName } = parseDependencyDeclaration(dependencyDeclaration); | ||
| finalHash[serviceName] = servicesHash[mappedName]; | ||
| return finalHash; | ||
| }, {})); | ||
| if (!serviceDescriptor) { | ||
| debug('Provider did not return a descriptor:', serviceName); | ||
| return Promise.reject(new YError(E_BAD_SERVICE_PROVIDER, serviceName)); | ||
| else { | ||
| if (initializerState.initializer) { | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Initializer ready...`); | ||
| if (initializer[SPECIAL_PROPS.TYPE] === 'constant') { | ||
| const provider = initializerState.initializer[SPECIAL_PROPS.VALUE]; | ||
| initializerState.singletonProvider = provider; | ||
| initializerState.singletonProviderLoadPromise = Promise.resolve(provider); | ||
| } | ||
| if (initializerState.initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| const singletonInitializerState = initializerState; | ||
| if (!('singletonProviderLoadPromise' in singletonInitializerState)) { | ||
| singletonInitializerState.singletonProviderLoadPromise = | ||
| this._loadProvider(siloContext, serviceName, parentsNames); | ||
| } | ||
| await singletonInitializerState.singletonProviderLoadPromise; | ||
| } | ||
| else { | ||
| const siloedInitializerState = initializerState; | ||
| if (!siloedInitializerState.silosInstances[siloContext.index]) { | ||
| siloedInitializerState.silosInstances[siloContext.index] = { | ||
| providerLoadPromise: this._loadProvider(siloContext, serviceName, parentsNames), | ||
| }; | ||
| } | ||
| await siloedInitializerState.silosInstances[siloContext.index] | ||
| .providerLoadPromise; | ||
| } | ||
| } | ||
| debug('Successfully initialized a service descriptor:', serviceName); | ||
| if (serviceDescriptor.fatalErrorPromise) { | ||
| debug('Registering service descriptor error promise:', serviceName); | ||
| siloContext.errorsPromises.push(serviceDescriptor.fatalErrorPromise); | ||
| else { | ||
| debug(`${[...parentsNames, serviceName].join('->')}: Could not find the initializer...`); | ||
| initializerState.initializer = undefined; | ||
| initializerState.singletonProvider = NO_PROVIDER; | ||
| } | ||
| siloContext.servicesDescriptors.set(serviceName, Promise.resolve(serviceDescriptor)); | ||
| } | ||
| catch (err) { | ||
| debug('Error initializing a service descriptor:', serviceName, err.stack || 'no_stack_trace'); | ||
| if (E_UNMATCHED_DEPENDENCY === err.code) { | ||
| throw YError.wrap(err, E_UNMATCHED_DEPENDENCY, ...[serviceName].concat(err.params)); | ||
| } | ||
| async _resolveDependencies(siloContext, loadingServices, parentsNames) { | ||
| debug(`Initiating a dependencies load round for silo "${siloContext.index}"'.`); | ||
| if (this._options.sequential) { | ||
| for (const loadingService of loadingServices) { | ||
| await this._loadInitializer(siloContext, loadingService, parentsNames); | ||
| } | ||
| throw err; | ||
| } | ||
| return serviceDescriptor; | ||
| else { | ||
| await Promise.all(loadingServices.map((loadingService) => this._loadInitializer(siloContext, loadingService, parentsNames))); | ||
| } | ||
| } | ||
| /** | ||
| * Initialize a service dependencies | ||
| * @param {Object} siloContext | ||
| * Current execution silo siloContext | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {String} servicesDeclarations | ||
| * Dependencies declarations. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependendencies on the fly loading. | ||
| * Destroy the Knifecycle instance | ||
| * @return {Promise} | ||
| * Service dependencies hash 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() | ||
| * }) | ||
| */ | ||
| async _initializeDependencies(siloContext, serviceName, servicesDeclarations, { injectorContext = false, autoloading = false, }) { | ||
| debug('Initializing dependencies:', serviceName, servicesDeclarations); | ||
| const servicesDescriptors = await Promise.all(servicesDeclarations.map(async (serviceDeclaration) => { | ||
| const { mappedName, optional } = parseDependencyDeclaration(serviceDeclaration); | ||
| try { | ||
| const serviceDescriptor = await this._getServiceDescriptor(siloContext, mappedName, { | ||
| injectorContext, | ||
| autoloading, | ||
| }); | ||
| return serviceDescriptor; | ||
| } | ||
| catch (err) { | ||
| if (optional && | ||
| [ | ||
| 'E_UNMATCHED_DEPENDENCY', | ||
| E_AUTOLOADER_DYNAMIC_DEPENDENCY, | ||
| ].includes(err.code)) { | ||
| debug('Optional dependency not found:', serviceDeclaration, err.stack || 'no_stack_trace'); | ||
| return; | ||
| } | ||
| throw err; | ||
| } | ||
| })); | ||
| debug('Initialized dependencies descriptors:', serviceName, servicesDeclarations, servicesDescriptors); | ||
| siloContext.servicesSequence.push(servicesDeclarations | ||
| .filter((_, index) => servicesDescriptors[index]) | ||
| .map(_pickMappedNameFromDeclaration)); | ||
| const services = await Promise.all(servicesDescriptors.map(async (serviceDescriptor) => { | ||
| if (!serviceDescriptor) { | ||
| return undefined; | ||
| } | ||
| return serviceDescriptor.service; | ||
| })); | ||
| return services.reduce((hash, service, index) => { | ||
| const mappedName = _pickMappedNameFromDeclaration(servicesDeclarations[index]); | ||
| hash[mappedName] = service; | ||
| return hash; | ||
| }, {}); | ||
| async destroy() { | ||
| this._shutdownPromise = | ||
| this._shutdownPromise || | ||
| Promise.all(Object.keys(this._silosContexts).map(async (siloIndex) => { | ||
| const siloContext = this._silosContexts[siloIndex]; | ||
| const $dispose = (await this._getServiceProvider(siloContext, DISPOSE))?.service; | ||
| return $dispose(); | ||
| })).then(() => undefined); | ||
| debug('Shutting down Knifecycle instance.'); | ||
| return this._shutdownPromise; | ||
| } | ||
@@ -670,6 +800,2 @@ } | ||
| } | ||
| function _pickMappedNameFromDeclaration(dependencyDeclaration) { | ||
| const { mappedName } = parseDependencyDeclaration(dependencyDeclaration); | ||
| return mappedName; | ||
| } | ||
| function _applyShapes(shapes, serviceName) { | ||
@@ -694,3 +820,3 @@ return shapes.reduce((shapedService, shape) => { | ||
| if (!classes[style.className]) { | ||
| throw new YError(E_BAD_CLASS, style.className, serviceName); | ||
| throw new YError('E_BAD_CLASS', style.className, serviceName); | ||
| } | ||
@@ -702,3 +828,3 @@ classesApplications[serviceName] = style.className; | ||
| if (!classes[style.className]) { | ||
| throw new YError(E_BAD_CLASS, style.className, dependedServiceName); | ||
| throw new YError('E_BAD_CLASS', style.className, dependedServiceName); | ||
| } | ||
@@ -710,18 +836,2 @@ classesApplications[dependedServiceName] = style.className; | ||
| } | ||
| function serviceAdapter(serviceName, initializer, dependenciesHash) { | ||
| const servicePromise = initializer(dependenciesHash); | ||
| if (!servicePromise || !servicePromise.then) { | ||
| throw new YError(E_BAD_SERVICE_PROMISE, serviceName); | ||
| } | ||
| return servicePromise.then((_service_) => ({ | ||
| service: _service_, | ||
| })); | ||
| } | ||
| function _buildFinalHash(servicesHash, dependenciesDeclarations) { | ||
| return dependenciesDeclarations.reduce((finalHash, dependencyDeclaration) => { | ||
| const { serviceName, mappedName } = parseDependencyDeclaration(dependencyDeclaration); | ||
| finalHash[serviceName] = servicesHash[mappedName]; | ||
| return finalHash; | ||
| }, {}); | ||
| } | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+652
-501
@@ -0,3 +1,4 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint max-nested-callbacks:0 */ | ||
| import { describe, beforeEach, test } from '@jest/globals'; | ||
| import { jest, describe, beforeEach, test } from '@jest/globals'; | ||
| import assert from 'assert'; | ||
@@ -22,2 +23,22 @@ import sinon from 'sinon'; | ||
| } | ||
| const nullService = service(async function nullService({ time }) { | ||
| // service run for its side effect only | ||
| time(); | ||
| return null; | ||
| }, 'nullService', ['time']); | ||
| const undefinedService = service(async function undefinedService({ time, }) { | ||
| // service run for its side effect only | ||
| time(); | ||
| return undefined; | ||
| }, 'undefinedService', ['time']); | ||
| const nullProvider = provider(async function nullProvider({ time, }) { | ||
| // provider run for its side effect only | ||
| time(); | ||
| return { service: null }; | ||
| }, 'nullProvider', ['time']); | ||
| const undefinedProvider = provider(async function undefinedProvider({ time, }) { | ||
| // service run for its side effect only | ||
| time(); | ||
| return { service: undefined }; | ||
| }, 'undefinedProvider', ['time']); | ||
| beforeEach(() => { | ||
@@ -286,470 +307,649 @@ $ = new Knifecycle(); | ||
| }); | ||
| }); | ||
| describe('run', () => { | ||
| test('should work with no dependencies', async () => { | ||
| const dependencies = await $.run([]); | ||
| assert.deepEqual(dependencies, {}); | ||
| test('should fail with singleton depending on siloed services', () => { | ||
| assert.throws(() => { | ||
| $.register(provider(hashProvider, 'hash', [], false)); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'], true)); | ||
| }, (err) => { | ||
| assert.deepEqual(err.code, 'E_BAD_SINGLETON_DEPENDENCIES'); | ||
| assert.deepEqual(err.params, ['hash1', 'hash']); | ||
| return true; | ||
| }); | ||
| }); | ||
| test('should work with constant dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['time', 'ENV']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'ENV']); | ||
| assert.deepEqual(dependencies, { | ||
| ENV, | ||
| time, | ||
| test('should fail when setting siloed services depended on by a singleton', () => { | ||
| assert.throws(() => { | ||
| $.register(provider(hashProvider, 'hash1', ['hash'], true)); | ||
| $.register(provider(hashProvider, 'hash', [], false)); | ||
| }, (err) => { | ||
| assert.deepEqual(err.code, 'E_BAD_SINGLETON_DEPENDENCIES'); | ||
| assert.deepEqual(err.params, ['hash1', 'hash']); | ||
| return true; | ||
| }); | ||
| }); | ||
| test('should work with service dependencies', async () => { | ||
| const wrappedSampleService = inject(['time'], async function sampleService({ time }) { | ||
| return Promise.resolve(typeof time); | ||
| }); | ||
| describe('run', () => { | ||
| describe('should work', () => { | ||
| test('with no dependencies', async () => { | ||
| const dependencies = await $.run([]); | ||
| assert.deepEqual(dependencies, {}); | ||
| }); | ||
| $.register(service(wrappedSampleService, 'sample')); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['sample']); | ||
| assert.deepEqual(Object.keys(dependencies), ['sample']); | ||
| assert.deepEqual(dependencies, { | ||
| sample: 'function', | ||
| test('with constant dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['time', 'ENV']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'ENV']); | ||
| assert.deepEqual(dependencies, { | ||
| ENV, | ||
| time, | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with simple dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV }, | ||
| time, | ||
| test('with service dependencies', async () => { | ||
| const wrappedSampleService = inject(['time'], async function sampleService({ time }) { | ||
| return Promise.resolve(typeof time); | ||
| }); | ||
| $.register(service(wrappedSampleService, 'sample')); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['sample']); | ||
| assert.deepEqual(Object.keys(dependencies), ['sample']); | ||
| assert.deepEqual(dependencies, { | ||
| sample: 'function', | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with given optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('DEBUG', {})); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: {} }, | ||
| time, | ||
| test('with null service dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(nullService); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['nullService']); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullService']); | ||
| assert.deepEqual(dependencies, { | ||
| nullService: null, | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with lacking optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: undefined }, | ||
| time, | ||
| test('with null provider dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(nullProvider); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['nullProvider']); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullProvider']); | ||
| assert.deepEqual(dependencies, { | ||
| nullProvider: null, | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with deeper dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash2', ['hash1'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash4', ['hash3'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| const dependencies = await $.run(['hash5', 'time']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| test('should instanciate services once', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash3', ['ENV', 'time'])); | ||
| const dependencies = await $.run([ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| test('should instanciate a single mapped service', async () => { | ||
| const providerStub = sinon.stub().returns(Promise.resolve({ | ||
| service: 'stub', | ||
| })); | ||
| const providerStub2 = sinon.stub().returns(Promise.resolve({ | ||
| service: 'stub2', | ||
| })); | ||
| $.register(provider(providerStub, 'mappedStub', ['stub2>mappedStub2'])); | ||
| $.register(provider(providerStub2, 'mappedStub2')); | ||
| const dependencies = await $.run([ | ||
| 'stub>mappedStub', | ||
| ]); | ||
| assert.deepEqual(dependencies, { | ||
| stub: 'stub', | ||
| test('with undefined dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(undefinedService); | ||
| $.register(undefinedProvider); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run([ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| assert.deepEqual(dependencies, { | ||
| undefinedService: undefined, | ||
| undefinedProvider: undefined, | ||
| }); | ||
| }); | ||
| assert.deepEqual(providerStub.args, [ | ||
| [ | ||
| { | ||
| stub2: 'stub2', | ||
| }, | ||
| ], | ||
| ]); | ||
| }); | ||
| test('should instanciate several services with mappings', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(singleton(service(timeServiceStub, 'aTime'))); | ||
| $.register(provider(hashProvider, 'aHash', ['ENV', 'time>aTime'])); | ||
| $.register(provider(hashProvider, 'aHash2', ['ENV', 'hash>aHash'])); | ||
| $.register(provider(hashProvider, 'aHash3', ['ENV', 'hash>aHash'])); | ||
| const dependencies = await $.run([ | ||
| 'hash2>aHash2', | ||
| 'hash3>aHash3', | ||
| 'time>aTime', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash2', 'hash3', 'time']); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| test('should fail with bad service', async () => { | ||
| $.register(service((() => undefined), 'lol')); | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_BAD_SERVICE_PROMISE'); | ||
| assert.deepEqual(err.params, ['lol']); | ||
| } | ||
| }); | ||
| test('should fail with bad provider', async () => { | ||
| $.register(provider((() => undefined), 'lol')); | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual(err.params, ['lol']); | ||
| } | ||
| }); | ||
| test('should fail with bad service in a provider', async () => { | ||
| $.register(provider(() => Promise.resolve(), 'lol')); | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual(err.params, ['lol']); | ||
| } | ||
| }); | ||
| test('should fail with undeclared dependencies', async () => { | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual(err.params, ['lol']); | ||
| } | ||
| }); | ||
| test('should fail with undeclared dependencies upstream', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'hash2'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'lol'])); | ||
| try { | ||
| await $.run(['time', 'hash']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual(err.params, ['hash', 'hash2', 'lol']); | ||
| } | ||
| }); | ||
| test('should provide a fatal error handler', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(dbProvider, 'db', ['ENV'])); | ||
| $.register(provider(processProvider, 'process', ['$fatalError'])); | ||
| function processProvider({ $fatalError, }) { | ||
| return Promise.resolve({ | ||
| service: { | ||
| fatalErrorPromise: $fatalError.promise, | ||
| }, | ||
| test('with simple dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV }, | ||
| time, | ||
| }); | ||
| } | ||
| async function dbProvider({ ENV }) { | ||
| let service; | ||
| const fatalErrorPromise = new Promise((resolve, reject) => { | ||
| service = Promise.resolve({ | ||
| resolve, | ||
| reject, | ||
| ENV, | ||
| }); | ||
| }); | ||
| test('with given optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('DEBUG', {})); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: {} }, | ||
| time, | ||
| }); | ||
| return { | ||
| service, | ||
| fatalErrorPromise, | ||
| }; | ||
| } | ||
| const { process, db } = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| 'db', | ||
| 'process', | ||
| ]); | ||
| try { | ||
| db.reject(new Error('E_DB_ERROR')); | ||
| await process.fatalErrorPromise; | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.message, 'E_DB_ERROR'); | ||
| } | ||
| }); | ||
| test('with lacking optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: undefined }, | ||
| time, | ||
| }); | ||
| }); | ||
| test('with deeper dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash2', ['hash1'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash4', ['hash3'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| const dependencies = await $.run(['hash5', 'time']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| test('and instanciate services once', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash3', ['ENV', 'time'])); | ||
| const dependencies = await $.run([ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| test('and instanciate a single mapped service', async () => { | ||
| const providerStub = sinon.stub().returns(Promise.resolve({ | ||
| service: 'stub', | ||
| })); | ||
| const providerStub2 = sinon.stub().returns(Promise.resolve({ | ||
| service: 'stub2', | ||
| })); | ||
| $.register(provider(providerStub, 'mappedStub', ['stub2>mappedStub2'])); | ||
| $.register(provider(providerStub2, 'mappedStub2')); | ||
| const dependencies = await $.run(['stub>mappedStub']); | ||
| assert.deepEqual(dependencies, { | ||
| stub: 'stub', | ||
| }); | ||
| assert.deepEqual(providerStub.args, [ | ||
| [ | ||
| { | ||
| stub2: 'stub2', | ||
| }, | ||
| ], | ||
| ]); | ||
| }); | ||
| test('and instanciate several services with mappings', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(singleton(service(timeServiceStub, 'aTime'))); | ||
| $.register(provider(hashProvider, 'aHash', ['ENV', 'time>aTime'])); | ||
| $.register(provider(hashProvider, 'aHash2', ['ENV', 'hash>aHash'])); | ||
| $.register(provider(hashProvider, 'aHash3', ['ENV', 'hash>aHash'])); | ||
| const dependencies = await $.run([ | ||
| 'hash2>aHash2', | ||
| 'hash3>aHash3', | ||
| 'time>aTime', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash2', 'hash3', 'time']); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| }); | ||
| describe('should fail', () => { | ||
| test('with bad service', async () => { | ||
| $.register(service((() => undefined), 'lol')); | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_BAD_SERVICE_PROMISE'); | ||
| assert.deepEqual(err.params, ['lol']); | ||
| } | ||
| }); | ||
| test('with bad provider', async () => { | ||
| $.register(provider((() => undefined), 'lol')); | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual(err.params, ['lol']); | ||
| } | ||
| }); | ||
| test('with bad service in a provider', async () => { | ||
| $.register(provider(() => Promise.resolve(), 'lol')); | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual(err.params, ['lol']); | ||
| } | ||
| }); | ||
| test('with undeclared dependencies', async () => { | ||
| try { | ||
| await $.run(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual(err.params, ['__run__', 'lol']); | ||
| } | ||
| }); | ||
| test('with undeclared dependencies upstream', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'hash2'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'lol'])); | ||
| try { | ||
| await $.run(['time', 'hash']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual(err.params, [ | ||
| '__run__', | ||
| 'hash', | ||
| 'hash2', | ||
| 'lol', | ||
| ]); | ||
| } | ||
| }); | ||
| test('and provide a fatal error handler', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(dbProvider, 'db', ['ENV'])); | ||
| $.register(provider(processProvider, 'process', ['$fatalError'])); | ||
| function processProvider({ $fatalError, }) { | ||
| return Promise.resolve({ | ||
| service: { | ||
| fatalErrorPromise: $fatalError.promise, | ||
| }, | ||
| }); | ||
| } | ||
| async function dbProvider({ ENV }) { | ||
| let service; | ||
| const fatalErrorPromise = new Promise((resolve, reject) => { | ||
| service = { | ||
| resolve, | ||
| reject, | ||
| ENV, | ||
| }; | ||
| }); | ||
| return { | ||
| service, | ||
| fatalErrorPromise, | ||
| }; | ||
| } | ||
| const { process, db } = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| 'db', | ||
| 'process', | ||
| ]); | ||
| try { | ||
| db.reject(new Error('E_DB_ERROR')); | ||
| await process.fatalErrorPromise; | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.deepEqual(err.message, 'E_DB_ERROR'); | ||
| } | ||
| }); | ||
| }); | ||
| }); | ||
| describe('autoload', () => { | ||
| test('should work with lacking autoloaded dependencies', async () => { | ||
| const autoloaderInitializer = initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer({ | ||
| describe('should work', () => { | ||
| test('with constant dependencies', async () => { | ||
| const autoloaderInitializer = initializer({ | ||
| type: 'service', | ||
| name: 'DEBUG', | ||
| name: '$autoload', | ||
| inject: [], | ||
| }, async () => 'THE_DEBUG:' + serviceName), | ||
| })); | ||
| const wrappedProvider = provider(hashProvider, 'hash', ['ENV', '?DEBUG']); | ||
| $.register(autoloaderInitializer); | ||
| $.register(wrappedProvider); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: 'THE_DEBUG:DEBUG' }, | ||
| time, | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: constant(serviceName, `value_of:${serviceName}`), | ||
| })); | ||
| const wrappedProvider = provider(hashProvider, 'hash', [ | ||
| 'ENV', | ||
| '?DEBUG', | ||
| ]); | ||
| $.register(autoloaderInitializer); | ||
| $.register(wrappedProvider); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV: 'value_of:ENV', DEBUG: 'value_of:DEBUG' }, | ||
| time: 'value_of:time', | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with deeper several lacking dependencies', async () => { | ||
| $.register(initializer({ | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer({ | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: 'hash2' === serviceName | ||
| ? ['hash1'] | ||
| : 'hash4' === serviceName | ||
| ? ['hash3'] | ||
| : [], | ||
| }, hashProvider), | ||
| }))); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| const dependencies = await $.run(['hash5', 'time']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| test('should work with various dependencies', async () => { | ||
| $.register(provider(hashProvider, 'hash', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash3', ['?ENV'])); | ||
| $.register(constant('DEBUG', 1)); | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV', 'DEBUG'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => { | ||
| if ('ENV' === serviceName) { | ||
| throw new YError('E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| return { | ||
| test('with lacking autoloaded dependencies', async () => { | ||
| const autoloaderInitializer = initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer({ | ||
| type: 'service', | ||
| name: 'hash2', | ||
| inject: ['hash3'], | ||
| }, async () => 'THE_HASH:' + serviceName), | ||
| }; | ||
| })); | ||
| const dependencies = await $.run(['hash', '?ENV']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'ENV']); | ||
| name: 'DEBUG', | ||
| inject: [], | ||
| }, async () => 'THE_DEBUG:' + serviceName), | ||
| })); | ||
| const wrappedProvider = provider(hashProvider, 'hash', [ | ||
| 'ENV', | ||
| '?DEBUG', | ||
| ]); | ||
| $.register(autoloaderInitializer); | ||
| $.register(wrappedProvider); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run(['time', 'hash']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: 'THE_DEBUG:DEBUG' }, | ||
| time, | ||
| }); | ||
| }); | ||
| test('with deeper several lacking dependencies', async () => { | ||
| $.register(initializer({ | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer({ | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: 'hash2' === serviceName | ||
| ? ['hash1'] | ||
| : 'hash4' === serviceName | ||
| ? ['hash3'] | ||
| : [], | ||
| }, hashProvider), | ||
| }))); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| const dependencies = await $.run(['hash5', 'time']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| test('with various dependencies', async () => { | ||
| $.register(provider(hashProvider, 'hash', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash3', ['?ENV'])); | ||
| $.register(constant('DEBUG', 1)); | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['DEBUG'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => { | ||
| if ('ENV' === serviceName) { | ||
| throw new YError('E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| return { | ||
| path: '/path/of/debug', | ||
| initializer: initializer({ | ||
| type: 'service', | ||
| name: 'hash2', | ||
| inject: ['hash3'], | ||
| }, async () => 'THE_HASH:' + serviceName), | ||
| }; | ||
| })); | ||
| const dependencies = await $.run(['hash', '?ENV']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'ENV']); | ||
| }); | ||
| test('and instanciate services once', async () => { | ||
| $.register(initializer({ | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer({ | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: ['ENV', 'time'], | ||
| }, hashProvider), | ||
| }))); | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['hash1', 'hash2', 'hash3'])); | ||
| $.register(provider(hashProvider, 'hash_', ['hash1', 'hash2', 'hash3'])); | ||
| const dependencies = await $.run(['hash', 'hash_', 'hash3']); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'hash_', 'hash3']); | ||
| }); | ||
| test('with null service dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(constant('time', time)); | ||
| $.register(initializer({ | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: nullService, | ||
| }))); | ||
| const dependencies = await $.run(['nullService']); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullService']); | ||
| assert.deepEqual(dependencies, { | ||
| nullService: null, | ||
| }); | ||
| }); | ||
| test('with null provider dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(constant('time', time)); | ||
| $.register(initializer({ | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: nullProvider, | ||
| }))); | ||
| const dependencies = await $.run(['nullProvider']); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullProvider']); | ||
| assert.deepEqual(dependencies, { | ||
| nullProvider: null, | ||
| }); | ||
| }); | ||
| test('with undefined dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(initializer({ | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: serviceName === 'undefinedService' | ||
| ? undefinedService | ||
| : undefinedProvider, | ||
| }))); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run([ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| assert.deepEqual(dependencies, { | ||
| undefinedService: undefined, | ||
| undefinedProvider: null, | ||
| }); | ||
| }); | ||
| test('when autoload depends on optional and unexisting autoloaded dependencies', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer({ | ||
| type: 'service', | ||
| name: serviceName, | ||
| inject: [], | ||
| }, async () => `THE_${serviceName.toUpperCase()}:` + serviceName), | ||
| }))); | ||
| const dependencies = await $.run(['test']); | ||
| assert.deepEqual(Object.keys(dependencies), ['test']); | ||
| }); | ||
| test('when autoload depends on deeper optional and unexisting autoloaded dependencies', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: 'log', | ||
| inject: ['?LOG_ROUTING', '?LOGGER', '?debug'], | ||
| singleton: true, | ||
| }, async () => { | ||
| return () => undefined; | ||
| })); | ||
| $.register(constant('LOGGER', 'LOGGER_CONSTANT')); | ||
| $.register(constant('debug', 'debug_value')); | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV', '?log'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer({ | ||
| type: 'service', | ||
| name: serviceName, | ||
| inject: [], | ||
| }, async () => `THE_${serviceName.toUpperCase()}:` + serviceName), | ||
| }))); | ||
| const dependencies = await $.run(['test', 'log']); | ||
| assert.deepEqual(Object.keys(dependencies), ['test', 'log']); | ||
| }); | ||
| }); | ||
| test('should instanciate services once', async () => { | ||
| $.register(initializer({ | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer({ | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: ['ENV', 'time'], | ||
| }, hashProvider), | ||
| }))); | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['hash1', 'hash2', 'hash3'])); | ||
| $.register(provider(hashProvider, 'hash_', ['hash1', 'hash2', 'hash3'])); | ||
| const dependencies = await $.run([ | ||
| 'hash', | ||
| 'hash_', | ||
| 'hash3', | ||
| ]); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'hash_', 'hash3']); | ||
| }); | ||
| test('should fail when autoload does not exists', async () => { | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| }); | ||
| test('should fail when autoloaded dependencies are not found', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => { | ||
| throw new YError('E_CANNOT_AUTOLOAD', serviceName); | ||
| })); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_CANNOT_AUTOLOAD'); | ||
| assert.deepEqual(err.params, ['test']); | ||
| } | ||
| }); | ||
| test('should fail when autoloaded dependencies are not initializers', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, async () => async () => 'not_an_initializer')); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual(err.params, ['test', undefined]); | ||
| } | ||
| }); | ||
| test('should fail when autoloaded dependencies are not right initializers', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer({ | ||
| describe('should fail', () => { | ||
| test('when autoload does not exists', async () => { | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| }); | ||
| test('when autoloaded dependencies are not found', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: 'not-' + serviceName, | ||
| name: '$autoload', | ||
| inject: [], | ||
| }, async () => 'THE_TEST:' + serviceName), | ||
| }))); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_AUTOLOADED_INITIALIZER_MISMATCH'); | ||
| assert.deepEqual(err.params, ['test', 'not-test']); | ||
| } | ||
| }); | ||
| test('should fail when autoload depends on existing autoloaded dependencies', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['ENV'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer({ | ||
| singleton: true, | ||
| }, async () => async (serviceName) => { | ||
| throw new YError('E_CANNOT_AUTOLOAD', serviceName); | ||
| })); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual(err.params, ['test']); | ||
| assert.equal(err.wrappedErrors[0].code, 'E_CANNOT_AUTOLOAD'); | ||
| assert.deepEqual(err.wrappedErrors[0].params, ['test']); | ||
| } | ||
| }); | ||
| test('when the autoloader returns bad data', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: 'DEBUG', | ||
| name: '$autoload', | ||
| inject: [], | ||
| }, async () => 'THE_DEBUG:' + serviceName), | ||
| }))); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_AUTOLOADER_DYNAMIC_DEPENDENCY'); | ||
| assert.deepEqual(err.params, ['ENV']); | ||
| } | ||
| }); | ||
| test('should work when autoload depends on optional and unexisting autoloaded dependencies', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer({ | ||
| singleton: true, | ||
| }, async () => async () => 'not_an_initializer')); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual(err.params, ['test']); | ||
| assert.equal(err.wrappedErrors[0].code, 'E_BAD_AUTOLOADER_RESULT'); | ||
| assert.deepEqual(err.wrappedErrors[0].params, ['test', 'not_an_initializer']); | ||
| } | ||
| }); | ||
| test('when autoloaded dependencies are not initializers', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: serviceName, | ||
| name: '$autoload', | ||
| inject: [], | ||
| }, async () => `THE_${serviceName.toUpperCase()}:` + serviceName), | ||
| }))); | ||
| const dependencies = await $.run(['test']); | ||
| assert.deepEqual(Object.keys(dependencies), ['test']); | ||
| }); | ||
| test.skip('should work when autoload depends on deeper optional and unexisting autoloaded dependencies', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: 'log', | ||
| inject: ['?LOG_ROUTING', '?LOGGER', '?debug'], | ||
| }, async () => { | ||
| return () => undefined; | ||
| })); | ||
| $.register(constant('LOGGER', 'LOGGER_CONSTANT')); | ||
| $.register(constant('debug', 'debug_value')); | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV', '?log'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer({ | ||
| singleton: true, | ||
| }, async () => async () => ({ | ||
| initializer: 'not_an_initializer', | ||
| path: '/path/to/initializer', | ||
| }))); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual(err.params, ['test']); | ||
| assert.equal(err.wrappedErrors[0].code, 'E_AUTOLOADED_INITIALIZER_MISMATCH'); | ||
| assert.deepEqual(err.wrappedErrors[0].params, ['test', undefined]); | ||
| } | ||
| }); | ||
| test('when autoloaded dependencies are not right initializers', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: serviceName, | ||
| name: '$autoload', | ||
| inject: [], | ||
| }, async () => `THE_${serviceName.toUpperCase()}:` + serviceName), | ||
| }))); | ||
| const dependencies = await $.run(['test', 'log']); | ||
| assert.deepEqual(Object.keys(dependencies), ['test', 'log']); | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer({ | ||
| type: 'service', | ||
| name: 'not-' + serviceName, | ||
| inject: [], | ||
| }, async () => 'THE_TEST:' + serviceName), | ||
| }))); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual(err.params, ['test']); | ||
| assert.equal(err.wrappedErrors[0].code, 'E_AUTOLOADED_INITIALIZER_MISMATCH'); | ||
| assert.deepEqual(err.wrappedErrors[0].params, ['test', 'not-test']); | ||
| } | ||
| }); | ||
| test('when autoload depends on existing autoloaded dependencies', async () => { | ||
| $.register(initializer({ | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['ENV'], | ||
| singleton: true, | ||
| }, async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer({ | ||
| type: 'service', | ||
| name: 'DEBUG', | ||
| inject: [], | ||
| }, async () => 'THE_DEBUG:' + serviceName), | ||
| }))); | ||
| try { | ||
| await $.run(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } | ||
| catch (err) { | ||
| assert.equal(err.code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual(err.params, ['__run__', 'test']); | ||
| } | ||
| }); | ||
| }); | ||
@@ -762,7 +962,3 @@ }); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run(['time', 'hash', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
@@ -781,7 +977,3 @@ 'time', | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run(['time', 'hash', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
@@ -803,7 +995,3 @@ 'time', | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run(['time', 'hash', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
@@ -828,6 +1016,3 @@ 'time', | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run([ | ||
| 'time', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run(['time', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', '$injector']); | ||
@@ -896,9 +1081,3 @@ const injectDependencies = await dependencies.$injector(['time', 'hash']); | ||
| $.run(['$instance']), | ||
| $.run([ | ||
| '$instance', | ||
| 'ENV', | ||
| 'hash', | ||
| 'hash1', | ||
| 'time', | ||
| ]), | ||
| $.run(['$instance', 'ENV', 'hash', 'hash1', 'time']), | ||
| $.run(['$instance', 'ENV', 'hash', 'hash2']), | ||
@@ -916,9 +1095,3 @@ ]); | ||
| $.run(['$instance']), | ||
| $.run([ | ||
| '$dispose', | ||
| 'ENV', | ||
| 'hash', | ||
| 'hash1', | ||
| 'time', | ||
| ]), | ||
| $.run(['$dispose', 'ENV', 'hash', 'hash1', 'time']), | ||
| $.run(['ENV', 'hash', 'hash2']), | ||
@@ -957,7 +1130,3 @@ ]); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run([ | ||
| 'time', | ||
| 'ENV', | ||
| '$dispose', | ||
| ]); | ||
| const dependencies = await $.run(['time', 'ENV', '$dispose']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'ENV', '$dispose']); | ||
@@ -970,7 +1139,3 @@ await dependencies.$dispose(); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| '$dispose', | ||
| ]); | ||
| const dependencies = await $.run(['time', 'hash', '$dispose']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash', '$dispose']); | ||
@@ -1081,6 +1246,3 @@ await dependencies.$dispose(); | ||
| }), 'hash2', ['hash1', 'hash'])); | ||
| const dependencies = await $.run([ | ||
| 'hash2', | ||
| '$dispose', | ||
| ]); | ||
| const dependencies = await $.run(['hash2', '$dispose']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash2', '$dispose']); | ||
@@ -1099,13 +1261,6 @@ await dependencies.$dispose(); | ||
| const { hash } = await $.run(['time', 'hash']); | ||
| const dependencies = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| '$dispose', | ||
| ]); | ||
| const dependencies = await $.run(['time', 'hash', '$dispose']); | ||
| assert.equal(dependencies.hash, hash); | ||
| await dependencies.$dispose(); | ||
| const newDependencies = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| ]); | ||
| const newDependencies = await $.run(['time', 'hash']); | ||
| assert.equal(newDependencies.hash, hash); | ||
@@ -1117,7 +1272,3 @@ }); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'], true)); | ||
| const { hash, $dispose } = await $.run([ | ||
| 'time', | ||
| 'hash', | ||
| '$dispose', | ||
| ]); | ||
| const { hash, $dispose } = await $.run(['time', 'hash', '$dispose']); | ||
| await $dispose(); | ||
@@ -1124,0 +1275,0 @@ const dependencies = await $.run(['time', 'hash']); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"} |
+1
-0
@@ -0,1 +1,2 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint @typescript-eslint/ban-types:0 */ | ||
@@ -2,0 +3,0 @@ import { YError } from 'yerror'; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"} |
@@ -0,1 +1,3 @@ | ||
| /* eslint-disable @typescript-eslint/no-unused-vars */ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| import { describe, test } from '@jest/globals'; | ||
@@ -2,0 +4,0 @@ import assert from 'assert'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"util.test.js","sourceRoot":"","sources":["../src/util.test.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"util.test.js","sourceRoot":"","sources":["../src/util.test.ts"],"names":[],"mappings":"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"} |
+17
-16
@@ -28,3 +28,3 @@ { | ||
| "name": "knifecycle", | ||
| "version": "15.0.1", | ||
| "version": "16.0.0", | ||
| "description": "Manage your NodeJS processes's lifecycle automatically with an unobtrusive dependency injection implementation.", | ||
@@ -84,27 +84,27 @@ "main": "dist/index.js", | ||
| "@swc/cli": "^0.1.62", | ||
| "@swc/core": "^1.3.60", | ||
| "@swc/core": "^1.3.76", | ||
| "@swc/helpers": "^0.5.1", | ||
| "@swc/jest": "^0.2.26", | ||
| "@typescript-eslint/eslint-plugin": "^5.59.7", | ||
| "@typescript-eslint/parser": "^5.59.7", | ||
| "@swc/jest": "^0.2.28", | ||
| "@typescript-eslint/eslint-plugin": "^6.3.0", | ||
| "@typescript-eslint/parser": "^6.3.0", | ||
| "commitizen": "^4.3.0", | ||
| "conventional-changelog-cli": "^2.2.2", | ||
| "conventional-changelog-cli": "^3.0.0", | ||
| "coveralls": "^3.1.1", | ||
| "cz-conventional-changelog": "^3.3.0", | ||
| "eslint": "^8.41.0", | ||
| "eslint-config-prettier": "^8.8.0", | ||
| "eslint-plugin-prettier": "^4.2.1", | ||
| "jest": "^29.5.0", | ||
| "eslint": "^8.46.0", | ||
| "eslint-config-prettier": "^9.0.0", | ||
| "eslint-plugin-prettier": "^5.0.0", | ||
| "jest": "^29.6.2", | ||
| "jsarch": "^6.0.1", | ||
| "jsdoc-to-markdown": "^8.0.0", | ||
| "metapak": "^5.0.1", | ||
| "metapak-nfroidure": "^14.1.3", | ||
| "prettier": "^2.8.8", | ||
| "metapak": "^5.1.3", | ||
| "metapak-nfroidure": "^15.0.0", | ||
| "prettier": "^3.0.1", | ||
| "rimraf": "^5.0.1", | ||
| "sinon": "^14.0.0", | ||
| "typescript": "^5.0.4" | ||
| "typescript": "^5.1.6" | ||
| }, | ||
| "dependencies": { | ||
| "debug": "^4.3.4", | ||
| "yerror": "^6.2.1" | ||
| "yerror": "^7.0.0" | ||
| }, | ||
@@ -202,3 +202,4 @@ "config": { | ||
| ".ts" | ||
| ] | ||
| ], | ||
| "prettierPath": null | ||
| }, | ||
@@ -205,0 +206,0 @@ "jsarch": { |
+11
-58
@@ -10,4 +10,4 @@ [//]: # ( ) | ||
| [](https://github.com/nfroidure/knifecycle/blob/master/LICENSE) | ||
| [](https://coveralls.io/github/nfroidure/knifecycle?branch=master) | ||
| [](https://github.com/nfroidure/knifecycle/blob/main/LICENSE) | ||
| [](https://coveralls.io/github/nfroidure/knifecycle?branch=main) | ||
@@ -453,3 +453,3 @@ | ||
| * [Knifecycle](#Knifecycle) | ||
| * [new Knifecycle()](#new_Knifecycle_new) | ||
| * [new Knifecycle(options)](#new_Knifecycle_new) | ||
| * [.register(initializer)](#Knifecycle+register) ⇒ [<code>Knifecycle</code>](#Knifecycle) | ||
@@ -459,12 +459,15 @@ * [.toMermaidGraph(options)](#Knifecycle+toMermaidGraph) ⇒ <code>String</code> | ||
| * [.destroy()](#Knifecycle+destroy) ⇒ <code>Promise</code> | ||
| * [._getServiceDescriptor(siloContext, serviceName, options, serviceProvider)](#Knifecycle+_getServiceDescriptor) ⇒ <code>Promise</code> | ||
| * [._initializeServiceDescriptor(siloContext, serviceName, options)](#Knifecycle+_initializeServiceDescriptor) ⇒ <code>Promise</code> | ||
| * [._initializeDependencies(siloContext, serviceName, servicesDeclarations, options)](#Knifecycle+_initializeDependencies) ⇒ <code>Promise</code> | ||
| <a name="new_Knifecycle_new"></a> | ||
| ### new Knifecycle() | ||
| ### new Knifecycle(options) | ||
| Create a new Knifecycle instance | ||
| **Returns**: [<code>Knifecycle</code>](#Knifecycle) - The Knifecycle instance | ||
| | Param | Type | Description | | ||
| | --- | --- | --- | | ||
| | options | <code>Object</code> | An object with options | | ||
| | options.sequential | <code>boolean</code> | Allows to load dependencies sequentially (usefull for debugging) | | ||
| **Example** | ||
@@ -567,52 +570,2 @@ ```js | ||
| ``` | ||
| <a name="Knifecycle+_getServiceDescriptor"></a> | ||
| ### knifecycle.\_getServiceDescriptor(siloContext, serviceName, options, serviceProvider) ⇒ <code>Promise</code> | ||
| Initialize or return a service descriptor | ||
| **Kind**: instance method of [<code>Knifecycle</code>](#Knifecycle) | ||
| **Returns**: <code>Promise</code> - Service descriptor promise. | ||
| | Param | Type | Description | | ||
| | --- | --- | --- | | ||
| | siloContext | <code>Object</code> | Current execution silo context | | ||
| | serviceName | <code>String</code> | Service name. | | ||
| | options | <code>Object</code> | Options for service retrieval | | ||
| | options.injectorContext | <code>Boolean</code> | Flag indicating the injection were initiated by the $injector | | ||
| | options.autoloading | <code>Boolean</code> | Flag to indicating $autoload dependencies on the fly loading | | ||
| | serviceProvider | <code>String</code> | Service provider. | | ||
| <a name="Knifecycle+_initializeServiceDescriptor"></a> | ||
| ### knifecycle.\_initializeServiceDescriptor(siloContext, serviceName, options) ⇒ <code>Promise</code> | ||
| Initialize a service descriptor | ||
| **Kind**: instance method of [<code>Knifecycle</code>](#Knifecycle) | ||
| **Returns**: <code>Promise</code> - Service dependencies hash promise. | ||
| | Param | Type | Description | | ||
| | --- | --- | --- | | ||
| | siloContext | <code>Object</code> | Current execution silo context | | ||
| | serviceName | <code>String</code> | Service name. | | ||
| | options | <code>Object</code> | Options for service retrieval | | ||
| | options.injectorContext | <code>Boolean</code> | Flag indicating the injection were initiated by the $injector | | ||
| | options.autoloading | <code>Boolean</code> | Flag to indicating $autoload dependendencies on the fly loading. | | ||
| <a name="Knifecycle+_initializeDependencies"></a> | ||
| ### knifecycle.\_initializeDependencies(siloContext, serviceName, servicesDeclarations, options) ⇒ <code>Promise</code> | ||
| Initialize a service dependencies | ||
| **Kind**: instance method of [<code>Knifecycle</code>](#Knifecycle) | ||
| **Returns**: <code>Promise</code> - Service dependencies hash promise. | ||
| | Param | Type | Description | | ||
| | --- | --- | --- | | ||
| | siloContext | <code>Object</code> | Current execution silo siloContext | | ||
| | serviceName | <code>String</code> | Service name. | | ||
| | servicesDeclarations | <code>String</code> | Dependencies declarations. | | ||
| | options | <code>Object</code> | Options for service retrieval | | ||
| | options.injectorContext | <code>Boolean</code> | Flag indicating the injection were initiated by the $injector | | ||
| | options.autoloading | <code>Boolean</code> | Flag to indicating $autoload dependendencies on the fly loading. | | ||
| <a name="initInitializerBuilder"></a> | ||
@@ -908,2 +861,2 @@ | ||
| # License | ||
| [MIT](https://github.com/nfroidure/knifecycle/blob/master/LICENSE) | ||
| [MIT](https://github.com/nfroidure/knifecycle/blob/main/LICENSE) |
+89
-4
@@ -0,1 +1,2 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| import { describe, test } from '@jest/globals'; | ||
@@ -6,3 +7,2 @@ import assert from 'assert'; | ||
| import { Knifecycle, initializer, constant } from './index.js'; | ||
| import type { BuildInitializer } from './build.js'; | ||
@@ -68,5 +68,3 @@ describe('buildInitializer', () => { | ||
| const { buildInitializer } = await $.run<{ | ||
| buildInitializer: BuildInitializer; | ||
| }>(['buildInitializer']); | ||
| const { buildInitializer } = await $.run<any>(['buildInitializer']); | ||
@@ -142,2 +140,89 @@ const content = await buildInitializer(['dep1', 'finalMappedDep>dep3']); | ||
| }); | ||
| // TODO: allow building with internal dependencies | ||
| test.skip('should work with simple internal services dependencies', async () => { | ||
| const $ = new Knifecycle(); | ||
| $.register(constant('PWD', '~/my-project')); | ||
| $.register(initAutoloader); | ||
| $.register(initInitializerBuilder); | ||
| $.register(constant('$fatalError', {})); | ||
| const { buildInitializer } = await $.run<any>(['buildInitializer']); | ||
| const content = await buildInitializer([ | ||
| 'dep1', | ||
| 'finalMappedDep>dep3', | ||
| '$fatalError', | ||
| '$dispose', | ||
| '$siloContext', | ||
| ]); | ||
| assert.equal( | ||
| content, | ||
| ` | ||
| // Definition batch #0 | ||
| import initDep1 from './services/dep1'; | ||
| const NODE_ENV = "development"; | ||
| // Definition batch #1 | ||
| import initDep2 from './services/dep2'; | ||
| // Definition batch #2 | ||
| import initDep3 from './services/dep3'; | ||
| export async function initialize(services = {}) { | ||
| // Initialization batch #0 | ||
| const batch0 = { | ||
| dep1: initDep1({ | ||
| }), | ||
| NODE_ENV: Promise.resolve(NODE_ENV), | ||
| }; | ||
| await Promise.all( | ||
| Object.keys(batch0) | ||
| .map(key => batch0[key]) | ||
| ); | ||
| services['dep1'] = await batch0['dep1']; | ||
| services['NODE_ENV'] = await batch0['NODE_ENV']; | ||
| // Initialization batch #1 | ||
| const batch1 = { | ||
| dep2: initDep2({ | ||
| dep1: services['dep1'], | ||
| NODE_ENV: services['NODE_ENV'], | ||
| }).then(provider => provider.service), | ||
| }; | ||
| await Promise.all( | ||
| Object.keys(batch1) | ||
| .map(key => batch1[key]) | ||
| ); | ||
| services['dep2'] = await batch1['dep2']; | ||
| // Initialization batch #2 | ||
| const batch2 = { | ||
| dep3: initDep3({ | ||
| dep2: services['dep2'], | ||
| dep1: services['dep1'], | ||
| depOpt: services['depOpt'], | ||
| }), | ||
| }; | ||
| await Promise.all( | ||
| Object.keys(batch2) | ||
| .map(key => batch2[key]) | ||
| ); | ||
| services['dep3'] = await batch2['dep3']; | ||
| return { | ||
| dep1: services['dep1'], | ||
| finalMappedDep: services['dep3'], | ||
| }; | ||
| } | ||
| `, | ||
| ); | ||
| }); | ||
| }); |
+19
-20
@@ -139,23 +139,22 @@ import { | ||
| const batch${index} = {${batch | ||
| .map((name) => { | ||
| if ( | ||
| 'constant' === | ||
| dependenciesHash[name].__initializer[SPECIAL_PROPS.TYPE] | ||
| ) { | ||
| return ` | ||
| .map((name) => { | ||
| if ( | ||
| 'constant' === dependenciesHash[name].__initializer[SPECIAL_PROPS.TYPE] | ||
| ) { | ||
| return ` | ||
| ${name}: Promise.resolve(${name}),`; | ||
| } | ||
| return ` | ||
| } | ||
| return ` | ||
| ${name}: ${dependenciesHash[name].__initializerName}({${ | ||
| dependenciesHash[name].__inject | ||
| ? `${dependenciesHash[name].__inject | ||
| .map(parseDependencyDeclaration) | ||
| .map( | ||
| ({ serviceName, mappedName }) => | ||
| ` | ||
| dependenciesHash[name].__inject | ||
| ? `${dependenciesHash[name].__inject | ||
| .map(parseDependencyDeclaration) | ||
| .map( | ||
| ({ serviceName, mappedName }) => | ||
| ` | ||
| ${serviceName}: services['${mappedName}'],`, | ||
| ) | ||
| .join('')}` | ||
| : '' | ||
| } | ||
| ) | ||
| .join('')}` | ||
| : '' | ||
| } | ||
| })${ | ||
@@ -166,4 +165,4 @@ 'provider' === dependenciesHash[name].__type | ||
| },`; | ||
| }) | ||
| .join('')} | ||
| }) | ||
| .join('')} | ||
| }; | ||
@@ -170,0 +169,0 @@ |
+889
-614
@@ -0,3 +1,4 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint max-nested-callbacks:0 */ | ||
| import { describe, beforeEach, test } from '@jest/globals'; | ||
| import { jest, describe, beforeEach, test } from '@jest/globals'; | ||
| import assert from 'assert'; | ||
@@ -16,4 +17,4 @@ import sinon from 'sinon'; | ||
| singleton, | ||
| FatalErrorService, | ||
| } from './index.js'; | ||
| import type { Provider, FatalErrorService } from './index.js'; | ||
| import { ALLOWED_INITIALIZER_TYPES } from './util.js'; | ||
@@ -38,2 +39,51 @@ | ||
| const nullService = service<{ time: any }, null>( | ||
| async function nullService({ time }: { time: any }): Promise<null> { | ||
| // service run for its side effect only | ||
| time(); | ||
| return null; | ||
| }, | ||
| 'nullService', | ||
| ['time'], | ||
| ); | ||
| const undefinedService = service<{ time: any }, undefined>( | ||
| async function undefinedService({ | ||
| time, | ||
| }: { | ||
| time: any; | ||
| }): Promise<undefined> { | ||
| // service run for its side effect only | ||
| time(); | ||
| return undefined; | ||
| }, | ||
| 'undefinedService', | ||
| ['time'], | ||
| ); | ||
| const nullProvider = provider<{ time: any }, null>( | ||
| async function nullProvider({ | ||
| time, | ||
| }: { | ||
| time: any; | ||
| }): Promise<Provider<null>> { | ||
| // provider run for its side effect only | ||
| time(); | ||
| return { service: null }; | ||
| }, | ||
| 'nullProvider', | ||
| ['time'], | ||
| ); | ||
| const undefinedProvider = provider<{ time: any }, undefined>( | ||
| async function undefinedProvider({ | ||
| time, | ||
| }: { | ||
| time: any; | ||
| }): Promise<Provider<undefined>> { | ||
| // service run for its side effect only | ||
| time(); | ||
| return { service: undefined }; | ||
| }, | ||
| 'undefinedProvider', | ||
| ['time'], | ||
| ); | ||
| beforeEach(() => { | ||
@@ -56,3 +106,3 @@ $ = new Knifecycle(); | ||
| $.register(constant('TEST', 2)); | ||
| assert.deepEqual(await $.run<Record<string, any>>(['TEST']), { | ||
| assert.deepEqual(await $.run<any>(['TEST']), { | ||
| TEST: 2, | ||
@@ -64,3 +114,3 @@ }); | ||
| $.register(constant('TEST', 1)); | ||
| assert.deepEqual(await $.run<Record<string, any>>(['TEST']), { | ||
| assert.deepEqual(await $.run<any>(['TEST']), { | ||
| TEST: 1, | ||
@@ -90,3 +140,3 @@ }); | ||
| const { test } = await $.run<{ test: () => number }>(['test']); | ||
| const { test } = await $.run<any>(['test']); | ||
| assert.deepEqual(test(), 2); | ||
@@ -97,3 +147,3 @@ }); | ||
| $.register(service(async () => () => 1, 'test')); | ||
| const { test } = await $.run<{ test: () => number }>(['test']); | ||
| const { test } = await $.run<any>(['test']); | ||
| assert.deepEqual(test(), 1); | ||
@@ -144,3 +194,3 @@ | ||
| const { test } = await $.run<Record<string, any>>(['test']); | ||
| const { test } = await $.run<any>(['test']); | ||
| assert.deepEqual(test, 2); | ||
@@ -176,3 +226,3 @@ }); | ||
| const { test } = await $.run<Record<string, any>>(['test']); | ||
| const { test } = await $.run<any>(['test']); | ||
| assert.deepEqual(test, 2); | ||
@@ -196,3 +246,3 @@ }); | ||
| const { test } = await $.run<Record<string, any>>(['test']); | ||
| const { test } = await $.run<any>(['test']); | ||
| assert.deepEqual(test, 1); | ||
@@ -419,448 +469,380 @@ | ||
| }); | ||
| }); | ||
| describe('run', () => { | ||
| test('should work with no dependencies', async () => { | ||
| const dependencies = await $.run<Record<string, any>>([]); | ||
| assert.deepEqual(dependencies, {}); | ||
| test('should fail with singleton depending on siloed services', () => { | ||
| assert.throws( | ||
| () => { | ||
| $.register(provider(hashProvider, 'hash', [], false)); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'], true)); | ||
| }, | ||
| (err) => { | ||
| assert.deepEqual( | ||
| (err as YError).code, | ||
| 'E_BAD_SINGLETON_DEPENDENCIES', | ||
| ); | ||
| assert.deepEqual((err as YError).params, ['hash1', 'hash']); | ||
| return true; | ||
| }, | ||
| ); | ||
| }); | ||
| test('should work with constant dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run<Record<string, any>>(['time', 'ENV']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'ENV']); | ||
| assert.deepEqual(dependencies, { | ||
| ENV, | ||
| time, | ||
| }); | ||
| }); | ||
| test('should work with service dependencies', async () => { | ||
| const wrappedSampleService = inject<{ time: any }, string>( | ||
| ['time'], | ||
| async function sampleService({ time }: { time: any }) { | ||
| return Promise.resolve(typeof time); | ||
| test('should fail when setting siloed services depended on by a singleton', () => { | ||
| assert.throws( | ||
| () => { | ||
| $.register(provider(hashProvider, 'hash1', ['hash'], true)); | ||
| $.register(provider(hashProvider, 'hash', [], false)); | ||
| }, | ||
| (err) => { | ||
| assert.deepEqual( | ||
| (err as YError).code, | ||
| 'E_BAD_SINGLETON_DEPENDENCIES', | ||
| ); | ||
| assert.deepEqual((err as YError).params, ['hash1', 'hash']); | ||
| return true; | ||
| }, | ||
| ); | ||
| $.register(service(wrappedSampleService, 'sample')); | ||
| $.register(constant('time', time)); | ||
| }); | ||
| }); | ||
| const dependencies = await $.run<Record<string, any>>(['sample']); | ||
| describe('run', () => { | ||
| describe('should work', () => { | ||
| test('with no dependencies', async () => { | ||
| const dependencies = await $.run<any>([]); | ||
| assert.deepEqual(Object.keys(dependencies), ['sample']); | ||
| assert.deepEqual(dependencies, { | ||
| sample: 'function', | ||
| assert.deepEqual(dependencies, {}); | ||
| }); | ||
| }); | ||
| test('should work with simple dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| test('with constant dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run<Record<string, any>>(['time', 'hash']); | ||
| const dependencies = await $.run<any>(['time', 'ENV']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV }, | ||
| time, | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'ENV']); | ||
| assert.deepEqual(dependencies, { | ||
| ENV, | ||
| time, | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with given optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('DEBUG', {})); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| test('with service dependencies', async () => { | ||
| const wrappedSampleService = inject<{ time: any }, string>( | ||
| ['time'], | ||
| async function sampleService({ time }: { time: any }) { | ||
| return Promise.resolve(typeof time); | ||
| }, | ||
| ); | ||
| $.register(service(wrappedSampleService, 'sample')); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run<Record<string, any>>(['time', 'hash']); | ||
| const dependencies = await $.run<any>(['sample']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: {} }, | ||
| time, | ||
| assert.deepEqual(Object.keys(dependencies), ['sample']); | ||
| assert.deepEqual(dependencies, { | ||
| sample: 'function', | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with lacking optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| test('with null service dependencies', async () => { | ||
| const time = jest.fn(); | ||
| const dependencies = await $.run<Record<string, any>>(['time', 'hash']); | ||
| $.register(nullService); | ||
| $.register(constant('time', time)); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: undefined }, | ||
| time, | ||
| const dependencies = await $.run<any>(['nullService']); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullService']); | ||
| assert.deepEqual(dependencies, { | ||
| nullService: null, | ||
| }); | ||
| }); | ||
| }); | ||
| test('should work with deeper dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash2', ['hash1'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash4', ['hash3'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| test('with null provider dependencies', async () => { | ||
| const time = jest.fn(); | ||
| const dependencies = await $.run<Record<string, any>>(['hash5', 'time']); | ||
| $.register(nullProvider); | ||
| $.register(constant('time', time)); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| const dependencies = await $.run<any>(['nullProvider']); | ||
| test('should instanciate services once', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullProvider']); | ||
| assert.deepEqual(dependencies, { | ||
| nullProvider: null, | ||
| }); | ||
| }); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash3', ['ENV', 'time'])); | ||
| test('with undefined dependencies', async () => { | ||
| const time = jest.fn(); | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| $.register(undefinedService); | ||
| $.register(undefinedProvider); | ||
| $.register(constant('time', time)); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| const dependencies = await $.run<any>([ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| test('should instanciate a single mapped service', async () => { | ||
| const providerStub = sinon.stub().returns( | ||
| Promise.resolve({ | ||
| service: 'stub', | ||
| }), | ||
| ); | ||
| const providerStub2 = sinon.stub().returns( | ||
| Promise.resolve({ | ||
| service: 'stub2', | ||
| }), | ||
| ); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| assert.deepEqual(dependencies, { | ||
| undefinedService: undefined, | ||
| undefinedProvider: undefined, | ||
| }); | ||
| }); | ||
| $.register(provider(providerStub, 'mappedStub', ['stub2>mappedStub2'])); | ||
| $.register(provider(providerStub2, 'mappedStub2')); | ||
| test('with simple dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'stub>mappedStub', | ||
| ]); | ||
| const dependencies = await $.run<any>(['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| stub: 'stub', | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV }, | ||
| time, | ||
| }); | ||
| }); | ||
| assert.deepEqual(providerStub.args, [ | ||
| [ | ||
| { | ||
| stub2: 'stub2', | ||
| }, | ||
| ], | ||
| ]); | ||
| }); | ||
| test('should instanciate several services with mappings', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| test('with given optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('DEBUG', {})); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(singleton(service(timeServiceStub, 'aTime'))); | ||
| $.register(provider(hashProvider, 'aHash', ['ENV', 'time>aTime'])); | ||
| $.register(provider(hashProvider, 'aHash2', ['ENV', 'hash>aHash'])); | ||
| $.register(provider(hashProvider, 'aHash3', ['ENV', 'hash>aHash'])); | ||
| const dependencies = await $.run<any>(['time', 'hash']); | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'hash2>aHash2', | ||
| 'hash3>aHash3', | ||
| 'time>aTime', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: {} }, | ||
| time, | ||
| }); | ||
| }); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash2', 'hash3', 'time']); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| test('with lacking optional dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', '?DEBUG'])); | ||
| test('should fail with bad service', async () => { | ||
| $.register(service((() => undefined) as any, 'lol')); | ||
| const dependencies = await $.run<any>(['time', 'hash']); | ||
| try { | ||
| await $.run<Record<string, any>>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_BAD_SERVICE_PROMISE'); | ||
| assert.deepEqual((err as YError).params, ['lol']); | ||
| } | ||
| }); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: undefined }, | ||
| time, | ||
| }); | ||
| }); | ||
| test('should fail with bad provider', async () => { | ||
| $.register(provider((() => undefined) as any, 'lol')); | ||
| try { | ||
| await $.run<Record<string, any>>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual((err as YError).params, ['lol']); | ||
| } | ||
| }); | ||
| test('with deeper dependencies', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash2', ['hash1'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash4', ['hash3'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| test('should fail with bad service in a provider', async () => { | ||
| $.register(provider(() => Promise.resolve() as any, 'lol')); | ||
| try { | ||
| await $.run<Record<string, any>>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual((err as YError).params, ['lol']); | ||
| } | ||
| }); | ||
| const dependencies = await $.run<any>(['hash5', 'time']); | ||
| test('should fail with undeclared dependencies', async () => { | ||
| try { | ||
| await $.run<Record<string, any>>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual((err as YError).params, ['lol']); | ||
| } | ||
| }); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| test('should fail with undeclared dependencies upstream', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'hash2'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'lol'])); | ||
| test('and instanciate services once', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| try { | ||
| await $.run<Record<string, any>>(['time', 'hash']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual((err as YError).params, ['hash', 'hash2', 'lol']); | ||
| } | ||
| }); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'time'])); | ||
| $.register(provider(hashProvider, 'hash3', ['ENV', 'time'])); | ||
| test('should provide a fatal error handler', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(dbProvider, 'db', ['ENV'])); | ||
| $.register(provider(processProvider, 'process', ['$fatalError'])); | ||
| const dependencies = await $.run<any>([ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| function processProvider({ | ||
| $fatalError, | ||
| }: { | ||
| $fatalError: FatalErrorService; | ||
| }) { | ||
| return Promise.resolve({ | ||
| service: { | ||
| fatalErrorPromise: $fatalError.promise, | ||
| }, | ||
| }); | ||
| } | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'hash', | ||
| 'hash2', | ||
| 'hash3', | ||
| 'time', | ||
| ]); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| async function dbProvider({ ENV }: { ENV: Record<string, string> }) { | ||
| let service; | ||
| const fatalErrorPromise = new Promise<void>((resolve, reject) => { | ||
| service = Promise.resolve({ | ||
| resolve, | ||
| reject, | ||
| ENV, | ||
| }); | ||
| }); | ||
| test('and instanciate a single mapped service', async () => { | ||
| const providerStub = sinon.stub().returns( | ||
| Promise.resolve({ | ||
| service: 'stub', | ||
| }), | ||
| ); | ||
| const providerStub2 = sinon.stub().returns( | ||
| Promise.resolve({ | ||
| service: 'stub2', | ||
| }), | ||
| ); | ||
| return { | ||
| service, | ||
| fatalErrorPromise, | ||
| }; | ||
| } | ||
| $.register(provider(providerStub, 'mappedStub', ['stub2>mappedStub2'])); | ||
| $.register(provider(providerStub2, 'mappedStub2')); | ||
| const { process, db } = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| 'db', | ||
| 'process', | ||
| ]); | ||
| const dependencies = await $.run<any>(['stub>mappedStub']); | ||
| try { | ||
| db.reject(new Error('E_DB_ERROR')); | ||
| await process.fatalErrorPromise; | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as Error).message, 'E_DB_ERROR'); | ||
| } | ||
| }); | ||
| }); | ||
| describe('autoload', () => { | ||
| test('should work with lacking autoloaded dependencies', async () => { | ||
| const autoloaderInitializer = initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer( | ||
| assert.deepEqual(dependencies, { | ||
| stub: 'stub', | ||
| }); | ||
| assert.deepEqual(providerStub.args, [ | ||
| [ | ||
| { | ||
| type: 'service', | ||
| name: 'DEBUG', | ||
| inject: [], | ||
| stub2: 'stub2', | ||
| }, | ||
| async () => 'THE_DEBUG:' + serviceName, | ||
| ), | ||
| }), | ||
| ); | ||
| const wrappedProvider = provider(hashProvider, 'hash', ['ENV', '?DEBUG']); | ||
| ], | ||
| ]); | ||
| }); | ||
| $.register(autoloaderInitializer); | ||
| $.register(wrappedProvider); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| test('and instanciate several services with mappings', async () => { | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| const dependencies = await $.run<Record<string, any>>(['time', 'hash']); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(singleton(service(timeServiceStub, 'aTime'))); | ||
| $.register(provider(hashProvider, 'aHash', ['ENV', 'time>aTime'])); | ||
| $.register(provider(hashProvider, 'aHash2', ['ENV', 'hash>aHash'])); | ||
| $.register(provider(hashProvider, 'aHash3', ['ENV', 'hash>aHash'])); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: 'THE_DEBUG:DEBUG' }, | ||
| time, | ||
| const dependencies = await $.run<any>([ | ||
| 'hash2>aHash2', | ||
| 'hash3>aHash3', | ||
| 'time>aTime', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash2', 'hash3', 'time']); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| }); | ||
| }); | ||
| describe('should fail', () => { | ||
| test('with bad service', async () => { | ||
| $.register(service((() => undefined) as any, 'lol')); | ||
| test('should work with deeper several lacking dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: | ||
| 'hash2' === serviceName | ||
| ? ['hash1'] | ||
| : 'hash4' === serviceName | ||
| ? ['hash3'] | ||
| : [], | ||
| }, | ||
| hashProvider, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| try { | ||
| await $.run<any>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_BAD_SERVICE_PROMISE'); | ||
| assert.deepEqual((err as YError).params, ['lol']); | ||
| } | ||
| }); | ||
| const dependencies = await $.run<Record<string, any>>(['hash5', 'time']); | ||
| test('with bad provider', async () => { | ||
| $.register(provider((() => undefined) as any, 'lol')); | ||
| try { | ||
| await $.run<any>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual((err as YError).params, ['lol']); | ||
| } | ||
| }); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| test('with bad service in a provider', async () => { | ||
| $.register(provider(() => Promise.resolve() as any, 'lol')); | ||
| try { | ||
| await $.run<any>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_BAD_SERVICE_PROVIDER'); | ||
| assert.deepEqual((err as YError).params, ['lol']); | ||
| } | ||
| }); | ||
| test('should work with various dependencies', async () => { | ||
| $.register(provider(hashProvider, 'hash', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash3', ['?ENV'])); | ||
| $.register(constant('DEBUG', 1)); | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV', 'DEBUG'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => { | ||
| if ('ENV' === serviceName) { | ||
| throw new YError('E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| test('with undeclared dependencies', async () => { | ||
| try { | ||
| await $.run<any>(['lol']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual((err as YError).params, ['__run__', 'lol']); | ||
| } | ||
| }); | ||
| return { | ||
| path: '/path/of/debug', | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: 'hash2', | ||
| inject: ['hash3'], | ||
| }, | ||
| async () => 'THE_HASH:' + serviceName, | ||
| ), | ||
| }; | ||
| }, | ||
| ), | ||
| ); | ||
| test('with undeclared dependencies upstream', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV', 'hash2'])); | ||
| $.register(provider(hashProvider, 'hash2', ['ENV', 'lol'])); | ||
| const dependencies = await $.run<Record<string, any>>(['hash', '?ENV']); | ||
| try { | ||
| await $.run<any>(['time', 'hash']); | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as YError).code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual((err as YError).params, [ | ||
| '__run__', | ||
| 'hash', | ||
| 'hash2', | ||
| 'lol', | ||
| ]); | ||
| } | ||
| }); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'ENV']); | ||
| }); | ||
| test('and provide a fatal error handler', async () => { | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(dbProvider, 'db', ['ENV'])); | ||
| $.register(provider(processProvider, 'process', ['$fatalError'])); | ||
| test('should instanciate services once', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: ['ENV', 'time'], | ||
| }, | ||
| hashProvider, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| function processProvider({ | ||
| $fatalError, | ||
| }: { | ||
| $fatalError: FatalErrorService; | ||
| }) { | ||
| return Promise.resolve({ | ||
| service: { | ||
| fatalErrorPromise: $fatalError.promise, | ||
| }, | ||
| }); | ||
| } | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['hash1', 'hash2', 'hash3'])); | ||
| $.register(provider(hashProvider, 'hash_', ['hash1', 'hash2', 'hash3'])); | ||
| async function dbProvider({ ENV }: { ENV: Record<string, string> }) { | ||
| let service; | ||
| const fatalErrorPromise = new Promise<void>((resolve, reject) => { | ||
| service = { | ||
| resolve, | ||
| reject, | ||
| ENV, | ||
| }; | ||
| }); | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'hash', | ||
| 'hash_', | ||
| 'hash3', | ||
| ]); | ||
| return { | ||
| service, | ||
| fatalErrorPromise, | ||
| }; | ||
| } | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'hash_', 'hash3']); | ||
| }); | ||
| const { process, db } = await $.run<any>([ | ||
| 'time', | ||
| 'hash', | ||
| 'db', | ||
| 'process', | ||
| ]); | ||
| test('should fail when autoload does not exists', async () => { | ||
| try { | ||
| await $.run<Record<string, any>>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| try { | ||
| db.reject(new Error('E_DB_ERROR')); | ||
| await process.fatalErrorPromise; | ||
| throw new Error('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.deepEqual((err as Error).message, 'E_DB_ERROR'); | ||
| } | ||
| }); | ||
| }); | ||
| }); | ||
| test('should fail when autoloaded dependencies are not found', async () => { | ||
| $.register( | ||
| initializer( | ||
| describe('autoload', () => { | ||
| describe('should work', () => { | ||
| test('with constant dependencies', async () => { | ||
| const autoloaderInitializer = initializer( | ||
| { | ||
@@ -872,42 +854,26 @@ type: 'service', | ||
| }, | ||
| async () => async (serviceName) => { | ||
| throw new YError('E_CANNOT_AUTOLOAD', serviceName); | ||
| }, | ||
| ), | ||
| ); | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: constant(serviceName, `value_of:${serviceName}`), | ||
| }), | ||
| ); | ||
| const wrappedProvider = provider(hashProvider, 'hash', [ | ||
| 'ENV', | ||
| '?DEBUG', | ||
| ]); | ||
| try { | ||
| await $.run<Record<string, any>>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_CANNOT_AUTOLOAD'); | ||
| assert.deepEqual((err as YError).params, ['test']); | ||
| } | ||
| }); | ||
| $.register(autoloaderInitializer); | ||
| $.register(wrappedProvider); | ||
| test('should fail when autoloaded dependencies are not initializers', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, | ||
| async () => async () => 'not_an_initializer', | ||
| ), | ||
| ); | ||
| const dependencies = await $.run<any>(['time', 'hash']); | ||
| try { | ||
| await $.run<Record<string, any>>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual((err as YError).params, ['test', undefined]); | ||
| } | ||
| }); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV: 'value_of:ENV', DEBUG: 'value_of:DEBUG' }, | ||
| time: 'value_of:time', | ||
| }); | ||
| }); | ||
| test('should fail when autoloaded dependencies are not right initializers', async () => { | ||
| $.register( | ||
| initializer( | ||
| test('with lacking autoloaded dependencies', async () => { | ||
| const autoloaderInitializer = initializer( | ||
| { | ||
@@ -924,34 +890,2 @@ type: 'service', | ||
| type: 'service', | ||
| name: 'not-' + serviceName, | ||
| inject: [], | ||
| }, | ||
| async () => 'THE_TEST:' + serviceName, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| try { | ||
| await $.run<Record<string, any>>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_AUTOLOADED_INITIALIZER_MISMATCH'); | ||
| assert.deepEqual((err as YError).params, ['test', 'not-test']); | ||
| } | ||
| }); | ||
| test('should fail when autoload depends on existing autoloaded dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['ENV'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: 'DEBUG', | ||
@@ -963,82 +897,472 @@ inject: [], | ||
| }), | ||
| ), | ||
| ); | ||
| ); | ||
| const wrappedProvider = provider(hashProvider, 'hash', [ | ||
| 'ENV', | ||
| '?DEBUG', | ||
| ]); | ||
| try { | ||
| await $.run<Record<string, any>>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_AUTOLOADER_DYNAMIC_DEPENDENCY'); | ||
| assert.deepEqual((err as YError).params, ['ENV']); | ||
| } | ||
| }); | ||
| $.register(autoloaderInitializer); | ||
| $.register(wrappedProvider); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| test('should work when autoload depends on optional and unexisting autoloaded dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: serviceName, | ||
| inject: [], | ||
| }, | ||
| async () => `THE_${serviceName.toUpperCase()}:` + serviceName, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| const dependencies = await $.run<any>(['time', 'hash']); | ||
| const dependencies = await $.run<Record<string, any>>(['test']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash']); | ||
| assert.deepEqual(dependencies, { | ||
| hash: { ENV, DEBUG: 'THE_DEBUG:DEBUG' }, | ||
| time, | ||
| }); | ||
| }); | ||
| assert.deepEqual(Object.keys(dependencies), ['test']); | ||
| test('with deeper several lacking dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: | ||
| 'hash2' === serviceName | ||
| ? ['hash1'] | ||
| : 'hash4' === serviceName | ||
| ? ['hash3'] | ||
| : [], | ||
| }, | ||
| hashProvider, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(constant('time', time)); | ||
| $.register(provider(hashProvider, 'hash', ['ENV'])); | ||
| $.register(provider(hashProvider, 'hash1', ['hash'])); | ||
| $.register(provider(hashProvider, 'hash3', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash5', ['hash4'])); | ||
| const dependencies = await $.run<any>(['hash5', 'time']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash5', 'time']); | ||
| }); | ||
| test('with various dependencies', async () => { | ||
| $.register(provider(hashProvider, 'hash', ['hash2'])); | ||
| $.register(provider(hashProvider, 'hash3', ['?ENV'])); | ||
| $.register(constant('DEBUG', 1)); | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['DEBUG'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => { | ||
| if ('ENV' === serviceName) { | ||
| throw new YError('E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| return { | ||
| path: '/path/of/debug', | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: 'hash2', | ||
| inject: ['hash3'], | ||
| }, | ||
| async () => 'THE_HASH:' + serviceName, | ||
| ), | ||
| }; | ||
| }, | ||
| ), | ||
| ); | ||
| const dependencies = await $.run<any>(['hash', '?ENV']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'ENV']); | ||
| }); | ||
| test('and instanciate services once', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'provider', | ||
| name: serviceName, | ||
| inject: ['ENV', 'time'], | ||
| }, | ||
| hashProvider, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| const timeServiceStub = sinon.spy(timeService); | ||
| $.register(constant('ENV', ENV)); | ||
| $.register(service(timeServiceStub, 'time')); | ||
| $.register(provider(hashProvider, 'hash', ['hash1', 'hash2', 'hash3'])); | ||
| $.register( | ||
| provider(hashProvider, 'hash_', ['hash1', 'hash2', 'hash3']), | ||
| ); | ||
| const dependencies = await $.run<any>(['hash', 'hash_', 'hash3']); | ||
| assert.deepEqual(timeServiceStub.args, [[{}]]); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash', 'hash_', 'hash3']); | ||
| }); | ||
| test('with null service dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(constant('time', time)); | ||
| $.register( | ||
| initializer( | ||
| { | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: nullService, | ||
| }), | ||
| ), | ||
| ); | ||
| const dependencies = await $.run<any>(['nullService']); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullService']); | ||
| assert.deepEqual(dependencies, { | ||
| nullService: null, | ||
| }); | ||
| }); | ||
| test('with null provider dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register(constant('time', time)); | ||
| $.register( | ||
| initializer( | ||
| { | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: nullProvider, | ||
| }), | ||
| ), | ||
| ); | ||
| const dependencies = await $.run<any>(['nullProvider']); | ||
| assert.deepEqual(Object.keys(dependencies), ['nullProvider']); | ||
| assert.deepEqual(dependencies, { | ||
| nullProvider: null, | ||
| }); | ||
| }); | ||
| test('with undefined dependencies', async () => { | ||
| const time = jest.fn(); | ||
| $.register( | ||
| initializer( | ||
| { | ||
| name: '$autoload', | ||
| type: 'service', | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/to/${serviceName}`, | ||
| initializer: | ||
| serviceName === 'undefinedService' | ||
| ? undefinedService | ||
| : undefinedProvider, | ||
| }), | ||
| ), | ||
| ); | ||
| $.register(constant('time', time)); | ||
| const dependencies = await $.run<any>([ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
| 'undefinedService', | ||
| 'undefinedProvider', | ||
| ]); | ||
| assert.deepEqual(dependencies, { | ||
| undefinedService: undefined, | ||
| undefinedProvider: null, | ||
| }); | ||
| }); | ||
| test('when autoload depends on optional and unexisting autoloaded dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: serviceName, | ||
| inject: [], | ||
| }, | ||
| async () => `THE_${serviceName.toUpperCase()}:` + serviceName, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| const dependencies = await $.run<any>(['test']); | ||
| assert.deepEqual(Object.keys(dependencies), ['test']); | ||
| }); | ||
| test('when autoload depends on deeper optional and unexisting autoloaded dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: 'log', | ||
| inject: ['?LOG_ROUTING', '?LOGGER', '?debug'], | ||
| singleton: true, | ||
| }, | ||
| async () => { | ||
| return () => undefined; | ||
| }, | ||
| ), | ||
| ); | ||
| $.register(constant('LOGGER', 'LOGGER_CONSTANT')); | ||
| $.register(constant('debug', 'debug_value')); | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV', '?log'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: serviceName, | ||
| inject: [], | ||
| }, | ||
| async () => `THE_${serviceName.toUpperCase()}:` + serviceName, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| const dependencies = await $.run<any>(['test', 'log']); | ||
| assert.deepEqual(Object.keys(dependencies), ['test', 'log']); | ||
| }); | ||
| }); | ||
| test.skip('should work when autoload depends on deeper optional and unexisting autoloaded dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: 'log', | ||
| inject: ['?LOG_ROUTING', '?LOGGER', '?debug'], | ||
| }, | ||
| async () => { | ||
| return () => undefined; | ||
| }, | ||
| ), | ||
| ); | ||
| $.register(constant('LOGGER', 'LOGGER_CONSTANT')); | ||
| $.register(constant('debug', 'debug_value')); | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['?ENV', '?log'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: `/path/of/${serviceName}`, | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: serviceName, | ||
| inject: [], | ||
| }, | ||
| async () => `THE_${serviceName.toUpperCase()}:` + serviceName, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| describe('should fail', () => { | ||
| test('when autoload does not exists', async () => { | ||
| try { | ||
| await $.run<any>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_UNMATCHED_DEPENDENCY'); | ||
| } | ||
| }); | ||
| const dependencies = await $.run<Record<string, any>>(['test', 'log']); | ||
| test('when autoloaded dependencies are not found', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => { | ||
| throw new YError('E_CANNOT_AUTOLOAD', serviceName); | ||
| }, | ||
| ), | ||
| ); | ||
| assert.deepEqual(Object.keys(dependencies), ['test', 'log']); | ||
| try { | ||
| await $.run<any>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual((err as YError).params, ['test']); | ||
| assert.equal( | ||
| ((err as YError).wrappedErrors[0] as YError).code, | ||
| 'E_CANNOT_AUTOLOAD', | ||
| ); | ||
| assert.deepEqual( | ||
| ((err as YError).wrappedErrors[0] as YError).params, | ||
| ['test'], | ||
| ); | ||
| } | ||
| }); | ||
| test('when the autoloader returns bad data', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, | ||
| async () => async () => 'not_an_initializer', | ||
| ), | ||
| ); | ||
| try { | ||
| await $.run<any>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual((err as YError).params, ['test']); | ||
| assert.equal( | ||
| ((err as YError).wrappedErrors[0] as YError).code, | ||
| 'E_BAD_AUTOLOADER_RESULT', | ||
| ); | ||
| assert.deepEqual( | ||
| ((err as YError).wrappedErrors[0] as YError).params, | ||
| ['test', 'not_an_initializer'], | ||
| ); | ||
| } | ||
| }); | ||
| test('when autoloaded dependencies are not initializers', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, | ||
| async () => async () => ({ | ||
| initializer: 'not_an_initializer', | ||
| path: '/path/to/initializer', | ||
| }), | ||
| ), | ||
| ); | ||
| try { | ||
| await $.run<any>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual((err as YError).params, ['test']); | ||
| assert.equal( | ||
| ((err as YError).wrappedErrors[0] as YError).code, | ||
| 'E_AUTOLOADED_INITIALIZER_MISMATCH', | ||
| ); | ||
| assert.deepEqual( | ||
| ((err as YError).wrappedErrors[0] as YError).params, | ||
| ['test', undefined], | ||
| ); | ||
| } | ||
| }); | ||
| test('when autoloaded dependencies are not right initializers', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: [], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: 'not-' + serviceName, | ||
| inject: [], | ||
| }, | ||
| async () => 'THE_TEST:' + serviceName, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| try { | ||
| await $.run<any>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_BAD_AUTOLOADED_INITIALIZER'); | ||
| assert.deepEqual((err as YError).params, ['test']); | ||
| assert.equal( | ||
| ((err as YError).wrappedErrors[0] as YError).code, | ||
| 'E_AUTOLOADED_INITIALIZER_MISMATCH', | ||
| ); | ||
| assert.deepEqual( | ||
| ((err as YError).wrappedErrors[0] as YError).params, | ||
| ['test', 'not-test'], | ||
| ); | ||
| } | ||
| }); | ||
| test('when autoload depends on existing autoloaded dependencies', async () => { | ||
| $.register( | ||
| initializer( | ||
| { | ||
| type: 'service', | ||
| name: '$autoload', | ||
| inject: ['ENV'], | ||
| singleton: true, | ||
| }, | ||
| async () => async (serviceName) => ({ | ||
| path: '/path/of/debug', | ||
| initializer: initializer( | ||
| { | ||
| type: 'service', | ||
| name: 'DEBUG', | ||
| inject: [], | ||
| }, | ||
| async () => 'THE_DEBUG:' + serviceName, | ||
| ), | ||
| }), | ||
| ), | ||
| ); | ||
| try { | ||
| await $.run<any>(['test']); | ||
| throw new YError('E_UNEXPECTED_SUCCESS'); | ||
| } catch (err) { | ||
| assert.equal((err as YError).code, 'E_UNMATCHED_DEPENDENCY'); | ||
| assert.deepEqual((err as YError).params, ['__run__', 'test']); | ||
| } | ||
| }); | ||
| }); | ||
@@ -1053,7 +1377,3 @@ }); | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run<any>(['time', 'hash', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
@@ -1075,7 +1395,3 @@ 'time', | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run<any>(['time', 'hash', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
@@ -1100,7 +1416,3 @@ 'time', | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run<any>(['time', 'hash', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), [ | ||
@@ -1128,6 +1440,3 @@ 'time', | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| '$injector', | ||
| ]); | ||
| const dependencies = await $.run<any>(['time', '$injector']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', '$injector']); | ||
@@ -1148,4 +1457,4 @@ | ||
| const [{ hash }, { hash: sameHash }] = await Promise.all([ | ||
| $.run<Record<string, any>>(['hash']), | ||
| $.run<Record<string, any>>(['hash']), | ||
| $.run<any>(['hash']), | ||
| $.run<any>(['hash']), | ||
| ]); | ||
@@ -1155,3 +1464,3 @@ | ||
| const { hash: yaSameHash } = await $.run<Record<string, any>>(['hash']); | ||
| const { hash: yaSameHash } = await $.run<any>(['hash']); | ||
@@ -1168,6 +1477,6 @@ assert.notEqual(hash, yaSameHash); | ||
| await Promise.all([ | ||
| $.run<Record<string, any>>(['hash']), | ||
| $.run<Record<string, any>>(['hash']), | ||
| $.run<Record<string, any>>(['hash2']), | ||
| $.run<Record<string, any>>(['hash2']), | ||
| $.run<any>(['hash']), | ||
| $.run<any>(['hash']), | ||
| $.run<any>(['hash2']), | ||
| $.run<any>(['hash2']), | ||
| ]); | ||
@@ -1177,3 +1486,3 @@ assert.equal(hash, sameHash); | ||
| const { hash: yaSameHash } = await $.run<Record<string, any>>(['hash']); | ||
| const { hash: yaSameHash } = await $.run<any>(['hash']); | ||
@@ -1187,3 +1496,3 @@ assert.equal(hash, yaSameHash); | ||
| assert.equal(typeof $.destroy, 'function'); | ||
| const dependencies = await $.run<Record<string, any>>(['$instance']); | ||
| const dependencies = await $.run<any>(['$instance']); | ||
@@ -1201,5 +1510,5 @@ await dependencies.$instance.destroy(); | ||
| const [dependencies] = await Promise.all([ | ||
| $.run<Record<string, any>>(['$instance']), | ||
| $.run<Record<string, any>>(['ENV', 'hash', 'hash1', 'time']), | ||
| $.run<Record<string, any>>(['ENV', 'hash', 'hash2']), | ||
| $.run<any>(['$instance']), | ||
| $.run<any>(['ENV', 'hash', 'hash1', 'time']), | ||
| $.run<any>(['ENV', 'hash', 'hash2']), | ||
| ]); | ||
@@ -1220,11 +1529,5 @@ | ||
| const dependenciesBuckets = await Promise.all([ | ||
| $.run<Record<string, any>>(['$instance']), | ||
| $.run<Record<string, any>>([ | ||
| '$instance', | ||
| 'ENV', | ||
| 'hash', | ||
| 'hash1', | ||
| 'time', | ||
| ]), | ||
| $.run<Record<string, any>>(['$instance', 'ENV', 'hash', 'hash2']), | ||
| $.run<any>(['$instance']), | ||
| $.run<any>(['$instance', 'ENV', 'hash', 'hash1', 'time']), | ||
| $.run<any>(['$instance', 'ENV', 'hash', 'hash2']), | ||
| ]); | ||
@@ -1247,12 +1550,7 @@ | ||
| const [dependencies1, dependencies2] = await Promise.all([ | ||
| $.run<Record<string, any>>(['$instance']), | ||
| $.run<Record<string, any>>([ | ||
| '$dispose', | ||
| 'ENV', | ||
| 'hash', | ||
| 'hash1', | ||
| 'time', | ||
| ]), | ||
| $.run<Record<string, any>>(['ENV', 'hash', 'hash2']), | ||
| $.run<any>(['$instance']), | ||
| $.run<any>(['$dispose', 'ENV', 'hash', 'hash1', 'time']), | ||
| $.run<any>(['ENV', 'hash', 'hash2']), | ||
| ]); | ||
| await Promise.all([ | ||
@@ -1270,3 +1568,3 @@ dependencies2.$dispose(), | ||
| const dependencies = await $.run<Record<string, any>>(['$instance']); | ||
| const dependencies = await $.run<any>(['$instance']); | ||
@@ -1278,3 +1576,3 @@ assert.equal(typeof dependencies.$instance.destroy, 'function'); | ||
| try { | ||
| await $.run<Record<string, any>>(['ENV', 'hash', 'hash1']); | ||
| await $.run<any>(['ENV', 'hash', 'hash1']); | ||
| throw new YError('E_UNEXPECTED_SUCCES'); | ||
@@ -1289,3 +1587,3 @@ } catch (err) { | ||
| test('should work with no dependencies', async () => { | ||
| const dependencies = await $.run<Record<string, any>>(['$dispose']); | ||
| const dependencies = await $.run<any>(['$dispose']); | ||
| assert.equal(typeof dependencies.$dispose, 'function'); | ||
@@ -1300,7 +1598,3 @@ | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'ENV', | ||
| '$dispose', | ||
| ]); | ||
| const dependencies = await $.run<any>(['time', 'ENV', '$dispose']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'ENV', '$dispose']); | ||
@@ -1316,7 +1610,3 @@ | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| '$dispose', | ||
| ]); | ||
| const dependencies = await $.run<any>(['time', 'hash', '$dispose']); | ||
| assert.deepEqual(Object.keys(dependencies), ['time', 'hash', '$dispose']); | ||
@@ -1328,4 +1618,4 @@ | ||
| test('should work with deeper dependencies', async () => { | ||
| let shutdownCallResolve; | ||
| let shutdownResolve; | ||
| let shutdownCallResolve: (value?: unknown) => void; | ||
| let shutdownResolve: (value?: unknown) => void; | ||
| const shutdownCallPromise = new Promise((resolve) => { | ||
@@ -1364,3 +1654,3 @@ shutdownCallResolve = resolve; | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| const dependencies = await $.run<any>([ | ||
| 'hash5', | ||
@@ -1382,3 +1672,2 @@ 'time', | ||
| }); | ||
| await dependencies.$dispose(); | ||
@@ -1389,4 +1678,4 @@ await finalPromise; | ||
| test('should work with deeper multi used dependencies', async () => { | ||
| let shutdownCallResolve; | ||
| let shutdownResolve; | ||
| let shutdownCallResolve: (value?: unknown) => void; | ||
| let shutdownResolve: (value?: unknown) => void; | ||
| const shutdownCallPromise = new Promise((resolve) => { | ||
@@ -1421,3 +1710,3 @@ shutdownCallResolve = resolve; | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| const dependencies = await $.run<any>([ | ||
| 'hash1', | ||
@@ -1480,6 +1769,3 @@ 'hash2', | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'hash2', | ||
| '$dispose', | ||
| ]); | ||
| const dependencies = await $.run<any>(['hash2', '$dispose']); | ||
| assert.deepEqual(Object.keys(dependencies), ['hash2', '$dispose']); | ||
@@ -1500,8 +1786,4 @@ await dependencies.$dispose(); | ||
| const { hash } = await $.run<Record<string, any>>(['time', 'hash']); | ||
| const dependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| '$dispose', | ||
| ]); | ||
| const { hash } = await $.run<any>(['time', 'hash']); | ||
| const dependencies = await $.run<any>(['time', 'hash', '$dispose']); | ||
@@ -1512,6 +1794,3 @@ assert.equal(dependencies.hash, hash); | ||
| const newDependencies = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| ]); | ||
| const newDependencies = await $.run<any>(['time', 'hash']); | ||
| assert.equal(newDependencies.hash, hash); | ||
@@ -1525,11 +1804,7 @@ }); | ||
| const { hash, $dispose } = await $.run<Record<string, any>>([ | ||
| 'time', | ||
| 'hash', | ||
| '$dispose', | ||
| ]); | ||
| const { hash, $dispose } = await $.run<any>(['time', 'hash', '$dispose']); | ||
| await $dispose(); | ||
| const dependencies = await $.run<Record<string, any>>(['time', 'hash']); | ||
| const dependencies = await $.run<any>(['time', 'hash']); | ||
| assert.notEqual(dependencies.hash, hash); | ||
@@ -1536,0 +1811,0 @@ }); |
+913
-686
@@ -0,1 +1,2 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint max-len: ["warn", { "ignoreComments": true }] @typescript-eslint/no-this-alias: "warn" */ | ||
@@ -100,2 +101,11 @@ import { | ||
| export const RUN_DEPENDENT_NAME = '__run__'; | ||
| export const SYSTEM_DEPENDENT_NAME = '__system__'; | ||
| export const AUTOLOAD_DEPENDENT_NAME = '__autoloader__'; | ||
| export const INJECTOR_DEPENDENT_NAME = '__injector__'; | ||
| export const NO_PROVIDER = Symbol('NO_PROVIDER'); | ||
| export type KnifecycleOptions = { | ||
| sequential?: boolean; | ||
| }; | ||
| export interface Injector<T extends Record<string, unknown>> { | ||
@@ -112,9 +122,52 @@ (dependencies: DependencyDeclaration[]): Promise<T>; | ||
| } | ||
| export interface SiloContext<S> { | ||
| name: string; | ||
| servicesDescriptors: Map<DependencyDeclaration, Promise<Provider<S>>>; | ||
| servicesSequence: DependencyDeclaration[][]; | ||
| servicesShutdownsPromises: Map<DependencyDeclaration, Promise<void>>; | ||
| export type SiloIndex = string; | ||
| export type BaseInitializerStateDescriptor<S, D extends Dependencies> = { | ||
| dependents: { | ||
| silo?: SiloIndex; | ||
| name: ServiceName; | ||
| optional: boolean; | ||
| }[]; | ||
| initializerLoadPromise?: Promise<Initializer<S, D>>; | ||
| initializer?: Initializer<S, D>; | ||
| autoloaded: boolean; | ||
| }; | ||
| export type SiloedInitializerStateDescriptor< | ||
| S, | ||
| D extends Dependencies, | ||
| > = BaseInitializerStateDescriptor<S, D> & { | ||
| silosInstances: Record< | ||
| SiloIndex, | ||
| { | ||
| dependency?: ServiceName; | ||
| provider?: NonNullable<Provider<S> | typeof NO_PROVIDER>; | ||
| providerLoadPromise?: Promise<void>; | ||
| instanceDisposePromise?: Promise<S>; | ||
| } | ||
| >; | ||
| }; | ||
| export type SingletonInitializerStateDescriptor< | ||
| S, | ||
| D extends Dependencies, | ||
| > = BaseInitializerStateDescriptor<S, D> & { | ||
| singletonProvider?: NonNullable<Provider<S> | typeof NO_PROVIDER>; | ||
| singletonProviderLoadPromise?: Promise<void>; | ||
| disposer?: Disposer; | ||
| fatalErrorPromise?: FatalErrorPromise; | ||
| }; | ||
| export type AutoloadedInitializerStateDescriptor< | ||
| S, | ||
| D extends Dependencies, | ||
| > = BaseInitializerStateDescriptor<S, D> & { | ||
| autoloaded: true; | ||
| }; | ||
| export type InitializerStateDescriptor<S, D extends Dependencies> = | ||
| | SingletonInitializerStateDescriptor<S, D> | ||
| | SiloedInitializerStateDescriptor<S, D> | ||
| | AutoloadedInitializerStateDescriptor<S, D>; | ||
| export interface SiloContext { | ||
| index: SiloIndex; | ||
| loadingServices: ServiceName[]; | ||
| loadingSequences: ServiceName[][]; | ||
| errorsPromises: Promise<void>[]; | ||
| shutdownPromise?: Promise<void>; | ||
| _shutdownPromise?: Promise<void>; | ||
| throwFatalError?: (err: Error) => void; | ||
@@ -131,3 +184,3 @@ } | ||
| $instance: Knifecycle; | ||
| $siloContext: SiloContext<unknown>; | ||
| $siloContext: SiloContext; | ||
| $fatalError: FatalErrorService; | ||
@@ -145,15 +198,2 @@ }; | ||
| const E_BAD_AUTOLOADED_INITIALIZER = 'E_BAD_AUTOLOADED_INITIALIZER'; | ||
| const E_AUTOLOADED_INITIALIZER_MISMATCH = 'E_AUTOLOADED_INITIALIZER_MISMATCH'; | ||
| const E_UNMATCHED_DEPENDENCY = 'E_UNMATCHED_DEPENDENCY'; | ||
| const E_CIRCULAR_DEPENDENCY = 'E_CIRCULAR_DEPENDENCY'; | ||
| const E_BAD_SERVICE_PROVIDER = 'E_BAD_SERVICE_PROVIDER'; | ||
| const E_BAD_SERVICE_PROMISE = 'E_BAD_SERVICE_PROMISE'; | ||
| const E_INSTANCE_DESTROYED = 'E_INSTANCE_DESTROYED'; | ||
| const E_AUTOLOADER_DYNAMIC_DEPENDENCY = 'E_AUTOLOADER_DYNAMIC_DEPENDENCY'; | ||
| const E_BAD_CLASS = 'E_BAD_CLASS'; | ||
| const E_UNDEFINED_CONSTANT_INITIALIZER = 'E_UNDEFINED_CONSTANT_INITIALIZER'; | ||
| const E_BAD_VALUED_NON_CONSTANT_INITIALIZER = | ||
| 'E_BAD_VALUED_NON_CONSTANT_INITIALIZER'; | ||
| /* Architecture Note #1: Knifecycle | ||
@@ -175,2 +215,5 @@ | ||
| set as a property. | ||
| In fact, the Knifecycle API is aimed to allow to statically | ||
| build its services load/unload code once in production. | ||
| */ | ||
@@ -189,25 +232,17 @@ | ||
| class Knifecycle { | ||
| private _options: KnifecycleOptions; | ||
| private _silosCounter: number; | ||
| private _silosContexts: Set<SiloContext<unknown>>; | ||
| private _initializers: Map< | ||
| private _silosContexts: Record<SiloIndex, SiloContext>; | ||
| private _initializersStates: Record< | ||
| string, | ||
| ProviderInitializer<Record<string, unknown>, unknown> | ||
| InitializerStateDescriptor<unknown, Dependencies> | ||
| >; | ||
| private _initializerResolvers: Map< | ||
| string, | ||
| Promise<ProviderInitializer<Record<string, unknown>, unknown>> | ||
| >; | ||
| private _singletonsServicesHandles: Map<string, Set<string>>; | ||
| private _singletonsServicesDescriptors: Map< | ||
| string, | ||
| { | ||
| promise: Promise<Provider<unknown>>; | ||
| preloaded: boolean; | ||
| } | ||
| >; | ||
| private _singletonsServicesShutdownsPromises: Map<string, Promise<void>>; | ||
| private shutdownPromise?: Promise<void>; | ||
| private _shutdownPromise?: Promise<void>; | ||
| /** | ||
| * Create a new Knifecycle instance | ||
| * @param {Object} options | ||
| * An object with options | ||
| * @param {boolean} options.sequential | ||
| * Allows to load dependencies sequentially (usefull for debugging) | ||
| * @return {Knifecycle} | ||
@@ -221,27 +256,53 @@ * The Knifecycle instance | ||
| */ | ||
| constructor() { | ||
| constructor(options?: KnifecycleOptions) { | ||
| this._options = options || {}; | ||
| this._silosCounter = 0; | ||
| this._silosContexts = new Set(); | ||
| this._initializers = new Map(); | ||
| this._initializerResolvers = new Map(); | ||
| this._singletonsServicesHandles = new Map(); | ||
| this._singletonsServicesDescriptors = new Map(); | ||
| this._singletonsServicesShutdownsPromises = new Map(); | ||
| this._silosContexts = {}; | ||
| this._initializersStates = { | ||
| [FATAL_ERROR]: { | ||
| initializer: service(async () => { | ||
| throw new YError('E_UNEXPECTED_INIT', FATAL_ERROR); | ||
| }, FATAL_ERROR), | ||
| autoloaded: false, | ||
| dependents: [], | ||
| silosInstances: {}, | ||
| }, | ||
| [SILO_CONTEXT]: { | ||
| initializer: service(async () => { | ||
| throw new YError('E_UNEXPECTED_INIT', SILO_CONTEXT); | ||
| }, SILO_CONTEXT), | ||
| autoloaded: false, | ||
| dependents: [], | ||
| silosInstances: {}, | ||
| }, | ||
| [DISPOSE]: { | ||
| initializer: service(async () => { | ||
| throw new YError('E_UNEXPECTED_INIT', DISPOSE); | ||
| }, DISPOSE), | ||
| autoloaded: false, | ||
| dependents: [], | ||
| silosInstances: {}, | ||
| }, | ||
| }; | ||
| this.register(constant(INSTANCE, this)); | ||
| const initInjectorProvider = provider( | ||
| async ({ $siloContext }: { $siloContext: SiloContext<unknown> }) => ({ | ||
| service: async (dependenciesDeclarations: DependencyDeclaration[]) => | ||
| _buildFinalHash( | ||
| await this._initializeDependencies( | ||
| $siloContext, | ||
| $siloContext.name, | ||
| dependenciesDeclarations, | ||
| { injectorContext: true, autoloading: false }, | ||
| ), | ||
| async ({ | ||
| $siloContext, | ||
| $instance, | ||
| }: { | ||
| $siloContext: SiloContext; | ||
| $instance: Knifecycle; | ||
| }) => ({ | ||
| service: async (dependenciesDeclarations: DependencyDeclaration[]) => { | ||
| return $instance._loadInitializerDependencies( | ||
| $siloContext, | ||
| [INJECTOR_DEPENDENT_NAME], | ||
| dependenciesDeclarations, | ||
| ), | ||
| [], | ||
| ); | ||
| }, | ||
| }), | ||
| INJECTOR, | ||
| [SILO_CONTEXT], | ||
| [SILO_CONTEXT, INSTANCE], | ||
| // Despite its global definition, the injector | ||
@@ -264,3 +325,3 @@ // depends on the silo context and then needs | ||
| - constants: a `constant` initializer resolves to | ||
| a constant value. | ||
| any constant value. | ||
| - services: a `service` initializer directly | ||
@@ -274,8 +335,9 @@ resolve to the actual service it builds. It can | ||
| `fatalErrorPromise` that will be rejected if an | ||
| unrecoverable error happens. | ||
| unrecoverable error happens allowing Knifecycle | ||
| to terminate. | ||
| Initializers can be declared as singletons. This means | ||
| that they will be instanciated once for all for each | ||
| executions silos using them (we will cover this | ||
| topic later on). | ||
| Initializers can be declared as singletons (constants are | ||
| of course only singletons). This means that they will be | ||
| instanciated once for all for each executions silos using | ||
| them (we will cover this topic later on). | ||
| */ | ||
@@ -291,62 +353,150 @@ | ||
| register<T extends Initializer<unknown, any>>(initializer: T): Knifecycle { | ||
| if (this.shutdownPromise) { | ||
| throw new YError(E_INSTANCE_DESTROYED); | ||
| if (this._shutdownPromise) { | ||
| throw new YError('E_INSTANCE_DESTROYED'); | ||
| } | ||
| unwrapInitializerProperties(initializer); | ||
| const initializerState: InitializerStateDescriptor<any, any> = { | ||
| initializer, | ||
| autoloaded: false, | ||
| dependents: [], | ||
| }; | ||
| // Temporary cast constants into providers | ||
| // Best would be to threat each differently | ||
| // at dependencies initialization level to boost performances | ||
| if (initializer[SPECIAL_PROPS.TYPE] === 'constant') { | ||
| const value = initializer[SPECIAL_PROPS.VALUE]; | ||
| this._checkInitializerOverride(initializer[SPECIAL_PROPS.NAME]); | ||
| if ('undefined' === typeof value) { | ||
| throw new YError( | ||
| E_UNDEFINED_CONSTANT_INITIALIZER, | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ); | ||
| } | ||
| this._buildInitializerState(initializerState, initializer); | ||
| initializer = provider( | ||
| async () => ({ | ||
| service: value, | ||
| }), | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| [], | ||
| true, | ||
| ) as T; | ||
| this._initializersStates[initializer[SPECIAL_PROPS.NAME]] = | ||
| initializerState; | ||
| // Needed for the build utils to still recognize | ||
| // this initializer as a constant value | ||
| initializer[SPECIAL_PROPS.VALUE] = value; | ||
| initializer[SPECIAL_PROPS.TYPE] = 'constant'; | ||
| } else if ('undefined' !== typeof initializer[SPECIAL_PROPS.VALUE]) { | ||
| throw new YError( | ||
| E_BAD_VALUED_NON_CONSTANT_INITIALIZER, | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ); | ||
| debug(`Registered an initializer: ${initializer[SPECIAL_PROPS.NAME]}`); | ||
| return this; | ||
| } | ||
| _checkInitializerOverride(serviceName: ServiceName) { | ||
| if (this._initializersStates[serviceName]) { | ||
| if ('initializer' in this._initializersStates[serviceName]) { | ||
| if (this._initializersStates[serviceName]?.dependents?.length) { | ||
| debug( | ||
| `Override attempt of an already used initializer: ${serviceName}`, | ||
| ); | ||
| throw new YError('E_INITIALIZER_ALREADY_INSTANCIATED', serviceName); | ||
| } | ||
| debug(`Overridden an initializer: ${serviceName}`); | ||
| } | ||
| } | ||
| } | ||
| // Temporary cast service initializers into | ||
| // providers. Best would be to threat each differently | ||
| // at dependencies initialization level to boost performances | ||
| if ('service' === initializer[SPECIAL_PROPS.TYPE]) { | ||
| initializer = reuseSpecialProps( | ||
| initializer, | ||
| serviceAdapter.bind( | ||
| null, | ||
| initializer[SPECIAL_PROPS.NAME] as string, | ||
| initializer as ServiceInitializer<Record<string, unknown>, unknown>, | ||
| ), | ||
| ) as T; | ||
| initializer[SPECIAL_PROPS.TYPE] = 'provider'; | ||
| _buildInitializerState( | ||
| initializerState: InitializerStateDescriptor<any, any>, | ||
| initializer: Initializer<unknown, any>, | ||
| ): void { | ||
| unwrapInitializerProperties(initializer); | ||
| if (initializer[SPECIAL_PROPS.TYPE] === 'constant') { | ||
| const provider = { | ||
| service: initializer[SPECIAL_PROPS.VALUE], | ||
| }; | ||
| ( | ||
| initializerState as SingletonInitializerStateDescriptor<any, any> | ||
| ).singletonProvider = provider; | ||
| ( | ||
| initializerState as SingletonInitializerStateDescriptor<any, any> | ||
| ).singletonProviderLoadPromise = Promise.resolve(); | ||
| } else { | ||
| this._checkInitializerDependencies(initializer); | ||
| if (!initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| ( | ||
| initializerState as SiloedInitializerStateDescriptor<any, any> | ||
| ).silosInstances = {}; | ||
| } | ||
| } | ||
| } | ||
| _checkInitializerDependencies(initializer: Initializer<any, any>) { | ||
| const initializerDependsOfItself = initializer[SPECIAL_PROPS.INJECT] | ||
| .map(_pickServiceNameFromDeclaration) | ||
| .map((dependencyDeclaration) => { | ||
| const serviceName = _pickServiceNameFromDeclaration( | ||
| dependencyDeclaration, | ||
| ); | ||
| if ( | ||
| // TEMPFIX: let's build | ||
| initializer[SPECIAL_PROPS.NAME] !== 'BUILD_CONSTANTS' && | ||
| // TEMPFIX: Those services are special... | ||
| ![FATAL_ERROR, INJECTOR, SILO_CONTEXT].includes(serviceName) && | ||
| initializer[SPECIAL_PROPS.SINGLETON] && | ||
| this._initializersStates[serviceName] && | ||
| 'initializer' in this._initializersStates[serviceName] && | ||
| this._initializersStates[serviceName]?.initializer && | ||
| !this._initializersStates[serviceName]?.initializer?.[ | ||
| SPECIAL_PROPS.SINGLETON | ||
| ] | ||
| ) { | ||
| debug( | ||
| `Found an inconsistent singleton initializer dependency: ${ | ||
| initializer[SPECIAL_PROPS.NAME] | ||
| }`, | ||
| serviceName, | ||
| initializer, | ||
| ); | ||
| throw new YError( | ||
| 'E_BAD_SINGLETON_DEPENDENCIES', | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| serviceName, | ||
| ); | ||
| } | ||
| return serviceName; | ||
| }) | ||
| .includes(initializer[SPECIAL_PROPS.NAME]); | ||
| if ( | ||
| // TEMPFIX: let's build | ||
| initializer[SPECIAL_PROPS.NAME] !== 'BUILD_CONSTANTS' && | ||
| !initializer[SPECIAL_PROPS.SINGLETON] | ||
| ) { | ||
| Object.keys(this._initializersStates) | ||
| .filter( | ||
| (serviceName) => | ||
| ![ | ||
| // TEMPFIX: Those services are special... | ||
| FATAL_ERROR, | ||
| INJECTOR, | ||
| SILO_CONTEXT, | ||
| ].includes(serviceName), | ||
| ) | ||
| .forEach((serviceName) => { | ||
| if ( | ||
| this._initializersStates[serviceName]?.initializer && | ||
| this._initializersStates[serviceName]?.initializer?.[ | ||
| SPECIAL_PROPS.SINGLETON | ||
| ] && | ||
| ( | ||
| this._initializersStates[serviceName]?.initializer?.[ | ||
| SPECIAL_PROPS.INJECT | ||
| ] || [] | ||
| ) | ||
| .map(_pickServiceNameFromDeclaration) | ||
| .includes(initializer[SPECIAL_PROPS.NAME]) | ||
| ) { | ||
| debug( | ||
| `Found an inconsistent dependent initializer: ${ | ||
| initializer[SPECIAL_PROPS.NAME] | ||
| }`, | ||
| serviceName, | ||
| initializer, | ||
| ); | ||
| throw new YError( | ||
| 'E_BAD_SINGLETON_DEPENDENCIES', | ||
| serviceName, | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ); | ||
| } | ||
| }); | ||
| } | ||
| if (initializerDependsOfItself) { | ||
| throw new YError(E_CIRCULAR_DEPENDENCY, initializer[SPECIAL_PROPS.NAME]); | ||
| throw new YError( | ||
| 'E_CIRCULAR_DEPENDENCY', | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ); | ||
| } | ||
@@ -360,54 +510,2 @@ | ||
| }); | ||
| if (this._initializers.has(initializer[SPECIAL_PROPS.NAME])) { | ||
| const initializedAsSingleton = | ||
| this._singletonsServicesHandles.has(initializer[SPECIAL_PROPS.NAME]) && | ||
| this._singletonsServicesDescriptors.has( | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ) && | ||
| !this._singletonsServicesDescriptors.get( | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| )?.preloaded; | ||
| const initializedAsInstance = [...this._silosContexts.values()].some( | ||
| (siloContext) => | ||
| siloContext.servicesSequence.some((sequence) => | ||
| sequence.includes(initializer[SPECIAL_PROPS.NAME]), | ||
| ), | ||
| ); | ||
| if (initializedAsSingleton || initializedAsInstance) { | ||
| throw new YError( | ||
| 'E_INITIALIZER_ALREADY_INSTANCIATED', | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ); | ||
| } | ||
| debug(`Overridden an initializer: ${initializer[SPECIAL_PROPS.NAME]}`); | ||
| } else { | ||
| debug(`Registered an initializer: ${initializer[SPECIAL_PROPS.NAME]}`); | ||
| } | ||
| // Constants are singletons and constant so we can set it | ||
| // to singleton services descriptors map directly | ||
| if ('constant' === initializer[SPECIAL_PROPS.TYPE]) { | ||
| const handlesSet = new Set<string>(); | ||
| this._singletonsServicesHandles.set( | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| handlesSet, | ||
| ); | ||
| this._singletonsServicesDescriptors.set(initializer[SPECIAL_PROPS.NAME], { | ||
| preloaded: true, | ||
| // We do not directly use initializer[SPECIAL_PROPS.VALUE] here | ||
| // since it looks like there is a bug with Babel build that | ||
| // change functions to empty litteral objects | ||
| promise: ( | ||
| initializer as ProviderInitializer<Record<string, unknown>, unknown> | ||
| )({}), | ||
| }); | ||
| } | ||
| this._initializers.set( | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| initializer as ProviderInitializer<Record<string, unknown>, unknown>, | ||
| ); | ||
| return this; | ||
| } | ||
@@ -421,9 +519,10 @@ | ||
| const serviceName = _pickServiceNameFromDeclaration(dependencyDeclaration); | ||
| const dependencyProvider = this._initializers.get(serviceName); | ||
| const initializersState = this._initializersStates[serviceName]; | ||
| if (!dependencyProvider) { | ||
| if (!initializersState || !initializersState.initializer) { | ||
| return; | ||
| } | ||
| declarationsStacks = declarationsStacks.concat(dependencyDeclaration); | ||
| dependencyProvider[SPECIAL_PROPS.INJECT].forEach( | ||
| (initializersState.initializer[SPECIAL_PROPS.INJECT] || []).forEach( | ||
| (childDependencyDeclaration) => { | ||
@@ -436,3 +535,3 @@ const childServiceName = _pickServiceNameFromDeclaration( | ||
| throw new YError( | ||
| E_CIRCULAR_DEPENDENCY, | ||
| 'E_CIRCULAR_DEPENDENCY', | ||
| ...[rootServiceName] | ||
@@ -499,21 +598,25 @@ .concat(declarationsStacks) | ||
| ): string { | ||
| const servicesProviders = this._initializers; | ||
| const links: MermaidLink[] = Array.from(servicesProviders.keys()) | ||
| const initializersStates = this._initializersStates; | ||
| const links: MermaidLink[] = Object.keys(initializersStates) | ||
| .filter((provider) => !provider.startsWith('$')) | ||
| .reduce((links, serviceName) => { | ||
| const serviceProvider = servicesProviders.get( | ||
| serviceName, | ||
| ) as ProviderInitializer<Record<string, unknown>, unknown>; | ||
| const initializerState = initializersStates[serviceName]; | ||
| if (!serviceProvider[SPECIAL_PROPS.INJECT].length) { | ||
| if ( | ||
| !initializerState || | ||
| !initializerState.initializer || | ||
| !initializerState.initializer[SPECIAL_PROPS.INJECT]?.length | ||
| ) { | ||
| return links; | ||
| } | ||
| return links.concat( | ||
| serviceProvider[SPECIAL_PROPS.INJECT].map((dependencyDeclaration) => { | ||
| const dependedServiceName = _pickServiceNameFromDeclaration( | ||
| dependencyDeclaration, | ||
| ); | ||
| initializerState.initializer[SPECIAL_PROPS.INJECT].map( | ||
| (dependencyDeclaration) => { | ||
| const dependedServiceName = _pickServiceNameFromDeclaration( | ||
| dependencyDeclaration, | ||
| ); | ||
| return { serviceName, dependedServiceName }; | ||
| }), | ||
| return { serviceName, dependedServiceName }; | ||
| }, | ||
| ), | ||
| ); | ||
@@ -583,22 +686,22 @@ }, []); | ||
| ): Promise<ID> { | ||
| const _this = this; | ||
| const internalDependencies = [ | ||
| ...new Set(dependenciesDeclarations.concat(DISPOSE)), | ||
| ]; | ||
| const siloContext: SiloContext<unknown> = { | ||
| name: `silo-${this._silosCounter++}`, | ||
| servicesDescriptors: new Map(), | ||
| servicesSequence: [], | ||
| servicesShutdownsPromises: new Map(), | ||
| const siloIndex: SiloIndex = `silo-${this._silosCounter++}`; | ||
| const siloContext: SiloContext = { | ||
| index: siloIndex, | ||
| loadingServices: [], | ||
| loadingSequences: [], | ||
| errorsPromises: [], | ||
| }; | ||
| if (this.shutdownPromise) { | ||
| throw new YError(E_INSTANCE_DESTROYED); | ||
| if (this._shutdownPromise) { | ||
| throw new YError('E_INSTANCE_DESTROYED'); | ||
| } | ||
| // Create a provider for the special fatal error service | ||
| siloContext.servicesDescriptors.set( | ||
| FATAL_ERROR, | ||
| Promise.resolve({ | ||
| ( | ||
| this._initializersStates[FATAL_ERROR] as SiloedInitializerStateDescriptor< | ||
| FatalErrorService, | ||
| Dependencies<unknown> | ||
| > | ||
| ).silosInstances[siloIndex] = { | ||
| provider: { | ||
| service: { | ||
@@ -612,554 +715,719 @@ promise: new Promise<void>((_resolve, reject) => { | ||
| }, | ||
| }), | ||
| ); | ||
| }, | ||
| }; | ||
| // Make the siloContext available for internal injections | ||
| siloContext.servicesDescriptors.set( | ||
| SILO_CONTEXT, | ||
| Promise.resolve({ | ||
| service: siloContext, | ||
| }), | ||
| ); | ||
| ( | ||
| this._initializersStates[ | ||
| SILO_CONTEXT | ||
| ] as SiloedInitializerStateDescriptor<SiloContext, Dependencies<unknown>> | ||
| ).silosInstances[siloIndex] = { | ||
| provider: { service: siloContext }, | ||
| }; | ||
| // Create a provider for the shutdown special dependency | ||
| siloContext.servicesDescriptors.set( | ||
| DISPOSE, | ||
| Promise.resolve({ | ||
| ( | ||
| this._initializersStates[DISPOSE] as SiloedInitializerStateDescriptor< | ||
| Disposer, | ||
| Dependencies<unknown> | ||
| > | ||
| ).silosInstances[siloIndex] = { | ||
| provider: { | ||
| service: async () => { | ||
| siloContext.shutdownPromise = | ||
| siloContext.shutdownPromise || | ||
| _shutdownNextServices(siloContext.servicesSequence); | ||
| const _this = this; | ||
| siloContext._shutdownPromise = | ||
| siloContext._shutdownPromise || | ||
| _shutdownNextServices(siloContext.loadingSequences.concat()); | ||
| await siloContext._shutdownPromise; | ||
| delete this._silosContexts[siloContext.index]; | ||
| debug('Shutting down services'); | ||
| await siloContext.shutdownPromise; | ||
| this._silosContexts.delete(siloContext); | ||
| // Shutdown services in their instanciation order | ||
| async function _shutdownNextServices(reversedServiceSequence) { | ||
| if (0 === reversedServiceSequence.length) { | ||
| async function _shutdownNextServices( | ||
| serviceLoadSequences: ServiceName[][], | ||
| ) { | ||
| if (0 === serviceLoadSequences.length) { | ||
| return; | ||
| } | ||
| const currentServiceLoadSequence = serviceLoadSequences.pop() || []; | ||
| await Promise.all( | ||
| reversedServiceSequence.pop().map(async (serviceName) => { | ||
| const singletonServiceDescriptor = | ||
| await _this._pickupSingletonServiceDescriptorPromise( | ||
| serviceName, | ||
| ); | ||
| const serviceDescriptor = | ||
| singletonServiceDescriptor || | ||
| (await siloContext.servicesDescriptors.get(serviceName)); | ||
| let serviceShutdownPromise: Promise<void> | undefined = | ||
| _this._singletonsServicesShutdownsPromises.get(serviceName) || | ||
| siloContext.servicesShutdownsPromises.get(serviceName); | ||
| if (serviceShutdownPromise) { | ||
| debug('Reusing a service shutdown promise:', serviceName); | ||
| return serviceShutdownPromise; | ||
| } | ||
| // First ensure to remove services that are depend on | ||
| // by another service loaded in the same batch (may | ||
| // happen depending on the load sequence) | ||
| const dependendedByAServiceInTheSameBatch = | ||
| currentServiceLoadSequence.filter((serviceName) => { | ||
| if ( | ||
| reversedServiceSequence.some((servicesDeclarations) => | ||
| servicesDeclarations.includes(serviceName), | ||
| ) | ||
| currentServiceLoadSequence | ||
| .filter( | ||
| (anotherServiceName) => | ||
| anotherServiceName !== serviceName, | ||
| ) | ||
| .some((anotherServiceName) => | ||
| ( | ||
| _this._initializersStates[anotherServiceName] | ||
| ?.initializer?.[SPECIAL_PROPS.INJECT] || [] | ||
| ) | ||
| .map(_pickServiceNameFromDeclaration) | ||
| .includes(serviceName), | ||
| ) | ||
| ) { | ||
| debug('Delaying service shutdown:', serviceName); | ||
| return Promise.resolve(); | ||
| debug( | ||
| `Delaying service "${serviceName}" dependencies shutdown to a dedicated batch.'`, | ||
| ); | ||
| return true; | ||
| } | ||
| if (singletonServiceDescriptor) { | ||
| const handleSet = _this._singletonsServicesHandles.get( | ||
| serviceName, | ||
| ) as Set<string>; | ||
| }); | ||
| handleSet.delete(siloContext.name); | ||
| if (handleSet.size) { | ||
| debug( | ||
| 'Singleton is used elsewhere:', | ||
| await Promise.all( | ||
| currentServiceLoadSequence | ||
| .filter( | ||
| (serviceName) => | ||
| !dependendedByAServiceInTheSameBatch.includes(serviceName), | ||
| ) | ||
| .map(async (serviceName) => { | ||
| const initializeState = | ||
| _this._initializersStates[serviceName]; | ||
| if ('silosInstances' in initializeState) { | ||
| const provider = _this._getServiceProvider( | ||
| siloContext, | ||
| serviceName, | ||
| handleSet, | ||
| ); | ||
| return Promise.resolve(); | ||
| if ( | ||
| serviceLoadSequences.some((servicesLoadSequence) => | ||
| servicesLoadSequence.includes(serviceName), | ||
| ) | ||
| ) { | ||
| debug( | ||
| 'Delaying service shutdown to another batch:', | ||
| serviceName, | ||
| ); | ||
| return Promise.resolve(); | ||
| } | ||
| if ( | ||
| !initializeState.silosInstances[siloContext.index] | ||
| .instanceDisposePromise | ||
| ) { | ||
| debug('Shutting down a service:', serviceName); | ||
| initializeState.silosInstances[ | ||
| siloContext.index | ||
| ].instanceDisposePromise = | ||
| provider && | ||
| provider !== NO_PROVIDER && | ||
| 'dispose' in provider && | ||
| provider.dispose | ||
| ? provider.dispose() | ||
| : Promise.resolve(); | ||
| } else { | ||
| debug('Reusing a service shutdown promise:', serviceName); | ||
| } | ||
| await initializeState.silosInstances[siloContext.index] | ||
| .instanceDisposePromise; | ||
| } else if ('singletonProvider' in initializeState) { | ||
| initializeState.dependents = | ||
| initializeState.dependents.filter( | ||
| ({ silo }) => silo !== siloContext.index, | ||
| ); | ||
| if (initializeState.dependents.length) { | ||
| debug( | ||
| `Will not shut down the ${serviceName} singleton service (still used ${initializeState.dependents.length} times).`, | ||
| initializeState.dependents, | ||
| ); | ||
| } else { | ||
| const provider = _this._getServiceProvider( | ||
| siloContext, | ||
| serviceName, | ||
| ); | ||
| debug('Shutting down a singleton service:', serviceName); | ||
| delete initializeState.singletonProviderLoadPromise; | ||
| delete initializeState.singletonProvider; | ||
| return provider && | ||
| provider !== NO_PROVIDER && | ||
| 'dispose' in provider && | ||
| provider.dispose | ||
| ? provider.dispose() | ||
| : Promise.resolve(); | ||
| } | ||
| } | ||
| _this._singletonsServicesDescriptors.delete(serviceName); | ||
| } | ||
| debug('Shutting down a service:', serviceName); | ||
| serviceShutdownPromise = serviceDescriptor?.dispose | ||
| ? serviceDescriptor.dispose() | ||
| : Promise.resolve(); | ||
| if (singletonServiceDescriptor) { | ||
| _this._singletonsServicesShutdownsPromises.set( | ||
| serviceName, | ||
| serviceShutdownPromise, | ||
| ); | ||
| } | ||
| siloContext.servicesShutdownsPromises.set( | ||
| serviceName, | ||
| serviceShutdownPromise, | ||
| ); | ||
| return serviceShutdownPromise; | ||
| }), | ||
| }), | ||
| ); | ||
| await _shutdownNextServices(reversedServiceSequence); | ||
| if (dependendedByAServiceInTheSameBatch.length) { | ||
| serviceLoadSequences.unshift(dependendedByAServiceInTheSameBatch); | ||
| } | ||
| await _shutdownNextServices(serviceLoadSequences); | ||
| } | ||
| }, | ||
| dispose: Promise.resolve.bind(Promise), | ||
| }), | ||
| ); | ||
| }, | ||
| }; | ||
| this._silosContexts[siloContext.index] = siloContext; | ||
| this._silosContexts.add(siloContext); | ||
| const servicesHash = await this._initializeDependencies( | ||
| const services = await this._loadInitializerDependencies( | ||
| siloContext, | ||
| siloContext.name, | ||
| internalDependencies, | ||
| { injectorContext: false, autoloading: false }, | ||
| [RUN_DEPENDENT_NAME], | ||
| dependenciesDeclarations, | ||
| [DISPOSE], | ||
| ); | ||
| // TODO: recreate error promise when autoloaded/injected things? | ||
| debug('Handling fatal errors:', siloContext.errorsPromises); | ||
| Promise.all(siloContext.errorsPromises).catch(siloContext.throwFatalError); | ||
| return _buildFinalHash( | ||
| servicesHash, | ||
| dependenciesDeclarations, | ||
| ) as unknown as ID; | ||
| debug('All dependencies now loaded:', siloContext.loadingSequences); | ||
| return services as ID; | ||
| } | ||
| /** | ||
| * 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() | ||
| * }) | ||
| */ | ||
| async destroy(): Promise<void> { | ||
| this.shutdownPromise = | ||
| this.shutdownPromise || | ||
| Promise.all( | ||
| [...this._silosContexts].map(async (siloContext) => { | ||
| const $dispose = (await siloContext.servicesDescriptors.get(DISPOSE)) | ||
| ?.service as Disposer; | ||
| return $dispose(); | ||
| }), | ||
| ).then(() => undefined); | ||
| debug('Shutting down Knifecycle instance.'); | ||
| return this.shutdownPromise; | ||
| _getInitializer( | ||
| serviceName: ServiceName, | ||
| ): Initializer<unknown, Dependencies> | undefined { | ||
| return this._initializersStates[serviceName]?.initializer; | ||
| } | ||
| /** | ||
| * Initialize or return a service descriptor | ||
| * @param {Object} siloContext | ||
| * Current execution silo context | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependencies on the fly loading | ||
| * @param {String} serviceProvider | ||
| * Service provider. | ||
| * @return {Promise} | ||
| * Service descriptor promise. | ||
| */ | ||
| async _getServiceDescriptor( | ||
| siloContext: SiloContext<unknown>, | ||
| _getServiceProvider( | ||
| siloContext: SiloContext, | ||
| serviceName: ServiceName, | ||
| { | ||
| injectorContext, | ||
| autoloading, | ||
| }: { injectorContext: boolean; autoloading: boolean }, | ||
| ): Promise<Provider<unknown>> { | ||
| // Try to get service descriptior early from the silo context | ||
| let serviceDescriptorPromise = | ||
| siloContext.servicesDescriptors.get(serviceName); | ||
| if (serviceDescriptorPromise) { | ||
| if (autoloading) { | ||
| debug( | ||
| `⚠️ - Possible dead lock due to reusing "${serviceName}" from the silo context while autoloading.`, | ||
| ); | ||
| } | ||
| return serviceDescriptorPromise; | ||
| ): Provider<unknown> | typeof NO_PROVIDER | undefined { | ||
| const initializerState = this._initializersStates[serviceName]; | ||
| // This method expect the initialized to have a state | ||
| // so failing early if not to avoid programming errors | ||
| if (!initializerState) { | ||
| throw new YError('E_UNEXPECTED_SERVICE_READ'); | ||
| } | ||
| if ('initializer' in initializerState) { | ||
| if ('singletonProvider' in initializerState) { | ||
| const provider = initializerState.singletonProvider; | ||
| const initializer = await this._findInitializer(siloContext, serviceName, { | ||
| injectorContext, | ||
| autoloading, | ||
| }); | ||
| if (provider) { | ||
| return provider; | ||
| } | ||
| } | ||
| serviceDescriptorPromise = this._pickupSingletonServiceDescriptorPromise( | ||
| serviceName, | ||
| ) as Promise<Provider<unknown>>; | ||
| if ( | ||
| 'silosInstances' in initializerState && | ||
| initializerState.silosInstances && | ||
| initializerState.silosInstances[siloContext.index] && | ||
| 'provider' in initializerState.silosInstances[siloContext.index] | ||
| ) { | ||
| const provider = | ||
| initializerState.silosInstances[siloContext.index].provider; | ||
| if (serviceDescriptorPromise as Promise<Provider<unknown>> | undefined) { | ||
| if (autoloading) { | ||
| debug( | ||
| `⚠️ - Possible dead lock due to reusing the singleton "${serviceName}" while autoloading.`, | ||
| ); | ||
| if (provider) { | ||
| return provider; | ||
| } | ||
| } | ||
| (this._singletonsServicesHandles.get(serviceName) as Set<string>).add( | ||
| siloContext.name, | ||
| ); | ||
| } else { | ||
| serviceDescriptorPromise = | ||
| siloContext.servicesDescriptors.get(serviceName); | ||
| } | ||
| if (serviceDescriptorPromise) { | ||
| return serviceDescriptorPromise; | ||
| } | ||
| return; | ||
| } | ||
| // The $injector service is mainly intended to be used as a workaround | ||
| // for unavoidable circular dependencies. It rarely make sense to | ||
| // instanciate new services at this level so printing a warning for | ||
| // debug purposes | ||
| if (injectorContext) { | ||
| debug( | ||
| 'Warning: Instantiating a new service via the $injector. It may' + | ||
| ' mean that you no longer need it if your worked around a circular' + | ||
| ' dependency.', | ||
| ); | ||
| } | ||
| serviceDescriptorPromise = this._initializeServiceDescriptor( | ||
| siloContext, | ||
| serviceName, | ||
| initializer, | ||
| { | ||
| autoloading: autoloading || AUTOLOAD === serviceName, | ||
| injectorContext, | ||
| }, | ||
| async _loadInitializerDependencies( | ||
| siloContext: SiloContext, | ||
| parentsNames: ServiceName[], | ||
| dependenciesDeclarations: DependencyDeclaration[], | ||
| additionalDeclarations: DependencyDeclaration[], | ||
| ): Promise<Dependencies> { | ||
| debug( | ||
| `${[...parentsNames].join( | ||
| '->', | ||
| )}: Gathering the dependencies (${dependenciesDeclarations.join(', ')}).`, | ||
| ); | ||
| const allDependenciesDeclarations = [ | ||
| ...new Set(dependenciesDeclarations.concat(additionalDeclarations)), | ||
| ]; | ||
| const dependencies: ServiceName[] = []; | ||
| const lackingDependencies: ServiceName[] = []; | ||
| if (initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| const handlesSet = new Set<string>(); | ||
| for (const serviceDeclaration of allDependenciesDeclarations) { | ||
| const { mappedName, optional } = | ||
| parseDependencyDeclaration(serviceDeclaration); | ||
| const initializerState = this._initializersStates[mappedName] || { | ||
| dependents: [], | ||
| autoloaded: true, | ||
| }; | ||
| handlesSet.add(siloContext.name); | ||
| this._singletonsServicesHandles.set(serviceName, handlesSet); | ||
| this._singletonsServicesDescriptors.set(serviceName, { | ||
| preloaded: false, | ||
| promise: serviceDescriptorPromise, | ||
| this._initializersStates[mappedName] = initializerState; | ||
| initializerState.dependents.push({ | ||
| silo: siloContext.index, | ||
| name: parentsNames[parentsNames.length - 1], | ||
| optional, | ||
| }); | ||
| } else { | ||
| siloContext.servicesDescriptors.set( | ||
| serviceName, | ||
| serviceDescriptorPromise, | ||
| ); | ||
| } | ||
| // Since the autoloader is a bit special it must be pushed here | ||
| if (AUTOLOAD === serviceName) { | ||
| siloContext.servicesSequence.unshift([AUTOLOAD]); | ||
| } | ||
| return serviceDescriptorPromise; | ||
| } | ||
| async _findInitializer( | ||
| siloContext: SiloContext<unknown>, | ||
| serviceName: ServiceName, | ||
| { | ||
| injectorContext, | ||
| autoloading, | ||
| }: { injectorContext: boolean; autoloading: boolean }, | ||
| ): Promise<ProviderInitializer<Record<string, unknown>, unknown>> { | ||
| const initializer = this._initializers.get(serviceName); | ||
| if (initializer) { | ||
| return initializer; | ||
| dependencies.push(mappedName); | ||
| } | ||
| // The auto loader must only have static dependencies | ||
| // and we have to do this check here to avoid caching | ||
| // non-autoloading request and then be blocked by an | ||
| // autoloader dep that waits for that cached load | ||
| if (autoloading) { | ||
| throw new YError(E_AUTOLOADER_DYNAMIC_DEPENDENCY, serviceName); | ||
| } | ||
| do { | ||
| const previouslyLackingDependencies = [...lackingDependencies]; | ||
| debug('No service provider:', serviceName); | ||
| lackingDependencies.length = 0; | ||
| let initializerPromise = this._initializerResolvers.get(serviceName); | ||
| for (const mappedName of dependencies) { | ||
| if (!this._getServiceProvider(siloContext, mappedName)) { | ||
| lackingDependencies.push(mappedName); | ||
| if (!siloContext.loadingServices.includes(mappedName)) { | ||
| siloContext.loadingServices.push(mappedName); | ||
| } | ||
| } | ||
| } | ||
| if (initializerPromise) { | ||
| return await initializerPromise; | ||
| } | ||
| initializerPromise = (async () => { | ||
| if (!this._initializers.get(AUTOLOAD)) { | ||
| throw new YError(E_UNMATCHED_DEPENDENCY, serviceName); | ||
| } | ||
| debug(`Loading the $autoload service to lookup for: ${serviceName}.`); | ||
| try { | ||
| const autoloadingDescriptor = (await this._getServiceDescriptor( | ||
| if (lackingDependencies.length) { | ||
| await this._resolveDependencies( | ||
| siloContext, | ||
| AUTOLOAD, | ||
| { injectorContext, autoloading: true }, | ||
| )) as Provider< | ||
| Autoloader<Initializer<unknown, Record<string, unknown>>> | ||
| >; | ||
| const { initializer, path } = await autoloadingDescriptor.service( | ||
| serviceName, | ||
| lackingDependencies, | ||
| parentsNames, | ||
| ); | ||
| } | ||
| const loadSequence = previouslyLackingDependencies.filter( | ||
| (previouslyLackingDependency) => | ||
| !lackingDependencies.includes(previouslyLackingDependency), | ||
| ); | ||
| if ( | ||
| typeof initializer !== 'function' && | ||
| (typeof initializer !== 'object' || | ||
| initializer[SPECIAL_PROPS.TYPE] !== 'constant') | ||
| ) { | ||
| if (loadSequence.length) { | ||
| siloContext.loadingSequences.push(loadSequence); | ||
| } | ||
| } while (lackingDependencies.length); | ||
| return dependenciesDeclarations.reduce( | ||
| (finalHash, dependencyDeclaration) => { | ||
| const { serviceName, mappedName, optional } = | ||
| parseDependencyDeclaration(dependencyDeclaration); | ||
| const provider = this._getServiceProvider(siloContext, mappedName); | ||
| // We expect a provider here since everything | ||
| // should be resolved | ||
| if (!provider) { | ||
| throw new YError( | ||
| E_BAD_AUTOLOADED_INITIALIZER, | ||
| 'E_UNEXPECTED_PROVIDER_STATE', | ||
| serviceName, | ||
| initializer, | ||
| parentsNames, | ||
| ); | ||
| } | ||
| if (initializer[SPECIAL_PROPS.NAME] !== serviceName) { | ||
| if (!optional && provider === NO_PROVIDER) { | ||
| throw new YError( | ||
| E_AUTOLOADED_INITIALIZER_MISMATCH, | ||
| 'E_UNMATCHED_DEPENDENCY', | ||
| ...parentsNames, | ||
| serviceName, | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ); | ||
| } | ||
| debug(`Loaded the ${serviceName} initializer at path ${path}.`); | ||
| this.register(initializer); | ||
| this._initializerResolvers.delete(serviceName); | ||
| // Here we need to pick-up the registered initializer to | ||
| // have a universally usable intitializer | ||
| return this._initializers.get(serviceName); | ||
| } catch (err) { | ||
| debug(`Could not load ${serviceName} via the auto loader.`); | ||
| throw err; | ||
| } | ||
| })() as Promise<ProviderInitializer<Record<string, unknown>, unknown>>; | ||
| if (provider === NO_PROVIDER) { | ||
| debug( | ||
| `${[...parentsNames, serviceName].join( | ||
| '->', | ||
| )}: Optional dependency not found.`, | ||
| ); | ||
| } | ||
| this._initializerResolvers.set( | ||
| serviceName, | ||
| initializerPromise as Promise< | ||
| ProviderInitializer<Record<string, unknown>, unknown> | ||
| >, | ||
| finalHash[serviceName] = (provider as Provider<unknown>).service; | ||
| return finalHash; | ||
| }, | ||
| {}, | ||
| ); | ||
| return await (initializerPromise as Promise< | ||
| ProviderInitializer<Record<string, unknown>, unknown> | ||
| >); | ||
| } | ||
| _pickupSingletonServiceDescriptorPromise( | ||
| async _loadProvider( | ||
| siloContext: SiloContext, | ||
| serviceName: ServiceName, | ||
| ): Promise<Provider<unknown>> | void { | ||
| const serviceDescriptor = | ||
| this._singletonsServicesDescriptors.get(serviceName); | ||
| parentsNames: ServiceName[], | ||
| ): Promise<void> { | ||
| debug( | ||
| `${[...parentsNames, serviceName].join('->')}: Loading the provider...`, | ||
| ); | ||
| if (!serviceDescriptor) { | ||
| const initializerState = this._initializersStates[serviceName]; | ||
| if (!('initializer' in initializerState) || !initializerState.initializer) { | ||
| // At that point there should be an initialiser property | ||
| throw new YError('E_UNEXPECTED_INITIALIZER_STATE', serviceName); | ||
| } | ||
| const services = await this._loadInitializerDependencies( | ||
| siloContext, | ||
| [...parentsNames, serviceName], | ||
| initializerState.initializer[SPECIAL_PROPS.INJECT], | ||
| [], | ||
| ); | ||
| let providerPromise: Promise<Provider<unknown>>; | ||
| if (initializerState.initializer[SPECIAL_PROPS.TYPE] === 'service') { | ||
| const servicePromise = ( | ||
| initializerState.initializer as ServiceInitializer< | ||
| Dependencies, | ||
| Service | ||
| > | ||
| )(services); | ||
| if (!servicePromise || !servicePromise.then) { | ||
| debug('Service initializer did not return a promise:', serviceName); | ||
| throw new YError('E_BAD_SERVICE_PROMISE', serviceName); | ||
| } | ||
| providerPromise = servicePromise.then((service) => ({ service })); | ||
| } else if ( | ||
| initializerState.initializer[SPECIAL_PROPS.TYPE] === 'provider' | ||
| ) { | ||
| providerPromise = ( | ||
| initializerState.initializer as ProviderInitializer< | ||
| Dependencies, | ||
| Service | ||
| > | ||
| )(services); | ||
| if (!providerPromise || !providerPromise.then) { | ||
| debug('Provider initializer did not return a promise:', serviceName); | ||
| throw new YError('E_BAD_SERVICE_PROVIDER', serviceName); | ||
| } | ||
| } else { | ||
| providerPromise = Promise.reject( | ||
| new YError('E_UNEXPECTED_STATE', serviceName, initializer), | ||
| ); | ||
| } | ||
| if (initializerState.initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| ( | ||
| initializerState as SingletonInitializerStateDescriptor<any, any> | ||
| ).singletonProviderLoadPromise = | ||
| providerPromise as unknown as Promise<void>; | ||
| } else { | ||
| ( | ||
| initializerState as SiloedInitializerStateDescriptor<any, any> | ||
| ).silosInstances[siloContext.index] = { | ||
| providerLoadPromise: providerPromise as unknown as Promise<void>, | ||
| }; | ||
| } | ||
| const provider = await providerPromise; | ||
| if ( | ||
| !provider || | ||
| !(typeof provider === 'object') || | ||
| !('service' in provider) | ||
| ) { | ||
| debug('Provider has no `service` property:', serviceName); | ||
| throw new YError('E_BAD_SERVICE_PROVIDER', serviceName); | ||
| } | ||
| if (provider.fatalErrorPromise) { | ||
| debug('Registering service descriptor error promise:', serviceName); | ||
| siloContext.errorsPromises.push(provider.fatalErrorPromise); | ||
| } | ||
| if (initializerState.initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| ( | ||
| initializerState as SingletonInitializerStateDescriptor<any, any> | ||
| ).singletonProvider = provider; | ||
| } else { | ||
| ( | ||
| initializerState as SiloedInitializerStateDescriptor<any, any> | ||
| ).silosInstances[siloContext.index] = { provider }; | ||
| } | ||
| } | ||
| async _getAutoloader( | ||
| siloContext: SiloContext, | ||
| parentsNames: ServiceName[], | ||
| ): Promise< | ||
| Autoloader<Initializer<unknown, Dependencies<unknown>>> | undefined | ||
| > { | ||
| // The auto loader must only have static dependencies | ||
| // and we have to do this check here to avoid inifinite loop | ||
| if (parentsNames.includes(AUTOLOAD)) { | ||
| debug( | ||
| `${parentsNames.join( | ||
| '->', | ||
| )}: Won't try to autoload autoloader dependencies...`, | ||
| ); | ||
| return; | ||
| } | ||
| serviceDescriptor.preloaded = false; | ||
| const autoloaderState: SingletonInitializerStateDescriptor<any, any> = | ||
| this._initializersStates[AUTOLOAD]; | ||
| return serviceDescriptor.promise; | ||
| if (!autoloaderState) { | ||
| return; | ||
| } | ||
| if (!('singletonProviderLoadPromise' in autoloaderState)) { | ||
| debug(`${parentsNames.join('->')}: Instanciating the autoloader...`); | ||
| // Trick to ensure the singletonProviderLoadPromise is set | ||
| let resolveAutoloder; | ||
| autoloaderState.singletonProviderLoadPromise = new Promise((_resolve) => { | ||
| resolveAutoloder = _resolve; | ||
| }); | ||
| resolveAutoloder( | ||
| await this._loadProvider(siloContext, AUTOLOAD, parentsNames), | ||
| ); | ||
| } | ||
| await autoloaderState.singletonProviderLoadPromise; | ||
| const autoloader = (await this._getServiceProvider( | ||
| siloContext, | ||
| AUTOLOAD, | ||
| )) as Provider<Autoloader<any>>; | ||
| debug(`${parentsNames.join('->')}: Loaded the autoloader...`); | ||
| if (!autoloader) { | ||
| throw new YError('E_UNEXPECTED_AUTOLOADER'); | ||
| } | ||
| return autoloader.service; | ||
| } | ||
| /** | ||
| * Initialize a service descriptor | ||
| * @param {Object} siloContext | ||
| * Current execution silo context | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependendencies on the fly loading. | ||
| * @return {Promise} | ||
| * Service dependencies hash promise. | ||
| */ | ||
| async _initializeServiceDescriptor( | ||
| siloContext: SiloContext<unknown>, | ||
| async _loadInitializer( | ||
| siloContext: SiloContext, | ||
| serviceName: ServiceName, | ||
| initializer: ProviderInitializer<Record<string, unknown>, unknown>, | ||
| { | ||
| autoloading, | ||
| injectorContext, | ||
| }: { autoloading: boolean; injectorContext: boolean }, | ||
| ): Promise<Provider<unknown>> { | ||
| let serviceDescriptor: Provider<unknown>; | ||
| parentsNames: ServiceName[], | ||
| ): Promise<void> { | ||
| const initializerState = this._initializersStates[serviceName]; | ||
| debug('Initializing a service descriptor:', serviceName); | ||
| debug( | ||
| `${[...parentsNames, serviceName].join('->')}: Loading an initializer...`, | ||
| ); | ||
| try { | ||
| // A singleton service may use a reserved resource | ||
| // like a TCP socket. This is why we have to be aware | ||
| // of singleton services full shutdown before creating | ||
| // a new one | ||
| // At that point there should be an initialiser state | ||
| if (!initializerState) { | ||
| throw new YError('E_UNEXPECTED_INITIALIZER_STATE', serviceName); | ||
| } | ||
| await (this._singletonsServicesShutdownsPromises.get(serviceName) || | ||
| Promise.resolve()); | ||
| // Anyway delete any shutdown promise before instanciating | ||
| // a new service | ||
| this._singletonsServicesShutdownsPromises.delete(serviceName); | ||
| siloContext.servicesShutdownsPromises.delete(serviceName); | ||
| const servicesHash = await this._initializeDependencies( | ||
| siloContext, | ||
| serviceName, | ||
| initializer[SPECIAL_PROPS.INJECT], | ||
| { injectorContext, autoloading }, | ||
| // When no initializer try to autoload it | ||
| if (!('initializer' in initializerState)) { | ||
| debug( | ||
| `${[...parentsNames, serviceName].join( | ||
| '->', | ||
| )}: No registered initializer...`, | ||
| ); | ||
| debug('Successfully gathered service dependencies:', serviceName); | ||
| if (initializerState.initializerLoadPromise) { | ||
| debug( | ||
| `${[...parentsNames, serviceName].join( | ||
| '->', | ||
| )}: Wait for pending initializer registration...`, | ||
| ); | ||
| await initializerState.initializerLoadPromise; | ||
| } else { | ||
| debug( | ||
| `${[...parentsNames, serviceName].join( | ||
| '->', | ||
| )}: Try to autoload the initializer...`, | ||
| ); | ||
| serviceDescriptor = await initializer( | ||
| initializer[SPECIAL_PROPS.INJECT].reduce( | ||
| (finalHash, dependencyDeclaration) => { | ||
| const { serviceName, mappedName } = parseDependencyDeclaration( | ||
| dependencyDeclaration, | ||
| ); | ||
| initializerState.autoloaded = true; | ||
| finalHash[serviceName] = servicesHash[mappedName]; | ||
| return finalHash; | ||
| // Trick to ensure the singletonProviderLoadPromise is set | ||
| let resolveInitializer, rejectInitializer; | ||
| initializerState.initializerLoadPromise = new Promise( | ||
| (_resolve, _reject) => { | ||
| resolveInitializer = _resolve; | ||
| rejectInitializer = _reject; | ||
| }, | ||
| {}, | ||
| ), | ||
| ); | ||
| ); | ||
| if (!serviceDescriptor) { | ||
| debug('Provider did not return a descriptor:', serviceName); | ||
| return Promise.reject(new YError(E_BAD_SERVICE_PROVIDER, serviceName)); | ||
| try { | ||
| const autoloader = await this._getAutoloader(siloContext, [ | ||
| ...parentsNames, | ||
| serviceName, | ||
| ]); | ||
| if (!autoloader) { | ||
| debug( | ||
| `${parentsNames.join( | ||
| '->', | ||
| )}: No autoloader found, leaving initializer undefined...`, | ||
| ); | ||
| initializerState.initializer = undefined; | ||
| resolveInitializer(undefined); | ||
| return; | ||
| } | ||
| const result = await autoloader(serviceName); | ||
| if ( | ||
| typeof result !== 'object' || | ||
| !('initializer' in result) || | ||
| !('path' in result) | ||
| ) { | ||
| throw new YError('E_BAD_AUTOLOADER_RESULT', serviceName, result); | ||
| } | ||
| const { initializer, path } = result; | ||
| debug( | ||
| `${[...parentsNames, serviceName].join( | ||
| '->', | ||
| )}: Loaded the initializer at path ${path}...`, | ||
| ); | ||
| if (initializer[SPECIAL_PROPS.NAME] !== serviceName) { | ||
| throw new YError( | ||
| 'E_AUTOLOADED_INITIALIZER_MISMATCH', | ||
| serviceName, | ||
| initializer[SPECIAL_PROPS.NAME], | ||
| ); | ||
| } | ||
| initializerState.dependents.push({ | ||
| silo: siloContext.index, | ||
| name: AUTOLOAD, | ||
| optional: false, | ||
| }); | ||
| initializerState.initializer = initializer; | ||
| this._buildInitializerState(initializerState, initializer); | ||
| resolveInitializer(initializer); | ||
| return; | ||
| } catch (err) { | ||
| if ((err as YError).code === 'E_AULOADER_DEPENDS_ON_AUTOLOAD') { | ||
| initializerState.initializer = undefined; | ||
| rejectInitializer(err); | ||
| await initializerState.initializerLoadPromise; | ||
| return; | ||
| } | ||
| if (!['E_UNMATCHED_DEPENDENCY'].includes((err as YError).code)) { | ||
| initializerState.initializer = undefined; | ||
| rejectInitializer( | ||
| YError.wrap( | ||
| err as Error, | ||
| 'E_BAD_AUTOLOADED_INITIALIZER', | ||
| serviceName, | ||
| ), | ||
| ); | ||
| await initializerState.initializerLoadPromise; | ||
| return; | ||
| } | ||
| debug( | ||
| `${[...parentsNames, serviceName].join( | ||
| '->', | ||
| )}: Could not autoload the initializer...`, | ||
| err, | ||
| ); | ||
| initializerState.initializer = undefined; | ||
| resolveInitializer(undefined); | ||
| await initializerState.initializerLoadPromise; | ||
| } | ||
| return; | ||
| } | ||
| debug('Successfully initialized a service descriptor:', serviceName); | ||
| if (serviceDescriptor.fatalErrorPromise) { | ||
| debug('Registering service descriptor error promise:', serviceName); | ||
| siloContext.errorsPromises.push(serviceDescriptor.fatalErrorPromise); | ||
| } | ||
| siloContext.servicesDescriptors.set( | ||
| serviceName, | ||
| Promise.resolve(serviceDescriptor), | ||
| ); | ||
| } catch (err) { | ||
| debug( | ||
| 'Error initializing a service descriptor:', | ||
| serviceName, | ||
| (err as Error).stack || 'no_stack_trace', | ||
| ); | ||
| if (E_UNMATCHED_DEPENDENCY === (err as YError).code) { | ||
| throw YError.wrap( | ||
| err as Error, | ||
| E_UNMATCHED_DEPENDENCY, | ||
| ...[serviceName].concat((err as YError).params), | ||
| } else { | ||
| if (initializerState.initializer) { | ||
| debug( | ||
| `${[...parentsNames, serviceName].join('->')}: Initializer ready...`, | ||
| ); | ||
| if (initializer[SPECIAL_PROPS.TYPE] === 'constant') { | ||
| const provider = initializerState.initializer[SPECIAL_PROPS.VALUE]; | ||
| ( | ||
| initializerState as SingletonInitializerStateDescriptor<any, any> | ||
| ).singletonProvider = provider; | ||
| ( | ||
| initializerState as SingletonInitializerStateDescriptor<any, any> | ||
| ).singletonProviderLoadPromise = Promise.resolve(provider); | ||
| } | ||
| if (initializerState.initializer[SPECIAL_PROPS.SINGLETON]) { | ||
| const singletonInitializerState = | ||
| initializerState as SingletonInitializerStateDescriptor<any, any>; | ||
| if (!('singletonProviderLoadPromise' in singletonInitializerState)) { | ||
| singletonInitializerState.singletonProviderLoadPromise = | ||
| this._loadProvider(siloContext, serviceName, parentsNames); | ||
| } | ||
| await singletonInitializerState.singletonProviderLoadPromise; | ||
| } else { | ||
| const siloedInitializerState = | ||
| initializerState as SiloedInitializerStateDescriptor<any, any>; | ||
| if (!siloedInitializerState.silosInstances[siloContext.index]) { | ||
| siloedInitializerState.silosInstances[siloContext.index] = { | ||
| providerLoadPromise: this._loadProvider( | ||
| siloContext, | ||
| serviceName, | ||
| parentsNames, | ||
| ), | ||
| }; | ||
| } | ||
| await siloedInitializerState.silosInstances[siloContext.index] | ||
| .providerLoadPromise; | ||
| } | ||
| } else { | ||
| debug( | ||
| `${[...parentsNames, serviceName].join( | ||
| '->', | ||
| )}: Could not find the initializer...`, | ||
| ); | ||
| initializerState.initializer = undefined; | ||
| ( | ||
| initializerState as SingletonInitializerStateDescriptor<any, any> | ||
| ).singletonProvider = NO_PROVIDER; | ||
| } | ||
| throw err; | ||
| } | ||
| return serviceDescriptor; | ||
| } | ||
| async _resolveDependencies( | ||
| siloContext: SiloContext, | ||
| loadingServices: ServiceName[], | ||
| parentsNames: ServiceName[], | ||
| ): Promise<void> { | ||
| debug( | ||
| `Initiating a dependencies load round for silo "${siloContext.index}"'.`, | ||
| ); | ||
| if (this._options.sequential) { | ||
| for (const loadingService of loadingServices) { | ||
| await this._loadInitializer(siloContext, loadingService, parentsNames); | ||
| } | ||
| } else { | ||
| await Promise.all( | ||
| loadingServices.map((loadingService) => | ||
| this._loadInitializer(siloContext, loadingService, parentsNames), | ||
| ), | ||
| ); | ||
| } | ||
| } | ||
| /** | ||
| * Initialize a service dependencies | ||
| * @param {Object} siloContext | ||
| * Current execution silo siloContext | ||
| * @param {String} serviceName | ||
| * Service name. | ||
| * @param {String} servicesDeclarations | ||
| * Dependencies declarations. | ||
| * @param {Object} options | ||
| * Options for service retrieval | ||
| * @param {Boolean} options.injectorContext | ||
| * Flag indicating the injection were initiated by the $injector | ||
| * @param {Boolean} options.autoloading | ||
| * Flag to indicating $autoload dependendencies on the fly loading. | ||
| * Destroy the Knifecycle instance | ||
| * @return {Promise} | ||
| * Service dependencies hash 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() | ||
| * }) | ||
| */ | ||
| async _initializeDependencies( | ||
| siloContext: SiloContext<unknown>, | ||
| serviceName: ServiceName, | ||
| servicesDeclarations: DependencyDeclaration[], | ||
| { | ||
| injectorContext = false, | ||
| autoloading = false, | ||
| }: { autoloading: boolean; injectorContext: boolean }, | ||
| ): Promise<Dependencies> { | ||
| debug('Initializing dependencies:', serviceName, servicesDeclarations); | ||
| const servicesDescriptors: (Provider<unknown> | undefined)[] = | ||
| await Promise.all( | ||
| servicesDeclarations.map(async (serviceDeclaration) => { | ||
| const { mappedName, optional } = | ||
| parseDependencyDeclaration(serviceDeclaration); | ||
| async destroy(): Promise<void> { | ||
| this._shutdownPromise = | ||
| this._shutdownPromise || | ||
| Promise.all( | ||
| Object.keys(this._silosContexts).map(async (siloIndex) => { | ||
| const siloContext = this._silosContexts[siloIndex]; | ||
| const $dispose = ( | ||
| (await this._getServiceProvider( | ||
| siloContext, | ||
| DISPOSE, | ||
| )) as Provider<Disposer> | ||
| )?.service; | ||
| try { | ||
| const serviceDescriptor = await this._getServiceDescriptor( | ||
| siloContext, | ||
| mappedName, | ||
| { | ||
| injectorContext, | ||
| autoloading, | ||
| }, | ||
| ); | ||
| return serviceDescriptor; | ||
| } catch (err) { | ||
| if ( | ||
| optional && | ||
| [ | ||
| 'E_UNMATCHED_DEPENDENCY', | ||
| E_AUTOLOADER_DYNAMIC_DEPENDENCY, | ||
| ].includes((err as YError).code) | ||
| ) { | ||
| debug( | ||
| 'Optional dependency not found:', | ||
| serviceDeclaration, | ||
| (err as Error).stack || 'no_stack_trace', | ||
| ); | ||
| return; | ||
| } | ||
| throw err; | ||
| } | ||
| return $dispose(); | ||
| }), | ||
| ); | ||
| debug( | ||
| 'Initialized dependencies descriptors:', | ||
| serviceName, | ||
| servicesDeclarations, | ||
| servicesDescriptors, | ||
| ); | ||
| siloContext.servicesSequence.push( | ||
| servicesDeclarations | ||
| .filter((_, index) => servicesDescriptors[index]) | ||
| .map(_pickMappedNameFromDeclaration), | ||
| ); | ||
| ).then(() => undefined); | ||
| const services = await Promise.all( | ||
| servicesDescriptors.map(async (serviceDescriptor) => { | ||
| if (!serviceDescriptor) { | ||
| return undefined; | ||
| } | ||
| return serviceDescriptor.service; | ||
| }), | ||
| ); | ||
| debug('Shutting down Knifecycle instance.'); | ||
| return services.reduce<Record<string, unknown>>((hash, service, index) => { | ||
| const mappedName = _pickMappedNameFromDeclaration( | ||
| servicesDeclarations[index], | ||
| ); | ||
| hash[mappedName] = service; | ||
| return hash; | ||
| }, {}); | ||
| return this._shutdownPromise; | ||
| } | ||
@@ -1213,10 +1481,2 @@ } | ||
| function _pickMappedNameFromDeclaration( | ||
| dependencyDeclaration: DependencyDeclaration, | ||
| ): ServiceName { | ||
| const { mappedName } = parseDependencyDeclaration(dependencyDeclaration); | ||
| return mappedName; | ||
| } | ||
| function _applyShapes(shapes, serviceName) { | ||
@@ -1276,3 +1536,3 @@ return shapes.reduce((shapedService, shape) => { | ||
| if (!classes[style.className]) { | ||
| throw new YError(E_BAD_CLASS, style.className, serviceName); | ||
| throw new YError('E_BAD_CLASS', style.className, serviceName); | ||
| } | ||
@@ -1286,3 +1546,3 @@ classesApplications[serviceName] = style.className; | ||
| if (!classes[style.className]) { | ||
| throw new YError(E_BAD_CLASS, style.className, dependedServiceName); | ||
| throw new YError('E_BAD_CLASS', style.className, dependedServiceName); | ||
| } | ||
@@ -1294,34 +1554,1 @@ classesApplications[dependedServiceName] = style.className; | ||
| } | ||
| function serviceAdapter< | ||
| S, | ||
| T extends ServiceInitializer<Record<string, unknown>, S>, | ||
| >( | ||
| serviceName: ServiceName, | ||
| initializer: T, | ||
| dependenciesHash: T extends ServiceInitializer<infer D, unknown> ? D : never, | ||
| ): Promise<Provider<S>> { | ||
| const servicePromise = initializer(dependenciesHash); | ||
| if (!servicePromise || !servicePromise.then) { | ||
| throw new YError(E_BAD_SERVICE_PROMISE, serviceName); | ||
| } | ||
| return servicePromise.then((_service_) => ({ | ||
| service: _service_, | ||
| })); | ||
| } | ||
| function _buildFinalHash( | ||
| servicesHash: { [name: string]: unknown }, | ||
| dependenciesDeclarations: DependencyDeclaration[], | ||
| ): { [name: string]: unknown } { | ||
| return dependenciesDeclarations.reduce((finalHash, dependencyDeclaration) => { | ||
| const { serviceName, mappedName } = parseDependencyDeclaration( | ||
| dependencyDeclaration, | ||
| ); | ||
| finalHash[serviceName] = servicesHash[mappedName]; | ||
| return finalHash; | ||
| }, {}); | ||
| } |
+2
-0
@@ -0,1 +1,3 @@ | ||
| /* eslint-disable @typescript-eslint/no-unused-vars */ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| import { describe, test } from '@jest/globals'; | ||
@@ -2,0 +4,0 @@ import assert from 'assert'; |
+1
-0
@@ -0,1 +1,2 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint @typescript-eslint/ban-types:0 */ | ||
@@ -2,0 +3,0 @@ |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
605273
8.27%10725
8.37%858
-5.19%20
42.86%+ Added
- Removed
Updated