Skip to main content
Skip to main content

Code Generation Capabilities

Mifty's powerful code generation system automatically creates complete, production-ready modules from your database design. This eliminates hours of boilerplate coding and ensures consistent, high-quality code across your application.

๐Ÿš€ Overviewโ€‹

Mifty provides two main approaches to code generation:

  1. ๐ŸŽจ Visual Database Designer โ†’ Auto-generate modules
  2. ๐Ÿ“ Manual Configuration โ†’ Interactive module creation

Both approaches generate the same comprehensive module structure with all necessary files and patterns.

๐ŸŽฏ What Gets Generatedโ€‹

When you generate a module, Mifty creates a complete, production-ready structure:

src/modules/user/
โ”œโ”€โ”€ ๐Ÿ“ controllers/
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user.controller.ts # HTTP request handlers
โ”œโ”€โ”€ ๐Ÿ“ services/
โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ user.service.ts # Business logic implementation
โ”‚ โ””โ”€โ”€ ๐Ÿ“ interfaces/
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user.service.interface.ts
โ”œโ”€โ”€ ๐Ÿ“ repositories/
โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ user.repository.ts # Data access layer
โ”‚ โ””โ”€โ”€ ๐Ÿ“ interfaces/
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user.repository.interface.ts
โ”œโ”€โ”€ ๐Ÿ“ entities/
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user.entity.ts # TypeScript type definitions
โ”œโ”€โ”€ ๐Ÿ“ dtos/
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user-response.dto.ts # Response formatting
โ”œโ”€โ”€ ๐Ÿ“ validations/
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user.validation.ts # Input validation schemas
โ”œโ”€โ”€ ๐Ÿ“ routes/
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user.routes.ts # Express route definitions
โ”œโ”€โ”€ ๐Ÿ“ tests/
โ”‚ โ”œโ”€โ”€ ๐Ÿ“„ user.service.test.ts # Unit tests
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ user.controller.test.ts # Controller tests
โ””โ”€โ”€ ๐Ÿ“„ di.ts # Dependency injection setup

๐Ÿ“‹ Generated Files Overviewโ€‹

File TypePurposeFeatures
ControllerHTTP request handlingCRUD operations, validation, error handling
ServiceBusiness logicDomain operations, data transformation
RepositoryData accessDatabase operations, query optimization
EntityType definitionsPrisma types, DTOs, interfaces
ValidationInput validationZod schemas, transformation logic
RoutesAPI endpointsRESTful routes, middleware integration
TestsQuality assuranceUnit tests, integration tests
DIDependency injectionService registration, container setup

๐ŸŽจ Method 1: Visual Database Designerโ€‹

Step 1: Design Your Databaseโ€‹

# Start the database designer
npm run db-designer

Open http://localhost:3001/ui and visually design your database:

  1. Add Tables: Click "Add Table" and name your entities
  2. Define Columns: Add fields with types, constraints, and validations
  3. Create Relationships: Connect tables with foreign keys
  4. Save Design: Your design is saved to src/db.design.ts

Step 2: Generate Modulesโ€‹

# Generate modules from your visual design
npm run generate

Choose option 2 (From db design) and Mifty will:

  • โœ… Read your db.design.ts file
  • โœ… Generate modules for each table
  • โœ… Create all relationships and foreign keys
  • โœ… Set up proper validation schemas
  • โœ… Generate complete test suites

Example: Visual Design to Codeโ€‹

Visual Design (src/db.design.ts):

export const dbDesign = {
User: {
columns: {
id: { type: 'String', primary: true, randomUUID: true },
email: { type: 'String', unique: true, nullable: false },
name: { type: 'String', nullable: true },
createdAt: { type: 'DateTime', default: 'now()' }
}
},
Post: {
columns: {
id: { type: 'String', primary: true, randomUUID: true },
title: { type: 'String', nullable: false },
content: { type: 'String', nullable: true },
authorId: { type: 'String', nullable: false },
createdAt: { type: 'DateTime', default: 'now()' }
},
relations: {
author: { type: 'manyToOne', model: 'User', foreignKey: 'authorId' }
}
}
};

Generated Controller (user.controller.ts):

@injectable()
export class UserController extends BaseController<User, UserCreateDto, UserUpdateDto> {
constructor(
@inject('IUserService') private userService: IUserService
) {
super({
service: userService,
responseClass: UserResponse,
createSchema: userValidation.create,
updateSchema: userValidation.update,
searchFields: ['name', 'email'],
defaultInclude: { posts: true }
});
}
}

Generated Service (user.service.ts):

@injectable()
export class UserService extends BaseService<User, UserCreateDto, UserUpdateDto> implements IUserService {
constructor(
@inject('IUserRepository') repository: IUserRepository
) {
super(repository);
}

// Custom business logic methods can be added here
}

