ts6to7 - codemod สำหรับทำ migration จาก TypeScript 5/6 → 7(tsgo) โดยอัตโนมัติ
(github.com/zi-gae)เมื่อวานนี้ TypeScript 7 ได้ออกเวอร์ชันทางการแล้ว คอมไพเลอร์เนทีฟที่เขียนใหม่ด้วย Go (tsgo) ทำให้เร็วขึ้นราว 10 เท่า แต่ตัวเลือกคอมไพเลอร์ที่เคย deprecated ใน TS5/6 ถูกถอดออกทั้งหมด และค่าเริ่มต้นของ strict ก็เปลี่ยนเป็น true ด้วย — โปรเจกต์ที่มี tsconfig เก่า ๆ จึงอัปเกรดไม่ได้ง่าย ๆ
ผมจึงสร้าง codemod สำหรับทำส่วนที่เป็นงานเชิงกลเหล่านี้โดยอัตโนมัติ
npx ts6to7 --dry # ดูตัวอย่าง (ไม่เขียนอะไรลงไฟล์)
npx ts6to7 # นำไปใช้จริง
สิ่งที่ทำ:
- แก้ไข tsconfig*.json ในตำแหน่งเดิม — ใช้ jsonc-parser ในการแก้ไข จึงคงคอมเมนต์และฟอร์แมตไว้เหมือนเดิม
- แปลงตัวเลือกที่ถูกถอดออกให้เป็นค่าที่เทียบเท่าใน TS7: target: es5 → ES2015, module: umd/amd → ESNext, moduleResolution: node → NodeNext/Bundler, importsNotUsedAsValues → verbatimModuleSyntax เป็นต้น
- พับ baseUrl เข้าไปใน paths
- bump dependency ของ typescript เป็น ^7.0.0
- หากยังไม่ได้ตั้งค่า strict จะตรึงเป็น false — ไฟล์ที่สืบทอด config อื่นผ่าน extends จะไม่ถูกแก้ไข และจะแจ้งเตือนเท่านั้น (เพราะ base config อาจตั้งค่า strict ไว้แล้ว)
- สิ่งที่ไม่สามารถแปลงอัตโนมัติได้อย่างปลอดภัย (runtime ที่รองรับเฉพาะ ES5, เครื่องมือที่อิง API คอมไพเลอร์เก่าอย่าง ts-node/ts-jest, การไม่มี types array ฯลฯ) จะแสดงเป็นเช็กลิสต์ "ต้องตรวจสอบด้วยตนเอง" ที่จำกัดขอบเขตตามไฟล์
ย้ายจาก TypeScript 5 ได้โดยตรง: ไม่จำเป็นต้องผ่าน 6 ก่อน ตัวเลือกยุค TS5 อย่าง ignoreDeprecations และ prepend ใน project references ก็จะถูกจัดการให้ด้วย
รองรับ monorepo ด้วย (สแกนทุกแพ็กเกจ)
ตอนนี้อยู่ที่เวอร์ชัน 0.2.0 หากมีกรณีที่ tsconfig ถูกแปลงผิด การแจ้ง issue พร้อมแนบ tsconfig นั้นมาจะเป็นประโยชน์มากครับ
ยังไม่มีความคิดเห็น