unbash: پارسر سریع Bash با TypeScript
خلاصهٔ کاملتر
تو معرفی مخزن اومده که unbash یه پارسر سریع و بدون وابستگیِ Bashه که با TypeScript نوشته شده. ورودیش سورس شله — یه دستور کپیشده، یه اسکریپت کامل، یا شلی که داخل یه فرمت دیگه جاسازی شده — و خروجیش یه ASTِ تایپدار با موقعیت دقیق هر گره در متن اصلیه. نکتهٔ اصلیش هم همینه: ساختار دستور رو بهت میده بدون اینکه چیزی اجرا بشه.
نویسنده چند کاربرد مشخص براش شمرده: دستهبندی دستورها، ریدایرکتها و اجرای پسزمینه برای پرامپتهای مجوز و allowlist و ممیزی؛ فهرستکردن ایستای فایلها و وابستگیهایی که تو اسکریپتهای package، مراحل CI و هوکها اسم برده شدن؛ ساخت توضیح و پیشنمایش ساختاری از پایپلاینها؛ و پیدا کردن یا مهاجرت دادن فراخوانی دستورها با ویرایشهای محدود به همون بازهٔ متنی، جوری که فرمت و کامنتهای اطراف دستنخورده بمونن.
استفادهش هم یه تابع parse بیشتر نیست:
import { parse } from "unbash";
const ast = parse('if [ -f "$1" ]; then cat "$1"; fi');خروجی یه درخت با گرههای Script، Statement و Ifه که هر شرط و بلوک then خودش یه لیست دستور ساختاریافتهست. از نظر پوشش، کنترلفلو، پایپلاین، ریدایرکت، بسط پارامتر و کلمه، جایگزینی پروسه، coproc، heredoc و herestring رو هم میگیره.
دو تا تلهٔ ریز رو خود نویسنده هشدار داده: بخشهای بسطشدهٔ هر Word تو یه گتر تنبل به اسم parts میشینن که Object.keys نشونش نمیده، و خطای پارس اسکریپتهای تودرتو روی خودشون ثبت میشه نه روی ریشه — پس پیمایشگر سادهلوح ممکنه هم بسطها رو گم کنه هم خطاها رو. در عوض unbash صراحتاً میگه کد رو اجرا نمیکنه، سندباکس نیست و دربارهٔ امنبودن یه دستور تصمیم نمیگیره.
مقایسهها هم منصفانه نوشته شدن: نویسنده tree-sitter-bash رو برای پارس افزایشی و CST کامل و sh-syntax رو برای پشتیبانی چند دیالکت و فرمتکردن پیشنهاد میده، ولی مزیت unbash رو نبودِ WASM و افزونهٔ نیتیو، API همگام و حجم کم میدونه. طبق بنچمارک روی Apple M1 Pro، سرعت پارسش بین حدود ۷۵ تا ۱۱۶ مگابایت بر ثانیهست؛ یعنی ۷ تا ۱۷ برابر tree-sitter-bash. حجم باندل هم ۸۰ کیلوبایت مینیفای و ۱۹ کیلوبایت gzipشدهست.
نکات کلیدی:
- پارسر Bash با TypeScript، بدون وابستگی، همگام و ESM؛ نصب با npm install unbash
- AST تایپدار با موقعیت متنی هر گره؛ بدون اجرا و بدون بسط شل
- برای ورودی خراب یا ناقص، AST جزئی + خطاهای موقعیتدار برمیگردونه
- parts روی Word یه getter تنبله و تو Object.keys نمیاد
- خطاهای اسکریپتهای تودرتو روی خودشون میشینن، نه روی ریشه
- ۷ تا ۱۷ برابر سریعتر از tree-sitter-bash؛ باندل ۱۹ کیلوبایت gzipشده
- سندباکس نیست و امنبودن دستور رو تشخیص نمیده




