UNPKG

dependency-injection-cat

Version:

DI Cat is a truly clean DI-container, which allows you not to pollute your business logic with decorators from DI/IOC libraries!

206 lines (205 loc) 15.4 kB
"use strict"; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildDependencyGraphAndFillQualifiedBeans = void 0; var BeanRepository_1 = require("../bean/BeanRepository"); var BeanDependenciesRepository_1 = require("../bean-dependencies/BeanDependenciesRepository"); var CompilationContext_1 = require("../../compilation-context/CompilationContext"); var DependencyGraph_1 = require("./DependencyGraph"); var constants_1 = require("../context/constants"); var QualifiedType_1 = require("../ts-helpers/type-qualifier/QualifiedType"); var uniqNotEmpty_1 = require("../utils/uniqNotEmpty"); var buildDependencyGraphAndFillQualifiedBeans = function (contextDescriptor) { var beansMap = BeanRepository_1.BeanRepository.beanDescriptorRepository.get(contextDescriptor.name); var beanDependenciesMap = BeanDependenciesRepository_1.BeanDependenciesRepository.getBeanDescriptorMapByContextName(contextDescriptor.name); if (!beansMap || !beanDependenciesMap) { return; } beansMap.forEach(function (beanDescriptors) { beanDescriptors.forEach(function (beanDescriptor) { var _a; var dependencies = (_a = beanDependenciesMap.get(beanDescriptor)) !== null && _a !== void 0 ? _a : []; dependencies.forEach(function (dependencyDescriptor) { var _a, _b, _c, _d, _e, _f; if (dependencyDescriptor.qualifiedType.kind === QualifiedType_1.QualifiedTypeKind.LIST) { var beansFromCurrentContext = (_a = beansMap.get(dependencyDescriptor.qualifiedType.fullTypeId)) !== null && _a !== void 0 ? _a : []; var beansFromGlobalContext = (_c = (_b = BeanRepository_1.BeanRepository.beanDescriptorRepository.get(constants_1.GLOBAL_CONTEXT_NAME)) === null || _b === void 0 ? void 0 : _b.get(dependencyDescriptor.qualifiedType.fullTypeId)) !== null && _c !== void 0 ? _c : []; var mergedBeans = __spreadArray(__spreadArray([], __read(beansFromCurrentContext), false), __read(beansFromGlobalContext), false).filter(function (it) { return it !== beanDescriptor; }); var uniqMergedBeans = (0, uniqNotEmpty_1.uniqNotEmpty)(mergedBeans); if (uniqMergedBeans.length === 0) { CompilationContext_1.CompilationContext.reportError({ node: dependencyDescriptor.node, message: 'Not found any Bean candidates for list', filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } uniqMergedBeans.forEach(function (bean) { dependencyDescriptor.qualifiedBeans.add(bean); }); DependencyGraph_1.DependencyGraph.addNodeWithEdges(beanDescriptor, uniqMergedBeans); return; } if (dependencyDescriptor.qualifiedType.kind === QualifiedType_1.QualifiedTypeKind.PLAIN) { var currentContextBeans = (_d = beansMap.get(dependencyDescriptor.qualifiedType.fullTypeId)) !== null && _d !== void 0 ? _d : []; var currentContextNonEmbeddedBeans = currentContextBeans .filter(function (it) { return it !== beanDescriptor && it.beanKind !== 'embedded'; }); var currentContextEmbeddedBeans = currentContextBeans .filter(function (it) { return it !== beanDescriptor && it.beanKind === 'embedded'; }); var globalContextBeans = ((_f = (_e = BeanRepository_1.BeanRepository.beanDescriptorRepository.get(constants_1.GLOBAL_CONTEXT_NAME)) === null || _e === void 0 ? void 0 : _e.get(dependencyDescriptor.qualifiedType.fullTypeId)) !== null && _f !== void 0 ? _f : []) .filter(function (it) { return it !== beanDescriptor; }); var nonEmbeddedBeanCandidatesFromCurrentContext = (0, uniqNotEmpty_1.uniqNotEmpty)(currentContextNonEmbeddedBeans); var embeddedBeanCandidatesFromCurrentContext = (0, uniqNotEmpty_1.uniqNotEmpty)(currentContextEmbeddedBeans); var beanCandidatesFromGlobalContext = (0, uniqNotEmpty_1.uniqNotEmpty)(globalContextBeans); if (dependencyDescriptor.qualifier !== null) { nonEmbeddedBeanCandidatesFromCurrentContext = nonEmbeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.classMemberName === dependencyDescriptor.qualifier; }); embeddedBeanCandidatesFromCurrentContext = embeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.nestedProperty === dependencyDescriptor.qualifier; }); beanCandidatesFromGlobalContext = beanCandidatesFromGlobalContext .filter(function (it) { return it.classMemberName === dependencyDescriptor.qualifier; }); } if (nonEmbeddedBeanCandidatesFromCurrentContext.length === 0 && embeddedBeanCandidatesFromCurrentContext.length === 0 && beanCandidatesFromGlobalContext.length === 0) { CompilationContext_1.CompilationContext.reportError({ node: dependencyDescriptor.node, message: 'Bean for dependency is not registered', filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } if (nonEmbeddedBeanCandidatesFromCurrentContext.length === 1) { dependencyDescriptor.qualifiedBeans.add(nonEmbeddedBeanCandidatesFromCurrentContext[0]); DependencyGraph_1.DependencyGraph.addNodeWithEdges(beanDescriptor, nonEmbeddedBeanCandidatesFromCurrentContext); return; } if (nonEmbeddedBeanCandidatesFromCurrentContext.length > 1) { var beanCandidatesFromCurrentContextQualifiedByParameterName = nonEmbeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.classMemberName === dependencyDescriptor.parameterName; }); if (beanCandidatesFromCurrentContextQualifiedByParameterName.length === 1) { dependencyDescriptor.qualifiedBeans.add(beanCandidatesFromCurrentContextQualifiedByParameterName[0]); DependencyGraph_1.DependencyGraph.addNodeWithEdges(beanDescriptor, beanCandidatesFromCurrentContextQualifiedByParameterName); return; } if (beanCandidatesFromCurrentContextQualifiedByParameterName.length > 1) { CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ dependencyDescriptor.node ], __read(beanCandidatesFromCurrentContextQualifiedByParameterName.map(function (it) { return it.node; })), false), message: "Found " + beanCandidatesFromCurrentContextQualifiedByParameterName.length + " Bean candidates, with same name, please rename one of beans", filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ dependencyDescriptor.node ], __read(nonEmbeddedBeanCandidatesFromCurrentContext.map(function (it) { return it.node; })), false), message: "Found " + nonEmbeddedBeanCandidatesFromCurrentContext.length + " Bean candidates, please use @Qualifier or rename parameter to match bean name, to specify which Bean should be injected", filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } if (embeddedBeanCandidatesFromCurrentContext.length === 1) { dependencyDescriptor.qualifiedBeans.add(embeddedBeanCandidatesFromCurrentContext[0]); DependencyGraph_1.DependencyGraph.addNodeWithEdges(beanDescriptor, embeddedBeanCandidatesFromCurrentContext); return; } if (embeddedBeanCandidatesFromCurrentContext.length > 1) { var beansByParameterName = embeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.nestedProperty === dependencyDescriptor.parameterName; }); if (beansByParameterName.length === 1) { dependencyDescriptor.qualifiedBeans.add(beansByParameterName[0]); DependencyGraph_1.DependencyGraph.addNodeWithEdges(beanDescriptor, beansByParameterName); return; } if (beansByParameterName.length > 1) { CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ dependencyDescriptor.node ], __read(beansByParameterName.map(function (it) { return it.node; })), false), message: "Found " + beansByParameterName.length + " Embedded Bean candidates, with same name, please rename one of beans", filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ dependencyDescriptor.node ], __read(embeddedBeanCandidatesFromCurrentContext.map(function (it) { return it.node; })), false), message: "Found " + embeddedBeanCandidatesFromCurrentContext.length + " Embedded Bean candidates, please use @Qualifier or rename parameter to match bean name, to specify which Bean should be injected", filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } if (beanCandidatesFromGlobalContext.length === 1) { dependencyDescriptor.qualifiedBeans.add(beanCandidatesFromGlobalContext[0]); DependencyGraph_1.DependencyGraph.addNodeWithEdges(beanDescriptor, beanCandidatesFromGlobalContext); return; } if (beanCandidatesFromGlobalContext.length > 1) { var beanCandidatesFromGlobalContextQualifiedByParameterName = beanCandidatesFromGlobalContext .filter(function (it) { return it.classMemberName === dependencyDescriptor.parameterName; }); if (beanCandidatesFromGlobalContextQualifiedByParameterName.length === 1) { dependencyDescriptor.qualifiedBeans.add(beanCandidatesFromGlobalContextQualifiedByParameterName[0]); DependencyGraph_1.DependencyGraph.addNodeWithEdges(beanDescriptor, beanCandidatesFromGlobalContextQualifiedByParameterName); return; } if (beanCandidatesFromGlobalContextQualifiedByParameterName.length > 1) { CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ dependencyDescriptor.node ], __read(beanCandidatesFromGlobalContextQualifiedByParameterName.map(function (it) { return it.node; })), false), message: "Found " + beanCandidatesFromGlobalContextQualifiedByParameterName.length + " Bean candidates in Global context, with same name, please rename one of beans", filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ dependencyDescriptor.node ], __read(beanCandidatesFromGlobalContext.map(function (it) { return it.node; })), false), message: "Found " + beanCandidatesFromGlobalContext.length + " Bean candidates in Global context, please use @Qualifier or rename parameter to match bean name, to specify which Bean should be injected", filePath: beanDescriptor.contextDescriptor.absolutePath, relatedContextPath: beanDescriptor.contextDescriptor.absolutePath, }); return; } } }); }); }); }; exports.buildDependencyGraphAndFillQualifiedBeans = buildDependencyGraphAndFillQualifiedBeans;