Schema
This content is not available in your language yet.
El schema es un objeto plano donde cada clave es el nombre del campo y el valor describe cómo renderizarlo y validarlo. La forma sigue convenciones de Mongoose y se traduce internamente a JSON Schema para AJV.
const schema = { fieldName: { type: 'String', // requerido required: true, // validación label: 'Nombre', // UI hint placeholder: 'Tu nombre', minLength: 2, }, // ...más campos};Tipos de campo soportados
Sección titulada «Tipos de campo soportados»type | JS / TS | Renderiza como |
|---|---|---|
'String' | string | <co-input> (text por defecto) |
'Number' | number | <co-input type="number"> |
'Boolean' | boolean | <co-checkbox> |
'Date' | Date | string ISO | <co-input type="date"> |
'ObjectId' | string | <co-ref-field> (requiere ref) |
'Mixed' | any | <co-input> (text) |
Atributos de validación (estándar JSON Schema)
Sección titulada «Atributos de validación (estándar JSON Schema)»| Atributo | Aplica a | Descripción |
|---|---|---|
required | todos | El campo debe tener valor |
min | Number | Valor numérico mínimo |
max | Number | Valor numérico máximo |
minLength | String | Longitud mínima |
maxLength | String | Longitud máxima |
enum | String | Valores permitidos. Renderiza como <co-select> |
match o regex | String | RegExp pattern |
format | String | email, date-time, uri, uuid, etc. (ajv-formats) |
default | todos | Valor inicial. Puede ser función () => value |
multiple | String/ObjectId | Hace que el campo sea array |
Atributos UI (extensiones Prolibu)
Sección titulada «Atributos UI (extensiones Prolibu)»| Atributo | Tipo | Descripción |
|---|---|---|
label | string | Etiqueta visible. Si falta, se deriva del name (camelCase → “Camel Case”) |
placeholder | string | Placeholder del input |
eg | string | Ejemplo en helper text (e.g. foo@bar.com) |
description | string | Texto auxiliar bajo el campo |
helperText | string | Alias de description |
readOnly | boolean | El usuario no puede editar |
disabled | boolean | El campo está deshabilitado |
hidden | boolean | El campo no se renderiza pero sí participa de validación |
full | boolean | El campo ocupa el ancho completo en layout grid |
uiCom | string | Override del componente: 'TextArea', 'HtmlEditor', custom |
Atributos para campos de referencia
Sección titulada «Atributos para campos de referencia»| Atributo | Tipo | Descripción |
|---|---|---|
ref | string | Modelo backend al que apunta (ej. 'Company', 'User') |
displayName | string | Campo del modelo que se muestra al usuario (default: 'name') |
Ver Campos de referencia para el detalle.
Ejemplo completo
Sección titulada «Ejemplo completo»const userSchema = { // String simple firstName: { type: 'String', required: true, minLength: 2, maxLength: 50, label: 'Nombre', placeholder: 'Tu nombre', },
// Email con formato validado email: { type: 'String', required: true, format: 'email', label: 'Email', eg: 'usuario@empresa.com', },
// Number con rango age: { type: 'Number', min: 18, max: 120, default: 25, label: 'Edad', },
// Boolean → checkbox newsletter: { type: 'Boolean', default: true, label: 'Suscribirme al newsletter', },
// Enum → select country: { type: 'String', enum: ['Colombia', 'México', 'Argentina', 'España'], default: 'Colombia', required: true, label: 'País', },
// Reference field company: { type: 'ObjectId', ref: 'Company', displayName: 'name', label: 'Empresa', required: true, },
// Textarea (override vía uiCom) bio: { type: 'String', uiCom: 'TextArea', maxLength: 500, label: 'Biografía', description: 'Cuéntanos sobre ti (máx. 500 caracteres)', full: true, },
// Date birthDate: { type: 'Date', label: 'Fecha de nacimiento', },
// Password (con pattern) password: { type: 'String', required: true, minLength: 8, match: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/, label: 'Contraseña', description: 'Mínimo 8 caracteres, una mayúscula y un número', },};Defaults dinámicos
Sección titulada «Defaults dinámicos»default acepta una función que se invoca una sola vez al construir el form:
const schema = { createdAt: { type: 'Date', default: () => new Date(), }, slug: { type: 'String', default: () => crypto.randomUUID(), },};Inferencia automática del label
Sección titulada «Inferencia automática del label»Si no defines label, se deriva del nombre del campo aplicando case conversion:
name | label inferido |
|---|---|
firstName | First Name |
email_address | Email Address |
phoneNumber | Phone Number |
URL | URL |
Conversión interna a JSON Schema
Sección titulada «Conversión interna a JSON Schema»form-core traduce tu schema Mongoose a JSON Schema antes de pasarlo a AJV. Si necesitas inspeccionarlo:
import { mongooseToJsonSchema } from '@prolibu-suite/cobalt-form-core';
const jsonSchema = mongooseToJsonSchema(userSchema);console.log(jsonSchema);// { type: 'object', properties: {...}, required: [...] }Esto es útil para sincronizar con OpenAPI o tooling externo de validación.