From 30affde7f782aa1c3e114380820b0e39d907583f Mon Sep 17 00:00:00 2001 From: CharlieHelps Date: Fri, 5 Sep 2025 12:12:08 +0000 Subject: [PATCH 1/6] feat(eslint-config): expose top-level flat config entry; move ESLint plugins to peerDeps per appsyncjs PR #29 and use ^X.Y.Z ranges --- packages/eslint-config/package.json | 13 +++++++++++-- pnpm-lock.yaml | 9 ++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 9e618c1..634dabf 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -8,7 +8,7 @@ "engines": { "node": ">=22 <25" }, - "dependencies": { + "peerDependencies": { "eslint": "^9.0.0", "eslint-config-xo-typescript": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", @@ -20,7 +20,16 @@ "eslint-plugin-unused-imports": "^4.0.0" }, "devDependencies": { - "@mikecbrant/prettier-config": "workspace:*" + "@mikecbrant/prettier-config": "workspace:*", + "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", + "eslint-plugin-unicorn": "^52.0.0", + "eslint-plugin-sonarjs": "^3.0.2", + "eslint-plugin-unused-imports": "^4.0.0" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 530babb..69455f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,7 +24,10 @@ importers: version: 5.9.2 packages/eslint-config: - dependencies: + devDependencies: + "@mikecbrant/prettier-config": + specifier: workspace:* + version: link:../prettier-config "@typescript-eslint/eslint-plugin": specifier: ^8.0.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) @@ -52,10 +55,6 @@ importers: eslint-plugin-unused-imports: specifier: ^4.0.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 packages/prettier-config: dependencies: From 9c29b979e839ae0c4231b640383c2f69bffcb198 Mon Sep 17 00:00:00 2001 From: CharlieHelps Date: Fri, 5 Sep 2025 12:48:36 +0000 Subject: [PATCH 2/6] chore(eslint-config): pin devDeps to lockfile-resolved versions; add patch changeset for @mikecbrant/eslint-config --- .changeset/align-eslint-config-devdeps.md | 5 +++++ packages/eslint-config/package.json | 18 +++++++++--------- pnpm-lock.yaml | 18 +++++++++--------- 3 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 .changeset/align-eslint-config-devdeps.md diff --git a/.changeset/align-eslint-config-devdeps.md b/.changeset/align-eslint-config-devdeps.md new file mode 100644 index 0000000..7c91721 --- /dev/null +++ b/.changeset/align-eslint-config-devdeps.md @@ -0,0 +1,5 @@ +--- +"@mikecbrant/eslint-config": patch +--- + +Align devDependency versions with the exact resolutions in the workspace lockfile for `packages/eslint-config` (ESLint core and all related plugins/configs). Peer dependency ranges remain as explicit compatible majors (using `^X.Y.Z`). diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 634dabf..ed07ede 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -21,15 +21,15 @@ }, "devDependencies": { "@mikecbrant/prettier-config": "workspace:*", - "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", - "eslint-plugin-unicorn": "^52.0.0", - "eslint-plugin-sonarjs": "^3.0.2", - "eslint-plugin-unused-imports": "^4.0.0" + "eslint": "9.34.0", + "eslint-config-xo-typescript": "8.0.2", + "@typescript-eslint/parser": "8.41.0", + "@typescript-eslint/eslint-plugin": "8.41.0", + "eslint-plugin-import": "2.32.0", + "eslint-import-resolver-typescript": "3.10.1", + "eslint-plugin-unicorn": "52.0.0", + "eslint-plugin-sonarjs": "3.0.5", + "eslint-plugin-unused-imports": "4.2.0" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69455f5..191b8d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,31 +29,31 @@ importers: specifier: workspace:* version: link:../prettier-config "@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 + specifier: 9.34.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 + 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) packages/prettier-config: From 259b1d5efea8e77cde1ba5470024ab5283baa1fc Mon Sep 17 00:00:00 2001 From: CharlieHelps Date: Fri, 5 Sep 2025 13:08:27 +0000 Subject: [PATCH 3/6] changeset: mark @mikecbrant/eslint-config as major; document breaking peerDependencies change and retain devDeps lockfile alignment note --- .changeset/align-eslint-config-devdeps.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.changeset/align-eslint-config-devdeps.md b/.changeset/align-eslint-config-devdeps.md index 7c91721..6604260 100644 --- a/.changeset/align-eslint-config-devdeps.md +++ b/.changeset/align-eslint-config-devdeps.md @@ -1,5 +1,17 @@ --- -"@mikecbrant/eslint-config": patch +"@mikecbrant/eslint-config": major --- -Align devDependency versions with the exact resolutions in the workspace lockfile for `packages/eslint-config` (ESLint core and all related plugins/configs). Peer dependency ranges remain as explicit compatible majors (using `^X.Y.Z`). +Breaking change: move ESLint core and all ESLint plugin/config packages from `dependencies` to `peerDependencies`. Consumers must now install these directly in their projects to use this shared config: + +- `eslint` +- `@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` + +Also align this package’s `devDependencies` with the exact versions resolved in the workspace lockfile to support local development of the config. From e49215892d383d4d50f0f8cedc778684a56d98c4 Mon Sep 17 00:00:00 2001 From: CharlieHelps Date: Fri, 5 Sep 2025 13:15:13 +0000 Subject: [PATCH 4/6] chore(eslint-config): declare TypeScript as peer and pinned devDependency\n\n- peerDependencies: typescript ^5.0.0\n- devDependencies: typescript 5.9.2 (pinned to workspace lockfile resolution)\n\nRefs PR #9 review (id: 2325062722). --- packages/eslint-config/package.json | 6 ++++-- pnpm-lock.yaml | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index ed07ede..53a37e6 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -17,7 +17,8 @@ "eslint-import-resolver-typescript": "^3.6.0", "eslint-plugin-unicorn": "^52.0.0", "eslint-plugin-sonarjs": "^3.0.2", - "eslint-plugin-unused-imports": "^4.0.0" + "eslint-plugin-unused-imports": "^4.0.0", + "typescript": "^5.0.0" }, "devDependencies": { "@mikecbrant/prettier-config": "workspace:*", @@ -29,7 +30,8 @@ "eslint-import-resolver-typescript": "3.10.1", "eslint-plugin-unicorn": "52.0.0", "eslint-plugin-sonarjs": "3.0.5", - "eslint-plugin-unused-imports": "4.2.0" + "eslint-plugin-unused-imports": "4.2.0", + "typescript": "5.9.2" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 191b8d3..2281828 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,6 +55,9 @@ importers: eslint-plugin-unused-imports: 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) + typescript: + specifier: 5.9.2 + version: 5.9.2 packages/prettier-config: dependencies: From 1fdc12dc8b1df6b9c602409458e7e44372379928 Mon Sep 17 00:00:00 2001 From: Mike Brant Date: Fri, 5 Sep 2025 08:17:57 -0500 Subject: [PATCH 5/6] Update packages/eslint-config/package.json --- packages/eslint-config/package.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 53a37e6..a78e200 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -22,16 +22,16 @@ }, "devDependencies": { "@mikecbrant/prettier-config": "workspace:*", - "eslint": "9.34.0", - "eslint-config-xo-typescript": "8.0.2", - "@typescript-eslint/parser": "8.41.0", - "@typescript-eslint/eslint-plugin": "8.41.0", - "eslint-plugin-import": "2.32.0", - "eslint-import-resolver-typescript": "3.10.1", - "eslint-plugin-unicorn": "52.0.0", - "eslint-plugin-sonarjs": "3.0.5", - "eslint-plugin-unused-imports": "4.2.0", - "typescript": "5.9.2" + "eslint": "^9.34.0", + "eslint-config-xo-typescript": "^8.0.2", + "@typescript-eslint/parser": "^8.41.0", + "@typescript-eslint/eslint-plugin": "^8.41.0", + "eslint-plugin-import": "^2.32.0", + "eslint-import-resolver-typescript": "^3.10.1", + "eslint-plugin-unicorn": "^52.0.0", + "eslint-plugin-sonarjs": "^3.0.5", + "eslint-plugin-unused-imports": "^4.2.0", + "typescript": "^5.9.2" }, "publishConfig": { "access": "public" From ed361e3e12b00b7338011aedb900d135170ec5ef Mon Sep 17 00:00:00 2001 From: CharlieHelps Date: Fri, 5 Sep 2025 13:58:37 +0000 Subject: [PATCH 6/6] =?UTF-8?q?feat(eslint-config):=20adopt=20Option=20B?= =?UTF-8?q?=20=E2=80=94=20eslint+typescript=20as=20peers;=20plugins=20as?= =?UTF-8?q?=20deps;=20caret=20ranges\n\n-=20peerDependencies:=20eslint=20^?= =?UTF-8?q?9.0.0,=20typescript=20^5.0.0=20only\n-=20dependencies:=20move?= =?UTF-8?q?=20ESLint=20plugins/configs;=20use=20caret=20ranges=20per=20own?= =?UTF-8?q?er\n-=20devDependencies:=20eslint=20^9.34.0,=20typescript=20^5.?= =?UTF-8?q?9.2,=20keep=20@mikecbrant/prettier-config=20workspace:*\n-=20up?= =?UTF-8?q?date=20Changeset=20to=20state=20Option=20B=20and=20caret=20devD?= =?UTF-8?q?eps=20policy\n-=20docs:=20README=20adds=20peers,=20install/usag?= =?UTF-8?q?e,=20and=20guidance=20to=20avoid=20duplicated=20flat-config=20v?= =?UTF-8?q?alues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/align-eslint-config-devdeps.md | 8 ++++-- packages/eslint-config/README.md | 25 +++++++++++++++-- packages/eslint-config/package.json | 20 +++++--------- pnpm-lock.yaml | 33 ++++++++++++----------- 4 files changed, 53 insertions(+), 33 deletions(-) diff --git a/.changeset/align-eslint-config-devdeps.md b/.changeset/align-eslint-config-devdeps.md index 6604260..5f5cb7c 100644 --- a/.changeset/align-eslint-config-devdeps.md +++ b/.changeset/align-eslint-config-devdeps.md @@ -2,9 +2,13 @@ "@mikecbrant/eslint-config": major --- -Breaking change: move ESLint core and all ESLint plugin/config packages from `dependencies` to `peerDependencies`. Consumers must now install these directly in their projects to use this shared config: +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` @@ -14,4 +18,4 @@ Breaking change: move ESLint core and all ESLint plugin/config packages from `de - `eslint-plugin-sonarjs` - `eslint-plugin-unused-imports` -Also align this package’s `devDependencies` with the exact versions resolved in the workspace lockfile to support local development of the config. +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 a78e200..4d4c57d 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -10,27 +10,21 @@ }, "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", - "eslint-plugin-unicorn": "^52.0.0", - "eslint-plugin-sonarjs": "^3.0.2", - "eslint-plugin-unused-imports": "^4.0.0", "typescript": "^5.0.0" }, - "devDependencies": { - "@mikecbrant/prettier-config": "workspace:*", - "eslint": "^9.34.0", - "eslint-config-xo-typescript": "^8.0.2", + "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.5", - "eslint-plugin-unused-imports": "^4.2.0", + "eslint-plugin-unused-imports": "^4.2.0" + }, + "devDependencies": { + "@mikecbrant/prettier-config": "workspace:*", + "eslint": "^9.34.0", "typescript": "^5.9.2" }, "publishConfig": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2281828..a2059f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,39 +24,40 @@ importers: version: 5.9.2 packages/eslint-config: - devDependencies: - "@mikecbrant/prettier-config": - specifier: workspace:* - version: link:../prettier-config + dependencies: "@typescript-eslint/eslint-plugin": - specifier: 8.41.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.41.0 + specifier: ^8.41.0 version: 8.41.0(eslint@9.34.0)(typescript@5.9.2) - eslint: - specifier: 9.34.0 - version: 9.34.0 eslint-config-xo-typescript: - specifier: 8.0.2 + specifier: ^8.0.2 version: 8.0.2(eslint@9.34.0)(typescript@5.9.2) eslint-import-resolver-typescript: - specifier: 3.10.1 + specifier: ^3.10.1 version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.34.0) eslint-plugin-import: - specifier: 2.32.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.5 + specifier: ^3.0.5 version: 3.0.5(eslint@9.34.0) eslint-plugin-unicorn: - specifier: 52.0.0 + specifier: ^52.0.0 version: 52.0.0(eslint@9.34.0) eslint-plugin-unused-imports: - specifier: 4.2.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 + specifier: ^5.9.2 version: 5.9.2 packages/prettier-config: