UNPKG

@simplyhomes/sos-sdk

Version:

TypeScript SDK for Simply Homes SoS API v4

86 lines (85 loc) • 3.84 kB
import { parseConfig } from './config-parser'; import { detectTypes, detectBodyDtos } from './type-detector'; import { validateEndpoints } from './validator'; import { generateResourceFile, generateV4File } from './code-generator'; import { exportModels } from './model-exporter'; import { writeFile } from './utils'; async function main() { console.log('šŸš€ Starting SDK wrapper generation...\n'); const startTime = Date.now(); try { // 1. Parse config console.log('šŸ“‹ Parsing sdk.config.yml...'); const config = await parseConfig('sdk.config.yml'); console.log(`āœ… Found ${Object.keys(config.resources).length} resources\n`); // 2. Detect types from generated code console.log('šŸ” Detecting types from generated API files...'); const typeMap = await detectTypes(); console.log(`āœ… Detected ${typeMap.size} API methods\n`); // 2b. Detect available body DTOs const bodyDtoSet = detectBodyDtos(); // 3. Validate endpoints (STRICT MODE) console.log('āœ”ļø Validating endpoints against OpenAPI spec...'); const validationErrors = await validateEndpoints(config, typeMap); if (validationErrors.length > 0) { console.warn('\nāš ļø ' + validationErrors.length + ' validation warnings (continuing anyway):\n'); // Just show first 5 errors validationErrors.slice(0, 5).forEach(err => { console.warn(` • ${err.resourcePath}: ${err.endpoint}`); }); console.warn(` ... and ${validationErrors.length - 5} more\n`); } else { console.log('āœ… All endpoints validated\n'); } // 4. Generate resource wrappers console.log('šŸ“ Generating resource wrappers...'); let generatedCount = 0; for (const [resourceName, resourceConfig] of Object.entries(config.resources)) { try { const code = generateResourceFile(resourceName, resourceConfig, typeMap, bodyDtoSet); await writeFile(`resources/${resourceName}.ts`, code); generatedCount++; console.log(` āœ“ ${resourceName}.ts`); } catch (error) { console.error(` āœ— ${resourceName}.ts - ${error instanceof Error ? error.message : String(error)}`); throw error; } } console.log(`\nāœ… Generated ${generatedCount} resource files\n`); // 5. Generate v4.ts aggregator console.log('šŸ“ Generating v4.ts aggregator...'); const v4Code = generateV4File(config.resources); await writeFile('resources/v4.ts', v4Code); console.log(' āœ“ v4.ts\n'); // 6. Export all models with V4 namespace console.log('šŸ“¦ Exporting models with V4 namespace...'); await exportModels(); console.log(' āœ“ src/index.ts updated\n'); // Done! const duration = ((Date.now() - startTime) / 1000).toFixed(2); console.log(`\n✨ Generation complete in ${duration}s!\n`); console.log('šŸ“Š Summary:'); console.log(` • ${generatedCount} resource wrappers`); console.log(` • ${typeMap.size} API methods`); console.log(` • 1 V4 aggregator class`); console.log(` • Auto-exported models with V4 namespace\n`); process.exit(0); } catch (error) { console.error('\nāŒ Generation failed:\n'); if (error instanceof Error) { console.error(error.message); if (error.stack) { console.error('\nStack trace:'); console.error(error.stack); } } else { console.error(String(error)); } process.exit(1); } } main();