ขนมปังกลมต้นฉบับกำลังส่องแผ่นโค้ดผ่านตะแกรงตรวจทางเข้าออกก่อนส่งไปเครื่องรัน

Bun.Transpiler: ตรวจ import ของสคริปต์ก่อนตัดสินใจรัน

พี่โชว์Engineering

ได้รับ TypeScript สั้น ๆ จาก plugin แล้วอยากดูว่ามัน import อะไรก่อนรัน การใช้ eval หรือ bun run ทันทีให้สิทธิ์โค้ดเร็วเกินไปครับ Bun.Transpiler มี scan() เพื่อดู imports/exports และ transformSync() เพื่อแปลงเป็น JavaScript โดย ไม่ได้ execute โค้ดที่แปลง เหมือนอ่านรายการของในกล่องก่อนเปิดสวิตช์เครื่องจักร

ตัวอย่างนี้ใช้สตริงที่อยู่ในไฟล์ทดสอบเท่านั้น ไม่รับโค้ดจาก network แล้วรัน มันทดสอบว่า type annotation ถูกแปลงและ scan มองเห็น static import ตาม API official

const source = 'import { item } from "./catalog"; export const count: number = 3;';
const transpiler = new Bun.Transpiler({ loader: "ts" });
const report = transpiler.scan(source);
if (report.imports.length !== 1 || report.imports[0].path !== "./catalog") {
  throw new Error("static import was not found");
}
const output = transpiler.transformSync(source);
if (!output.includes("count") || output.includes(": number")) {
  throw new Error("TypeScript transform failed");
}
console.log("transpiler scan and transform passed");

ขอบเขตของการตรวจ

scan() บอกสิ่งที่ parser เห็นใน source เช่น static import, require และ dynamic import ที่ระบุ literal path แต่ไม่ใช่ security scanner โค้ดยังสามารถสร้าง path จากตัวแปร, เรียก network API หรือใช้ runtime capability หลังรันได้ การไม่พบ import อันตรายจึง ไม่ใช่ เหตุผลให้ execute โค้ดที่ไม่เชื่อถือใน repository จริง

เอกสารแยก scanImports() ซึ่งเร็วกว่าแต่แม่นยำน้อยกว่าเล็กน้อย กับ scan() ที่ให้ metadata มากกว่า และแนะนำ transformSync() สำหรับไฟล์ส่วนใหญ่ เพราะ async threadpool มี overhead ให้เลือกตามขนาดงานและ benchmark จริง หากต้องรับ plugin ภายนอก ให้ตรวจ provenance, จำกัดสิทธิ์ filesystem/network และแยก sandbox ในชั้น runtime ต่างหาก

Recap

  • ใช้ scan() อ่าน dependency ที่ parser มองเห็นก่อนพิจารณารัน
  • transformSync() แปลง syntax แต่ไม่ execute ผลลัพธ์
  • อย่าใช้ผล scan เป็นการรับรองความปลอดภัยของโค้ดภายนอก
  • จำกัด runtime permissions และทดสอบกับ input จริงก่อนใช้เป็น pipeline