Generated Validation (user.validation.ts):

export const createUserSchema = flatToNestedSchema(
z.object({
email: z.string().email(),
name: z.string().optional(),
}),
data => ({
email: data.email,
name: data.name,
})
);

export const userValidation = {
create: createUserSchema,
update: updateUserSchema,
idParam: userIdParamSchema,
search: searchQuerySchema
};

๐Ÿ“ Method 2: Manual Interactive Generationโ€‹

Step 1: Start Interactive Generatorโ€‹

npm run generate

Choose option 1 (Manually) for interactive prompts.

Step 2: Configure Your Moduleโ€‹

The generator will ask you to configure:

๐Ÿ—๏ธ Basic Module Informationโ€‹

Enter module name: product

๐Ÿ“‹ Fields Configurationโ€‹

Add custom fields? (y/n): y
Field name: title
Field type: string
Is optional? (y/n): n
Add validation rules? (y/n): y
Validation rule: min(3).max(100)

๐Ÿ”— Relationships Configurationโ€‹

Add relationships? (y/n): y
Relationship name: category
Related model: Category
Relationship type: manyToOne
Foreign key: categoryId

๐Ÿ›ฃ๏ธ Routes Configurationโ€‹

Include route: getAll? (y/n): y
Include route: getById? (y/n): y
Include route: create? (y/n): y
Include route: update? (y/n): y
Include route: delete? (y/n): y
Include route: search? (y/n): y

๐Ÿงช Testing Configurationโ€‹

Generate service tests? (y/n): y
Generate controller tests? (y/n): y
Generate integration tests? (y/n): y

Step 3: Generated Outputโ€‹

The generator creates all files with your specifications:

// Generated entity with your custom fields
export type Product = Prisma.ProductGetPayload<{
include: {
category: true
}
}>;

// Generated validation with your rules
const createProductSchema = z.object({
title: z.string().min(3).max(100),
categoryId: z.string().uuid(),
});

// Generated routes with your selections
router.get('/product/', productController.findWithPagination);
router.get('/product/search', productController.search);
router.get('/product/:id', productController.getById);
router.post('/product/', productController.create);
router.put('/product/:id', productController.update);
router.delete('/product/:id', productController.delete);

๐Ÿ”ง Advanced Generation Featuresโ€‹

๐ŸŽฏ Prisma Integrationโ€‹

Mifty automatically integrates with your Prisma schema:

