La instancia
Es devuelta por qmapCreator y se encarga de compilar la
query y devolver funciones de ayuda.
Args
function qmap(query, options) {
//
}
query
Es el string que representa su query, también es posible pasar
null y undefined que representan que no se hará ninguna
transformación ("", "{}" también representan lo mismo)
options
Es un objeto opcional que permite definir el schema y las variables por default
(ambos pueden ser sobreescritos), schema le hace saber a la función cuál de los
schemas debe utilizar para filtrar la información
y variables sirven para dar valores a las variables en las funciones.
Si sobreescribe el schema en la función apply debe sobreescribirlo en la función
includes, ya que sino van a diferir en comportamiento.
Al ejecutar
const qmap = qmapCreator()
const { errors, apply, includes } = qmap(`{
[ upperCase(products.name) ],
transaction.providers.id,
take([ currency([ add(ids, @offset) ]) ], @quantity)
}`, {
variables: {
quantity: 1,
offset: 300,
}
})
La ejecución de la función de compilación devuelve
un objeto que contiene: errors, apply e includes.
errors
Es un array con los errores al compilar la query, es undefined si no hay errores.
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator()
const { errors } = qmap("{ id, name }")
includes
Es una función que permite comprobar si el path
(dónde está alojado un objeto dentro del JSON)
se debe agregar. Respeta a los schemas y a las
queries de qmapCreator, por lo que no importa si
está en la query que se compiló con la función qmap,
si el schema o la query no lo tienen,
el resultado será false. Existe un segundo
parámetro (opcional) que sirve para sobreescribir
el schema, si en apply declara nuevamente el
schema asegurese de sobreescribirlo también en
includes.
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator()
const { includes } = qmap(`{
product {
provider {
account
}
}
}`)
// se necesita un array que representa el camino hacia lo
// que se pregunta
includes(["product"]) // true
includes(["product", "provider"]) // true
includes(["product", "provider", "account"]) // true
includes(["product", "provider", "id"]) // false
includes utiliza un índice que se genera en compilación,
si se tiene schemas o queries se realiza la búsqueda
primero en el indice de schemas, luego en el de queries
y por último sobre la query actual.
La intención de esta función es que se puedan realizar operaciones de forma condicional, por ejemplo agregar un join si es necesario (ayuda a cambiar el enfoque en el caso de tener diferentes niveles de acceso a la información).
apply
Es la función que trasforma el JSON, recibe como
primer argumento el JSON objetivo, y como segundo (opcional)
las opciones, que es el objeto dónde se pueden agregar las
variables, sobreescribir el schema (cuidado con
sobreescribir el schema, asegúrese de hacerlo en ambos, apply e includes)
e indicar en dónde se debe aplicar las transformaciones.
Las variables pueden tener cualquier tipo de dato.
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator({
functions: {
concat: (...strs) => strs.join("")
},
schemas: `{
user {
name
}
}`
})
const { apply } = qmap(`{
id,
name,
label: concat(id, @separator, name)
}`, {
variables: {
separator: "@"
}
})
const input = {
id: 1,
name: "test",
other: "other"
}
const result = apply(input)
// result is { id: 1, name: 'test', label: '1@test' }
const otherResult = apply(input, {
schema: "user",
variables: {
separator: "-"
}
})
// result is { id: null, name: 'test', label: '-test' }
over option
Es un arreglo de strings que indican el path para
llegar al lugar dónde se deben aplicar las transformaciones,
por ejemplo ["request", "data"] se aplica a input.request.data
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator()
const { apply } = qmap(`{
id,
name,
}`)
const input = {
status: "success",
data: {
id: 1,
name: "test",
other: "other"
}
}
const result = apply(input, { over: ["data"] })
// result is { data: { id: 1, name: 'test' } }