Skip to content
/ schema Public

Verifica un objeto con un esquema, tipo MongoDB

Notifications You must be signed in to change notification settings

dapize/schema

Repository files navigation

Schema

Es un sistema simple de verificación y compilación de objetos a travez de un esquema.

Definiciones

Existen dos formas de declarar el tipo de valor que tendrá una propiedad:

  • La simple: Se define como valor el nombre del tipo que tendrá la propiedad.
// Ejemplo
const objSchema = {
  title: 'string',
  position: 'number'
};

Crearemos un esquema con una sola propiedad 'title' de tipo 'string'.

const myObj = {
  title: 'string'
};
const titleSchema = new Schema(myObj);
  • La compuesta: Como valor de la propiedad a verificar se crea un objeto con la siguiente sintaxis:
// Ejemplo sintaxis:
{
  type: 'string', // Nombre del tipo
  required: true, // Si es obligatoria esta propiedad
  default: 'Titulo cualquiera' // El valor por defecto de la propiedad
}
// Ejemplo de definición compuesta, tomando como base el ejemplo de más arriba:
const objSchema = {
  title: {
    type: 'string',
    required: true
  },
  position: {
    type: 'number',
    default: 10
  }
};
const titleSchema = new Schema(objSchema); // inicializamos el schema.
  • Los tipos disponibles para verificar son: string, number, object, boolean y array , y se declaran escritos como string.

Cuando el tipo de valor es objeto, es posible definir una propiedad adicional llamada 'properties' en donde cada llave de este objeto usa la misma sintaxis de la definición simple o compuesta.

const objSchema = {
  friends: {
    type: 'object',
    required: true,
    properties: {
      work: 'array', // definición simple.
      neighborhood: { // definición compuesta.
        type: 'array',
        required: true
      }
    }
  }
};
const friendsSchema = new Schema(objSchema); // inicializamos el schema.

Cuando se espera que el valor de una propiedad en un objeto a validar sea de más de un tipo, digamos, de tipo 'string' o de tipo 'array', se debe declarar los tipos entre de un array

const objSchema = {
  tasks: ['string', 'array'] // digamos que tienes solo un 'task' (string) o varias (array).
};
const tasksSchema = new Schema(objSchema); // inicializamos el schema.

OJO:

  • La propiedad 'required' y 'default', son opcionales.
  • Todos las propiedades de un esquema definido son opcionales a menos que se declaren requeridas (con la propiedad 'required' en true obviamente. No hace falta poner 'required' en false obviamente, simplemente se obvia.)

Métodos disponibles

  • validate(Object) : Sirve para validar un objeto con el esquema. Comunmente el objeto es un response de una solicitud (tal vez un ajax).
// Verificamos si es válido un objeto con el esquema creado más arriba
const myResponse = {
  title: 'Título cualquiera'
};
titleSchema.validate(myResponse); // => true
// Si cumple con el esquema definido, porque la propiedad 'title', es un 'string'
// y existe en el objeto pasado para ser validado.
  • compile(obj) : Obtiene el objeto fusionado con el esquema iniciado. Esto se usa normalmente para obtener un objeto más grande que contendrá las propiedades 'por defecto' que se declararón en el esquema.

Si yá se validó no es necesario pasar como argumento el objeto a compilar.

const myObj = {
  title: {
    type: 'string',
    required: true
  },
  description: {
    type: 'string',
    default: 'Ejemplo de descripción'
  },
  authors: ['string', 'array']
};

const myResponse = {
  title: 'Título cualquiera',
  authors: 'Loki' // authors: ['Loki', 'Thor', 'Iroman']
};

const myTitle = new Schema(myObj);
myTitle.validate(myResponse); // => TRUE
myTitle.compile();

/*
 =>

  {
    title: 'Título cualquiera',
    description: 'Ejemplo de descripción',
    authors: 'Loki'
  }
*/

Compilación doble:

Vá a ver casos en donde necesitemos compilar más de un objeto con el mismo schema, ejemplo:

const myObj = {
  image: {
    type: 'string',
    required: true
  },
  'image-alt': 'string',
  'image-title': 'string',
  title: {
    type: 'string',
    required: true
  },
  'title-tag': {
    type: 'string',
    default: 'h4'
  },
  description: 'string'
};

const mySchema = new Schema(myObj);

// Response 1:
mySchema.compile({
  image: '../../assets/images/premio.png',
  title: 'Costo Cero',
  description: 'Esta es una descripción extraña'
});

/*
  =>

  {
    description: "Esta es una descripción extraña"
    image: "../../assets/images/premio.png",
    title: "Costo Cero",
    "title-tag": "h4"
  }
*/

// Response 2:
mySchema.compile({
  image: '../../assets/images/premio2.png',
  title: 'Costo Cero 2',
  description: 'Esta es una descripción extraña 2'
});

/*
  =>

  {
    description: "Esta es una descripción extraña 2"
    image: "../../assets/images/premio2.png",
    title: "Costo Cero 2",
    "title-tag": "h4"
  }
*/

Getters

Locales

  • different : Devuelve los valores diferentes entre el esquema y el objeto pasado.
  • missings.required : Devuelve una lista de las propiedades requeridas inexistentes.
  • missings.optional : Devuelve una lista de las propiedades opcionales inexistentes.
  • errors : Devuelve una lista de los errores encontrados en la compilación.
// Tomando en cuenta el ejemplo de más arriba:
console.log(myTitle.different);
console.log(myTitle.missings.required);
console.log(myTitle.missings.optional);
console.log(myTitle.errors);

Generales

  • Schema.version : Variable estática. Imprime la versión actual de la librería.
console.log(Schema.version);
// =>
1.0Beta

Navegadores compatibles

IE11+, Chrome, Firefox, Safari, Opera

Extras

Más información técnica en la carpeta 'docs'

Por agregar:

  • Método 'extend' : Servirá para extender un schema previamente definido.
  • Propiedad 'pattern': Servirá para verificar específicamente si el valor cumple con un patrón definido, muy aparte de la existencia de la misma propiedad en el objeto pasado.

Por el momento es todo lo que trae, más adelante agregaré más caracteristicas, como más métodos y eventos.

Licencia

MIT