Skip to content

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
};
typeJS / TSRenderiza 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)»
AtributoAplica aDescripción
requiredtodosEl campo debe tener valor
minNumberValor numérico mínimo
maxNumberValor numérico máximo
minLengthStringLongitud mínima
maxLengthStringLongitud máxima
enumStringValores permitidos. Renderiza como <co-select>
match o regexStringRegExp pattern
formatStringemail, date-time, uri, uuid, etc. (ajv-formats)
defaulttodosValor inicial. Puede ser función () => value
multipleString/ObjectIdHace que el campo sea array
AtributoTipoDescripción
labelstringEtiqueta visible. Si falta, se deriva del name (camelCase → “Camel Case”)
placeholderstringPlaceholder del input
egstringEjemplo en helper text (e.g. foo@bar.com)
descriptionstringTexto auxiliar bajo el campo
helperTextstringAlias de description
readOnlybooleanEl usuario no puede editar
disabledbooleanEl campo está deshabilitado
hiddenbooleanEl campo no se renderiza pero sí participa de validación
fullbooleanEl campo ocupa el ancho completo en layout grid
uiComstringOverride del componente: 'TextArea', 'HtmlEditor', custom
AtributoTipoDescripción
refstringModelo backend al que apunta (ej. 'Company', 'User')
displayNamestringCampo del modelo que se muestra al usuario (default: 'name')

Ver Campos de referencia para el detalle.

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',
},
};

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(),
},
};

Si no defines label, se deriva del nombre del campo aplicando case conversion:

namelabel inferido
firstNameFirst Name
email_addressEmail Address
phoneNumberPhone Number
URLURL

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.