Skip to content

Props Transformation ​

System that intercepts and modifies props before rendering β€” the "intelligent filter" between schema and component.

Middleware

Middleware Pipeline allows modifying component behavior without changing code:

πŸ”§ What It Does: ​

InputMiddlewareTransformationOutput
Raw props from schemawithValidationAdds validation rulesProps with validation
Raw valueswithFormattingFormats CPF, phone, etc.Formatted values
Basic propswithConditionalApplies visibility rulesConditional props
Component propswithCustomLogicSpecific business logicFinal props

πŸ“Š Pipeline Flow: ​

Sequential Execution:

text
Raw Props β†’ Middleware 1 β†’ Middleware 2 β†’ Middleware N β†’ Final Props β†’ Component

Practical Example:

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

// Middleware Pipeline
β†’ withFormatting: formats CPF
β†’ withValidation: adds validation
β†’ withCustomLogic: adds business rules

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

πŸ’‘ Result: Basic props β†’ Enriched props. Functionality without duplicated code!


πŸš€ Middleware Types ​

Each middleware has a specific responsibility:

πŸ›‘οΈ Validation Middleware: ​

FunctionInputTransformationResult
Required Fieldsrequired: trueAdds validatorRequired field
Pattern Validationpattern: "email"Regex validationValid email
Custom Rulesx-rules: { minLength: 8 }Business validationSpecific rules
Cross-FieldMultiple field refsField dependencyValidation between fields

🎨 Formatting Middleware: ​

FunctionInputTransformationResult
CPF/CNPJtype: "cpf"Mask formatting123.456.789-01
Phonetype: "phone"Phone formatting(11) 99999-9999
Currencytype: "currency"Money formatting$1,234.56
Datetype: "date"Date formattingmm/dd/yyyy

🎯 Conditional Middleware: ​

FunctionInputTransformationResult
Visibilityvisible: "\{\{ expression \}\}"Show/hide logicComponent visible/hidden
Disabled Statedisabled: "\{\{ condition \}\}"Enable/disableComponent enabled/disabled
Dynamic Propsprops: "\{\{ context \}\}"Context-based propsDynamic props
Role-basedroles: ["admin"]Permission checkComponent by permission

πŸ”§ Custom Business Middleware: ​

FunctionInputTransformationResult
Audit LoggingAny componentAdd loggingAutomatic auditing
AnalyticsUser interactionsAdd trackingUsage metrics
CachingExpensive operationsAdd memoizationImproved performance
Error BoundaryComponent errorsAdd error handlingIncreased resilience

βš™οΈ Pipeline Architecture ​

How the middleware system works internally:

πŸ“‹ 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 ​

Common middleware implementation patterns:

πŸ”§ 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;

Middleware Pipeline is the "props processor" used by other concepts: