Skip to content

De JSON a Componentes

Sistema que interpreta schemas JSON y los transforma en elementos React/Vue — el "traductor" entre backend y frontend.

Schema Resolution

Schema Resolution es el proceso que transforma configuraciones JSON en interfaces funcionales:

🔧 Qué Hace:

EntradaProcesoSalidaResultado
JSON Schema del backendResolución + ValidaciónÁrbol de Elementos React/VueInterfaz renderizada
Especificaciones de componenteBúsqueda en registroInstancias de componentesComponentes funcionales
Props y contextoPipeline de middlewareProps mejoradasComportamiento correcto

📊 Flujo de Resolución:

Pasos Automáticos:

  1. Schema Parsing: JSON → Estructura interna
  2. Component Lookup: x-component → Componente React/Vue
  3. Props Resolution: Propiedades del schema → Props del componente
  4. Context Injection: Contexto Form/Menu → Contexto del componente
  5. Middleware Application: Pipeline de transformación de props
  6. Element Creation: Llamadas React.createElement() / Vue h()

Ejemplo Visual:

json
{ "name": "email", "x-component": "InputText", "required": true }

Proceso de Resolución

jsx
<InputText name="email" required={true} onChange={...} />

💡 Resultado: Schema declarativo → Componente imperativo.

🚀 Tipos de Resolución

Diferentes tipos de schema requieren diferentes estrategias de resolución:

📝 Resolución de Schema de Formulario:

Propiedad del SchemaEstrategia de ResoluciónResultado React/VueEjemplo
nameIdentificación de campoProp name<input name="email" />
x-componentBúsqueda en registro de componentesTipo de componente<InputText />
requiredRegla de validaciónProp required + validaciónrequired={true}
x-component-propsPassthrough de propsProps directasplaceholder="Ingresa email"
x-rulesConfiguración de validaciónProps de validaciónpattern="email"

🧭 Resolución de Schema de Menú:

Propiedad del SchemaEstrategia de ResoluciónResultado React/VueEjemplo
labelContenido de textoProp children<MenuItem>Dashboard</MenuItem>
urlObjetivo de navegaciónhref o onClick<Link to="/dashboard" />
iconComponente de iconoElemento de icono<DashboardIcon />
visibleRenderizado condicionalWrapper condicional{visible && <MenuItem />}
childrenElementos de menú anidadosResolución recursiva<Submenu items={...} />

🎨 Resolución de Schema de Componente:

Propiedad del SchemaEstrategia de ResoluciónResultado React/VueEjemplo
x-componentBúsqueda de tipo de componenteClase de componente<Button />
x-uiProps de layout/estiloProps CSS/estiloclassName="col-md-6"
x-component-propsProps específicas del componenteObjeto de props{ variant: "primary" }
x-reactionsManejadores de eventosProps de eventosonClick={handleClick}

⚙️ Motor de Resolución

Cómo el sistema resuelve schemas internamente:

🔄 Pipeline de Resolución:

Raw JSON Schema

Validar Schema (¿JSON válido?)

Resolver Componente (Búsqueda en registro)

Mapear Props (Schema → Props del componente)

Inyectar Contexto (Contexto Form/Menu/Global)

Aplicar Middleware (Pipeline de transformaciones)

Crear Elemento (React.createElement / Vue h())

Elemento React/Vue Final

🎯 Prioridades de Resolución:

Orden de Resolución de Componentes:

  1. Componentes locales (props de factory)
  2. Componentes globales (scheptaProvider)
  3. Overrides de registro (llamadas registerComponent)
  4. Componentes predeterminados (registro integrado)

Orden de Resolución de Props:

  1. Props definidas en schema (x-component-props)
  2. Props derivadas (de estructura del schema)
  3. Props de contexto (contexto de formulario, etc.)
  4. Props predeterminadas (predeterminados del componente)

Orden de Resolución de Middleware:

  1. Middleware integrado (validación, formateo)
  2. Middleware global (scheptaProvider)
  3. Middleware local (props de factory)
  4. Middleware de componente (específico del componente)

📊 Estrategias de Resolución

Diferentes estrategias para diferentes tipos de contenido:

🎯 Resolución de Expresiones:

Tipo de ExpresiónEstrategia de ResoluciónEjemploResultado
Valores EstáticosAsignación directa"required": truerequired={true}
Expresiones de SegmentoSustitución de contexto"\{\{ $segment.tenant \}\}""banco 1"
Expresiones de AsociaciónBúsqueda de asociación"\{\{ $target.title \}\}""Título del Portal"
Expresiones JEXLEvaluación de expresión"\{\{ $segment.role === 'admin' \}\}"true

🔧 Resolución Condicional:

Resolución de Visibilidad:

typescript
const visible = evaluateExpression(schema.visible, context);
if (!visible) return null; // El componente no se renderiza

Resolución de Props Dinámicas:

typescript
const dynamicProps = schema['x-component-props'];
const resolvedProps = resolveDynamicValues(dynamicProps, context);

Resolución de Validación:

  • Reglas → Props: x-rules transformado en propiedades de validación
  • Inyección de Contexto: Contexto de formulario inyectado automáticamente para validación
  • Manejo de Errores: Fallbacks para reglas inválidas o mal formadas

💡 Conceptos Relacionados

Schema Resolution es el "procesador" que conecta schemas con React/Vue: