UNPKG

@surv-co/prisma-typeorm-db-utils

Version:

Transform Prisma schemas to TypeORM entities with NestJS integration and fast pg-mem testing

82 lines 4.15 kB
import { mkdirSync, readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; import { createPrismaSchemaTransformer, createTypeORMEntityTransformer } from '../src/transformers'; async function generateEntities() { console.log('🚀 Starting entity generation from extensive Prisma schema...'); try { // Read the extensive Prisma schema const schemaPath = join(__dirname, 'schema.prisma'); const schemaContent = readFileSync(schemaPath, 'utf-8'); console.log('📖 Read extensive Prisma schema file for integration testing'); // Create transformers const schemaTransformer = createPrismaSchemaTransformer(); const entityTransformer = createTypeORMEntityTransformer(); // Step 1: Transform Prisma schema to table configs console.log('🔄 Step 1: Transforming Prisma schema to table configs...'); const tableConfigsResult = await schemaTransformer.transformPrismaSchema(schemaContent)(); if (tableConfigsResult._tag === 'Left') { console.error('❌ Failed to transform Prisma schema:', tableConfigsResult.left.message); return; } const tableConfigs = tableConfigsResult.right; console.log(`✅ Successfully transformed schema to ${Object.keys(tableConfigs).length} table configs`); // Log table names for verification console.log('📋 Tables found:'); Object.keys(tableConfigs).forEach(tableName => { console.log(` - ${tableName}`); }); // Step 2: Transform table configs to TypeORM entities console.log('🔄 Step 2: Transforming table configs to TypeORM entities...'); const entitiesResult = await entityTransformer.transform(tableConfigs)(); if (entitiesResult._tag === 'Left') { console.error('❌ Failed to generate TypeORM entities:', entitiesResult.left.message); return; } const entities = entitiesResult.right; console.log(`✅ Successfully generated ${entities.length} TypeORM entities`); // Step 3: Write entities to files console.log('💾 Step 3: Writing entities to files...'); const outputDir = join(__dirname, 'generated-entities'); // Create output directory if it doesn't exist try { mkdirSync(outputDir, { recursive: true }); } catch (error) { // Directory might already exist, that's fine } // Write each entity to a separate file entities.forEach((entityCode, index) => { // Extract class name from the entity code const classNameMatch = entityCode.match(/export class (\w+)/); const className = classNameMatch ? classNameMatch[1] : `Entity${index + 1}`; const fileName = `${className}.ts`; const filePath = join(outputDir, fileName); writeFileSync(filePath, entityCode, 'utf-8'); console.log(` 📄 Wrote ${fileName}`); }); // Step 4: Create an index file that exports all entities console.log('📝 Step 4: Creating index file...'); const indexContent = entities .map((entityCode, index) => { const classNameMatch = entityCode.match(/export class (\w+)/); const className = classNameMatch ? classNameMatch[1] : `Entity${index + 1}`; return `export { ${className} } from './${className}';`; }) .join('\n'); const indexPath = join(outputDir, 'index.ts'); writeFileSync(indexPath, indexContent + '\n', 'utf-8'); console.log(' 📄 Wrote index.ts'); console.log('🎉 Entity generation completed successfully!'); console.log(`📁 Output directory: ${outputDir}`); console.log(`📊 Generated ${entities.length} entities`); } catch (error) { console.error('💥 Unexpected error during entity generation:', error); } } // Run the generation if (require.main === module) { generateEntities().catch(console.error); } export { generateEntities }; //# sourceMappingURL=generate-entities.js.map