Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

knifecycle

Package Overview
Dependencies
Maintainers
1
Versions
116
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

knifecycle - npm Package Compare versions

Comparing version
15.0.1
to
16.0.0
+9
-0
CHANGELOG.md

@@ -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":"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"}
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}

@@ -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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"}

@@ -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, };

@@ -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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"}

@@ -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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"}

@@ -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 +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":"AAAA,uDAAuD;AACvD,2CAA2C;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,SAAS,MAAM,OAAO,CAAC;AAE9B,MAAM,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;EAqBE;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,UAAU;IACV,SAAS;IACT,UAAU;CACF,CAAC;AAwHX,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,GAAG,oBAAoB,MAAM;IACnC,IAAI,EAAE,GAAG,oBAAoB,MAAM;IACnC,MAAM,EAAE,GAAG,oBAAoB,QAAQ;IACvC,SAAS,EAAE,GAAG,oBAAoB,WAAW;IAC7C,KAAK,EAAE,GAAG,oBAAoB,OAAO;IACrC,KAAK,EAAE,GAAG,oBAAoB,OAAO;CACtC,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CACjE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAC5B,CAAC;AAEF,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAC5D,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAEpD,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,OAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAC1B,uFAAuF,CACxF,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE;QACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;YAC9B,MAAM,IAAI,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;SACrD;QACD,IACE,OAAO;YACP,OAAO,CAAC,UAAU;YAClB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,EACnE;YACA,OAAO,EAAE,CAAC;SACX;QACD,MAAM,IAAI,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;KACtD;IAED,OAAO,OAAO,CAAC,CAAC,CAAC;SACd,IAAI,EAAE;SACN,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SACnC,GAAG,CACF,CAAC,SAAS,EAAE,EAAE,CACZ,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAC1E;SACA,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAmB;IAClD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;QACnC,MAAM,IAAI,MAAM,CAAC,uBAAuB,EAAE,OAAO,SAAS,CAAC,CAAC;KAC7D;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC,YAAY,EAAE;QACjB,MAAM,IAAI,MAAM,CAAC,uBAAuB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;KAC3D;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,YAAoB;IAC5C,OAAQ,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAa,CAAC,OAAO,CACtD,yBAAyB,EACzB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAC5B,CAAC;AACJ,CAAC;AAgCD,MAAM,UAAU,iBAAiB,CAK/B,IAEwC,EACxC,EAAwE,EACxE,QAAkE,EAAE;IAIpE,MAAM,iBAAiB,GAAI,EAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC9D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;SACvD,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,KAAK,GACT,WAAW,KAAK,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;SAC3B;aAAM,IAAI,KAAK,YAAY,MAAM,EAAE;YAClC,EAAE,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;SACrC;aAAM;YACL,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;SAClB;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAoB,EACpB,KAAQ;IAER,MAAM,6BAA6B,GACjC,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAE3D,IAAI,6BAA6B,EAAE;QACjC,MAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;KACrE;IAED,KAAK,CAAC,2CAA2C,IAAI,GAAG,CAAC,CAAC;IAE1D,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,OAAO,CACrB,cAA+C,EAC/C,IAAqB,EACrB,YAAsC,EACtC,SAAmB,EACnB,KAAyB;IAEzB,IAAI,CAAC,cAAc,EAAE;QACnB,MAAM,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAC;KAC1C;IAED,IAAI,GAAG,IAAI,IAAI,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;IACjE,YAAY,GAAG,YAAY,IAAI,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1E,SAAS;QACP,OAAO,SAAS,KAAK,WAAW;YAC9B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK;YAClD,CAAC,CAAC,SAAS,CAAC;IAChB,KAAK,GAAG,KAAK,IAAI,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAE3D,KAAK,CAAC,kDAAkD,IAAI,GAAG,CAAC,CAAC;IAEjE,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,cAAc,EAAE,cAAc,EAAE;QAC1E,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,SAAS;QAC/B,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI;QAC1B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY;QACpC,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS;QACpC,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK;KAC7B,CAA6B,CAAC;IAE/B,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,cAA+C;IAE/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,cAA0B,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,OAAO,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,UAAU,QAAQ,CACtB,eAAiD,EACjD,IAAqB,EACrB,YAAsC,EACtC,SAAmB,EACnB,KAAyB;IAEzB,IAAI,CAAC,eAAe,EAAE;QACpB,MAAM,IAAI,MAAM,CAAC,uBAAuB,CAAC,CAAC;KAC3C;IAED,IAAI,GAAG,IAAI,IAAI,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;IAClE,YAAY,GAAG,YAAY,IAAI,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3E,SAAS;QACP,OAAO,SAAS,KAAK,WAAW;YAC9B,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK;YACnD,CAAC,CAAC,SAAS,CAAC;IAChB,KAAK,GAAG,KAAK,IAAI,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAE5D,KAAK,CACH,mDAAmD,IAAI,IAAI,WAAW,GAAG,CAC1E,CAAC;IAEF,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,eAAe,EACf,eAAe,EACf;QACE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,UAAU;QAChC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI;QAC1B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY;QACpC,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS;QACpC,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK;KAC7B,CAC2B,CAAC;IAE/B,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,eAAiD;IAEjD,MAAM,IAAI,GAAG,gBAAgB,CAAC,eAA2B,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,OAAO,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAqBD,MAAM,UAAU,eAAe,CAC7B,OAA2E,EAC3E,eAAqE;IAErE,OAAO,iBAAiB,CAAC,eAAe,EAAE,KAAK,EAAE,QAAW,EAAE,EAAE;QAC9D,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAErD,OAAQ,OAA2C,CACjD,QAAQ,EACR,YAAiB,CAClB,CAAC;IACJ,CAAC,CAA6B,CAAC;AACjC,CAAC;AA2CD,MAAM,UAAU,MAAM,CACpB,YAAqC,EACrC,WAEqC;IAErC,IAAI,UAAU,KAAK,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;QAClD,MAAM,IAAI,MAAM,CACd,wBAAwB,EACxB,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAC/B,YAAY,CACb,CAAC;KACH;IAED,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,WAAW,EACX,WAAyD,EACzD;QACE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY;KACrC,CACF,CAAC;IAEF,KAAK,CAAC,2CAA2C,EAAE,YAAY,CAAC,CAAC;IAEjE,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAgCD,MAAM,UAAU,SAAS,CACvB,IAEwC,EACxC,EAA+C;IAE/C,OAAO,MAAM,CAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAgDD,MAAM,UAAU,WAAW,CAKzB,IAEwC,EACxC,EAAsE;IAItE,OAAO,UAAU,CACf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAK,EAA8B,EAC7D,EAAqC,CACtC,CAAC;AACJ,CAAC;AAuCD,MAAM,UAAU,UAAU,CACxB,WAEmC;IAEnC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO,MAAM,CACX,YAAY,EACZ,WAAyD,CAC1D,CAAC;AACJ,CAAC;AAsDD,MAAM,UAAU,UAAU,CAKxB,YAAqC,EACrC,WAEmC;IAInC,MAAM,mBAAmB,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CACvE,0BAA0B,CAC3B,CAAC;IACF,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACvE,MAAM,mBAAmB,GAA4B,mBAAmB;SACrE,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;QAC1B,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,IAAI,CACpD,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,EAAE;YACpC,OAAO,gBAAgB,KAAK,WAAW,CAAC;QAC1C,CAAC,CACF,CAAC;QAEF,OAAO,CAAC,uBAAuB,CAAC;IAClC,CAAC,CAAC;SACD,MAAM,CACL,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC9D,MAAM,oBAAoB,GACxB,QAAQ;YACR,mBAAmB,CAAC,KAAK,CACvB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,EAAE;gBAC5C,OAAO,eAAe,KAAK,UAAU,IAAI,QAAQ,CAAC;YACpD,CAAC,CACF,CAAC;QACJ,OAAO;YACL,WAAW;YACX,UAAU;YACV,QAAQ,EAAE,oBAAoB;SAC/B,CAAC;IACJ,CAAC,CAAC,CACH;SACA,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAEvC,OAAO,MAAM,CACX,mBAAmB,EACnB,WAAyD,CAC1D,CAAC;AACJ,CAAC;AA+CD,MAAM,UAAU,KAAK,CACnB,iBAAoC,EACpC,WAEmC,EACnC,KAAK,GAAG,KAAK;IAEb,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,WAAW,EACX,WAA8C,EAC9C;QACE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK;YAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CACX,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,EACtC,iBAAiB,CAClB;YACH,CAAC,CAAC,iBAAiB;KACtB,CACF,CAAC;IAEF,KAAK,CAAC,iDAAiD,EAAE,iBAAiB,CAAC,CAAC;IAE5E,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAwCD,MAAM,UAAU,SAAS,CACvB,WAEmC,EACnC,WAAW,GAAG,IAAI;IAElB,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,WAAW,EACX,WAA8C,EAC9C;QACE,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,WAAW;KACvC,CACF,CAAC;IAEF,KAAK,CAAC,qCAAqC,EAAE,WAAW,CAAC,CAAC;IAE1D,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAkCD,MAAM,UAAU,IAAI,CAClB,IAAoB,EACpB,WAEmC;IAEnC,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,WAAW,EACX,WAA8C,EAC9C;QACE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI;KAC3B,CACF,CAAC;IAEF,KAAK,CAAC,qCAAqC,EAAE,IAAI,CAAC,CAAC;IAEnD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AA2BD,MAAM,UAAU,QAAQ,CACtB,WAEmC;IAEnC,OAAO,IAAI,CACT,gBAAgB,CAAC,WAAW,CAAC,EAC7B,WAA8C,CAC/C,CAAC;AACJ,CAAC;AAwCD,MAAM,UAAU,IAAI,CAClB,IAA4B,EAC5B,WAEmC;IAEnC,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,WAAW,EACX,WAA8C,EAC9C;QACE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI;KAC3B,CACF,CAAC;IAEF,KAAK,CAAC,qCAAqC,EAAE,IAAI,CAAC,CAAC;IAEnD,OAAO,iBAAoD,CAAC;AAC9D,CAAC;AA+BD,MAAM,UAAU,WAAW,CACzB,UAA4D,EAC5D,WAEmC;IAEnC,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,WAAW,EACX,WAA8C,EAC9C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,QAAQ,EAAE,EAAE;QAC3D,MAAM,aAAa,GAAG,oBAAoB,GAAG,QAAQ,CAAC;QAEtD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YAClD,MAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;SAC9C;QACD,eAAe,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,eAAe,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CACP,CAAC;IAEF,KAAK,CAAC,yCAAyC,EAAE,UAAU,CAAC,CAAC;IAE7D,OAAO,iBAA6C,CAAC;AACvD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,OAAO,CAOrB,eAA+C,EAC/C,IAAkB,EAClB,YAAsC,EACtC,SAAmB,EACnB,KAAyB;IAEzB,IAAI,GAAG,IAAI,IAAI,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACnD,YAAY,GAAG,YAAY,IAAI,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAE3E,IAAI,CAAC,IAAI,EAAE;QACT,MAAM,IAAI,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;KACxD;IAED,OAAO,WAAW,CAChB;QACE,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,YAAY;QACpB,SAAS;QACT,KAAK;KACN,EACD,KAAK,EAAE,YAAe,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CACpE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAOzB,eAA+C;IAE/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO,WAAW,CAChB;QACE,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,YAAY;KACrB,EACD,KAAK,EAAE,YAAe,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CACpE,CAAC;AACJ,CAAC;AAED;;;;;;;;;EASE;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CACxC,qBAA4C;IAE5C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,CAChC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAClE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAE/B,OAAO;QACL,WAAW;QACX,UAAU,EAAE,UAAU,IAAI,WAAW;QACrC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,8BAA8B,CAC5C,0BAAuD;IAEvD,OAAO,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GACtD,0BAA0B,CAAC,WAC7B,GACE,0BAA0B,CAAC,UAAU;QACrC,0BAA0B,CAAC,WAAW;QACpC,CAAC,CAAC,GAAG,GAAG,0BAA0B,CAAC,UAAU;QAC7C,CAAC,CAAC,EACN,EAAE,CAAC;AACL,CAAC;AAmCD,MAAM,UAAU,2BAA2B,CACzC,WAG0B;IAE1B,IAAI,OAAO,WAAW,KAAK,UAAU,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACxE,MAAM,IAAI,MAAM,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;KACpD;IACD,MAAM,UAAU,GAAG,WAAoC,CAAC;IAExD,IACE,OAAO,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,QAAQ;QAClD,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EACrC;QACA,MAAM,IAAI,MAAM,CAAC,sBAAsB,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;KAC1E;IAED,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE;QACvE,MAAM,IAAI,MAAM,CACd,wBAAwB,EACxB,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAC/B,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAC/B,yBAAyB,CAC1B,CAAC;KACH;IAED,IACE,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,WAAW;QAC/C,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,EACrC;QACA,MAAM,IAAI,MAAM,CACd,kBAAkB,EAClB,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK,CAC9C,CAAC;KACH;IAED,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE;QACjD,IACE,WAAW;YACX,OAAQ,WAAsC,CAAC,aAAa,CAAC,KAAK,CAAC,EACnE;YACA,MAAM,IAAI,MAAM,CACd,kCAAkC,EAClC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAC/B,CAAC;SACH;QACD,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;KAC5C;SAAM;QACL,IAAI,WAAW,KAAK,OAAO,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;YAC3D,MAAM,IAAI,MAAM,CACd,uCAAuC,EACvC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAChC,CAAC;SACH;QACD,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1E,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;YACjC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;QAC/C,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC;YAC7B,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;KAChD;IAED,OAAO,WAGmB,CAAC;AAC7B,CAAC"}

@@ -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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"}

@@ -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 @@ [//]: # ( )

[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/nfroidure/knifecycle/blob/master/LICENSE)
[![Coverage Status](https://coveralls.io/repos/github/nfroidure/knifecycle/badge.svg?branch=master)](https://coveralls.io/github/nfroidure/knifecycle?branch=master)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/nfroidure/knifecycle/blob/main/LICENSE)
[![Coverage Status](https://coveralls.io/repos/github/nfroidure/knifecycle/badge.svg?branch=main)](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)

@@ -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'],
};
}
`,
);
});
});

@@ -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 @@

@@ -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;
}, {});
}

@@ -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';

@@ -0,1 +1,2 @@

/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint @typescript-eslint/ban-types:0 */

@@ -2,0 +3,0 @@