1#!/usr/bin/env -S deno run --allow-read --allow-write --allow-net
2/**
3 * api-server-generator.ts โ Template generator for creating new API servers from OpenAPI specs.
4 * Generates controller stubs, registry configuration, and basic server structure.
5 */
11interface ServerTemplate {
12 name: string;
13 openApiSpecPath: string;
14 outputDirectory: string;
15 controllers: ControllerInfo[];
31}
32
33export class APIServerGenerator {
34 /**
35 * Generate a new API server from OpenAPI specification
36 */
37 static async generateServer(template: ServerTemplate): Promise<void> {
38 console.log(`๐ Generating API server: ${template.name}`);
39 console.log(`๐ OpenAPI Spec: ${template.openApiSpecPath}`);
40 console.log(`๐ Output Directory: ${template.outputDirectory}`);
41
42 // 1. Parse OpenAPI spec
43 const spec = await this.parseOpenAPISpec(template.openApiSpecPath);
44
45 // 2. Extract controller information
61 await this.copyBaseFiles(template.outputDirectory);
62
63 console.log(`โ
API server generated successfully in ${template.outputDirectory}`);
64 console.log(`๐ Next steps:`);
65 console.log(` 1. cd ${template.outputDirectory}`);
70
71 /**
72 * Parse OpenAPI specification file
73 */
74 private static async parseOpenAPISpec(specPath: string): Promise<any> {
75 try {
76 const content = await Deno.readTextFile(specPath);
85 } catch (error) {
86 const errorMessage = error instanceof Error ? error.message : String(error);
87 throw new Error(`Failed to parse OpenAPI spec: ${errorMessage}`);
88 }
89 }
90
91 /**
92 * Extract controller information from OpenAPI spec
93 */
94 private static extractControllers(spec: any): ControllerInfo[] {
96
97 if (!spec.paths) {
98 console.warn("No paths found in OpenAPI spec");
99 return [];
100 }
138
139 /**
140 * Create directory structure for new API server
141 */
142 private static async createDirectoryStructure(outputDir: string): Promise<void> {
145 "src/core",
146 "src/middleware",
147 "src/openapi",
148 "src/utils",
149 "src/types",
150 "src/external-apis",
151 "src/tests",
152 ];
362 ): string {
363 return `/**
364 * main.tsx โ Generated API server entry point
365 * Server: ${template.name}
366 */
369import { cors } from 'hono/cors';
370import { logger } from 'hono/logger';
371import { OpenAPIRouteGenerator } from './src/openapi/route.generator.ts';
372
373const app = new Hono();
386});
387
388// Initialize OpenAPI routes
389try {
390\tconst routeGenerator = new OpenAPIRouteGenerator(app);
391\tawait routeGenerator.loadAndGenerateRoutes('./src/openapi');
392\tconsole.log('โ
Routes loaded successfully');
393} catch (error) {
417
418console.log(\`๐ Starting \${' ${template.name}'} server on port \${port}\`);
419console.log(\`๐ API Documentation: http://localhost:\${port}/docs\`);
420
421Deno.serve({ port }, app.fetch);
430 if (args.length < 3) {
431 console.log(
432 "Usage: deno run --allow-read --allow-write api-server-generator.ts <name> <openapi-spec> <output-dir>",
433 );
434 console.log(
435 "Example: deno run --allow-read --allow-write api-server-generator.ts MyAPI ./openapi.yaml ./my-api-server",
436 );
437 Deno.exit(1);
441
442 try {
443 await APIServerGenerator.generateServer({
444 name,
445 openApiSpecPath: specPath,
446 outputDirectory: outputDir,
447 controllers: [], // Will be extracted from spec