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!
137 lines (136 loc) • 7.12 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompilationContext = void 0;
var chalk_1 = __importDefault(require("chalk"));
var lodash_1 = require("lodash");
var getPositionOfNode_1 = require("../core/utils/getPositionOfNode");
var CompilationError_1 = require("./CompilationError");
var config_1 = require("../external/config");
var ContextRepository_1 = require("../core/context/ContextRepository");
var CompilationContext = /** @class */ (function () {
function CompilationContext() {
}
CompilationContext.reportError = function (error) {
this.compilationContext.errors.push(error);
};
CompilationContext.reportErrorWithMultipleNodes = function (error) {
this.compilationContext.errorsWithMultipleNodes.push(error);
};
CompilationContext.reportErrorMessage = function (message) {
this.compilationContext.textErrors.push(message);
};
CompilationContext.reportAndThrowErrorMessage = function (message) {
throw new CompilationError_1.CompilationError(message);
};
CompilationContext.getErrorMessage = function () {
switch (config_1.diConfig.errorMessageType) {
case 'human':
return this.getErrorMessagesForHuman();
case 'debug':
return this.getErrorMessagesForDebug();
}
};
CompilationContext.clearErrorsByFilePath = function (filePath) {
this.compilationContext.errors =
this.compilationContext.errors.filter(function (it) { return it.filePath !== filePath; });
this.compilationContext.errorsWithMultipleNodes =
this.compilationContext.errorsWithMultipleNodes.filter(function (it) { return it.filePath !== filePath; });
};
CompilationContext.getErrorMessagesForDebug = function () {
if (this.areErrorsEmpty()) {
return null;
}
var errorsWithSingleNode = this.compilationContext.errors.map(this.formatDebugErrorWithSingleNode);
var errorsWithMultipleNodes = this.compilationContext.errorsWithMultipleNodes.map(this.formatDebugErrorWithMultipleNodes);
var result = {
errors: errorsWithSingleNode,
errorsWithMultipleNodes: errorsWithMultipleNodes,
textErrors: this.compilationContext.textErrors
};
return JSON.stringify(result);
};
CompilationContext.getErrorMessagesForHuman = function () {
var _this = this;
if (this.areErrorsEmpty()) {
return null;
}
var diCatHeader = 'DI-CAT';
var errorMessages = [];
this.compilationContext.textErrors.forEach(function (error) { return errorMessages.push(error); });
this.compilationContext.errors.forEach(function (error) {
errorMessages.push(_this.formatCompilationContextData(error));
});
this.compilationContext.errorsWithMultipleNodes.forEach(function (error) {
errorMessages.push(_this.formatCompilationContextDataWithMultipleNodes(error));
});
var flatMessages = (0, lodash_1.flattenDeep)(errorMessages.map(function (it) { return it.split('\n'); }));
var maxMessageLength = flatMessages
.reduce(function (a, b) { return (a.length > b.length ? a : b); }).length;
var neededPrefixLength = (maxMessageLength - diCatHeader.length - 2) / 4;
var prefix = '/-'.repeat(neededPrefixLength);
errorMessages.unshift("\n" + prefix + " " + diCatHeader + " " + prefix + "\n");
return chalk_1.default.red(errorMessages.join('\n'));
};
CompilationContext.formatDebugErrorWithSingleNode = function (_a) {
var message = _a.message, node = _a.node;
return {
message: message,
file: node.getSourceFile().fileName,
position: (0, getPositionOfNode_1.getPositionOfNode)(node)
};
};
CompilationContext.formatDebugErrorWithMultipleNodes = function (_a) {
var message = _a.message, nodes = _a.nodes;
return {
message: message,
nodes: nodes.map(function (it) { return ({
file: it.getSourceFile().fileName,
position: (0, getPositionOfNode_1.getPositionOfNode)(it)
}); })
};
};
CompilationContext.formatCompilationContextData = function (_a) {
var message = _a.message, node = _a.node, relatedContextPath = _a.relatedContextPath;
var nodePosition = (0, getPositionOfNode_1.getPositionOfNode)(node);
var path = node.getSourceFile().fileName;
if (relatedContextPath) {
var relatedContextDescriptor = ContextRepository_1.ContextRepository.contextPathToContextDescriptor.get(relatedContextPath);
if (relatedContextDescriptor) {
var relatedContextNodePosition = (0, getPositionOfNode_1.getPositionOfNode)(relatedContextDescriptor.node);
return message + "\nInvolved context: (" + relatedContextDescriptor.absolutePath + ":" + relatedContextNodePosition[0] + ":" + relatedContextNodePosition[1] + ")\nAt: (" + path + ":" + nodePosition[0] + ":" + nodePosition[1] + ")\n";
}
}
return message + "\nAt: (" + path + ":" + nodePosition[0] + ":" + nodePosition[1] + ")\n";
};
CompilationContext.formatCompilationContextDataWithMultipleNodes = function (_a) {
var message = _a.message, nodes = _a.nodes, relatedContextPath = _a.relatedContextPath;
var nodePositions = nodes.map(function (node) { return (0, getPositionOfNode_1.getPositionOfNode)(node); });
var paths = nodes.map(function (it) { return it.getSourceFile().fileName; });
var nodesMessage = paths.map(function (_, index) {
return paths[index] + ":" + nodePositions[index][0] + ":" + nodePositions[index][1];
}).join('\n');
if (relatedContextPath) {
var relatedContextDescriptor = ContextRepository_1.ContextRepository.contextPathToContextDescriptor.get(relatedContextPath);
if (relatedContextDescriptor) {
var relatedContextNodePosition = (0, getPositionOfNode_1.getPositionOfNode)(relatedContextDescriptor.node);
return message + "\nInvolved context: (" + relatedContextDescriptor.absolutePath + ":" + relatedContextNodePosition[0] + ":" + relatedContextNodePosition[1] + ")\n" + nodesMessage + "\n";
}
}
return message + "\n" + nodesMessage + "\n";
};
CompilationContext.areErrorsEmpty = function () {
return this.compilationContext.errors.length === 0
&& this.compilationContext.textErrors.length === 0
&& this.compilationContext.errorsWithMultipleNodes.length === 0;
};
CompilationContext.compilationContext = {
errors: [],
errorsWithMultipleNodes: [],
textErrors: [],
};
return CompilationContext;
}());
exports.CompilationContext = CompilationContext;