@chubbyts/chubbyts-dic
Version:
Dependency injection container (DIC), PSR-11 inspired.
54 lines (53 loc) • 1.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createParameter = exports.createContainer = void 0;
const createWrapperFactory = (newFactory, existingFactory) => {
return (container) => newFactory(container, existingFactory);
};
const createContainer = () => {
const storedFactories = new Map();
const storedServices = new Map();
const sets = (factories) => {
factories.forEach((factory, id) => {
set(id, factory);
});
};
const set = (id, factory) => {
storedServices.delete(id);
storedFactories.set(id, createWrapperFactory(factory, storedFactories.get(id)));
};
const get = (id) => {
if (!storedServices.has(id)) {
storedServices.set(id, create(id));
}
return storedServices.get(id);
};
const has = (id) => storedFactories.has(id);
const container = {
sets,
set,
get,
has,
};
const create = (id) => {
const factoryById = storedFactories.get(id);
if (!factoryById) {
throw new Error(`There is no service with id "${id}"`);
}
try {
return factoryById(container);
}
catch (e) {
const error = new Error(`Could not create service with id "${id}"`);
// eslint-disable-next-line functional/immutable-data
error.cause = e;
throw error;
}
};
return container;
};
exports.createContainer = createContainer;
const createParameter = (value) => {
return () => value;
};
exports.createParameter = createParameter;