graphql-modules
Version:
Create reusable, maintainable, testable and extendable GraphQL modules
49 lines (48 loc) • 1.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.instantiateSingletonProviders = instantiateSingletonProviders;
exports.createGlobalProvidersMap = createGlobalProvidersMap;
exports.attachGlobalProvidersMap = attachGlobalProvidersMap;
exports.duplicatedGlobalTokenError = duplicatedGlobalTokenError;
const di_1 = require("../di");
function instantiateSingletonProviders({ appInjector, modulesMap, }) {
appInjector.instantiateAll();
modulesMap.forEach((mod) => {
mod.injector.instantiateAll();
});
}
function createGlobalProvidersMap({ modules, scope, }) {
const globalProvidersMap = {};
const propType = scope === di_1.Scope.Singleton ? 'singletonProviders' : 'operationProviders';
modules.forEach((mod) => {
mod[propType].forEach((provider) => {
if (provider.factory.isGlobal) {
const key = provider.key.id;
if (globalProvidersMap[key]) {
throw duplicatedGlobalTokenError(provider, [
mod.id,
globalProvidersMap[key],
]);
}
globalProvidersMap[key] = mod.id;
}
});
});
return globalProvidersMap;
}
function attachGlobalProvidersMap({ injector, globalProvidersMap, moduleInjectorGetter, }) {
injector._globalProvidersMap = {
has(key) {
return typeof globalProvidersMap[key] === 'string';
},
get(key) {
return moduleInjectorGetter(globalProvidersMap[key]);
},
};
}
function duplicatedGlobalTokenError(provider, modules) {
return Error([
`Failed to define '${provider.key.displayName}' token as global.`,
`Token provided by two modules: '${modules.join("', '")}'`,
].join(' '));
}