hygen-templates
v1.0.0
Published
Generadores Hygen para crear módulos NestJS con DDD y Clean Architecture
Maintainers
Readme
Hygen Templates
Librería de generadores Hygen para crear módulos NestJS con DDD y Clean Architecture de forma rápida y estandarizada.
🚀 Instalación
Opción 1: CLI Global (Recomendado)
npm install -g hygen-templatesOpción 2: Como dependencia local
npm install hygen-templates📦 Uso
Con CLI Global
# Generar un módulo completo
hygen-templates module new --name=loans
# Ver ayuda
hygen-templatesCon dependencia local
Configuración en tu proyecto
Crea un archivo hygen.js en la raíz de tu proyecto:
module.exports = {
templates: `${__dirname}/node_modules/hygen-templates/_templates`,
};Generar un módulo completo
npx hygen module new --name=loansEsto generará la siguiente estructura:
src/modules/loans/
├── domain/
│ ├── entities/
│ │ └── loan.entity.ts
│ └── repositories/
│ └── loan.repository.interface.ts
├── application/
│ └── use-cases/
│ └── create-loan.usecase.ts
├── infrastructure/
│ ├── repositories/
│ │ └── loan.repository.ts
│ └── mappers/
│ └── loan.mapper.ts
├── presentation/
│ ├── controllers/
│ │ └── loan.controller.ts
│ └── dtos/
│ └── create-loan.dto.ts
└── loan.module.ts🏗️ Arquitectura Generada
Domain Layer
- Entities: Entidades de dominio con TypeORM
- Repositories: Interfaces de repositorio siguiendo el patrón Repository
Application Layer
- Use Cases: Casos de uso que implementan la lógica de negocio
Infrastructure Layer
- Repositories: Implementaciones concretas de los repositorios
- Mappers: Conversores entre entidades y DTOs
Presentation Layer
- Controllers: Controladores REST con endpoints CRUD básicos
- DTOs: Objetos de transferencia de datos con validaciones
📝 Archivos Generados
Entidad Base
@Entity('loans')
export class LoanEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ type: 'varchar', length: 255 })
name: string;
@Column({ type: 'text', nullable: true })
description?: string;
@Column({ type: 'boolean', default: true })
isActive: boolean;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}Use Case de Creación
@Injectable()
export class CreateLoanUseCase {
constructor(
private readonly loanRepository: ILoanRepository,
) {}
async execute(createLoanDto: CreateLoanDto): Promise<LoanEntity> {
const loan = await this.loanRepository.create({
name: createLoanDto.name,
description: createLoanDto.description,
isActive: true,
});
return loan;
}
}Controller REST
@Controller('loans')
export class LoanController {
@Post()
@HttpCode(HttpStatus.CREATED)
async create(@Body() createLoanDto: CreateLoanDto) {
// Implementation
}
@Get()
async findAll() {
// Implementation
}
@Get(':id')
async findOne(@Param('id') id: string) {
// Implementation
}
@Put(':id')
async update(@Param('id') id: string, @Body() updateLoanDto: Partial<CreateLoanDto>) {
// Implementation
}
@Delete(':id')
@HttpCode(HttpStatus.NO_CONTENT)
async remove(@Param('id') id: string) {
// Implementation
}
}🔧 Personalización
Los templates utilizan helpers de Hygen para adaptar los nombres dinámicamente:
h.changeCase.pascal(name):loan→Loanh.changeCase.camel(name):loan→loanh.changeCase.kebab(name):loan→loan
🚀 Próximas Funcionalidades
- Generador de Value Objects:
npx hygen vo new --name=email - Generador de Repositorios:
npx hygen repo new --name=user - Generador de Use Cases:
npx hygen usecase new --name=approve-loan - Generador de DTOs:
npx hygen dto new --name=update-user
🛠️ Desarrollo Local
Para contribuir al proyecto o probar cambios localmente:
# Clonar el repositorio
git clone https://github.com/fncordoba/hygen-templates.git
cd hygen-templates
# Instalar dependencias
npm install
# Instalar localmente para pruebas
npm link
# Probar el CLI
hygen-templates module new --name=test-module
# Desinstalar
npm unlink hygen-templates📄 Licencia
MIT
🤝 Contribuir
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
📞 Soporte
Si tienes alguna pregunta o necesitas ayuda, por favor abre un issue en GitHub.
