UNPKG

@notjustcoders/ioc-arise

Version:

Arise type-safe IoC containers from your code. Zero overhead, zero coupling.

92 lines 4.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.visualizeCommand = void 0; const commander_1 = require("commander"); const path_1 = require("path"); const fs_1 = require("fs"); const analyser_1 = require("../analyser"); const circular_dependency_detector_1 = require("../utils/circular-dependency-detector"); const console_analysis_renderer_1 = require("../renderer/console-analysis-renderer"); const configManager_1 = require("../utils/configManager"); const configValidator_1 = require("../utils/configValidator"); const errorFactory_1 = require("../errors/errorFactory"); const IoCError_1 = require("../errors/IoCError"); const logger_1 = require("../utils/logger"); exports.visualizeCommand = new commander_1.Command('visualize') .description('Visualize project dependencies and analysis results') .option('-s, --source <dir>', 'Source directory to scan', 'src') .option('-i, --interface <pattern>', 'Interface name pattern to match (regex)') .option('-e, --exclude <patterns...>', 'Exclude patterns for files') .option('-r, --renderer <type>', 'Renderer type (console)', 'console') .option('--verbose', 'Enable verbose logging') .action(async (options) => { try { // Initialize logger logger_1.Logger.initialize({ verbose: options.verbose ?? false }); // Initialize config manager with the source directory const initialSourceDir = (0, path_1.resolve)(options.source); const configManager = new configManager_1.ConfigManager(initialSourceDir); // Validate config if present if (configManager.hasConfigFile()) { const config = configManager.getConfig(); if (!configValidator_1.ConfigValidator.validateAndLog(config, configManager.getConfigPath())) { process.exit(1); } } // Merge CLI options with config file const mergedOptions = configManager.mergeWithCliOptions(options); const sourceDir = (0, path_1.resolve)(mergedOptions.source); if (!(0, fs_1.existsSync)(sourceDir)) { const error = errorFactory_1.ErrorFactory.sourceDirectoryNotFound(sourceDir); logger_1.Logger.error(IoCError_1.ErrorUtils.formatForConsole(error)); process.exit(1); } if (configManager.hasConfigFile()) { logger_1.Logger.info(`Using config file: ${configManager.getConfigPath()}`); } logger_1.Logger.custom('🔍', `Analyzing directory: ${sourceDir}`, logger_1.Logger.getColors().cyan + logger_1.Logger.getColors().bright); // Perform analysis const classes = await (0, analyser_1.analyzeProject)(sourceDir, { sourceDir, interfacePattern: mergedOptions.interface, excludePatterns: mergedOptions.exclude }); if (classes.length === 0) { logger_1.Logger.warn('No classes implementing interfaces found.'); process.exit(0); return; } // Detect circular dependencies const circularDependencies = circular_dependency_detector_1.CircularDependencyDetector.detect(classes); // Prepare analysis results const analysisResults = { classes, circularDependencies }; // Create renderer based on options const renderer = createRenderer(options.renderer); // Render the analysis results renderer.render(analysisResults); process.exit(0); } catch (error) { if (IoCError_1.ErrorUtils.isIoCError(error)) { logger_1.Logger.error(IoCError_1.ErrorUtils.formatForConsole(error)); } else { const wrappedError = errorFactory_1.ErrorFactory.unexpectedError(error); logger_1.Logger.error(IoCError_1.ErrorUtils.formatForConsole(wrappedError)); } process.exit(1); } }); function createRenderer(rendererType) { switch (rendererType.toLowerCase()) { case 'console': return new console_analysis_renderer_1.ConsoleAnalysisRenderer(); default: logger_1.Logger.warn(`Unknown renderer type: ${rendererType}. Falling back to console renderer.`); return new console_analysis_renderer_1.ConsoleAnalysisRenderer(); } } //# sourceMappingURL=visualize.js.map