parser-commands.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env node
  2. import { Command } from 'commander';
  3. import { ParseService } from '../services/parseService';
  4. import { existsSync } from 'fs';
  5. import { resolve } from 'path';
  6. const parseService = new ParseService();
  7. export const parserCommands = (program: Command) => {
  8. program
  9. .command('parse')
  10. .description('Generate documentation from source code comments')
  11. .requiredOption('-i, --input <path>', 'Input directory containing source files')
  12. .requiredOption('-o, --output <path>', 'Output directory for generated documentation')
  13. .option('-l, --languages <languages>', 'Comma-separated list of languages to parse', 'cpp')
  14. .option('-c, --config <config>', 'Configuration file path')
  15. .option('-w, --watch', 'Watch for file changes and regenerate', false)
  16. .option('--incremental', 'Only process changed files', false)
  17. .option('--include-private', 'Include private members', false)
  18. .option('--dry-run', 'Show what would be parsed without generating files', false)
  19. .action(async (options) => {
  20. if (!existsSync(options.input)) {
  21. console.error(`Error: Input directory '${options.input}' does not exist`);
  22. process.exit(1);
  23. }
  24. try {
  25. const result = await parseService.generateDocumentation({
  26. inputPath: resolve(options.input),
  27. outputPath: resolve(options.output),
  28. languages: options.languages.split(',').map((l: string) => l.trim()),
  29. configPath: options.config ? resolve(options.config) : undefined,
  30. watch: options.watch,
  31. incremental: options.incremental,
  32. includePrivate: options.includePrivate,
  33. dryRun: options.dryRun
  34. });
  35. if (options.dryRun) {
  36. console.log('Dry run results:');
  37. console.log(` Files to process: ${result.filesToProcess.length}`);
  38. console.log(` Estimated output files: ${result.estimatedFiles}`);
  39. result.filesToProcess.forEach((file: string) => console.log(` - ${file}`));
  40. } else {
  41. console.log(`Documentation generated successfully!`);
  42. console.log(` Processed ${result.processedFiles} files`);
  43. console.log(` Generated ${result.generatedFiles} documentation files`);
  44. console.log(` Output directory: ${options.output}`);
  45. if (result.errors.length > 0) {
  46. console.log(` Warnings/Errors: ${result.errors.length}`);
  47. result.errors.forEach((error: string) => console.log(` - ${error}`));
  48. }
  49. }
  50. } catch (error: any) {
  51. console.error('Error:', error);
  52. process.exit(1);
  53. }
  54. });
  55. program
  56. .command('parse-list-languages')
  57. .description('List all supported parser languages')
  58. .action(() => {
  59. const languages = parseService.getSupportedLanguages();
  60. console.log('Supported languages:');
  61. languages.forEach(lang => {
  62. console.log(` ${lang.name}: ${lang.description}`);
  63. console.log(` Extensions: ${lang.extensions.join(', ')}`);
  64. console.log();
  65. });
  66. });
  67. program
  68. .command('parse-validate')
  69. .description('Validate configuration and source files')
  70. .requiredOption('-i, --input <path>', 'Input directory to validate')
  71. .option('-c, --config <config>', 'Configuration file to validate')
  72. .action(async (options) => {
  73. if (!existsSync(options.input)) {
  74. console.error(`Error: Input directory '${options.input}' does not exist`);
  75. process.exit(1);
  76. }
  77. try {
  78. const validation = await parseService.validateConfiguration({
  79. inputPath: resolve(options.input),
  80. configPath: options.config ? resolve(options.config) : undefined
  81. });
  82. console.log('Validation results:');
  83. console.log(` Input directory: ${validation.inputValid ? '✓' : '✗'}`);
  84. console.log(` Configuration: ${validation.configValid ? '✓' : '✗'}`);
  85. console.log(` Supported files: ${validation.supportedFiles.length}`);
  86. if (validation.unsupportedFiles.length > 0) {
  87. console.log(` Unsupported files: ${validation.unsupportedFiles.length}`);
  88. validation.unsupportedFiles.forEach((file: string) => console.log(` - ${file}`));
  89. }
  90. if (validation.warnings.length > 0) {
  91. console.log(` Warnings: ${validation.warnings.length}`);
  92. validation.warnings.forEach((warning: string) => console.log(` - ${warning}`));
  93. }
  94. } catch (error: any) {
  95. console.error('Error:', error);
  96. process.exit(1);
  97. }
  98. });
  99. };