Skip to content

Transformação de Props

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

Middleware

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

O Que Faz:

EntradaMiddlewareTransformaçãoSaída
Props brutas do schemaMiddleware de expressões de templateSubstitui {{ $formValues.x }}, {{ $externalContext.x }}Props resolvidas
Props + schema + contextoMiddleware customizadoValidação, formatação, lógicaProps finais
Props do componenteSeu middlewareQualquer transformaçãoProps enriquecidas

Fluxo do Pipeline:

Execução sequencial (ordem do array):

text
Props Brutas → Middleware 1 → Middleware 2 → ... → Props Finais → Componente

Built-in: O middleware de expressões de template roda primeiro (ao usar FormFactory), então os valores do formulário e o contexto externo ficam disponíveis para substituição. Em seguida quaisquer middlewares que você passar (middlewares do Provider e middlewares da factory) rodam em ordem.

Resultado: Props básicas → Props enriquecidas. Funcionalidade sem código duplicado!

Interface do Middleware

Assinatura (de @schepta/core):

typescript
import type { MiddlewareFn, MiddlewareContext } from '@schepta/core';

const myMiddleware: MiddlewareFn = (props, schema, context) => {
  // props: objeto de props atual
  // schema: o nó do schema para este componente
  // context: MiddlewareContext
  return { ...props, /* suas alterações */ };
};

MiddlewareContext fornece:

  • formValues — valores atuais do formulário (para middleware que usa formulário)
  • externalContextexternalContext do Provider (usuário, API, etc.)
  • debug — utilitários de debug quando debug está habilitado
  • formAdapter — adapter de formulário quando disponível (ex.: no FormFactory)

Registro: Middlewares são passados como array, não como objeto. A ordem de execução é a ordem no array.

typescript
<ScheptaProvider middlewares={[templateMiddleware, withValidation, withAnalytics]}>
  ...
</ScheptaProvider>

// Ou por factory
<FormFactory schema={schema} middlewares={[customMiddleware]} />

O pipeline aplica os middlewares em sequência; cada um recebe o resultado do anterior. Use applyMiddlewares do core se precisar rodar o mesmo pipeline em outro lugar.

Padrões de Middleware

Padrões de transformação:

PadrãoPropósitoImplementação
EnhancerAdicionar funcionalidade(props, schema, context) => ({ ...props, newFeature })
FilterRemover/modificar props(props) => omit(props, 'sensitiveData')
MapperTransformar valores(props) => ({ ...props, value: transform(props.value) })
ConditionalAplicar condicionalmente(props, schema, context) => condition ? enhance(props) : props

Exemplo – wrapper de logging:

typescript
const withLogging = (next: MiddlewareFn): MiddlewareFn => (props, schema, context) => {
  if (context.debug?.isEnabled) {
    context.debug.log('middleware', 'Before', props);
  }
  const result = next(props, schema, context);
  if (context.debug?.isEnabled) {
    context.debug.log('middleware', 'After', result);
  }
  return result;
};

Conceitos Relacionados

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

  • 01. Factories: Factories executam o pipeline de middleware para cada componente
  • 04. Schema Resolution: A resolução aplica o middleware durante o processamento
  • 05. Renderer: Renderers recebem as props após o middleware
  • 02. Schema Language: Propriedades do schema (ex.: x-component-props) são transformadas pelo middleware
  • 03. Provider: O Provider registra o array global middlewares
  • 07. Debug System: O debug pode registrar a execução do middleware quando habilitado