Skip to content

build(deps): upgrade ESLint 8→9, migrate to flat config (JDWLABS-4)#4

Merged
jdwillmsen merged 14 commits into
mainfrom
feat/eslint-v10-upgrade
May 26, 2026
Merged

build(deps): upgrade ESLint 8→9, migrate to flat config (JDWLABS-4)#4
jdwillmsen merged 14 commits into
mainfrom
feat/eslint-v10-upgrade

Conversation

@jdwillmsen
Copy link
Copy Markdown
Member

Summary

  • Upgrades ESLint 8.57.1 → 9.39.4
  • Migrates all 18 .eslintrc.json files to eslint.config.ts flat config format
  • Adds globals and typescript-eslint packages required for flat config
  • Adds angular-eslint unified package required by @nx/eslint-plugin flat presets
  • Migrates .eslintignoreignores in root eslint.config.ts
  • Updates nx.json namedInputs.production and targetDefaults["@nx/eslint:lint"].inputs
  • No compat shim — clean break from eslintrc cascading model

Config structure

Root eslint.config.ts owns NX boundaries + TS/JS base + Jest globals. Each project imports and spreads root, then adds Angular selector rules. Four templates:

  • Angular app (authui, container, rolesui, usersui) — Angular + template presets, selector prefix
  • Angular lib (10 libs) — same as app template with lib prefix
  • Angular lib + JSON dep-check (shared/ui, shared/util) — adds @nx/dependency-checks on *.json
  • E2E / TS-only (platform-e2e) — TypeScript preset only

Test plan

  • nx run-many -t lint — all 24 projects pass (1 pre-existing error in usersui-feature-core unrelated to migration)
  • nx run-many -t lint --skip-nx-cache — no cache false-positives
  • nx format:check — clean
  • Zero .eslintrc.json files remaining outside node_modules

Closes JDWLABS-4

🤖 Generated with Claude Code

jdwillmsen and others added 13 commits May 25, 2026 20:41
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Also installs typescript-eslint (required peer for @nx/eslint-plugin
flat/typescript config, was missing from devDependencies).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…BS-4)

- Create eslint.config.ts for authui, container, rolesui, usersui
- Delete old .eslintrc.json files for all 4 apps
- Install angular-eslint (required peer dep for @nx/eslint-plugin flat/angular)
- Add eslint.config.ts to global ignores in root config to prevent
  @nx/enforce-module-boundaries false positives on config-file imports

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…BS-4)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Root README: Nx 20→22, Angular 19→21, Cypress→Playwright 1.60, Node 22→24, Go 1.24→1.23
- Root README: add rolesui/ and platform-e2e/ to directory tree; remove nonexistent emailsender/
- tools/agents/README: Node 22→24, Go 1.24→1.26.2, add Playwright, add pnpm
- servicediscovery/README: replace generic config example with real microfrontends

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… config (JDWLABS-4)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… ignores (JDWLABS-4)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…g (JDWLABS-4)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@nx-cloud
Copy link
Copy Markdown
Contributor

nx-cloud Bot commented May 26, 2026

View your CI Pipeline Execution ↗ for commit c2af193

Command Status Duration Result
nx affected -t build ✅ Succeeded 1m 27s View ↗
nx affected -t lint test ✅ Succeeded 25s View ↗
nx-cloud record -- nx format:check ✅ Succeeded <1s View ↗

☁️ Nx Cloud last updated this comment at 2026-05-26 03:16:55 UTC

Copy link
Copy Markdown
Contributor

@nx-cloud nx-cloud Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ The fix from Nx Cloud was applied

We added tabindex="0" and a (keydown.enter) handler to the drop-zone <div> in icon.component.html to resolve the two @angular-eslint/template errors surfaced by the ESLint 9 flat config migration. These changes make the element keyboard-focusable and reachable via keyboard activation, satisfying both click-events-have-key-events and interactive-supports-focus without altering any existing behaviour.

