Domain Layer (Entities & Domain Logic)
La capa Domain define el lenguaje del negocio dentro del frontend.
Aquí viven los modelos y las reglas que representan cómo el producto entiende sus datos, independientemente de:
- cómo el backend los expone
- cómo la UI los muestra
- cómo se obtienen (REST, GraphQL, mock, etc.)
👉 El Domain es el punto de estabilidad de la arquitectura.
El Domain desacopla las interfaces
El Domain actúa como un contrato interno estable entre capas:
Infrastructure (API / DTOs)
↓
Domain ← punto estable
↑
Application / UI
Si cambia el backend → se ajustan transforms
Si cambia la UI → el Domain no cambia
Si cambian las reglas → cambias el Domain, no la UI ni la API
👉 El resto del sistema no conoce DTOs, solo conoce Domain models.
Estructura de un domain
domain/
├── model/
├── logic/
└── form/ # opcional — solo si el feature tiene formularios
Tipos de archivos en Domain
1. model.ts (Entities)
Qué es
Definición de las entidades del negocio tal como el frontend las entiende y utiliza.
Responsabilidad
- Representar conceptos del negocio
- Los modelos como los conoce el front y como son más facil de utilizar en capas posteriores
- Usar nombres del negocio, no del backend
Ejemplo
export type User = {
id: string;
status: 'ACTIVE' | 'BLOCKED';
...
};
2. logic.ts (Domain logic)
Qué es
Funciones puras que operan sobre entidades.
Responsabilidad
-
Reglas
-
Validaciones
-
Invariantes
Ejemplo
export function canUserSubmit(user: User) {
return user.status === 'ACTIVE';
}
3. form.ts (Form Schemas & Types)
Qué es
Archivo que centraliza los esquemas de validación (Zod), tipos y valores por defecto de los formularios de un feature.
Responsabilidad
- Definir esquemas Zod para validación de formularios
- Exportar tipos inferidos desde los esquemas (
z.infer) - Proveer factory functions para valores por defecto (
createXDefaultValues)
Estructura de cada form
Cada formulario dentro del archivo sigue este patrón:
- Schema Zod — la definición de validación
- Type — inferido del schema con
z.infer - Default values factory — función que retorna valores iniciales
Ejemplo — auth.form.ts
// domain/auth.form.ts
import { z } from 'zod';
// 1. Schema Zod
export const loginFormDefinition = z.object({
email: z.string().min(1, 'El correo es obligatorio').email('Correo inválido'),
password: z.string().min(1, 'La contraseña es obligatoria'),
});
// 2. Type inferido
export type TLoginForm = z.infer<typeof loginFormDefinition>;
// 3. Default values factory
export function createLoginDefaultValues(
partial?: Partial<TLoginForm>
): TLoginForm {
return {
email: partial?.email ?? '',
password: partial?.password ?? '',
};
}
🧪 Testing de esta capa
Para ver lineamientos, alcance y ejemplos de pruebas del Domain layer, consulta:
👉 /docs/frontend/quality/testing/testing-by-layer/domain-test