cd00eb39ca02807f03ed90804835869260d73b73
- Introduced a new TypeScript file (generate.ts) for generating Angular code with Clean Architecture from OpenAPI/Swagger specifications. - Implemented a CLI using Commander.js for user input and options. - Added functions for analyzing Swagger files, generating code, organizing files, and creating a report. - Integrated Mustache templates for generating models, repositories, use cases, and mappers. - Created a build process with TypeScript and updated package.json to include build scripts and dependencies. - Added TypeScript configuration (tsconfig.json) for compiling the TypeScript code. - Updated the main entry point in package.json to point to the compiled JavaScript file in the dist directory.
OpenAPI Clean Architecture Generator
Generador de código Angular con Clean Architecture desde archivos OpenAPI/Swagger.
🚀 Instalación
Opción 1: Instalación Global
npm install -g @openapitools/openapi-generator-cli
npm install
Opción 2: Usar directamente
npm install
npm run setup
📖 Uso
Comando básico
# Versión compilada
npm run generate -- -i swagger.yaml
# Versión desarrollo (ts-node)
npm run generate:dev -- -i swagger.yaml
# Versión link global (si hiciste npm link)
generate-clean-arch -i swagger.yaml
Opciones disponibles
npm run generate -- [opciones]
Opciones:
-V, --version Mostrar versión
-i, --input <file> Archivo OpenAPI/Swagger (yaml o json) [default: swagger.yaml]
-o, --output <dir> Directorio de salida [default: ./src/app]
-t, --templates <dir> Directorio de templates personalizados [default: ./templates]
--skip-install No instalar dependencias
--dry-run Simular sin generar archivos
-h, --help Mostrar ayuda
Ejemplos
# Generar desde swagger.yaml en src/app
npm run generate -- -i swagger.yaml -o ./src/app
# Usar templates personalizados
npm run generate -- -i api.yaml -t ./mis-templates
# Modo de prueba (no genera archivos)
npm run generate -- -i swagger.yaml --dry-run
# Especificar todos los parámetros
npm run generate -- -i ./docs/api.yaml -o ./frontend/src/app -t ./custom-templates
📁 Estructura Generada
El generador crea la siguiente estructura siguiendo Clean Architecture:
src/app/
├── data/ # Capa de datos
│ ├── dtos/ # Data Transfer Objects
│ │ ├── node/
│ │ │ └── node.dto.ts
│ │ ├── order-type/
│ │ │ └── order-type.dto.ts
│ │ └── supply-mode/
│ │ └── supply-mode.dto.ts
│ ├── repositories/ # Implementaciones de repositorios
│ │ ├── node.repository.impl.ts
│ │ ├── order-type.repository.impl.ts
│ │ └── supply-mode.repository.impl.ts
│ └── mappers/ # Transformadores DTO → Entidad
│ ├── node.mapper.ts
│ ├── order-type.mapper.ts
│ └── supply-mode.mapper.ts
├── domain/ # Capa de dominio
│ ├── repositories/ # Contratos de repositorios
│ │ ├── node.repository.contract.ts
│ │ ├── order-type.repository.contract.ts
│ │ └── supply-mode.repository.contract.ts
│ └── use-cases/ # Casos de uso
│ ├── node/
│ │ ├── node.use-cases.contract.ts
│ │ └── node.use-cases.impl.ts
│ ├── order-type/
│ │ ├── order-type.use-cases.contract.ts
│ │ └── order-type.use-cases.impl.ts
│ └── supply-mode/
│ ├── supply-mode.use-cases.contract.ts
│ └── supply-mode.use-cases.impl.ts
├── di/ # Inyección de dependencias
│ ├── repositories/ # Providers de repositorios
│ │ ├── node.repository.provider.ts
│ │ ├── order-type.repository.provider.ts
│ │ └── supply-mode.repository.provider.ts
│ └── use-cases/ # Providers de use cases
│ ├── node.use-cases.provider.ts
│ ├── order-type.use-cases.provider.ts
│ └── supply-mode.use-cases.provider.ts
└── entities/ # Entidades de dominio
└── models/
├── node.model.ts
├── order-type.model.ts
└── supply-mode.model.ts
🔧 Personalización
Modificar Templates
Los templates están en la carpeta templates/. Cada archivo .mustache define cómo se genera un tipo de archivo.
Templates disponibles:
model.mustache- DTOsmodel-entity.mustache- Entidades del modelomapper.mustache- Mappersapi.repository.contract.mustache- Contratos de repositorioapi.repository.impl.mustache- Implementaciones de repositorioapi.use-cases.contract.mustache- Contratos de use casesapi.use-cases.impl.mustache- Implementaciones de use casesrepository.provider.mustache- Providers de repositoriouse-cases.provider.mustache- Providers de use cases
Variables Mustache Disponibles
{{classname}} - Nombre de la clase (ej: "OrderType")
{{classVarName}} - Nombre en camelCase (ej: "orderType")
{{classFilename}} - Nombre del archivo (ej: "order-type")
{{constantName}} - Constante (ej: "ORDER_TYPE")
{{description}} - Descripción del schema
{{httpMethod}} - Método HTTP (get, post, etc)
{{path}} - Path del endpoint
{{nickname}} - Nombre del método
{{allParams}} - Todos los parámetros
{{returnType}} - Tipo de retorno
{{vars}} - Variables del modelo
📊 Reporte de Generación
Después de cada generación, se crea un archivo generation-report.json con estadísticas:
{
"timestamp": "2025-01-15T10:30:00.000Z",
"tags": 3,
"endpoints": 8,
"outputDirectory": "./src/app",
"structure": {
"dtos": 15,
"repositories": 9,
"mappers": 3,
"useCases": 6
}
}
🎯 Ejemplo Completo
1. Preparar tu proyecto
# Clonar o copiar el generador
cd mi-proyecto-angular
mkdir generator
cd generator
# Copiar archivos del generador aquí
2. Copiar tu Swagger
cp ../docs/api.yaml ./swagger.yaml
3. Generar código
npm run generate -- -i swagger.yaml
4. Registrar providers en Angular
En tu app.module.ts o app.config.ts:
import { NodeRepositoryProvider } from '@/di/repositories/node.repository.provider';
import { NodeUseCasesProvider } from '@/di/use-cases/node.use-cases.provider';
// ... importar otros providers
@NgModule({
providers: [
// Repositories
NodeRepositoryProvider,
OrderTypeRepositoryProvider,
SupplyModeRepositoryProvider,
// Use Cases
NodeUseCasesProvider,
OrderTypeUseCasesProvider,
SupplyModeUseCasesProvider
]
})
export class AppModule {}
5. Usar en componentes
import { Component, inject } from '@angular/core';
import { NODE_USE_CASES, NodeUseCases } from '@/domain/use-cases/node/node.use-cases.contract';
@Component({
selector: 'app-nodes',
template: `...`
})
export class NodesComponent {
#nodeUseCases = inject(NODE_USE_CASES);
loadNodes() {
this.#nodeUseCases.getNodes('TI').subscribe(nodes => {
console.log(nodes);
});
}
}
🐛 Troubleshooting
Error: openapi-generator-cli no encontrado
npm install -g @openapitools/openapi-generator-cli
# o
npm run setup
Error: Archivo swagger.yaml no encontrado
Asegúrate de especificar la ruta correcta:
npm run generate -- -i ./ruta/a/tu/swagger.yaml
Los imports no se resuelven (@/ no funciona)
Configura los path aliases en tu tsconfig.json:
{
"compilerOptions": {
"paths": {
"@/*": ["src/app/*"],
"@environment": ["src/environments/environment"]
}
}
}
Los templates no generan el código esperado
- Verifica que tus templates están en
./templates/ - Revisa la sintaxis Mustache
- Usa
--dry-runpara verificar sin generar archivos
📝 Notas
- El generador crea archivos
.ts, no los compila - Los providers deben registrarse manualmente en tu módulo Angular
- Asegúrate de tener configurado
@mercadona/commono ajusta los imports en los templates - El generador asume Angular 17+ con inject() function
🤝 Contribuir
Si encuentras bugs o mejoras, siéntete libre de modificar los templates y el script según tus necesidades.
📄 Licencia
MIT