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!

255 lines (254 loc) 15.1 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)); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerLifecycleExpression = void 0; var typescript_1 = __importDefault(require("typescript")); var LifecycleMethodsRepository_1 = require("./LifecycleMethodsRepository"); var getQualifierValueFromFunctionArgument_1 = require("../bean-dependencies/getQualifierValueFromFunctionArgument"); var getParameterType_1 = require("../bean-dependencies/getParameterType"); var CompilationContext_1 = require("../../compilation-context/CompilationContext"); var BeanRepository_1 = require("../bean/BeanRepository"); var constants_1 = require("../context/constants"); var QualifiedType_1 = require("../ts-helpers/type-qualifier/QualifiedType"); var ExtendedSet_1 = require("../utils/ExtendedSet"); var uniqNotEmpty_1 = require("../utils/uniqNotEmpty"); var constants_2 = require("../bean/constants"); var registerLifecycleExpression = function (contextDescriptor, classMemberName, node, lifecycles, lifecycleNodeKind) { if (constants_2.restrictedClassMemberNames.has(classMemberName)) { CompilationContext_1.CompilationContext.reportError({ node: node, message: "\"" + classMemberName + "\" name is reserved for the di-container, please use another name instead", filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } var beansMap = BeanRepository_1.BeanRepository.beanDescriptorRepository.get(contextDescriptor.name); if (!beansMap) { return; } var dependencies = new ExtendedSet_1.ExtendedSet(); var parameters = typescript_1.default.isMethodDeclaration(node) ? node.parameters : node.initializer.parameters; parameters.forEach(function (parameter) { var _a, _b, _c, _d, _e, _f; var parameterName = parameter.name.getText(); var qualifier = (0, getQualifierValueFromFunctionArgument_1.getQualifierValueFromFunctionArgument)(parameter, contextDescriptor); var qualifiedType = (0, getParameterType_1.getParameterType)(parameter); if (qualifiedType === null) { CompilationContext_1.CompilationContext.reportError({ node: parameter, message: 'Can\'t qualify type of Context Lifecycle parameter', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } if (qualifiedType.kind === QualifiedType_1.QualifiedTypeKind.LIST) { var beansFromCurrentContext = (_a = beansMap.get(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(qualifiedType.fullTypeId)) !== null && _c !== void 0 ? _c : []; var mergedBeans = __spreadArray(__spreadArray([], __read(beansFromCurrentContext), false), __read(beansFromGlobalContext), false); var uniqMergedBeans = (0, uniqNotEmpty_1.uniqNotEmpty)(mergedBeans); if (uniqMergedBeans.length === 0) { CompilationContext_1.CompilationContext.reportError({ node: parameter, message: 'Not found any Bean candidates for list', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } dependencies.add({ qualifiedType: qualifiedType, parameterName: parameterName, beanDescriptors: new ExtendedSet_1.ExtendedSet(uniqMergedBeans) }); return; } if (qualifiedType.kind === QualifiedType_1.QualifiedTypeKind.PLAIN) { var currentContextBeans = (_d = beansMap.get(qualifiedType.fullTypeId)) !== null && _d !== void 0 ? _d : []; var currentContextNonEmbeddedBeans = currentContextBeans.filter(function (it) { return it.beanKind !== 'embedded'; }); var currentContextEmbeddedBeans = currentContextBeans.filter(function (it) { return it.beanKind === 'embedded'; }); var nonUniqBeanDescriptorsFromGlobalContext = (_f = (_e = BeanRepository_1.BeanRepository .beanDescriptorRepository.get(constants_1.GLOBAL_CONTEXT_NAME)) === null || _e === void 0 ? void 0 : _e.get(qualifiedType.fullTypeId)) !== null && _f !== void 0 ? _f : []; var nonEmbeddedBeanCandidatesFromCurrentContext = (0, uniqNotEmpty_1.uniqNotEmpty)(currentContextNonEmbeddedBeans); var embeddedBeanCandidatesFromCurrentContext = (0, uniqNotEmpty_1.uniqNotEmpty)(currentContextEmbeddedBeans); var beanCandidatesFromGlobalContext = (0, uniqNotEmpty_1.uniqNotEmpty)(nonUniqBeanDescriptorsFromGlobalContext); if (qualifier !== null) { nonEmbeddedBeanCandidatesFromCurrentContext = nonEmbeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.classMemberName === qualifier; }); embeddedBeanCandidatesFromCurrentContext = embeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.nestedProperty === qualifier; }); beanCandidatesFromGlobalContext = beanCandidatesFromGlobalContext .filter(function (it) { return it.classMemberName === qualifier; }); } if (nonEmbeddedBeanCandidatesFromCurrentContext.length === 0 && embeddedBeanCandidatesFromCurrentContext.length === 0 && beanCandidatesFromGlobalContext.length === 0) { CompilationContext_1.CompilationContext.reportError({ node: parameter, message: 'Bean for dependency is not registered', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } if (nonEmbeddedBeanCandidatesFromCurrentContext.length === 1) { dependencies.add({ parameterName: parameterName, qualifiedType: qualifiedType, beanDescriptors: new ExtendedSet_1.ExtendedSet(nonEmbeddedBeanCandidatesFromCurrentContext), }); return; } if (nonEmbeddedBeanCandidatesFromCurrentContext.length > 1) { var beanCandidatesFromCurrentContextQualifiedByParameterName = nonEmbeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.classMemberName === parameterName; }); if (beanCandidatesFromCurrentContextQualifiedByParameterName.length === 1) { dependencies.add({ parameterName: parameterName, qualifiedType: qualifiedType, beanDescriptors: new ExtendedSet_1.ExtendedSet(beanCandidatesFromCurrentContextQualifiedByParameterName) }); return; } if (beanCandidatesFromCurrentContextQualifiedByParameterName.length > 1) { CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ parameter ], __read(beanCandidatesFromCurrentContextQualifiedByParameterName.map(function (it) { return it.node; })), false), message: "Found " + beanCandidatesFromCurrentContextQualifiedByParameterName.length + " Bean candidates, with same name, please rename one of beans", filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ parameter ], __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: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } if (embeddedBeanCandidatesFromCurrentContext.length === 1) { dependencies.add({ parameterName: parameterName, qualifiedType: qualifiedType, beanDescriptors: new ExtendedSet_1.ExtendedSet(embeddedBeanCandidatesFromCurrentContext), }); return; } if (embeddedBeanCandidatesFromCurrentContext.length > 1) { var beansByParameterName = embeddedBeanCandidatesFromCurrentContext .filter(function (it) { return it.nestedProperty === parameterName; }); if (beansByParameterName.length === 1) { dependencies.add({ parameterName: parameterName, qualifiedType: qualifiedType, beanDescriptors: new ExtendedSet_1.ExtendedSet(beansByParameterName) }); return; } if (beansByParameterName.length > 1) { CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ parameter ], __read(beansByParameterName.map(function (it) { return it.node; })), false), message: "Found " + beansByParameterName.length + " Bean candidates, with same name, please rename one of beans", filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ parameter ], __read(embeddedBeanCandidatesFromCurrentContext.map(function (it) { return it.node; })), false), message: "Found " + embeddedBeanCandidatesFromCurrentContext.length + " Bean candidates, please use @Qualifier or rename parameter to match bean name, to specify which Bean should be injected", filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } if (beanCandidatesFromGlobalContext.length === 1) { dependencies.add({ parameterName: parameterName, qualifiedType: qualifiedType, beanDescriptors: new ExtendedSet_1.ExtendedSet(beanCandidatesFromGlobalContext) }); return; } if (beanCandidatesFromGlobalContext.length > 1) { var beanCandidatesFromGlobalContextQualifiedByParameterName = beanCandidatesFromGlobalContext .filter(function (it) { return it.classMemberName === parameterName; }); if (beanCandidatesFromGlobalContextQualifiedByParameterName.length === 1) { dependencies.add({ parameterName: parameterName, qualifiedType: qualifiedType, beanDescriptors: new ExtendedSet_1.ExtendedSet(beanCandidatesFromGlobalContextQualifiedByParameterName) }); return; } if (beanCandidatesFromGlobalContextQualifiedByParameterName.length > 1) { CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ parameter ], __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: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([ parameter ], __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: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } return; } }); LifecycleMethodsRepository_1.LifecycleMethodsRepository.register(contextDescriptor, { types: lifecycles, dependencies: dependencies, nodeKind: lifecycleNodeKind, node: node, classMemberName: classMemberName, contextDescriptor: contextDescriptor, }); }; exports.registerLifecycleExpression = registerLifecycleExpression;