UNPKG

@notjustcoders/ioc-arise

Version:

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

95 lines • 4.32 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 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