UNPKG

@notjustcoders/ioc-arise

Version:

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

102 lines 5.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.analyzeCommand = 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 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.analyzeCommand = new commander_1.Command('analyze') .description('Analyze project and show detected classes without generating') .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('--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); const classes = await (0, analyser_1.analyzeProject)(sourceDir, { sourceDir, interfacePattern: mergedOptions.interface, excludePatterns: mergedOptions.exclude }); if (classes.length === 0) { const error = errorFactory_1.ErrorFactory.noClassesFound(mergedOptions.interface || 'interfaces with "implements" keyword'); logger_1.Logger.error(IoCError_1.ErrorUtils.formatForConsole(error)); process.exit(1); return; } logger_1.Logger.newline(); logger_1.Logger.custom('📋', `Found ${classes.length} classes:`, logger_1.Logger.getColors().blue + logger_1.Logger.getColors().bright); logger_1.Logger.newline(); classes.forEach(cls => { logger_1.Logger.custom('📦', cls.name, logger_1.Logger.getColors().cyan + logger_1.Logger.getColors().bright); logger_1.Logger.log(logger_1.Logger.colorizeText(` File: ${cls.filePath}`, logger_1.Logger.getColors().gray)); if (cls.interfaceName) { logger_1.Logger.log(logger_1.Logger.colorizeText(` Implements: ${cls.interfaceName}`, logger_1.Logger.getColors().yellow)); } if (cls.abstractClassName) { logger_1.Logger.log(logger_1.Logger.colorizeText(` Extends: ${cls.abstractClassName} (abstract)`, logger_1.Logger.getColors().magenta)); } if (cls.dependencies.length > 0) { const deps = cls.dependencies.map(dep => dep.name).join(', '); logger_1.Logger.log(logger_1.Logger.colorizeText(` Dependencies: ${deps}`, logger_1.Logger.getColors().blue)); } else { logger_1.Logger.log(logger_1.Logger.colorizeText(` Dependencies: none`, logger_1.Logger.getColors().gray)); } logger_1.Logger.newline(); }); // Check for circular dependencies const cycles = circular_dependency_detector_1.CircularDependencyDetector.detect(classes); if (cycles.length > 0) { logger_1.Logger.warn('Circular dependencies detected:'); cycles.forEach((cycle, index) => { logger_1.Logger.log(logger_1.Logger.colorizeText(` ${index + 1}. ${cycle.join(' → ')}`, logger_1.Logger.getColors().red)); }); } else { logger_1.Logger.success('No circular dependencies found.'); } 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); } }); //# sourceMappingURL=analyze.js.map