@notjustcoders/ioc-arise
Version:
Arise type-safe IoC containers from your code. Zero overhead, zero coupling.
92 lines • 4.36 kB
JavaScript
"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