@notjustcoders/ioc-arise
Version:
Arise type-safe IoC containers from your code. Zero overhead, zero coupling.
85 lines • 3.88 kB
JavaScript
;
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 generator_1 = require("../generator");
const console_analysis_renderer_1 = require("../renderer/console-analysis-renderer");
const configManager_1 = require("../utils/configManager");
const configValidator_1 = require("../utils/configValidator");
const index_js_1 = require("../errors/index.js");
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')
.action(async (options) => {
try {
// 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 = index_js_1.ErrorFactory.sourceDirectoryNotFound(sourceDir);
console.error(`❌ ${index_js_1.ErrorUtils.formatForConsole(error)}`);
process.exit(1);
}
if (configManager.hasConfigFile()) {
console.log(`📋 Using config file: ${configManager.getConfigPath()}`);
}
console.log(`🔍 Analyzing directory: ${sourceDir}`);
// Perform analysis
const classes = await (0, analyser_1.analyzeProject)(sourceDir, {
sourceDir,
interfacePattern: mergedOptions.interface,
excludePatterns: mergedOptions.exclude
});
if (classes.length === 0) {
console.log('⚠️ No classes implementing interfaces found.');
return;
}
// Detect circular dependencies
const circularDependencies = (0, generator_1.detectCircularDependencies)(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);
}
catch (error) {
if (index_js_1.ErrorUtils.isIoCError(error)) {
console.error(`❌ ${index_js_1.ErrorUtils.formatForConsole(error)}`);
}
else {
const wrappedError = index_js_1.ErrorFactory.unexpectedError(error);
console.error(`❌ ${index_js_1.ErrorUtils.formatForConsole(wrappedError)}`);
}
process.exit(1);
}
});
function createRenderer(rendererType) {
switch (rendererType.toLowerCase()) {
case 'console':
return new console_analysis_renderer_1.ConsoleAnalysisRenderer();
default:
console.warn(`⚠️ Unknown renderer type: ${rendererType}. Falling back to console renderer.`);
return new console_analysis_renderer_1.ConsoleAnalysisRenderer();
}
}
//# sourceMappingURL=visualize.js.map