@ts-for-gir/cli
Version:
TypeScript type definition generator for GObject introspection GIR files
127 lines (106 loc) • 3.94 kB
text/typescript
import { mkdir } from "node:fs/promises";
import { type Generator, GeneratorType } from "@ts-for-gir/generator-base";
import { HtmlDocGenerator } from "@ts-for-gir/generator-html-doc";
import { JsonDefinitionGenerator } from "@ts-for-gir/generator-json";
import { TypeDefinitionGenerator } from "@ts-for-gir/generator-typescript";
import {
conflictsReporter,
ERROR_NO_MODULE_SPECIFIED,
FILE_PARSING_DONE,
GENERATING_TYPES_DONE,
type GirModule,
girParsingReporter,
type NSRegistry,
type OptionsGeneration,
Reporter,
ReporterService,
START_MODULE,
TSDATA_PARSING_DONE,
TypeIdentifier,
} from "@ts-for-gir/lib";
export class GenerationHandler {
log: Reporter;
generator: Generator;
protected readonly config: OptionsGeneration;
protected readonly registry: NSRegistry;
private readonly reporterService: ReporterService;
constructor(config: OptionsGeneration, type: GeneratorType, registry: NSRegistry) {
this.registry = registry;
this.config = config;
this.log = new Reporter(config.verbose, "GenerationHandler", config.reporter, config.reporterOutput);
this.reporterService = ReporterService.getInstance();
// Configure the reporter service
this.reporterService.configure(config.reporter, config.reporterOutput);
// Configure reporters globally
TypeIdentifier.configureReporter(config.reporter, config.reporterOutput);
conflictsReporter.configure(config.reporter, config.reporterOutput);
girParsingReporter.configure(config.reporter, config.reporterOutput);
// Register the main handler reporter
if (config.reporter) {
this.reporterService.registerReporter("GenerationHandler", this.log);
}
switch (type) {
case GeneratorType.TYPES:
this.generator = new TypeDefinitionGenerator(config, this.registry);
break;
case GeneratorType.HTML_DOC:
this.generator = new HtmlDocGenerator(config, this.registry);
break;
case GeneratorType.JSON:
this.generator = new JsonDefinitionGenerator(config, this.registry);
break;
default:
throw new Error("Unknown Generator");
}
}
public async start(girModules: GirModule[]): Promise<void> {
this.log.info(START_MODULE);
if (girModules.length === 0) {
this.log.error(ERROR_NO_MODULE_SPECIFIED);
}
this.log.info(FILE_PARSING_DONE);
this.log.info(TSDATA_PARSING_DONE);
try {
if (this.config.outdir) {
await mkdir(this.config.outdir, { recursive: true });
}
// TODO: Put this somewhere that makes sense
this.registry.transform({
inferGenerics: true,
verbose: this.config.verbose,
reporter: this.config.reporter,
reporterOutput: this.config.reporterOutput,
});
await this.generator.start();
for (const girModule of girModules) {
this.log.log(` - ${girModule.packageName} ...`);
await this.generator.generate(girModule);
}
await this.generator.finish(girModules);
this.log.success(GENERATING_TYPES_DONE);
} finally {
// Generate comprehensive report if reporter is enabled
// This will run even if there's an error
if (this.config.reporter) {
await this.generateComprehensiveReport();
}
}
}
private async generateComprehensiveReport(): Promise<void> {
try {
// Generate report once, pass to print and save
const report = this.reporterService.generateComprehensiveReport();
this.reporterService.printComprehensiveSummary(report);
await this.reporterService.saveComprehensiveReport(undefined, report);
const totalProblems = report.statistics.totalProblems;
const modulesProcessed = this.reporterService.getReporters().size;
if (totalProblems > 0) {
this.log.info(`📊 Generated comprehensive report: ${totalProblems} issues across ${modulesProcessed} modules`);
} else {
this.log.success("🎉 Generation completed without any reported issues across all modules!");
}
} catch (error) {
this.log.danger(`Failed to generate comprehensive report: ${error}`);
}
}
}