Bun.Glob: สแกนไฟล์ตาม pattern โดยตั้งขอบเขต symlink ให้ชัด
เครื่องมือ build หรือ codegen มักเริ่มจาก “หาไฟล์ทั้งหมดที่ตรง pattern” แต่ขอบเขตจริงมีรายละเอียด: จะรวม dotfile ไหม เดินตาม symlink หรือไม่ และต้องการเฉพาะไฟล์หรือรวม directory Bun.Glob มีทั้ง match() สำหรับตรวจ string และ scan()/scanSync() สำหรับเดิน filesystem จึงแยกการทดสอบ pattern ออกจากการแตะดิสก์ได้ครับ
import { Glob } from "bun";
const source = new Glob("src/**/*.{ts,tsx}");
const cases = new Map([
["src/index.ts", true],
["src/ui/Card.tsx", true],
["src/ui/Card.css", false],
["test/index.ts", false],
]);
for (const [path, expected] of cases) {
if (source.match(path) !== expected) {
throw new Error(`unexpected match result for ${path}`);
}
}
console.log("glob boundary tests passed");
ก่อนสแกน repository จริง ให้กำหนด cwd เป็น directory แคบที่สุด ใช้ onlyFiles: true ตามค่าเริ่มต้น และคง followSymlinks: false ถ้าไม่ได้ต้องการเดินออกนอกต้นไม้ที่เห็น ส่วน dot: false ช่วยไม่ดึงไฟล์ซ่อนโดยบังเอิญ แต่ไม่ใช่ security sandbox เพราะ process ยังอ่าน path อื่นได้ตามสิทธิ์ของผู้ใช้
ถ้า pipeline ต้องการ reproducible output ควรเก็บผลจาก iterator แล้ว sort ก่อนสร้างไฟล์ เพราะอย่าผูก artifact กับลำดับ directory entry ของระบบปฏิบัติการ และทดสอบ pattern ด้วย fixture string ก่อน scan จะช่วยจับกรณี * ไม่ข้าม / แต่ ** ข้ามได้
Recap
- ทดสอบ pattern ด้วย
match()ก่อนเดินดิสก์ - จำกัด
cwdและไม่ตาม symlink โดยไม่จำเป็น - เลือกนโยบาย dotfile ให้ชัด
- sort ผลก่อนสร้าง artifact ที่ต้อง reproducible