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는 구문에 대한 걱정 없이 복잡한 검색 필터를 만들 수 있는 쉽고 광범위한 방법을 제공함으로써 보다 포괄적인 솔루션을 제공합니다.
PBF는 이 기능이 PocketBase에 추가되기 전에 일회성 유틸리티 기능으로도 만들어졌습니다.
pbf는 MIT 라이선스에 따라 라이선스가 부여됩니다.
기여를 환영합니다! 자유롭게 이슈를 열거나 요청을 가져오시기 바랍니다.