قبل الدفع · فصل ٥

قبل الـ commit، على الملفات المتعلّمة بس

husky · pre-commit · lint-staged · --no-verify
🎯 الهدف: تشغّل ESLint و Prettier على الملفات اللي في الـ staging قبل ما الـ commit يتكمل.

ليه مش على المشروع كله كل مرة؟

الفريق عايز يضمن إن اللي داخل التاريخ متنسّق وعدل على القواعد. لو الفحص على المستودع كله مع كل commit، هيفحص ملفات أنت ملمستهاش، وهيبطأ. المطلوب: الملفات المتعلّمة بس، يعني اللي في الـ staging.

أداتان:

Husky

يعلّق أمر على حدث Git. هنا الحدث pre-commit: قبل ما الـ commit يتسجل، شغّل الأمر. لو الأمر طلع بغير صفر، الـ commit يتلغي.

lint-staged

ياخد الملفات المتعلّمة، ويشغّل أوامر على اللي امتداده مطابق. مش على باقي المشروع.

terminal
npm install --save-dev husky lint-stagednpx husky init

husky init يعمل فولدر .husky، ويضيف سكربت prepare في package.json عشان أي حد يعمل install يلاقي الـ hooks متظبطة. ويفتح .husky/pre-commit غالبًا فيه npm test. غيّر السطر ده إلى:

.husky/pre-commit
npx lint-staged

الأوامر فين؟

lint-staged يقرأ مفتاح في package.json. المفتاح نمط ملفات، والقيمة أوامر تتنفّذ بالترتيب على الملفات دي.

package.json
{  "lint-staged": {    "**/*.{js,ts,jsx,tsx}": [      "eslint --fix",      "prettier --write"    ],    "**/*.{css,scss,md,mdx}": [      "prettier --write"    ]  }}

ESLint الأول عشان --fix يظبط اللي يقدر عليه، وبعدين Prettier يمسك الشكل الأخير. لو عكست، ESLint ممكن يرجّع شكل Prettier لسه مظبطه، لو لسه فيه قاعدة شكلية شغالة.

من lint-staged ١٠، الملفات اللي اتعدلت بالأمر بتترجع للـ staging لوحدها. سطر git add في المقالات القديمة كان مطلوب زمان. دلوقتي زيادة، وسيبه.

الـ commit يشغّل الفحص. لو الأمر فشل، الـ commit مش هيتسجل، والرسالة هتوريك ليه.

فحص من غير ما يكتب

لو عايز الـ hook يرفض بس، من غير ما يصلح الملف تحت إيدك:

package.json
{  "lint-staged": {    "**/*.{js,ts,jsx,tsx}": [      "eslint",      "prettier --check"    ],    "**/*.{css,md,mdx}": [      "prettier --check"    ]  }}

الاختيار الشائع: الإصلاح على الـ commit عشان الفرع يتسجل نظيف، والفحص من غير كتابة على الـ CI عشان السيرفر يحكم وميعدّلش. الاتنين مع بعض في الفصول الجاية.

خلّصت الفصل لما

🧠 اختبر نفسك
١) lint-staged بيفحص كل الملفات ولا المتعلّمة؟
المتعلّمة بس، يعني اللي في الـ staging.
٢) الأمر في pre-commit رجع بغير صفر. الـ commit حصل؟
لأ. Git بيلغيه.
٣) ليه الـ CI لسه لازم رغم الـ hook؟
عشان —no-verify وأي جهاز من غير hooks يعدّي المرآة المحلية.