Cómo escribir esquemas potentes en JavaScript

Presentamos schm, una biblioteca funcional y altamente componible para crear esquemas en JavaScript y Node.js

He trabajado con HTML, CSS y JavaScript desde 2002. La primera vez que necesité algún tipo de esquema en JavaScript fue hace unos años.

Después de usar muchas bibliotecas diferentes e incluso de crear una y otra, decidí crear schm. Ese es el resultado de toda mi experiencia con esquemas en JavaScript.

¿Qué es schm?

schm es un grupo de paquetes npm para ayudar a los desarrolladores a lidiar con esquemas en JavaScript y Node.js.

Está muy inspirado en Mongoose Schemas. En realidad, son tan similares que puede usar schmparámetros dentro de Mongoose Schemas y viceversa. Sin embargo, no es específico de MongoDB. Puede usarlo para todo en JavaScript.

¿Qué tipo de problemas resuelve schm?

? Análisis y validación de valores de formulario

En el cliente, puede utilizar esquemas para definir modelos para formularios HTML. Facilita la transformación y validación de valores. Además, si usa Node.js en el servidor, puede usar el mismo esquema. El resultado es un comportamiento coherente entre las validaciones de cliente y servidor.

? Análisis y validación de la cadena de consulta

Considere la siguiente cadena de consulta: /?term=John&page=2&limit=10. Al combinar paquetes como schm-koa, schm-express y / o schm-mongo, podrá analizar y validar cadenas de consulta con términos de búsqueda y paginación con facilidad.

☊ Comunicación entre cliente y servidor

Si tiene una aplicación que consume recursos de una API REST, por ejemplo, puede usar esquemas para definir, en el cliente, la estructura del objeto que su cliente espera recibir del servidor. Si algo cambia en el servidor (las propiedades han cambiado de nombre, por ejemplo), simplemente puede actualizar su esquema para que toda la aplicación continúe funcionando.

Creando un esquema

Un esquema simple es solo un mapa de claves y tipos:

Eso es lo mismo que usar una typepropiedad:

Un esquema también puede ser un mapa entre claves y valores predeterminados. Los tipos se inferirán automáticamente:

Eso es equivalente a hacer lo siguiente:

Para obtener más información sobre cómo escribir esquemas, eche un vistazo a Mongoose Schemas.

Analizar valores

Después de definir el esquema, puede usarlo para analizar valores. Este proceso convertirá los valores a los tipos adecuados, además de aplicar otros analizadores definidos en el esquema. Estos son los analizadores disponibles: type, default, set, get, trim, uppercase, lowercase.

La salida será algo como esto:

{ name: "HAZ", birthdate: Tue Apr 10 1990 00:00:00 GMT,}

Validando valores

Al igual que en Mongoose Schemas, puede definir reglas de validación dentro de sus esquemas. Estos son los validadores disponibles: validate, required, match, enum, max, min, maxlength, minlength.

También puede crear analizadores y validadores personalizados ampliando el esquema. Hablaremos de ello más adelante en este artículo.

El error de validación será, por defecto, una matriz de objetos que describen los errores.

[ { message: "age must be greater than or equal 18", min: 18, param: "age", validator: "min", value: 17, }]

Si la validación pasa, devolverá los valores analizados, como parse().

Composición de varios esquemas

Supongamos que tiene esquemas separados que describen a body, identityy otras cosas, y desea componerlos para construir un humanesquema. Eso es tan fácil como parece:

Otra forma de componer esquemas es mediante el anidamiento. Un esquema se puede utilizar como typedentro de otro esquema:

Ampliación de esquemas

Esta es la parte donde schmrealmente brilla. Puede agregar analizadores y validadores personalizados o incluso reemplazar el comportamiento predeterminado de parsey validatemétodos creando grupos de esquemas.

Un grupo de esquemas es una función que recibe el esquema anterior como único argumento. Además de anterior params, parsersy validators, el objeto de esquema tiene un mergemétodo, que es útil para que las funciones de grupo de esquema fusionen nuevas funcionalidades con los esquemas anteriores.

La salida del fragmento anterior será algo como esto:

{ name: "Haz!!!", age: 27,}

Si desea ir más allá y aprender más sobre cómo crear analizadores personalizados, eche un vistazo a cómo se escriben los analizadores dentro de la biblioteca principal aquí.

Al extender los esquemas, podemos crear muchos tipos de cosas. Así es schmcomo se escriben la mayoría de las bibliotecas satélite, como schm-translate, schm-computed y schm-mongo.

Vamos a hablar de uno de ellos ahora.

Cambiar el nombre de las claves de valores

schm-translate es una de las bibliotecas satélite más simples pero poderosas de schm. Son unas pocas más de 10 líneas de código comprimidas en una función que le permite traducir claves de valores a sus claves de esquema.

Supongamos que está trabajando en una aplicación web que consume recursos de una API REST. De repente, los desarrolladores cambian las cosas en la API, lo que hace que el cuerpo de respuesta devuelva un modelo ligeramente diferente al que esperaba el cliente. En lugar de una emailpropiedad, devuelve ahora una matriz de emails.

Esto probablemente hará que su aplicación se rompa. Si no tiene un esquema o cualquier otra forma centralizada de manejar ese objeto, deberá actualizar cada parte de la aplicación para ajustarse a los cambios del servidor.

Con schmy schm-translate, se puede solucionar cambiando algunas líneas de código en un solo lugar:

El resultado será exactamente el que esperaba su aplicación antes del cambio:

{ name: "Haz", email: "[email protected]",}

Haga clic aquí para ver la lista de todos los paquetes

¿En qué se diferencia de otras bibliotecas de esquemas?

Una pregunta común es la diferencia entre schmy otras bibliotecas, como Joi y ajv (que sigue la especificación JSON Schema).

Comparado con ajv, schmno sigue ninguna especificación en particular. En su lugar, intenta imitar la API Mongoose Schema. Además, aunque ajvtiene algunas características de análisis, están limitadas a valores predeterminados y coerción de tipos.

En schm, la capacidad de analizar valores basados ​​en el esquema es lo que hace posible transformar una cadena de consulta en una consulta MongoDB, por ejemplo.

Dicho esto, ambos Joiy ajvse pueden combinar con schm. Puede ampliarlo fácilmente para utilizar un método de validación diferente:

¡Gracias por leer esto!

Si le gusta y lo encuentra útil, aquí hay algunas cosas que puede hacer para mostrar su apoyo:

  • Golpear el aplauso? en este artículo varias veces (hasta 50)
  • Regala una estrella ⭐️ en GitHub: //github.com/diegohaz/schm
  • Sígueme en GitHub: //github.com/diegohaz
  • Sígueme en Twitter: //twitter.com/diegohaz