Linters
OWOX Data Marts uses distributed lint-staged configurations following official best practices for multi-package monorepos.
๐ Workflow Diagram
Section titled โ๐ Workflow DiagramโsequenceDiagram participant Dev as Developer participant Git as Git Hook participant LS as lint-staged participant Config as .lintstagedrc.json participant ESL as ESLint participant Prettier as Prettier
Dev->>Git: git commit -m "..." Git->>LS: Trigger pre-commit hook LS->>LS: Detect staged files
Note over LS,Config: Automatic config discovery LS->>Config: Find nearest .lintstagedrc.json Config-->>LS: Return configuration rules
LS->>ESL: Run ESLint validation ESL-->>LS: Return results
alt ESLint has errors LS->>Dev: โ Commit blocked Note right of Dev: Fix errors manually Dev->>Dev: git add fixes Dev->>Git: git commit (retry) else ESLint passes LS->>Prettier: Format files Prettier-->>LS: Files formatted LS->>Git: โ
Continue commit Git->>Dev: ๐ Commit successful end๐๏ธ Architecture
Section titled โ๐๏ธ ArchitectureโConfiguration Discovery
Section titled โConfiguration Discoveryโlint-staged automatically finds the nearest configuration file to each staged file:
๐ project-root/โโโ .lintstagedrc.json # Root config (fallback)โโโ ๐ apps/โ โโโ ๐ backend/โ โ โโโ .lintstagedrc.json # Backend-specific rulesโ โ โโโ src/app.module.ts # โ Uses backend configโ โโโ ๐ web/โ โโโ .lintstagedrc.json # Frontend-specific rulesโ โโโ src/App.tsx # โ Uses web configโโโ ๐ packages/ โโโ ๐ ui/ โ โโโ .lintstagedrc.json # UI-specific rules โ โโโ src/button.tsx # โ Uses UI config โโโ README.md # โ Uses root configHow It Works
Section titled โHow It Worksโ- File Detection: Git detects staged files
- Config Discovery: lint-staged finds nearest
.lintstagedrc.jsonfor each file - Workspace Isolation: Each workspace runs with its own rules
- Tool Execution: ESLint validates โ Prettier formats (if validation passes)
- Commit Control: Commit blocked if any errors found
๐ Configuration Examples
Section titled โ๐ Configuration ExamplesโBackend TypeScript (apps/backend/.lintstagedrc.json)
Section titled โBackend TypeScript (apps/backend/.lintstagedrc.json)โ{ "*.{ts,tsx}": [ "eslint --config ./eslint.config.mjs", "prettier --config ./prettier.config.mjs --write" ], "*.json": ["prettier --config ./prettier.config.mjs --write"], "*.md": ["prettier --config ./prettier.config.mjs --write"]}Frontend React (apps/web/.lintstagedrc.json)
Section titled โFrontend React (apps/web/.lintstagedrc.json)โ{ "*.{ts,tsx,js,jsx}": [ "eslint --config ./eslint.config.js", "prettier --config ./prettier.config.js --write" ], "*.json": ["prettier --config ./prettier.config.js --write"], "*.{css,scss}": ["prettier --config ./prettier.config.js --write"]}Root Fallback (.lintstagedrc.json)
Section titled โRoot Fallback (.lintstagedrc.json)โ{ "*.json": "prettier --write", "*.{yml,yaml}": "prettier --write"}๐ ๏ธ Setup
Section titled โ๐ ๏ธ SetupโThe setup is handled automatically by the tools/setup-husky.js script:
# Manual setup (if needed)npm run setup:husky
# Automatic setup (runs on npm install)npm install # โ triggers postinstall โ setup:huskyWhat the setup does
Section titled โWhat the setup doesโ- Initializes Husky: Creates
.husky/directory - Creates pre-commit hook: Runs
npm run pre-commit - Makes hook executable: Sets proper permissions
๐ซ Bypassing Pre-commit Hooks
Section titled โ๐ซ Bypassing Pre-commit HooksโSometimes you need to commit without running lint-staged:
Temporary Bypass (Single Commit)
Section titled โTemporary Bypass (Single Commit)โ# Emergency commit (skip all hooks)git commit --no-verify -m "Emergency hotfix"
# Alternative short formgit commit -n -m "Emergency hotfix"Temporary Disable (Multiple Commits)
Section titled โTemporary Disable (Multiple Commits)โ# Disable pre-commit hookmv .husky/pre-commit .husky/pre-commit.disabled
# Make your commitsgit commit -m "WIP: Large refactoring"git commit -m "WIP: Continue refactoring"
# Re-enable hookmv .husky/pre-commit.disabled .husky/pre-commit๐ Troubleshooting
Section titled โ๐ TroubleshootingโCommon Issues
Section titled โCommon Issuesโ1. Hooks Not Running
Section titled โ1. Hooks Not Runningโ# Check if hooks are executablels -la .husky/pre-commit
# Fix permissions (Unix/macOS)chmod +x .husky/pre-commit
# Reinstall hooksnpm run setup:husky2. ESLint Configuration Not Found
Section titled โ2. ESLint Configuration Not Foundโโ ESLint couldn't find a configuration file.
# Solution: Ensure workspace has eslint.config.js/mjsls apps/backend/eslint.config.mjsls apps/web/eslint.config.js3. Prettier Configuration Issues
Section titled โ3. Prettier Configuration Issuesโโ Prettier configuration not found
# Solution: Ensure workspace has prettier.config.js/mjsls apps/backend/prettier.config.mjsls apps/web/prettier.config.jsDebug Mode
Section titled โDebug Modeโ# Run lint-staged with debug outputDEBUG=lint-staged* npm run pre-commit
# Check what files would be processednpx lint-staged --dry-run๐ฏ Best Practices
Section titled โ๐ฏ Best Practicesโโ Recommended Workflow
Section titled โโ Recommended Workflowโ- Write code with ESLint IDE integration
- Stage changes:
git add . - Commit:
git commit -m "descriptive message" - If blocked: Fix errors and retry
โ Fixing ESLint Errors
Section titled โโ Fixing ESLint Errorsโ# See what's wrongnpm run lint
# Auto-fix simple issuesnpm run lint:fix
# Format after fixingnpm run format
# Stage fixes and retrygit add . && git commitโ Anti-patterns
Section titled โโ Anti-patternsโ- Donโt blindly use
--no-verifyto skip hooks - Donโt disable ESLint rules without team discussion
- Donโt commit with
lint:fixwithout reviewing changes
๐ Adding New Workspaces
Section titled โ๐ Adding New WorkspacesโTo add lint-staged to a new workspace:
-
Create configuration file:
packages/new-package/.lintstagedrc.json {"*.{ts,tsx}": ["eslint --config ./eslint.config.js", "prettier --write"],"*.json": ["prettier --write"]} -
Test the configuration:
Terminal window cd packages/new-packageecho "test" > test.tsgit add test.tsgit commit -m "test" # Should use new config automatically -
No additional setup needed - lint-staged discovers configs automatically!