ไลบรารีสำหรับซีเรียลไลซ์และดีซีเรียลไลซ์ไวยากรณ์ตัวกรอง PocketBase
คุณสามารถติดตั้ง PBF ได้อย่างง่ายดายโดยใช้ npm หรือเส้นด้าย:
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
ยินดีบริจาค! โปรดอย่าลังเลที่จะเปิดประเด็นหรือดึงคำขอ