Bun.TOML.stringify: เขียน config โดยแยก data ออกจาก template
การต่อ TOML ด้วย template string ดูเร็ว จนชื่อโปรเจกต์มีเครื่องหมายคำพูดหรือขึ้นบรรทัดใหม่ แล้วไฟล์ที่สร้าง parse ไม่ผ่าน Bun.TOML.stringify แปลง object เป็น TOML พร้อม escape ตามรูปแบบ ทำให้เราโฟกัส schema และตรวจ round-trip ได้ครับ
WHY: ให้ serializer รับผิดชอบไวยากรณ์
เหมือนเขียนที่อยู่ส่งพัสดุผ่านแบบฟอร์มมาตรฐาน เราส่งข้อมูลเป็นช่อง ไม่ต้องเดาเองว่าต้องใส่เครื่องหมายตรงไหน Serializer ลด bug เชิง syntax แต่ไม่ได้ตัดสินว่าค่าไหนเป็น secret หรือ schema ถูกต้อง
type AppConfig = {
app: { name: string; ports: number[] };
feature: { audit: boolean };
};
const config: AppConfig = {
app: { name: 'ร้าน "เช้า"', ports: [3000, 3001] },
feature: { audit: true },
};
const text = Bun.TOML.stringify(config);
const parsed = Bun.TOML.parse(text) as AppConfig;
if (parsed.app.name !== config.app.name) throw new Error("name did not round-trip");
if (parsed.app.ports.join(",") !== "3000,3001") throw new Error("ports changed");
if (parsed.feature.audit !== true) throw new Error("boolean changed");
if (/password|token|secret/i.test(text)) throw new Error("secret-like key must not be emitted");
console.log("TOML round-trip verified");
HOW: round-trip ไม่เท่ากับ schema validation
ตัวอย่าง stringify แล้ว parse กลับเพื่อตรวจชนิดหลัก แต่ type assertion ทำงานเฉพาะ TypeScript ตอนพัฒนาและไม่ validate input runtime ถ้า object มาจาก API หรือ environment ต้องตรวจ schema ก่อน serialize อีกชั้น รวมถึง reject key ที่ไม่รู้จักเพื่อกัน typo กลายเป็น config ที่โปรแกรมปลายทางเพิกเฉย
ลำดับ key และรูปแบบ whitespace ของ serializer ไม่ควรเป็น business contract ถ้าต้องให้คน review diff ง่าย ให้ sort data ตามนโยบายของแอปก่อนและทดสอบค่าหลัง parse แทน snapshot ทั้งไฟล์ อย่าเก็บ token ลง TOML ใน repository แม้ serializer จะ escape ถูก เพราะ syntax correctness ไม่ใช่ secret management
Recap
- ส่ง data object ให้ serializer แทนต่อ TOML เอง
- parse กลับและเทียบค่าที่สำคัญ
- validate runtime schema ก่อน stringify
- อย่าผูก logic กับ whitespace หรือ key order
- แยก secret ไป credential store และตรวจไฟล์ก่อน commit