ngrx-uml
Version:
NGRX to Plant UML diagram
95 lines (94 loc) • 4.57 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NgModuleConverter = void 0;
const chalk_1 = __importDefault(require("chalk"));
const loglevel_1 = __importDefault(require("loglevel"));
const typescript_1 = __importDefault(require("typescript"));
const ng_module_model_1 = require("../../../core/converters/models/converted-items/ng-module.model");
const node_converter_1 = require("../../../core/converters/node.converter");
const register_reducer_call_converter_1 = require("./register-reducer-call.converter");
class NgModuleConverter extends node_converter_1.NodeConverter {
convert(context, node) {
const sourceFile = node.getSourceFile();
const decorator = this.getModuleDecorator(context, node);
if (decorator && node.name) {
const symbol = context.typeChecker.getSymbolAtLocation(node.name);
if (symbol) {
// log.info(context.typeChecker.getSymbolAtLocation(decorator));
const item = new ng_module_model_1.NgModule(node.name.getText(), sourceFile.fileName, node.getStart(), node.getEnd());
// log.warn('node start', node.getStart(), ' / ', node.getEnd(), ' / ',node.getFullStart(), node.pos, node.end , node.getLeadingTriviaWidth());
// log.info(item.name, chalk.gray(item.filePath));
item.registeredReducers = this.getReducersFromDecorator(context, decorator);
context.addResult({ symbol, item });
return item;
}
}
return;
}
getModuleDecorator(_context, node) {
if (node.decorators) {
return node.decorators.find(decorator => this.isNgModuleDecorator(decorator));
}
return;
}
isNgModuleDecorator(decorator) {
return typescript_1.default.isCallExpression(decorator.expression)
&& decorator.expression.expression.getText() === 'NgModule';
}
extractStoreModuleCall(context, storeModuleCall) {
return new register_reducer_call_converter_1.RegisterReducerCallConverter().convert(context, storeModuleCall);
}
extractImportsProperty(context, importsProperty) {
if (!typescript_1.default.isArrayLiteralExpression(importsProperty.initializer)) {
return;
}
const registeredReducers = [];
for (const el of importsProperty.initializer.elements) {
if (typescript_1.default.isCallExpression(el) && typescript_1.default.isPropertyAccessExpression(el.expression)) {
switch (el.expression.expression.getText()) {
case 'StoreModule': {
const result = this.extractStoreModuleCall(context, el);
if (result) {
registeredReducers.push(result);
}
else {
loglevel_1.default.warn(chalk_1.default.yellow('StoreModule call without reducer'), el.getText());
}
// context.converter.convertNode(context, el);
}
}
}
}
return registeredReducers.length ? registeredReducers : undefined;
}
getImportsProperty(expression) {
const importsProperty = expression.properties.find(p => { var _a; return ((_a = p.name) === null || _a === void 0 ? void 0 : _a.getText()) === 'imports'; });
if (importsProperty && typescript_1.default.isPropertyAssignment(importsProperty)) {
return importsProperty;
}
return;
}
getReducersFromDecoratorArgument(context, arg) {
if (typescript_1.default.isObjectLiteralExpression(arg)) {
const importsProperty = this.getImportsProperty(arg);
if (importsProperty) {
return this.extractImportsProperty(context, importsProperty);
}
}
return;
}
getNgModuleMetadata(decorator) {
if (typescript_1.default.isCallExpression(decorator.expression)) {
return decorator.expression.arguments[0];
}
return;
}
getReducersFromDecorator(context, decorator) {
const ngModuleMetadata = this.getNgModuleMetadata(decorator);
return ngModuleMetadata && this.getReducersFromDecoratorArgument(context, ngModuleMetadata);
}
}
exports.NgModuleConverter = NgModuleConverter;