diff --git a/.changeset/align-eslint-config-devdeps.md b/.changeset/align-eslint-config-devdeps.md new file mode 100644 index 0000000..5f5cb7c --- /dev/null +++ b/.changeset/align-eslint-config-devdeps.md @@ -0,0 +1,21 @@ +--- +"@mikecbrant/eslint-config": major +--- + +Breaking change: adopt Option B dependency model. Only the following are required as peer dependencies for consumers: + +- `eslint` +- `typescript` + +All ESLint plugin/config packages are now regular dependencies of `@mikecbrant/eslint-config` and will be installed transitively by consumers (no need to add them directly): + +- `@typescript-eslint/parser` +- `@typescript-eslint/eslint-plugin` +- `eslint-config-xo-typescript` +- `eslint-plugin-import` +- `eslint-import-resolver-typescript` +- `eslint-plugin-unicorn` +- `eslint-plugin-sonarjs` +- `eslint-plugin-unused-imports` + +Development policy: this package’s `devDependencies` now use caret ranges to track current tooling (no pinning to exact lockfile resolutions). diff --git a/packages/eslint-config/README.md b/packages/eslint-config/README.md index d1c7c83..7df9257 100644 --- a/packages/eslint-config/README.md +++ b/packages/eslint-config/README.md @@ -6,13 +6,22 @@ ESLint 9 flat config for ESM-only Node 22/24 projects. - ESM-only: no `.cjs`, no eslintrc format - CJS (`*.cjs`, `*.cts`) files are ignored by default +## Peer dependencies + +This package requires the following peers in your project: + +- `eslint` (^9.0.0) +- `typescript` (^5.0.0) + +All ESLint plugins/configs used by this shareable config are regular dependencies and install transitively with `@mikecbrant/eslint-config`. + ## Install ```bash -pnpm add -D eslint @mikecbrant/eslint-config +pnpm add -D eslint typescript @mikecbrant/eslint-config ``` -This shareable config brings along the necessary plugins/configs internally (XO + TypeScript, import resolver, SonarJS, unicorn, and unused-imports). Your project only needs `eslint` and this package. +This installs the two peers alongside the shared config. The plugin/config packages (XO TypeScript, import resolver, SonarJS, unicorn, and unused-imports) are bundled as dependencies of this package—you do not need to add them yourself. ## Usage @@ -23,6 +32,18 @@ import config from '@mikecbrant/eslint-config' export default config ``` +### Avoid duplicated config values + +When using the flat config exported by this package, do not re-declare the same plugins/configs or duplicate rules in your local `eslint.config.*`. This config already registers: + +- `@typescript-eslint` +- `eslint-plugin-import` +- `eslint-plugin-unicorn` +- `eslint-plugin-sonarjs` +- `eslint-plugin-unused-imports` + +Re-declaring these can lead to duplicate plugin instances or conflicting rules (an issue we hit in a recent PR). If you need project-specific tweaks, place additional overrides after the imported config without re-adding the same plugins/configs. + Key strict rules (all error): - `max-lines-per-function` = 60 (skip comments/blank lines) diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 9e618c1..4d4c57d 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -8,19 +8,24 @@ "engines": { "node": ">=22 <25" }, - "dependencies": { + "peerDependencies": { "eslint": "^9.0.0", - "eslint-config-xo-typescript": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "eslint-plugin-import": "^2.29.0", - "eslint-import-resolver-typescript": "^3.6.0", + "typescript": "^5.0.0" + }, + "dependencies": { + "@typescript-eslint/parser": "^8.41.0", + "@typescript-eslint/eslint-plugin": "^8.41.0", + "eslint-config-xo-typescript": "^8.0.2", + "eslint-plugin-import": "^2.32.0", + "eslint-import-resolver-typescript": "^3.10.1", "eslint-plugin-unicorn": "^52.0.0", - "eslint-plugin-sonarjs": "^3.0.2", - "eslint-plugin-unused-imports": "^4.0.0" + "eslint-plugin-sonarjs": "^3.0.5", + "eslint-plugin-unused-imports": "^4.2.0" }, "devDependencies": { - "@mikecbrant/prettier-config": "workspace:*" + "@mikecbrant/prettier-config": "workspace:*", + "eslint": "^9.34.0", + "typescript": "^5.9.2" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 530babb..a2059f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,36 +26,39 @@ importers: packages/eslint-config: dependencies: "@typescript-eslint/eslint-plugin": - specifier: ^8.0.0 + specifier: ^8.41.0 version: 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(typescript@5.9.2) "@typescript-eslint/parser": - specifier: ^8.0.0 + specifier: ^8.41.0 version: 8.41.0(eslint@9.34.0)(typescript@5.9.2) - eslint: - specifier: ^9.0.0 - version: 9.34.0 eslint-config-xo-typescript: - specifier: ^8.0.0 + specifier: ^8.0.2 version: 8.0.2(eslint@9.34.0)(typescript@5.9.2) eslint-import-resolver-typescript: - specifier: ^3.6.0 + specifier: ^3.10.1 version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0) eslint-plugin-import: - specifier: ^2.29.0 + specifier: ^2.32.0 version: 2.32.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0)(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.34.0) eslint-plugin-sonarjs: - specifier: ^3.0.2 + specifier: ^3.0.5 version: 3.0.5(eslint@9.34.0) eslint-plugin-unicorn: specifier: ^52.0.0 version: 52.0.0(eslint@9.34.0) eslint-plugin-unused-imports: - specifier: ^4.0.0 + specifier: ^4.2.0 version: 4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0)(typescript@5.9.2))(eslint@9.34.0) devDependencies: "@mikecbrant/prettier-config": specifier: workspace:* version: link:../prettier-config + eslint: + specifier: ^9.34.0 + version: 9.34.0 + typescript: + specifier: ^5.9.2 + version: 5.9.2 packages/prettier-config: dependencies: