Bibliothèque pour sérialiser et désérialiser la syntaxe du filtre PocketBase.
Vous pouvez facilement installer PBF en utilisant npm ou Yarn :
npm install pbf
ou
yarn add pbf
PBF simplifie le travail avec la syntaxe de filtre PocketBase. Voici un exemple rapide de la façon de commencer :
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"
} ) ;
Pour annuler un filtre (par exemple, égal à différent et à ou), vous pouvez utiliser la fonction not
. Cela n'annule pas la valeur mais uniquement l'opérateur utilisé.
import * as pbf from "@nedpals/pbf" ;
pbf . stringify ( pbf . not ( pbf . eq ( "is_repost" , false ) ) ) // is_repost = false
Dans certains cas, vous souhaitez créer un filtre de recherche avec certains filtres activés conditionnellement via un court-circuit. Vous pouvez le faire en ajoutant le modificateur .maybe
avant d'appeler les opérateurs. Cela filtrera toutes les valeurs fausses et affichera les filtres appropriés.
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
Au lieu de vous répéter en écrivant plusieurs filtres de comparaison du même champ, PBF fournit un raccourci simple via l' either
des modificateurs.
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 prend également en charge l'analyse des chaînes de filtre brutes dans un format PBF approprié. C'est idéal lorsque vous souhaitez analyser la requête de recherche d'URL ou simplement créer une expérience de recherche de type 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")
Pour rendre la sérialisation/désérialisation possible, PBF le stocke en tant qu'objet suivant un format d'arborescence syntaxique permettant de distinguer les filtres logiques, de comparaison et conteneurisés/parenthèses.
// 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
}
Cela facilite également la création de filtres à la main, en particulier lors de la création de filtres dynamiques de type facettes :
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"
À partir de PocketBase JS SDK 0.19.0, une nouvelle fonctionnalité a été ajoutée qui permet de créer des filtres de la même manière que PBF. Il existe cependant quelques différences essentielles entre les deux approches.
PocketBase garantit uniquement que les valeurs sont correctement échappées et liées au filtre. L'utilisateur est toujours responsable de la construction de la syntaxe du filtre, qui peut être sujette à des erreurs. PBF, d'autre part, fournit une solution plus complète en fournissant également un moyen simple et étendu de créer des filtres de recherche complexes sans se soucier de la syntaxe.
PBF a également été créé en tant que fonction utilitaire unique avant que cette fonctionnalité ne soit ajoutée à PocketBase.
pbf est sous licence MIT.
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir des problèmes ou à tirer des demandes.