Biblioteca para serializar y deserializar la sintaxis del filtro PocketBase.
Puede instalar PBF fácilmente usando npm o hilo:
npm install pbf
o
yarn add pbf
PBF simplifica el trabajo con la sintaxis del filtro PocketBase. Aquí hay un ejemplo rápido de cómo comenzar:
import * as pbf from "@nedpals/pbf" ;
import PocketBase from "pocketbase" ;
const pb = new PocketBase ( "<pocketbase url>" ) ;
const result = await pb . collection ( 'example' ) . getList ( 1 , 20 , {
filter : pbf . stringify ( pbf . and (
pbf . eq ( 'status' , true ) ,
pbf . gt ( 'created' , new Date ( "2022-08-01" ) )
) ) // status = true && created > "2022-08-01 10:00:00.000Z"
} ) ;
Para negar un filtro (por ejemplo, igual a no igual y a o), puede utilizar la función not
. Esto no niega el valor sino solo el operador utilizado.
import * as pbf from "@nedpals/pbf" ;
pbf . stringify ( pbf . not ( pbf . eq ( "is_repost" , false ) ) ) // is_repost = false
En algunos casos, desea crear un filtro de búsqueda con algunos de los filtros habilitados condicionalmente mediante un cortocircuito. Puede hacer esto agregando el modificador .maybe
antes de llamar a los operadores. Esto filtrará cualquier valor falso y generará los filtros apropiados.
import * as pbf from "@nedpals/pbf" ;
pbf . stringify ( pbf . and . maybe (
false && pbf . eq ( 'f' , 4 ) ,
null ,
pbf . eq ( 'd' , 1 ) ,
0 ,
pbf . not ( pbf . eq ( 'e' , 1 ) ) ,
) ) ; // d = 1 && e != 1
En lugar de repetirse escribiendo múltiples filtros de comparación del mismo campo, PBF proporciona un atajo sencillo a través de either
los modificadores.
import * as pbf from "@nedpals/pbf" ;
// shortcut for pbf.or(pbf.eq("size", "L"), pbf.eq("size", "XL"), pbf.eq("size", "XXL"))
pbf . stringify ( pbf . eq . either ( "size" , [ "L" , "XL" , "XXL" ] ) ) ; // (size = "L" || size = "XL") || size = "XXL"
PBF también admite el análisis de cadenas de filtro sin formato en un formato PBF adecuado. Esto es excelente cuando desea analizar la consulta de búsqueda de URL o simplemente desea crear una experiencia de búsqueda similar a PocketBase:
import * as pbf from "@nedpals/pbf" ;
const result = pbf . parse ( "title = 'example'" ) ; // equivalent to eq("title", "example");
// You can also inject/bind values to placeholders
const resultB = pbf . parse ( "title = {:title}" , { title : "Foo bar" } ) // equivalent of eq("title", "Foo bar")
Para hacer posible la serialización/deserialización, PBF lo almacena como un objeto siguiendo un formato de árbol de sintaxis para distinguir filtros lógicos, de comparación y en contenedores/entre paréntesis.
// Taken and modified from the source code for brevity
type FilterValue = number | boolean | string | Date | null ;
type Filter = ComparisonFilter | LogicalFilter | ContainerFilter ;
type Metadata = Record < string , any >
// eg. a = 1
interface ComparisonFilter {
field : string
op : Operator
value : FilterValue
meta ?: Metadata
}
// eg. a > 1 && b = 2
interface LogicalFilter {
lhs : Filter
op : Operator
rhs : Filter
meta ?: Metadata
}
// eg. (c = 3)
interface ContainerFilter {
op : Operator
filter : Filter
meta ?: Metadata
}
Esto también hace que sea más fácil crear filtros a mano, especialmente cuando se crean filtros dinámicos similares a facetas:
const filter : Filter = {
op : "and" ,
lhs : {
op : "gte" ,
field : "shoe_size" ,
value : 20
} ,
rhs : {
op : "eq" ,
field : "color" ,
value : "burgundy"
}
}
pbf . stringify ( filter ) // shoe_size >= 20 && color = "burgundy"
A partir de PocketBase JS SDK 0.19.0, se agregó una nueva característica que permite crear filtros de manera similar a PBF. Sin embargo, existen algunas diferencias clave entre los dos enfoques.
PocketBase solo garantiza que los valores se escapen y vinculen correctamente al filtro. El usuario sigue siendo responsable de construir la sintaxis del filtro, que puede ser propensa a errores. PBF, por otro lado, proporciona una solución más completa al proporcionar también una manera fácil y extensa de crear filtros de búsqueda complejos sin preocuparse por la sintaxis.
PBF también se creó como una función de utilidad única antes de que se agregara esta función a PocketBase.
pbf tiene la licencia MIT.
¡Las contribuciones son bienvenidas! No dude en abrir problemas o realizar solicitudes.