# Pre-commit Configuration for web_ui # Install: pre-commit install && pre-commit install --hook-type pre-push # Run: pre-commit run --config web_ui/.pre-commit-config.yaml --all-files # NOTE: this subproject lives inside the ~/src/utils monorepo, whose git root is # one level up. pre-commit always runs hooks from the git root, so every path # below is written relative to THAT, not to this directory, and the top-level # `files` key keeps these hooks off the sibling subprojects. CI invokes this # config exactly the same way. Mirrors design_system/.pre-commit-config.yaml. files: ^web_ui/ # dist/ is generated by tsc and committed for consumers. The whitespace hooks # would "fix" it, the next build would revert them, and the dist-fresh hook # would fail forever -- so formatting hooks must not see it. exclude: ^web_ui/dist/ default_stages: [pre-commit] fail_fast: false repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] - id: end-of-file-fixer - id: check-yaml - id: check-json # tsconfig*.json are JSONC -- TypeScript allows comments, and this file # uses them to explain why the lint config exists. package.json and the # lockfile are the real JSON worth validating. exclude: ^web_ui/tsconfig.*\.json$ - id: check-merge-conflict - id: mixed-line-ending args: [--fix=lf] - repo: local hooks: - id: file-length-cap name: file length <= 250 lines entry: bash scripts/check_file_length.sh language: system pass_filenames: true - id: subproject-scope name: subproject scope regex still matches entry: scripts/check_subproject_scope.sh web_ui language: script # always_run so the top-level `files` filter cannot skip the one hook # whose job is to notice that filter has stopped matching anything. always_run: true pass_filenames: false - id: web-ui-lint name: tsc --noEmit && eslint entry: bash -c 'cd web_ui && pnpm lint' language: system pass_filenames: false - id: web-ui-dist-fresh name: committed dist/ matches src/ # The tag ships a prebuilt dist/ (Vite does not transpile deps), so a # stale dist/ ships old code to every consumer with no error anywhere. entry: >- bash -c 'cd web_ui && pnpm build && git diff --exit-code -- dist || { echo "dist/ is stale -- pnpm build in web_ui and commit it"; exit 1; }' language: system pass_filenames: false require_serial: true - id: web-ui-test-coverage name: vitest with the 100% coverage gate entry: bash -c 'cd web_ui && pnpm coverage' language: system pass_filenames: false require_serial: true stages: [pre-push]