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"
} ) ;
フィルターを否定するには (例: 等しい、等しくない、および to or)、 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 と同様にフィルターを構築できる新しい機能が追加されました。ただし、2 つのアプローチにはいくつかの重要な違いがあります。
PocketBase は、値が適切にエスケープされ、フィルターにバインドされていることを保証するだけです。ユーザーは依然としてフィルター構文の構築に責任を負いますが、間違いが発生しやすい可能性があります。一方、PBF は、構文を気にせずに複雑な検索フィルターを作成するための簡単かつ広範な方法も提供することで、より包括的なソリューションを提供します。
PBF も、この機能が PocketBase に追加される前に、1 回限りのユーティリティ関数として作成されました。
pbf は MIT ライセンスに基づいてライセンスされています。
貢献は大歓迎です!気軽にイシューを開いたりプルリクエストを行ったりしてください。