@chubbyts/chubbyts-dic-config
Version:
Dependency injection container creation by config, inspired by laminas-config.
58 lines (57 loc) • 2.15 kB
JavaScript
import { createContainer, createParameter } from '@chubbyts/chubbyts-dic/dist/container';
const addServices = (concreteContainer, services) => {
services.forEach((service, name) => {
concreteContainer.set(name, () => {
return service;
});
});
};
const addFactories = (concreteContainer, factories) => {
factories.forEach((factory, name) => {
concreteContainer.set(name, (container) => {
return factory(container, name);
});
});
};
const addAliases = (concreteContainer, aliases) => {
aliases.forEach((target, name) => {
concreteContainer.set(name, (container) => {
return container.get(target);
});
});
};
const addDelegators = (concreteContainer, delegators, services, aliases) => {
delegators.forEach((delegatorList, name) => {
if (services.has(name) || aliases.get(name)) {
return;
}
delegatorList.forEach((delegator) => {
concreteContainer.set(name, (container, previous) => {
if (!previous) {
throw new Error('Missing previous');
}
return delegator(container, name, () => {
return previous(container);
});
});
});
});
};
export const createContainerByConfigFactory = (config) => {
return (concreteContainer = createContainer()) => {
concreteContainer.set('config', createParameter(config));
const dependencies = config.dependencies;
if (undefined === dependencies) {
return concreteContainer;
}
const services = dependencies.services || new Map();
const factories = dependencies.factories || new Map();
const aliases = dependencies.aliases || new Map();
const delegators = dependencies.delegators || new Map();
addServices(concreteContainer, services);
addFactories(concreteContainer, factories);
addAliases(concreteContainer, aliases);
addDelegators(concreteContainer, delegators, services, aliases);
return concreteContainer;
};
};