Monorepo Guide
Overview
@eslint-sets/eslint-config provides first-class support for monorepo projects.
Supported Tools
pnpm-workspace
yaml
# pnpm-workspace.yaml
packages:
- 'packages/*'
- 'apps/*'Features:
- Workspace protocol support (
workspace:*) - Path alias resolution
- Cross-package imports
Turborepo
json
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"lint": {
"outputs": []
}
}
}Features:
- Pipeline integration
- Task dependencies
- Cache support
NX
json
{
"targetDefaults": {
"lint": {
"dependsOn": ["^lint"]
}
}
}Features:
- Project graph
- Affected projects
- Task orchestration
Configuration
Root Config
typescript
// eslint.config.ts
import eslintConfig from '@eslint-sets/eslint-config'
export default eslintConfig({
typescript: true,
vue: true,
// Shared config for all packages
})Package-specific Config
typescript
// packages/ui-lib/eslint.config.ts
import eslintConfig from '@eslint-sets/eslint-config'
export default eslintConfig({
typescript: true,
projectType: 'lib', // Different rules for libraries
})Path Aliases
TypeScript Config
json
{
"compilerOptions": {
"paths": {
"@company/ui-lib": ["packages/ui-lib/src"],
"@company/shared": ["packages/shared/src"]
}
}
}Import Examples
typescript
// ✅ Works correctly
import { Button } from '@company/ui-lib'
import { formatDate } from '@company/shared'
// ✅ Also works
import { helper } from '../../packages/shared/src/helper'Best Practices
1. Shared Configuration
Create a base config for all packages:
typescript
// eslint.base.config.ts
import eslintConfig from '@eslint-sets/eslint-config'
export const baseConfig = eslintConfig({
typescript: true,
// Common settings
})2. Package-specific Overrides
typescript
// apps/web-app/eslint.config.ts
import { baseConfig } from '../../eslint.base.config'
export default baseConfig.append({
name: 'web-app-overrides',
rules: {
// App-specific rules
},
})3. Monorepo Structure
monorepo/
├── apps/
│ ├── web-app/
│ │ └── eslint.config.ts
│ └── admin-app/
│ └── eslint.config.ts
├── packages/
│ ├── ui-lib/
│ │ └── eslint.config.ts
│ └── shared/
│ └── eslint.config.ts
└── eslint.base.config.tsExamples
Troubleshooting
Path Aliases Not Working
Ensure tsconfig.json has correct paths configuration:
json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}Cross-package Imports
For workspace imports, ensure:
- Correct
workspace:*version inpackage.json - Package is built before importing
- ESLint config includes both packages
Performance Tips
- Shared Config: Use base config to avoid duplication
- Incremental: Use Turborepo/NX for affected projects only
- Caching: Enable ESLint cache in CI