@simplyhomes/sos-sdk
Version:
TypeScript SDK for Simply Homes SoS API v4
86 lines (85 loc) ⢠3.84 kB
JavaScript
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();