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
JavaScript
;
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;