From 7409d2329b72f3076e6b5af21b308129ad43ff41 Mon Sep 17 00:00:00 2001 From: sunlei Date: Fri, 5 Jun 2026 08:52:22 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96Husky=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E9=92=A9=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .husky/pre-commit | 2 +- package.json | 1 + scripts/husky-fast-check.mjs | 78 ++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 scripts/husky-fast-check.mjs diff --git a/.husky/pre-commit b/.husky/pre-commit index 8ff2704..23b649a 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -pnpm run verify:commit +node scripts/husky-fast-check.mjs diff --git a/package.json b/package.json index 80450db..f5c82e9 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "typecheck": "tsc --noEmit", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\"", "lint:fix": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "verify:staged": "node scripts/husky-fast-check.mjs", "verify:commit": "pnpm run lint && pnpm run typecheck", "test": "jest", "test:watch": "jest --watch", diff --git a/scripts/husky-fast-check.mjs b/scripts/husky-fast-check.mjs new file mode 100644 index 0000000..04fb220 --- /dev/null +++ b/scripts/husky-fast-check.mjs @@ -0,0 +1,78 @@ +import { spawnSync } from 'node:child_process'; +import { existsSync } from 'node:fs'; +import { extname } from 'node:path'; + +const CHECK_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']); +const CHECK_ROOTS = ['src/', 'test/', 'apps/', 'libs/']; + +function run(command, args) { + const result = spawnSync(command, args, { + shell: process.platform === 'win32' && command === 'pnpm', + stdio: 'inherit', + }); + + if (result.error) { + console.error(result.error.message); + process.exit(1); + } + + if (result.status !== 0) { + process.exit(result.status ?? 1); + } +} + +function output(command, args) { + const result = spawnSync(command, args, { + encoding: 'utf8', + shell: false, + }); + + if (result.error) { + console.error(result.error.message); + process.exit(1); + } + + if (result.status !== 0) { + process.exit(result.status ?? 1); + } + + return result.stdout; +} + +function getPnpmCommand() { + return 'pnpm'; +} + +function getStagedFiles() { + return output('git', [ + 'diff', + '--cached', + '--name-only', + '--diff-filter=ACMR', + '-z', + ]) + .split('\0') + .map((file) => file.replaceAll('\\', '/')) + .filter(Boolean); +} + +const files = getStagedFiles().filter((file) => { + if (!existsSync(file)) return false; + if (!CHECK_ROOTS.some((root) => file.startsWith(root))) return false; + + return CHECK_EXTENSIONS.has(extname(file)); +}); + +if (files.length === 0) { + console.info('[husky] no staged files need eslint.'); + process.exit(0); +} + +run(getPnpmCommand(), [ + 'exec', + 'eslint', + '--cache', + '--cache-location', + 'node_modules/.cache/husky-eslint/', + ...files, +]);