// Reads existing Prisma models
const getAllPrismaModelNames = (): string[] => {
const schemaContent = fs.readFileSync('src/prisma/schema.prisma', 'utf-8');
const modelMatches = schemaContent.match(/model\s+(\w+)\s*{/g);
return modelMatches.map(match => match.match(/model\s+(\w+)/)[1]);
};

// Generates type-safe entities
export type User = Prisma.UserGetPayload<{
include: {
posts: true,
profile: true
}
}>;

๐Ÿ”„ Relationship Handlingโ€‹

Mifty automatically handles complex relationships:

One-to-Many Relationshipsโ€‹

// Generated validation for User -> Posts relationship
const createPostSchema = flatToNestedSchema(
z.object({
title: z.string(),
authorId: z.string().uuid(),
}),
data => ({
title: data.title,
author: { connect: { id: data.authorId } }
})
);

Many-to-Many Relationshipsโ€‹

// Generated validation for User <-> Role relationship
const createUserSchema = flatToNestedSchema(
z.object({
email: z.string().email(),
roleIds: z.array(z.string().uuid()),
}),
data => ({
email: data.email,
roles: { connect: data.roleIds.map(id => ({ id })) }
})
);

๐Ÿงช Test Generationโ€‹

Comprehensive test suites are automatically generated:

Unit Testsโ€‹

describe('UserService', () => {
let userService: UserService;
let mockRepository: jest.Mocked<IUserRepository>;

beforeEach(() => {
mockRepository = createMockRepository();
userService = new UserService(mockRepository);
});

describe('create', () => {
it('should create a user successfully', async () => {
const createDto: UserCreateDto = {
email: 'test@example.com',
name: 'Test User'
};

mockRepository.create.mockResolvedValue(mockUser);

const result = await userService.create(createDto);

expect(result).toEqual(mockUser);
expect(mockRepository.create).toHaveBeenCalledWith(createDto);
});
});
});

Integration Testsโ€‹

describe('User Routes', () => {
let app: Application;

beforeAll(async () => {
app = await createTestApp();
});

describe('POST /api/v1/user', () => {
it('should create a new user', async () => {
const userData = {
email: 'test@example.com',
name: 'Test User'
};

const response = await request(app)
.post('/api/v1/user')
.send(userData)
.expect(201);

expect(response.body.success).toBe(true);
expect(response.body.data.email).toBe(userData.email);
});
});
});

๐ŸŽจ Customization Optionsโ€‹

๐Ÿ”ง Template Customizationโ€‹

You can customize the generated code by modifying templates in src/scripts/templates/:

// Custom controller template
export const generateControllerTemplate = (name: string, options: any) => {
return `
@injectable()
export class ${pascalCase(name)}Controller extends BaseController {
constructor(
@inject('I${pascalCase(name)}Service') private service: I${pascalCase(name)}Service
) {
super({
service,
responseClass: ${pascalCase(name)}Response,
// Your custom configuration
searchFields: ${JSON.stringify(options.searchFields)},
defaultInclude: ${JSON.stringify(options.defaultInclude)}
});
}

// Add custom methods here
}`;
};

๐ŸŽฏ Field Type Mappingโ€‹

Mifty automatically maps database types to TypeScript/Zod types:

Database TypeTypeScript TypeZod Validation
Stringstringz.string()
Intnumberz.number().int()
Floatnumberz.number()
Booleanbooleanz.boolean()
DateTimeDatez.union([z.string(), z.date()])
Jsonanyz.any()
Enumunion typez.enum([...])

๐Ÿ”„ Validation Transformationโ€‹

Mifty generates smart validation schemas that handle nested relationships:

// Flat input schema for API
const flatSchema = z.object({
title: z.string(),
categoryId: z.string().uuid(),
});

// Transformed to nested Prisma input
const transformedSchema = flatSchema.transform(data => ({
title: data.title,
category: { connect: { id: data.categoryId } }
}));

๐Ÿš€ Generation Commandsโ€‹

Basic Commandsโ€‹

# Interactive generator
npm run generate

# Generate specific module
npm run generate generate-module user

# Generate from database design
npm run generate generate-module auto

Advanced Commandsโ€‹

# Generate with AI assistance
npm run generate generate-ai --module user --type test

# Generate only tests
npm run generate generate-ai --module user --type test

# Generate only documentation
npm run generate generate-ai --module user --type docs

๐Ÿ” Generated Code Qualityโ€‹

๐Ÿ›ก๏ธ Type Safetyโ€‹

All generated code is fully type-safe:

// Generated with proper Prisma types
export type User = Prisma.UserGetPayload<{
include: { posts: true }
}>;

// Type-safe service methods
async findById(id: string): Promise<User> {
return this.repository.findById(id);
}

๐Ÿงช Test Coverageโ€‹

Generated tests provide comprehensive coverage:

  • โœ… Unit Tests: Service and repository logic
  • โœ… Integration Tests: API endpoint testing
  • โœ… Validation Tests: Input validation scenarios
  • โœ… Error Handling: Exception and edge cases

๐Ÿ“‹ Best Practicesโ€‹

Generated code follows enterprise patterns:

  • โœ… Clean Architecture: Layered separation of concerns
  • โœ… Dependency Injection: Loose coupling and testability
  • โœ… Error Handling: Proper exception management
  • โœ… Validation: Input sanitization and transformation
  • โœ… Documentation: JSDoc comments and type annotations

๐Ÿ”„ Regeneration and Updatesโ€‹

Safe Regenerationโ€‹

Mifty supports safe regeneration of modules:

# Regenerate existing module (prompts for confirmation)
npm run generate generate-module user

Incremental Updatesโ€‹

You can regenerate specific parts:

  1. Update database design in visual designer
  2. Regenerate entities to reflect schema changes
  3. Keep custom business logic in services
  4. Update tests to match new structure

Migration Strategyโ€‹

When updating existing modules:

  1. Backup custom code before regeneration
  2. Regenerate base files (entities, repositories)
  3. Merge custom logic back into services
  4. Update tests for new functionality

๐Ÿ’ก Pro Tipsโ€‹

๐ŸŽฏ Optimization Tipsโ€‹

  1. Use meaningful names for better generated code
  2. Design relationships carefully for optimal queries
  3. Add validation rules during generation for better security
  4. Generate tests early for better development workflow

๐Ÿ”ง Customization Best Practicesโ€‹

  1. Extend base classes rather than modifying generated code
  2. Add custom methods to services for business logic
  3. Use dependency injection for additional services
  4. Keep generated files clean and add customizations in separate files

๐Ÿš€ Performance Considerationsโ€‹

  1. Generated queries are optimized for common use cases
  2. Pagination is built into all list endpoints
  3. Search functionality uses database indexes
  4. Relationships are loaded efficiently with Prisma includes

The code generation system in Mifty eliminates the tedious work of writing boilerplate code while ensuring consistency, type safety, and best practices across your entire application.