pbf
1.3.2
用於序列化和反序列化 PocketBase 過濾器語法的函式庫。
您可以使用npm或yarn輕鬆安裝PBF:
npm install pbf
或者
yarn add pbf
PBF 使得使用 PocketBase 過濾器語法變得簡單。以下是如何開始的快速範例:
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"
} ) ;
若要否定篩選器(例如,等於、不等於、或),您可以使用not
函數。這不會否定該值,而只會否定所使用的運算子。
import * as pbf from "@nedpals/pbf" ;
pbf . stringify ( pbf . not ( pbf . eq ( "is_repost" , false ) ) ) // is_repost = false
在某些情況下,您希望建立一個搜尋過濾器,其中一些過濾器會透過短路有條件地啟用。您可以透過在呼叫運算子之前新增.maybe
修飾符來實現此目的。這將過濾掉任何錯誤值並輸出適當的過濾器。
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
PBF 無需重複編寫相同欄位的多個比較過濾器,而是透過either
修飾符提供了一種簡單的捷徑。
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 也支援將原始過濾器字串解析為正確的 PBF 格式。當您想要從 URL 搜尋查詢進行解析或只是想要建立類似 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")
為了使序列化/反序列化成為可能,PBF 將其儲存為遵循語法樹格式的對象,以區分邏輯、比較和容器化/括號過濾器。
// 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
}
這也使得手工製作過濾器變得更容易,特別是在建立動態的多面過濾器時:
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"
從 PocketBase JS SDK 0.19.0 開始,新增了一項新功能,允許以類似於 PBF 的方式建立過濾器。然而,這兩種方法之間存在一些關鍵差異。
PocketBase 僅確保值被正確轉義並綁定到過濾器。使用者仍然負責構造過濾器語法,這很容易出錯。另一方面,PBF 提供了更全面的解決方案,還提供了一種簡單而廣泛的方法來創建複雜的搜尋過濾器,而無需擔心語法。
在將此功能添加到 PocketBase 之前,PBF 也是作為一次性實用功能創建的。
pbf 根據 MIT 許可證獲得許可。
歡迎貢獻!請隨時提出問題或拉取請求。