@confytome/core
Version:
Core plugin system and OpenAPI 3.0.3 generator from JSDoc comments. Plugin registry, service layer, and CLI for extensible API documentation generation.
291 lines (233 loc) • 8.09 kB
JavaScript
/**
* CLI Plugin Management Commands
*
* Provides commands for managing the generator plugin system
*/
import { GeneratorFactory } from '../services/GeneratorFactory.js';
import { SimpleErrorHandler } from './error-handler-simple.js';
import { DEFAULT_OUTPUT_DIR } from '../constants.js';
/**
* List all available generators
*/
export async function listGenerators(options = {}) {
try {
await GeneratorFactory.initialize();
const generators = await GeneratorFactory.listGeneratorsWithStatus();
if (options.json) {
console.log(JSON.stringify(generators, null, 2));
return;
}
console.log('🔌 Available Generators:');
console.log('');
if (generators.length === 0) {
console.log(' No generators found. Run "confytome init" to set up the workspace.');
return;
}
// Group by type
const byType = {};
generators.forEach(gen => {
if (!byType[gen.type]) byType[gen.type] = [];
byType[gen.type].push(gen);
});
for (const [type, typeGenerators] of Object.entries(byType)) {
console.log(`📦 ${type.toUpperCase()} Generators:`);
typeGenerators.forEach(gen => {
const status = gen.available ? '✅' : gen.compatible ? '⚠️ ' : '❌';
const external = gen.isExternal ? ' (external)' : '';
console.log(` ${status} ${gen.name}${external}`);
console.log(` ${gen.description}`);
console.log(` Version: ${gen.version}, Package: ${gen.packageName}`);
if (!gen.available && gen.errors.length > 0) {
console.log(` Issues: ${gen.errors.join(', ')}`);
}
console.log('');
});
}
} catch (error) {
SimpleErrorHandler.handle(error, 'CLI');
}
}
/**
* Show detailed information about a specific generator
*/
export async function showGeneratorInfo(generatorName, options = {}) {
try {
await GeneratorFactory.initialize();
const info = await GeneratorFactory.getGeneratorInfo(generatorName);
if (!info.metadata) {
console.error(`❌ Generator not found: ${generatorName}`);
console.log('');
console.log('Available generators:');
const generators = await GeneratorFactory.listGenerators();
generators.forEach(gen => console.log(` ${gen.name}`));
process.exit(1);
}
if (options.json) {
console.log(JSON.stringify(info, null, 2));
return;
}
const meta = info.metadata;
console.log(`📦 Generator: ${meta.name}`);
console.log('');
console.log(` Description: ${meta.description}`);
console.log(` Type: ${meta.type}`);
console.log(` Version: ${meta.version}`);
console.log(` Package: ${meta.packageName}`);
console.log(` JSDoc Required: ${meta.requiresJSDocFiles ? 'Yes' : 'No'}`);
console.log(` External Plugin: ${meta.isExternalPlugin ? 'Yes' : 'No'}`);
if (meta.filePath) {
console.log(` File Path: ${meta.filePath}`);
}
console.log('');
console.log(` Status: ${info.validation.valid ? '✅ Available' : '❌ Unavailable'}`);
if (!info.validation.valid) {
console.log(' Issues:');
info.validation.errors.forEach(error => {
console.log(` - ${error}`);
});
}
// Show dependencies
const deps = Object.keys(meta.dependencies);
const peerDeps = Object.keys(meta.peerDependencies);
if (deps.length > 0) {
console.log('');
console.log(' Dependencies:');
deps.forEach(dep => console.log(` - ${dep}: ${meta.dependencies[dep]}`));
}
if (peerDeps.length > 0) {
console.log('');
console.log(' Peer Dependencies:');
peerDeps.forEach(dep => console.log(` - ${dep}: ${meta.peerDependencies[dep]}`));
}
} catch (error) {
SimpleErrorHandler.handle(error, 'CLI');
}
}
/**
* Show recommended generators based on available dependencies
*/
export async function showRecommendedGenerators(options = {}) {
try {
await GeneratorFactory.initialize();
const recommended = await GeneratorFactory.getRecommendedGenerators();
if (options.json) {
console.log(JSON.stringify(recommended, null, 2));
return;
}
console.log('💡 Recommended Generators:');
console.log('');
if (recommended.length === 0) {
console.log(' No recommended generators available.');
console.log(' Try running "confytome init" to set up the workspace.');
return;
}
recommended.forEach(gen => {
console.log(`✅ ${gen.name}`);
console.log(` ${gen.description}`);
console.log(` Reason: ${gen.reason}`);
console.log('');
});
} catch (error) {
SimpleErrorHandler.handle(error, 'CLI');
}
}
/**
* Validate generators and their dependencies
*/
export async function validateGenerators(generatorNames, options = {}) {
try {
await GeneratorFactory.initialize();
let generators = generatorNames;
if (generators.length === 0) {
// Validate all generators if none specified
const allGens = await GeneratorFactory.listGenerators();
generators = allGens.map(gen => gen.name);
}
const results = await GeneratorFactory.validateGenerators(generators);
if (options.json) {
console.log(JSON.stringify(results, null, 2));
return;
}
console.log('🔍 Generator Validation Results:');
console.log('');
let allValid = true;
results.forEach(result => {
const status = result.available ? '✅' : '❌';
console.log(`${status} ${result.name}`);
if (!result.available) {
allValid = false;
result.validation.errors.forEach(error => {
console.log(` - ${error}`);
});
}
console.log('');
});
if (allValid) {
console.log('🎉 All generators are valid and ready to use!');
} else {
console.log('⚠️ Some generators have issues. Install missing dependencies to resolve them.');
process.exit(1);
}
} catch (error) {
SimpleErrorHandler.handle(error, 'CLI');
}
}
/**
* Execute specific generators using the registry system
*/
export async function executeGenerators(generatorNames, options = {}) {
try {
await GeneratorFactory.initialize();
const outputDir = options.outputDir || DEFAULT_OUTPUT_DIR;
const executionOptions = {
failFast: options.failFast || false,
excludeBrand: options.excludeBrand || false,
contextUrl: import.meta.url
};
console.log(`🔄 Executing generators: ${generatorNames.join(', ')}`);
console.log(`📁 Output directory: ${outputDir}`);
console.log('');
const results = await GeneratorFactory.executeGenerators(
generatorNames,
outputDir,
executionOptions
);
let successCount = 0;
let failCount = 0;
results.forEach(result => {
if (result.success) {
successCount++;
console.log(`✅ ${result.generatorName}: ${result.result?.outputPath || 'completed'}`);
} else {
failCount++;
console.log(`❌ ${result.generatorName}: ${result.error}`);
}
});
console.log('');
console.log(`📊 Results: ${successCount} succeeded, ${failCount} failed`);
if (failCount > 0) {
process.exit(1);
}
} catch (error) {
SimpleErrorHandler.handle(error, 'CLI');
}
}
/**
* Execute all spec consumer generators
*/
export async function executeAllSpecConsumers(options = {}) {
try {
await GeneratorFactory.initialize();
const specConsumers = await GeneratorFactory.getGeneratorsByGeneratorType('spec-consumer');
const generatorNames = specConsumers.map(gen => gen.name);
if (generatorNames.length === 0) {
console.log('❌ No spec consumer generators found.');
console.log(' Try running "confytome init" first.');
return;
}
console.log(`🔄 Executing all spec consumer generators: ${generatorNames.join(', ')}`);
await executeGenerators(generatorNames, options);
} catch (error) {
SimpleErrorHandler.handle(error, 'CLI');
}
}