@notjustcoders/ioc-arise
Version:
Arise type-safe IoC containers from your code. Zero overhead, zero coupling.
95 lines ⢠4.32 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 generator_1 = require("../generator");
const configManager_1 = require("../utils/configManager");
const configValidator_1 = require("../utils/configValidator");
const index_js_1 = require("../errors/index.js");
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')
.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}`);
const classes = await (0, analyser_1.analyzeProject)(sourceDir, {
sourceDir,
interfacePattern: mergedOptions.interface,
excludePatterns: mergedOptions.exclude
});
console.log("---------------------------------------");
console.dir(classes, { depth: 100 });
if (classes.length === 0) {
const error = index_js_1.ErrorFactory.noClassesFound(mergedOptions.interface || 'interfaces with "implements" keyword');
console.error(`ā ${index_js_1.ErrorUtils.formatForConsole(error)}`);
process.exit(1);
return;
}
console.log(`\nš Found ${classes.length} classes:\n`);
classes.forEach(cls => {
console.log(`š¦ ${cls.name}`);
console.log(` File: ${cls.filePath}`);
if (cls.interfaceName) {
console.log(` Implements: ${cls.interfaceName}`);
}
if (cls.abstractClassName) {
console.log(` Extends: ${cls.abstractClassName} (abstract)`);
}
if (cls.dependencies.length > 0) {
console.log(` Dependencies: ${cls.dependencies.map(dep => dep.name).join(', ')}`);
}
else {
console.log(` Dependencies: none`);
}
console.log('');
});
// Check for circular dependencies
const cycles = (0, generator_1.detectCircularDependencies)(classes);
if (cycles.length > 0) {
console.log('ā ļø Circular dependencies detected:');
cycles.forEach((cycle, index) => {
console.log(` ${index + 1}. ${cycle.join(' ā ')}`);
});
}
else {
console.log('ā
No circular dependencies found.');
}
}
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);
}
});
//# sourceMappingURL=analyze.js.map