لماذا TypeScript هي اللغة المثالية لأدوات CLI؟
\nإذا كنت تكتب بلغة Python وفكرت فجأة في إنشاء أداة سطر أوامر، فمن المحتمل أن تكون أولى خطواتك هي استخدام argparse أو click. وهذا منطقي. ولكن ماذا لو أخبرتك أن TypeScript يمكنها التفوق على أي أداة Python في عالم CLI؟ نعم، لم تسمع خطأ.
TypeScript ليست مجرد "JavaScript مع أنواع". إنها لغة تحول تطوير أدوات CLI إلى عملية يمكن التنبؤ بها وآمنة. لا مزيد من "لماذا لدي undefined بدلاً من سلسلة نصية؟" أو "لقد مررت رقمًا فأصبح سلسلة نصية". الكتابة الصارمة تقطع فئة كاملة من الأخطاء في مرحلة التجميع.
لكن الميزة الرئيسية هي النظام البيئي. يتيح لك Node.js تشغيل كود TypeScript في أي مكان: على الخادم، في Docker، على Raspberry Pi. و npm يجعل نشر الأداة مسألة خمس دقائق. اليوم سنمر بالمسار بأكمله: من مجلد فارغ إلى أداة CLI جاهزة يمكن تثبيتها باستخدام الأمر npm install -g.
ماذا سنبني؟
\nتخيل: أنت تعمل غالبًا مع ملفات JSON وتحتاج إلى حساب عدد الحقول بسرعة، أو التحقق من الصحة، أو التحويل إلى CSV. سنكتب أداة json-toolkit التي تقوم بثلاثة أشياء:
- \n
- validate — تتحقق من صحة JSON؛ \n
- count — تحسب عدد المفاتيح في المستوى الأعلى؛ \n
- to-csv — تحول مصفوفة من الكائنات إلى CSV. \n
يبدو الأمر بسيطًا؟ نعم. ولكن من خلال هذا المثال ستتقن جميع التقنيات الأساسية: معالجة الوسائط، العمل مع نظام الملفات، الألوان في الطرفية، ومعالجة الأخطاء.
\n\nالخطوة 1. إعداد المشروع
\nأولاً، نقوم بإنشاء مجلد وتهيئة المشروع:
\nmkdir json-toolkit\ncd json-toolkit\nnpm init -y\nالآن نقوم بتثبيت TypeScript والحزم الضرورية:
\nnpm install -D typescript @types/node\nnpm install commander chalk\n- \n
commander— مكتبة لتحليل وسائط سطر الأوامر (مشابهة لـ Python-argparse ولكنها أكثر ملاءمة)؛ \n chalk— لتلوين المخرجات في الطرفية؛ \n @types/node— أنواع لـ Node.js. \n
نقوم بإنشاء tsconfig.json:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true,\n "declaration": true\n },\n "include": ["src/**/*"]\n}\nلاحظ: outDir هو المجلد الذي سيتم تجميع الكود فيه، و rootDir هو مجلد المصادر. هذه ممارسة قياسية لمشاريع TypeScript.
الخطوة 2. كتابة جوهر الأداة
\nنقوم بإنشاء مجلد src وملف src/index.ts. لنبدأ بعمليات الاستيراد وإعداد commander:
import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'fs';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n .name('json-toolkit')\n .description('أداة للعمل مع ملفات JSON')\n .version('1.0.0');\n\nprogram\n .command('validate')\n .argument('<file>', 'المسار إلى ملف JSON')\n .description('التحقق من صحة JSON')\n .action((file: string) => {\n try {\n const content = readFileSync(file, 'utf-8');\n JSON.parse(content);\n console.log(chalk.green('✓ JSON صحيح!'));\n } catch (err) {\n console.error(chalk.red('✗ خطأ:'), (err as Error).message);\n }\n });\n\nprogram\n .command('count')\n .argument('<file>', 'المسار إلى ملف JSON')\n .description('حساب عدد المفاتيح في المستوى الأعلى')\n .action((file: string) => {\n if (!existsSync(file)) {\n console.error(chalk.red('الملف غير موجود!'));\n return;\n }\n const content = readFileSync(file, 'utf-8');\n const data = JSON.parse(content);\n const keys = Object