Arquetipo Angular para arrancar nuevos desarrollos. Generado con Angular CLI 21.1.x.
- Angular 21 con standalone, signals y control flow moderno (
@if,@for,@switch) - SSR con Express y hydration (event replay)
- Jest para pruebas unitarias (en lugar de Karma)
- ESLint + Prettier (angular-eslint, TypeScript, accesibilidad en templates)
- Husky + lint-staged: formato y lint solo sobre archivos staged en cada commit; tests en pre-commit
- Interceptor HTTP global para trazabilidad básica de peticiones
- Manejo global de errores (cliente + SSR) con logging estructurado
- Ejemplo Clean Architecture / Hexagonal (frontend) con feature
posts - Playwright E2E con suite base para validación end-to-end
- Convenciones en
.cursor/rules: OnPush, signals,inject(), reactive forms, etc.
npm install
ng serveAbre http://localhost:4200/. La aplicación recarga al cambiar el código.
Si npm install falla por un error de Husky (p. ej. EPERM en Windows o en unidades de red), la instalación seguirá completándose. Para activar los hooks de pre-commit más tarde, ejecuta npx husky en una terminal con permisos de escritura en el repo.
| Script | Descripción |
|---|---|
ng serve / npm start |
Servidor de desarrollo |
ng build |
Build de producción (salida en dist/) |
ng test |
Tests unitarios con Jest |
npm run test:coverage |
Tests con cobertura |
npm run test:related |
Tests relacionados con archivos staged |
npm run check |
Validación completa (lint + test:coverage + build) |
npm run bundle:report |
Genera reporte de tamaño de bundles desde dist/ |
npm run bundle:report:build |
Build + reporte de bundle |
npm run e2e |
Suite E2E con Playwright |
npm run e2e:install |
Instala navegador Chromium para Playwright |
npm run e2e:ui |
Ejecuta Playwright en modo UI |
npm run security:audit |
Ejecuta auditoría de dependencias (falla en high/critical) |
npm run security:licenses |
Genera reporte de licencias de dependencias de producción |
npm run security:check |
Ejecuta auditoría + reporte de licencias |
ng lint |
Lint (ESLint) |
npm run lint:fix |
Lint con auto-fix |
npm run format |
Formatear con Prettier |
- Node.js
>=20.19.0(ver.nvmrc) - npm
>=10
Comando disponible:
npm run project:rename -- --name \"Nombre Producto\" [--slug nombre-producto] [--yes]
Uso recomendado:
- Vista previa (sin aplicar cambios):
npm run project:rename -- --name \"Acme Portal\"- Aplicar cambios de nombre:
npm run project:rename -- --name \"Acme Portal\" --slug acme-portal --yes- Validar el resultado:
npm install
npm run check
npm run e2eEstructura base de src/app/:
src/app/
core/ # Interceptors y piezas transversales
shared/ # Componentes, directivas y pipes reutilizables
features/ # Vertical slices por funcionalidad (lazy)
layout/ # Páginas de estructura general (home/shell)
No es obligatorio crear todas las carpetas desde el inicio; se pueden añadir según necesidad.
Para features nuevas, el arquetipo recomienda organizar por slice vertical (feature-first) y no por capas globales.
Comparativa rápida:
- Feature-first (recomendado): cada feature encapsula
domain,application,infrastructureypresentation; reduce acoplamiento entre features y facilita evolución independiente. - Capas globales (alternativa): agrupa por tipo técnico (
domain/,application/, etc. a nivel raíz); puede servir en equipos pequeños al inicio, pero tiende a mezclar contextos de negocio y crecer con más fricción.
Plantilla reutilizable por feature:
src/app/features/<feature-name>/
domain/
<feature>.model.ts
<feature>-repository.port.ts
application/
<use-case>.ts
<use-case>.spec.ts
<feature>-repository.token.ts
infrastructure/
<http-feature>.repository.ts
<feature>.dto.ts
<feature>.mapper.ts
<feature>.mapper.spec.ts
presentation/
<feature>.facade.ts
<feature>.facade.spec.ts
<feature>.page.ts
<feature>.page.html
<feature>.page.scss
<feature>.routes.ts
Guía práctica:
- Crear la carpeta de feature en
src/app/features/. - Definir primero
domainyapplication(puertos + casos de uso). - Implementar adaptadores en
infrastructure. - Exponer el flujo en
presentationcon facade y page. - Registrar rutas lazy (
<feature>.routes.ts) y conectar DI por tokens.
Ejemplo implementado en src/app/features/posts usando endpoint de prueba:
GET https://jsonplaceholder.typicode.com/posts/1- Nota:
postses una feature de demo para mostrar la arquitectura. Debe eliminarse al iniciar un proyecto real.
Capas del ejemplo:
domain: entidadPosty puertoPostRepository(sin Angular/HTTP)application: caso de usoGetPostByIdUseCaseinfrastructure:HttpPostRepository, DTO y mapperpresentation:PostDetailFacade+PostDetailPage
El enrutado de la feature es lazy (/posts/:id) y el wiring de dependencias se hace vía DI con token (POST_REPOSITORY).
- Levanta el proyecto:
npm start- Abre:
http://localhost:4200/http://localhost:4200/posts/1
La página /posts/1 obtiene y renderiza el post desde JSONPlaceholder.
- Eliminar carpeta demo:
src/app/features/posts
- Eliminar ruta demo en:
src/app/app.routes.ts(entradapath: 'posts')
- Ajustar Home demo si no aplica:
src/app/layout/home.page.ts
- Eliminar tests demo asociados:
src/app/features/posts/**/*.spec.tssrc/app/app.routes.spec.ts(assert de rutaposts)e2e/app.e2e.spec.ts(casos que navegan a/posts/1)
- Crear tu primera feature real siguiendo el mismo patrón hexagonal.
ng generate component nombre-componente
ng generate --help # Listado de schematics (components, directives, pipes, etc.)Por defecto los componentes se generan con estilo SCSS y prefijo app.
ng buildArtifacts en dist/. Build de producción con optimizaciones por defecto.
ng testSe usa Jest con jest-preset-angular y umbral de cobertura global mínimo del 60%.
- La cobertura global mínima está fijada en
60%parastatements,branches,functionsylines. - El alcance actual de cobertura está orientado al código de aplicación (
src/app/**/*.ts) y excluye archivos boilerplate de configuración/rutas. - El workflow de CI ejecuta
npm run check(lint + tests con cobertura + build). - El reporte de cobertura se publica como artefacto de GitHub Actions (
coverage-report). - La suite E2E está disponible para ejecución local o para integrarla en CI según necesidades del proyecto.
- Budgets de Angular ajustados en
angular.json:initial: warning350kB, error700kBanyComponentStyle: warning3kB, error6kB
- Reporte de bundle:
npm run bundle:report- salida en
reports/bundle-summary.jsonyreports/bundle-summary.md
- El reporte puede publicarse como artefacto de CI si se agrega un paso dedicado en el workflow.
Loggercentral ensrc/app/core/logging/logger.service.tscon nivelesdebug/info/warn/error.GlobalErrorHandlerensrc/app/core/errors/global-error-handler.service.tspara errores no capturados en cliente.- Interceptor HTTP (
src/app/core/interceptors/http-request.interceptor.ts) que:- registra cada request/response,
- normaliza
HttpErrorResponseaApiError.
- En SSR (
src/server.ts) existe middleware de error para registrar y responder con código controlado (SSR_RENDER_ERROR).
Este arquetipo adopta Conventional Commits:
tipo(scope opcional): descripcion corta
Tipos recomendados:
feat: nueva funcionalidadfix: correccion de bugrefactor: refactor sin cambio funcionaltest: cambios en testsdocs: documentacionchore: mantenimiento tecnicoci: cambios de pipeline
Ejemplos:
feat(posts): add post detail facadefix(ssr): handle render error middlewaredocs(readme): add commit convention section
Validación automática:
- Se usa
commitlintcon configuración encommitlint.config.cjs. - Hook de Husky:
.husky/commit-msg. - Si el mensaje no cumple la convención, el commit se bloquea.
El arquetipo incluye E2E con Playwright (e2e/app.e2e.spec.ts) con escenarios base:
- Home renderiza correctamente.
/posts/1renderiza datos desde API mockeada./posts/1renderiza error normalizado ante fallo de servidor.
Ejecución local:
npm run e2e:install
npm run e2eDesacoplar / desactivar E2E temporalmente:
- Local:
E2E_DISABLED=1 npm run e2e
- CI:
- por defecto el workflow actual no ejecuta E2E automáticamente.
- puedes agregar un job
e2ededicado y usarE2E_DISABLED=1como toggle.
Incluye controles automáticos:
npm run security:audit:- genera
reports/npm-audit.json - falla si detecta vulnerabilidades
highocritical - si no hay conectividad al registry, falla por defecto (seguro por diseño)
- genera
npm run security:licenses:- genera
reports/licenses.json - genera
reports/licenses-summary.txt
- genera
npm run security:check:- ejecuta ambos controles
CI:
- por defecto el workflow actual no ejecuta
security:check. - puedes agregar un job
securitydedicado para correr auditoría + licencias y publicar artefactos.
Desactivar temporalmente el job security en CI (si lo implementas):
- define variable de repositorio
SECURITY_DISABLED=1
Nota para entornos offline/locales restringidos:
- puedes permitir auditoría sin red de forma explícita:
SECURITY_AUDIT_ALLOW_NETWORK_ERROR=1 npm run security:audit