Skip to content

Transformação de Props

Sistema que intercepta e modifica props antes da renderização — o "filtro inteligente" entre schema e component.

Middleware

Middleware Pipeline permite modificar comportamento dos componentes sem alterar o código:

🔧 O Que Faz:

InputMiddlewareTransformationOutput
Raw props do schemawithValidationAdiciona rules de validaçãoProps com validation
Valores brutoswithFormattingFormata CPF, phone, etc.Valores formatados
Props básicoswithConditionalAplica regras de visibilidadeProps condicionais
Component propswithCustomLogicBusiness logic específicaProps finais

📊 Pipeline Flow:

Execução Sequencial:

text
Raw Props → Middleware 1 → Middleware 2 → Middleware N → Final Props → Component

Exemplo Prático:

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

// Middleware Pipeline
withFormatting: formata CPF
withValidation: adiciona validação
withCustomLogic: adiciona business rules

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

💡 Resultado: Props básicos → Props enriquecidos. Funcionalidade sem código duplicado!


🚀 Tipos de Middleware

Cada middleware tem uma responsabilidade específica:

🛡️ Validation Middleware:

FunçãoEntradaTransformaçãoResultado
Required Fieldsrequired: trueAdiciona validatorCampo obrigatório
Pattern Validationpattern: "email"Regex validationEmail válido
Custom Rulesx-rules: { minLength: 8 }Business validationRegras específicas
Cross-FieldMultiple field refsField dependencyValidação entre campos

🎨 Formatting Middleware:

FunçãoEntradaTransformaçãoResultado
CPF/CNPJtype: "cpf"Mask formatting123.456.789-01
Phonetype: "phone"Phone formatting(11) 99999-9999
Currencytype: "currency"Money formattingR$ 1.234,56
Datetype: "date"Date formattingdd/mm/yyyy

🎯 Conditional Middleware:

FunçãoEntradaTransformaçãoResultado
Visibilityvisible: "\{\{ expression \}\}"Show/hide logicComponent visível/oculto
Disabled Statedisabled: "\{\{ condition \}\}"Enable/disableComponent habilitado/desabilitado
Dynamic Propsprops: "\{\{ context \}\}"Context-based propsProps dinâmicos
Role-basedroles: ["admin"]Permission checkComponent por permissão

🔧 Custom Business Middleware:

FunçãoEntradaTransformaçãoResultado
Audit LoggingAny componentAdd loggingAuditoria automática
AnalyticsUser interactionsAdd trackingMétricas de uso
CachingExpensive operationsAdd memoizationPerformance melhorada
Error BoundaryComponent errorsAdd error handlingResilência aumentada

⚙️ Arquitetura do Pipeline

Como o sistema de middleware funciona internamente:

📋 Execution Flow:

StageInputProcessOutputError Strategy
1. Middleware RegistrationMiddleware listSort by priorityOrdered pipelineSkip invalid middleware
2. Props PreparationRaw schema propsNormalize propsStandard propsUse defaults
3. Pipeline ExecutionProps + middlewareSequential transformationEnhanced propsSkip failing middleware
4. Props ValidationFinal propsValidate prop typesValid propsFilter invalid props
5. Component InjectionComponent + propsProps injectionReady componentError boundary

🎯 Middleware Interface:

Standard Middleware Signature:

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

Middleware Registration:

typescript
const middleware = {
  // Built-in middleware (always executed)
  withValidation: validationMiddleware,
  withFormatting: formattingMiddleware,
  
  // Custom middleware (priority-based)
  withBusinessLogic: customBusinessMiddleware,
  withAnalytics: analyticsMiddleware
};

Priority System:

typescript
const middlewareOrder = [
  'withFormatting',    // Priority: 1 (execute first)
  'withValidation',    // Priority: 2
  'withConditional',   // Priority: 3
  'withBusinessLogic', // Priority: 4
  'withAnalytics'      // Priority: 5 (execute last)
];

📊 Middleware Patterns

Padrões comuns de implementação de middleware:

🔧 Transformation Patterns:

PatternPurposeImplementationExample
EnhancerAdd functionalityprops => ({ ...props, newFeature })Add validation
FilterRemove/modify propsprops => omit(props, 'sensitiveData')Security filtering
MapperTransform valuesprops => ({ ...props, value: transform(props.value) })Format values
ConditionalApply conditionally(props, schema, context) => condition ? enhance(props) : propsRole-based features

🎯 Composition Patterns:

Higher-Order Middleware:

typescript
const withLogging = (middleware) => (props, schema, context) => {
  console.log('Before:', props);
  const result = middleware(props, schema, context);
  console.log('After:', result);
  return result;
};

Async Middleware Chain:

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

Conditional Middleware:

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

💡 Conceitos Relacionados

Middleware Pipeline é o "processador de props" usado por outros conceitos: