Perpustakaan untuk membuat serialisasi dan deserialisasi sintaks filter PocketBase.
Anda dapat dengan mudah menginstal PBF menggunakan npm atau benang:
npm install pbf
atau
yarn add pbf
PBF memudahkan untuk bekerja dengan sintaks filter PocketBase. Berikut ini contoh singkat cara memulai:
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"
} ) ;
Untuk meniadakan filter (misalnya sama dengan tidak sama, dan atau), Anda dapat menggunakan fungsi not
. Ini tidak meniadakan nilai tetapi hanya operator yang digunakan.
import * as pbf from "@nedpals/pbf" ;
pbf . stringify ( pbf . not ( pbf . eq ( "is_repost" , false ) ) ) // is_repost = false
Dalam beberapa kasus, Anda ingin membuat filter pencarian dengan beberapa filter diaktifkan secara kondisional melalui hubungan arus pendek. Anda dapat melakukan ini dengan menambahkan pengubah .maybe
sebelum memanggil operator. Ini akan menyaring nilai-nilai palsu dan menampilkan filter yang sesuai.
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
Daripada mengulangi diri Anda sendiri dengan menulis beberapa filter perbandingan dari bidang yang sama, PBF menyediakan pintasan mudah melalui either
pengubah.
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 juga mendukung penguraian string filter mentah ke dalam format PBF yang tepat. Ini bagus ketika Anda ingin mengurai dari permintaan pencarian URL atau hanya ingin membangun pengalaman pencarian seperti 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")
Untuk memungkinkan serialisasi/deserialisasi, PBF menyimpannya sebagai objek mengikuti format pohon sintaksis untuk membedakan filter logis, perbandingan, dan dalam container/tanda kurung.
// 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
}
Hal ini juga mempermudah pembuatan filter dengan tangan terutama saat membuat filter dinamis seperti faset:
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"
Dimulai dengan PocketBase JS SDK 0.19.0, fitur baru ditambahkan yang memungkinkan filter dibuat mirip dengan PBF. Namun, ada beberapa perbedaan utama antara kedua pendekatan tersebut.
PocketBase hanya memastikan bahwa nilai-nilai lolos dengan benar dan terikat ke filter. Pengguna masih bertanggung jawab untuk membuat sintaks filter, yang rentan terhadap kesalahan. PBF, di sisi lain, memberikan solusi yang lebih komprehensif dengan juga menyediakan cara yang mudah dan ekstensif untuk membuat filter pencarian yang kompleks tanpa mengkhawatirkan sintaksisnya.
PBF juga dibuat sebagai fungsi utilitas satu kali sebelum fitur ini ditambahkan ke PocketBase.
pbf dilisensikan di bawah Lisensi MIT.
Kontribusi dipersilahkan! Silakan membuka masalah atau menarik permintaan.