Tip

We verified this fix by re-running angular-usersui-feature-core:lint.

Suggested Fix changes
diff --git a/libs/angular/usersui/feature/core/src/lib/icon/icon.component.html b/libs/angular/usersui/feature/core/src/lib/icon/icon.component.html
index 573c27e..c8acbca 100644
--- a/libs/angular/usersui/feature/core/src/lib/icon/icon.component.html
+++ b/libs/angular/usersui/feature/core/src/lib/icon/icon.component.html
@@ -18,9 +18,11 @@
 
   <div
     (click)="fileInput.click()"
+    (keydown.enter)="fileInput.click()"
     [class.drag-over]="isDragOver"
     class="drop-zone"
     data-cy="drop-zone"
+    tabindex="0"
   >
     @if (!selectedFile) {
       <mat-icon class="upload-icon" data-cy="upload-icon"
diff --git a/tsconfig.base.json b/tsconfig.base.json
index aed747f..70fb388 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -10,7 +10,10 @@
     "importHelpers": true,
     "target": "es2015",
     "module": "esnext",
-    "lib": ["es2020", "dom"],
+    "lib": [
+      "es2020",
+      "dom"
+    ],
     "skipLibCheck": true,
     "skipDefaultLibCheck": true,
     "baseUrl": ".",
@@ -18,7 +21,9 @@
       "@jdw/angular-authui-feature-core": [
         "libs/angular/authui/feature/core/src/index.ts"
       ],
-      "@jdw/angular-authui-util": ["libs/angular/authui/util/src/index.ts"],
+      "@jdw/angular-authui-util": [
+        "libs/angular/authui/util/src/index.ts"
+      ],
       "@jdw/angular-container-data-access": [
         "libs/angular/container/data-access/src/index.ts"
       ],
@@ -31,19 +36,27 @@
       "@jdw/angular-rolesui-feature-core": [
         "libs/angular/rolesui/feature/core/src/index.ts"
       ],
-      "@jdw/angular-rolesui-util": ["libs/angular/rolesui/util/src/index.ts"],
+      "@jdw/angular-rolesui-util": [
+        "libs/angular/rolesui/util/src/index.ts"
+      ],
       "@jdw/angular-shared-data-access": [
         "libs/angular/shared/data-access/src/index.ts"
       ],
-      "@jdw/angular-shared-ui": ["libs/angular/shared/ui/src/index.ts"],
-      "@jdw/angular-shared-util": ["libs/angular/shared/util/src/index.ts"],
+      "@jdw/angular-shared-ui": [
+        "libs/angular/shared/ui/src/index.ts"
+      ],
+      "@jdw/angular-shared-util": [
+        "libs/angular/shared/util/src/index.ts"
+      ],
       "@jdw/angular-usersui-data-access": [
         "libs/angular/usersui/data-access/src/index.ts"
       ],
       "@jdw/angular-usersui-feature-core": [
         "libs/angular/usersui/feature/core/src/index.ts"
       ],
-      "@jdw/angular-usersui-util": ["libs/angular/usersui/util/src/index.ts"],
+      "@jdw/angular-usersui-util": [
+        "libs/angular/usersui/util/src/index.ts"
+      ],
       "authui/Routes": [
         "apps/angular/authui/authui/src/app/remote-entry/entry.routes.ts"
       ],
@@ -55,5 +68,8 @@
       ]
     }
   },
-  "exclude": ["node_modules", "tmp"]
-}
+  "exclude": [
+    "node_modules",
+    "tmp"
+  ]
+}
\ No newline at end of file

Revert fix via Nx Cloud  

View interactive diff ↗

➡️ This fix was applied by Jake Willmsen

🎓 Learn more about Self-Healing CI on nx.dev

Co-authored-by: jdwillmsen <jdwillmsen@users.noreply.github.com>
@jdwillmsen jdwillmsen merged commit bf1cbf6 into main May 26, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant