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