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!

137 lines (136 loc) 7.12 kB
"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;