Библиотека для сериализации и десериализации синтаксиса фильтров PocketBase.
Вы можете легко установить PBF, используя npm или Yarn:
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.
Вклады приветствуются! Пожалуйста, не стесняйтесь открывать проблемы или запросы на извлечение.