Skip to content

Transformación de Props

Sistema que intercepta y modifica props antes del renderizado — el "filtro inteligente" entre schema y componente.

Middleware

El Pipeline de Middleware permite modificar el comportamiento de componentes sin cambiar código:

🔧 Qué Hace:

EntradaMiddlewareTransformaciónSalida
Props crudas del schemawithValidationAñade reglas de validaciónProps con validación
Valores crudoswithFormattingFormatea CPF, teléfono, etc.Valores formateados
Props básicaswithConditionalAplica reglas de visibilidadProps condicionales
Props de componentewithCustomLogicLógica de negocio específicaProps finales

📊 Flujo del Pipeline:

Ejecución Secuencial:

text
Props Crudas → Middleware 1 → Middleware 2 → Middleware N → Props Finales → Componente

Ejemplo Práctico:

typescript
// Entrada
{ name: "cpf", value: "12345678901", required: true }

// Pipeline de Middleware
withFormatting: formatea CPF
withValidation: añade validación
withCustomLogic: añade reglas de negocio

// Salida  
{ name: "cpf", value: "123.456.789-01", required: true, pattern: /\d{3}\.\d{3}\.\d{3}-\d{2}/, onValidate: validateCPF }

💡 Resultado: Props básicas → Props enriquecidas. ¡Funcionalidad sin código duplicado!

🚀 Tipos de Middleware

Cada middleware tiene una responsabilidad específica:

🛡️ Middleware de Validación:

FunciónEntradaTransformaciónResultado
Campos Requeridosrequired: trueAñade validadorCampo requerido
Validación de Patrónpattern: "email"Validación regexEmail válido
Reglas Personalizadasx-rules: { minLength: 8 }Validación de negocioReglas específicas
Cross-FieldReferencias de múltiples camposDependencia de campoValidación entre campos

🎨 Middleware de Formateo:

FunciónEntradaTransformaciónResultado
CPF/CNPJtype: "cpf"Formateo de máscara123.456.789-01
Teléfonotype: "phone"Formateo de teléfono(11) 99999-9999
Monedatype: "currency"Formateo de dinero$1,234.56
Fechatype: "date"Formateo de fechamm/dd/yyyy

🎯 Middleware Condicional:

FunciónEntradaTransformaciónResultado
Visibilidadvisible: "\{\{ expression \}\}"Lógica mostrar/ocultarComponente visible/oculto
Estado Deshabilitadodisabled: "\{\{ condition \}\}"Habilitar/deshabilitarComponente habilitado/deshabilitado
Props Dinámicasprops: "\{\{ context \}\}"Props basadas en contextoProps dinámicas
Basado en Rolroles: ["admin"]Verificación de permisosComponente por permiso

🔧 Middleware de Negocio Personalizado:

FunciónEntradaTransformaciónResultado
Audit LoggingCualquier componenteAñade loggingAuditoría automática
AnalyticsInteracciones de usuarioAñade trackingMétricas de uso
CachéOperaciones costosasAñade memoizaciónRendimiento mejorado
Error BoundaryErrores de componenteAñade manejo de erroresMayor resiliencia

⚙️ Arquitectura del Pipeline

Cómo funciona el sistema de middleware internamente:

📋 Flujo de Ejecución:

EtapaEntradaProcesoSalidaEstrategia de Error
1. Registro de MiddlewareLista de middlewareOrdenar por prioridadPipeline ordenadoOmitir middleware inválido
2. Preparación de PropsProps crudas del schemaNormalizar propsProps estándarUsar predeterminados
3. Ejecución del PipelineProps + middlewareTransformación secuencialProps mejoradasOmitir middleware fallido
4. Validación de PropsProps finalesValidar tipos de propsProps válidasFiltrar props inválidas
5. Inyección de ComponenteComponente + propsInyección de propsComponente listoError boundary

🎯 Interfaz de Middleware:

Firma Estándar de Middleware:

typescript
type Middleware = (
  props: ComponentProps,
  schema: SchemaNode,
  context: RenderContext
) => ComponentProps | Promise<ComponentProps>;

Registro de Middleware:

typescript
const middleware = {
  // Middleware integrado (siempre ejecutado)
  withValidation: validationMiddleware,
  withFormatting: formattingMiddleware,
  
  // Middleware personalizado (basado en prioridad)
  withBusinessLogic: customBusinessMiddleware,
  withAnalytics: analyticsMiddleware
};

Sistema de Prioridad:

typescript
const middlewareOrder = [
  'withFormatting',    // Prioridad: 1 (ejecutar primero)
  'withValidation',    // Prioridad: 2
  'withConditional',   // Prioridad: 3
  'withBusinessLogic', // Prioridad: 4
  'withAnalytics'      // Prioridad: 5 (ejecutar último)
];

📊 Patrones de Middleware

Patrones comunes de implementación de middleware:

🔧 Patrones de Transformación:

PatrónPropósitoImplementaciónEjemplo
EnhancerAñadir funcionalidadprops => ({ ...props, newFeature })Añadir validación
FilterEliminar/modificar propsprops => omit(props, 'sensitiveData')Filtrado de seguridad
MapperTransformar valoresprops => ({ ...props, value: transform(props.value) })Formatear valores
ConditionalAplicar condicionalmente(props, schema, context) => condition ? enhance(props) : propsCaracterísticas basadas en rol

🎯 Patrones de Composición:

Higher-Order Middleware:

typescript
const withLogging = (middleware) => (props, schema, context) => {
  console.log('Antes:', props);
  const result = middleware(props, schema, context);
  console.log('Después:', result);
  return result;
};

Cadena de Middleware Asíncrona:

typescript
const asyncPipeline = async (props, middleware) => {
  return middleware.reduce(async (propsPromise, middleware) => {
    const currentProps = await propsPromise;
    return middleware(currentProps, schema, context);
  }, Promise.resolve(props));
};

Middleware Condicional:

typescript
const conditionalMiddleware = (condition, middleware) => 
  (props, schema, context) => 
    condition(props, schema, context) ? middleware(props, schema, context) : props;

💡 Conceptos Relacionados

El Pipeline de Middleware es el "procesador de props" usado por otros conceptos: