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!
149 lines (148 loc) • 6.58 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerEmbeddedBean = void 0;
var ts = __importStar(require("typescript"));
var constants_1 = require("./constants");
var CompilationContext_1 = require("../../compilation-context/CompilationContext");
var TypeQualifier_1 = require("../ts-helpers/type-qualifier/TypeQualifier");
var BeanRepository_1 = require("./BeanRepository");
var node_source_descriptor_1 = require("../ts-helpers/node-source-descriptor");
var registerEmbeddedBean = function (contextDescriptor, classElement) {
var _a;
var classElementName = classElement.name.getText();
if (constants_1.restrictedClassMemberNames.has(classElementName)) {
CompilationContext_1.CompilationContext.reportError({
node: classElement,
message: classElementName + " name is reserved for the di-container, please use another name instead",
filePath: contextDescriptor.absolutePath,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
var propertyType = (_a = classElement.type) !== null && _a !== void 0 ? _a : null;
if (propertyType === null) {
CompilationContext_1.CompilationContext.reportError({
node: classElement,
message: 'Can\'t qualify type of Embedded Bean, please specify type explicitly',
filePath: contextDescriptor.absolutePath,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
if (!ts.isTypeReferenceNode(propertyType)) {
CompilationContext_1.CompilationContext.reportError({
node: propertyType,
message: 'Type of Embedded Bean should be a type reference',
filePath: contextDescriptor.absolutePath,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
var nodeSourceDescriptor = (0, node_source_descriptor_1.getNodeSourceDescriptorDeep)(propertyType.getSourceFile(), propertyType.getText());
if (!(nodeSourceDescriptor === null || nodeSourceDescriptor === void 0 ? void 0 : nodeSourceDescriptor.node)) {
CompilationContext_1.CompilationContext.reportError({
node: propertyType,
message: 'Can not find type of Embedded Bean',
filePath: contextDescriptor.absolutePath,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
if (!ts.isInterfaceDeclaration(nodeSourceDescriptor.node)) {
CompilationContext_1.CompilationContext.reportError({
node: propertyType,
message: 'Type of Embedded Bean should be a plain interface declaration (without extends keyword)',
filePath: nodeSourceDescriptor.path,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
var interfaceMembers = nodeSourceDescriptor.node.members;
if (!isPropertySignatureList(interfaceMembers)) {
CompilationContext_1.CompilationContext.reportError({
node: nodeSourceDescriptor.node,
message: 'Type of Embedded Bean should be a plain interface declaration (without extends keyword)',
filePath: nodeSourceDescriptor.path,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
interfaceMembers.forEach(function (node) {
var propertyName = node.name.getText();
var propertyType = node.type;
if (!propertyType) {
CompilationContext_1.CompilationContext.reportError({
node: node,
message: 'Each interface element Embedded Bean type should have a type',
filePath: nodeSourceDescriptor.path,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
var qualifiedType = TypeQualifier_1.TypeQualifier.qualify(propertyType);
if (qualifiedType === null) {
CompilationContext_1.CompilationContext.reportError({
node: node,
message: 'Can\'t qualify type of Nested Bean element',
filePath: nodeSourceDescriptor.path,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
BeanRepository_1.BeanRepository.registerBean({
classMemberName: classElement.name.getText(),
nestedProperty: propertyName,
contextDescriptor: contextDescriptor,
qualifiedType: qualifiedType,
scope: 'singleton',
node: classElement,
beanKind: 'embedded',
beanSourceLocation: null,
isPublic: false,
});
});
var qualifiedType = TypeQualifier_1.TypeQualifier.qualify(propertyType);
if (qualifiedType === null) {
CompilationContext_1.CompilationContext.reportError({
node: classElement,
message: 'Can\'t qualify type of Embedded Bean',
filePath: contextDescriptor.absolutePath,
relatedContextPath: contextDescriptor.absolutePath,
});
return;
}
BeanRepository_1.BeanRepository.registerBean({
classMemberName: classElement.name.getText(),
nestedProperty: null,
contextDescriptor: contextDescriptor,
qualifiedType: qualifiedType,
scope: 'singleton',
node: classElement,
beanKind: 'embedded',
beanSourceLocation: null,
isPublic: false,
});
};
exports.registerEmbeddedBean = registerEmbeddedBean;
function isPropertySignatureList(list) {
return list.every(function (it) { return ts.isPropertySignature(it); });
}