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!

150 lines (149 loc) 7.51 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.checkIsAllBeansRegisteredInContextAndFillBeanRequierness = void 0; var ContextRepository_1 = require("../context/ContextRepository"); var typescript_1 = __importDefault(require("typescript")); var CompilationContext_1 = require("../../compilation-context/CompilationContext"); var node_source_descriptor_1 = require("../ts-helpers/node-source-descriptor"); var removeQuotesFromString_1 = require("../utils/removeQuotesFromString"); var BeanRepository_1 = require("./BeanRepository"); var TypeQualifier_1 = require("../ts-helpers/type-qualifier/TypeQualifier"); //Only for non-global contexts var checkIsAllBeansRegisteredInContextAndFillBeanRequierness = function (contextDescriptor) { var _a, _b, _c; var extendsHeritageClause = (_a = contextDescriptor.node.heritageClauses) === null || _a === void 0 ? void 0 : _a.find(function (clause) { return clause.token === typescript_1.default.SyntaxKind.ExtendsKeyword; }); if (!extendsHeritageClause) { return; } var typeArgs = (_b = extendsHeritageClause.types[0].typeArguments) !== null && _b !== void 0 ? _b : null; if (typeArgs === null) { CompilationContext_1.CompilationContext.reportError({ node: extendsHeritageClause, message: 'You should pass TBeans interface reference to the context inheritance', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } var type = typeArgs[0]; if (!type || !typescript_1.default.isTypeReferenceNode(type)) { CompilationContext_1.CompilationContext.reportError({ node: extendsHeritageClause, message: 'TBeans should be a plain interface reference', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } var nodeDescriptor = (0, node_source_descriptor_1.getNodeSourceDescriptorDeep)(contextDescriptor.node.getSourceFile(), type.typeName.getText()); if (nodeDescriptor === null || nodeDescriptor.node === null) { CompilationContext_1.CompilationContext.reportError({ node: type.typeName, message: 'Can\'t qualify TBeans declaration', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } if (!typescript_1.default.isInterfaceDeclaration(nodeDescriptor.node)) { CompilationContext_1.CompilationContext.reportError({ node: type.typeName, message: 'TBeans should be a plain interface declaration (without extends keyword)', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } if (nodeDescriptor.node.heritageClauses !== undefined) { CompilationContext_1.CompilationContext.reportError({ node: type.typeName, message: 'TBeans should be a plain interface declaration (without extends keyword)', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } if (nodeDescriptor.node.members.some(function (it) { return !typescript_1.default.isPropertySignature(it); })) { CompilationContext_1.CompilationContext.reportError({ node: type.typeName, message: 'TBeans should be a plain interface declaration without indexed signatures', filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } ContextRepository_1.ContextRepository.registerTBeanType(contextDescriptor, nodeDescriptor); var requiredBeanProperties = nodeDescriptor.node.members.map(function (it) { return it; }); var contextBeans = (_c = BeanRepository_1.BeanRepository .beanDescriptorRepository.get(contextDescriptor.name)) !== null && _c !== void 0 ? _c : new Map(); var missingBeans = []; requiredBeanProperties.forEach(function (requiredBeanProperty) { var _a; if (!requiredBeanProperty.type) { CompilationContext_1.CompilationContext.reportError({ message: 'TBean interface property should have a type', node: requiredBeanProperty, relatedContextPath: contextDescriptor.absolutePath, filePath: requiredBeanProperty.getSourceFile().fileName, }); return; } var requiredBeanName = (0, removeQuotesFromString_1.removeQuotesFromString)(requiredBeanProperty.name.getText()); var qualifiedPropertyType = TypeQualifier_1.TypeQualifier.qualify(requiredBeanProperty.type); if (qualifiedPropertyType === null) { CompilationContext_1.CompilationContext.reportError({ message: 'Can not qualify type of TBean property', node: requiredBeanProperty, relatedContextPath: contextDescriptor.absolutePath, filePath: requiredBeanProperty.getSourceFile().fileName, }); return; } var requiredBeanDescriptor = (_a = contextBeans.get(qualifiedPropertyType.fullTypeId)) === null || _a === void 0 ? void 0 : _a.find(function (it) { return it.classMemberName === requiredBeanName && it.qualifiedType.kind === qualifiedPropertyType.kind; }); if (requiredBeanDescriptor) { requiredBeanDescriptor.isPublic = true; } else { missingBeans.push(requiredBeanProperty); } }); if (missingBeans.length > 0) { var missingBeansText = missingBeans.map(function (it) { return (0, removeQuotesFromString_1.removeQuotesFromString)(it.name.getText()); }).join(', '); CompilationContext_1.CompilationContext.reportErrorWithMultipleNodes({ nodes: __spreadArray([type], __read(missingBeans), false), message: "Some beans are not registered in Context \"" + contextDescriptor.name + "\": [ " + missingBeansText + " ]", filePath: contextDescriptor.absolutePath, relatedContextPath: contextDescriptor.absolutePath, }); return; } }; exports.checkIsAllBeansRegisteredInContextAndFillBeanRequierness = checkIsAllBeansRegisteredInContextAndFillBeanRequierness;