ليه مش على المشروع كله كل مرة؟
الفريق عايز يضمن إن اللي داخل التاريخ متنسّق وعدل على القواعد. لو الفحص على المستودع كله مع كل commit، هيفحص ملفات أنت ملمستهاش، وهيبطأ. المطلوب: الملفات المتعلّمة بس، يعني اللي في الـ staging.
أداتان:
يعلّق أمر على حدث Git. هنا الحدث pre-commit: قبل ما الـ commit يتسجل، شغّل الأمر. لو الأمر طلع بغير صفر، الـ commit يتلغي.
ياخد الملفات المتعلّمة، ويشغّل أوامر على اللي امتداده مطابق. مش على باقي المشروع.
npm install --save-dev husky lint-stagednpx husky inithusky init يعمل فولدر .husky، ويضيف سكربت prepare في package.json عشان أي حد يعمل install يلاقي الـ hooks متظبطة. ويفتح .husky/pre-commit غالبًا فيه npm test. غيّر السطر ده إلى:
npx lint-stagedالأوامر فين؟
lint-staged يقرأ مفتاح في 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 في المقالات القديمة كان مطلوب زمان. دلوقتي زيادة، وسيبه.
فحص من غير ما يكتب
لو عايز الـ hook يرفض بس، من غير ما يصلح الملف تحت إيدك:
{ "lint-staged": { "**/*.{js,ts,jsx,tsx}": [ "eslint", "prettier --check" ], "**/*.{css,md,mdx}": [ "prettier --check" ] }}الاختيار الشائع: الإصلاح على الـ commit عشان الفرع يتسجل نظيف، والفحص من غير كتابة على الـ CI عشان السيرفر يحكم وميعدّلش. الاتنين مع بعض في الفصول الجاية.