Skip to content

chore(deps): bump eslint from 8.57.1 to 9.26.0 in /web#1366

Closed
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/npm_and_yarn/web/eslint-9.26.0
Closed

chore(deps): bump eslint from 8.57.1 to 9.26.0 in /web#1366
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/npm_and_yarn/web/eslint-9.26.0

Conversation

@dependabot
Copy link
Contributor

@dependabot dependabot bot commented on behalf of github Feb 2, 2026

Bumps eslint from 8.57.1 to 9.26.0.

Release notes

Sourced from eslint's releases.

v9.26.0

Features

  • e9754e7 feat: add reportGlobalThis to no-shadow-restricted-names (#19670) (sethamus)
  • 0fa2b7a feat: add suggestions for eqeqeq rule (#19640) (Nitin Kumar)
  • dcbdcc9 feat: Add MCP server (#19592) (Nicholas C. Zakas)
  • 2dfd83e feat: add ignoreDirectives option in no-unused-expressions (#19645) (sethamus)

Bug Fixes

  • 96e84de fix: check cache file existence before deletion (#19648) (sethamus)
  • d683aeb fix: don't crash on tests with circular references in RuleTester (#19664) (Milos Djermanovic)
  • 9736d5d fix: add namespace to Plugin.meta type (#19661) (Milos Djermanovic)
  • 17bae69 fix: update RuleTester.run() type (#19634) (Nitin Kumar)

Documentation

  • dd98d63 docs: Update README (GitHub Actions Bot)
  • c25e858 docs: Update README (GitHub Actions Bot)
  • b2397e9 docs: Update README (GitHub Actions Bot)
  • addd0a6 docs: fix formatting of unordered lists in Markdown (#19660) (Milos Djermanovic)
  • a21b38d docs: Update README (GitHub Actions Bot)
  • c0721a7 docs: fix double space in command (#19657) (CamWass)

Chores

  • 5b247c8 chore: upgrade to @eslint/js@9.26.0 (#19681) (Francesco Trotta)
  • d6fa4ac chore: package.json update for @​eslint/js release (Jenkins)
  • 0958690 chore: disambiguate internal types LanguageOptions and Rule (#19669) (Francesco Trotta)
  • f1c858e chore: fix internal type references to Plugin and Rule (#19665) (Francesco Trotta)
  • 40dd299 refactor: One-shot ESQuery selector analysis (#19652) (Nicholas C. Zakas)
  • 1cfd702 chore: update dependency @​eslint/json to ^0.12.0 (#19656) (renovate[bot])

v9.25.1

Bug Fixes

  • cdc8e8c fix: revert directive detection in no-unused-expressions (#19639) (sethamus)

Chores

  • 1f2b057 chore: upgrade @​eslint/js@​9.25.1 (#19642) (Milos Djermanovic)
  • 771317f chore: package.json update for @​eslint/js release (Jenkins)

v9.25.0

Features

  • dcd95aa feat: support TypeScript syntax in no-empty-function rule (#19551) (sethamus)
  • 77d6d5b feat: support TS syntax in no-unused-expressions (#19564) (Sweta Tanwar)
  • 90228e5 feat: support JSRuleDefinition type (#19604) (루밀LuMir)
  • 59ba6b7 feat: add allowObjects option to no-restricted-properties (#19607) (sethamus)
  • db650a0 feat: support TypeScript syntax in no-invalid-this rule (#19532) (Tanuj Kanti)
  • 9535cff feat: support TS syntax in no-loop-func (#19559) (Nitin Kumar)

Bug Fixes

  • 910bd13 fix: nodeTypeKey not being used in NodeEventGenerator (#19631) (StyleShit)

Documentation

... (truncated)

Changelog

Sourced from eslint's changelog.

v9.26.0 - May 2, 2025

  • 5b247c8 chore: upgrade to @eslint/js@9.26.0 (#19681) (Francesco Trotta)
  • d6fa4ac chore: package.json update for @​eslint/js release (Jenkins)
  • e9754e7 feat: add reportGlobalThis to no-shadow-restricted-names (#19670) (sethamus)
  • 0fa2b7a feat: add suggestions for eqeqeq rule (#19640) (Nitin Kumar)
  • dd98d63 docs: Update README (GitHub Actions Bot)
  • 96e84de fix: check cache file existence before deletion (#19648) (sethamus)
  • c25e858 docs: Update README (GitHub Actions Bot)
  • 0958690 chore: disambiguate internal types LanguageOptions and Rule (#19669) (Francesco Trotta)
  • dcbdcc9 feat: Add MCP server (#19592) (Nicholas C. Zakas)
  • b2397e9 docs: Update README (GitHub Actions Bot)
  • d683aeb fix: don't crash on tests with circular references in RuleTester (#19664) (Milos Djermanovic)
  • f1c858e chore: fix internal type references to Plugin and Rule (#19665) (Francesco Trotta)
  • 9736d5d fix: add namespace to Plugin.meta type (#19661) (Milos Djermanovic)
  • 40dd299 refactor: One-shot ESQuery selector analysis (#19652) (Nicholas C. Zakas)
  • addd0a6 docs: fix formatting of unordered lists in Markdown (#19660) (Milos Djermanovic)
  • a21b38d docs: Update README (GitHub Actions Bot)
  • c0721a7 docs: fix double space in command (#19657) (CamWass)
  • 1cfd702 chore: update dependency @​eslint/json to ^0.12.0 (#19656) (renovate[bot])
  • 2dfd83e feat: add ignoreDirectives option in no-unused-expressions (#19645) (sethamus)
  • 17bae69 fix: update RuleTester.run() type (#19634) (Nitin Kumar)

v9.25.1 - April 21, 2025

  • 1f2b057 chore: upgrade @​eslint/js@​9.25.1 (#19642) (Milos Djermanovic)
  • 771317f chore: package.json update for @​eslint/js release (Jenkins)
  • cdc8e8c fix: revert directive detection in no-unused-expressions (#19639) (sethamus)

v9.25.0 - April 18, 2025

  • 88dc196 chore: upgrade @​eslint/js@​9.25.0 (#19636) (Milos Djermanovic)
  • 345288d chore: package.json update for @​eslint/js release (Jenkins)
  • 910bd13 fix: nodeTypeKey not being used in NodeEventGenerator (#19631) (StyleShit)
  • ca7a735 docs: update no-undef-init when not to use section (#19624) (Tanuj Kanti)
  • affe6be chore: upgrade trunk (#19628) (sethamus)
  • 1b870c9 docs: use eslint-config-xo in the getting started guide (#19629) (Nitin Kumar)
  • 5d4af16 docs: add types for multiple rule options (#19616) (Tanuj Kanti)
  • e8f8d57 docs: Update README (GitHub Actions Bot)
  • a40348f docs: no-use-before-define tweaks (#19622) (Kirk Waiblinger)
  • 0ba3ae3 docs: Update README (GitHub Actions Bot)
  • 865dbfe docs: ensure "learn more" deprecation links point to useful resource (#19590) (Kirk Waiblinger)
  • dcd95aa feat: support TypeScript syntax in no-empty-function rule (#19551) (sethamus)
  • 77d6d5b feat: support TS syntax in no-unused-expressions (#19564) (Sweta Tanwar)
  • 90228e5 feat: support JSRuleDefinition type (#19604) (루밀LuMir)
  • f80b746 docs: add known limitations for no-self-compare (#19612) (Nitin Kumar)
  • 59ba6b7 feat: add allowObjects option to no-restricted-properties (#19607) (sethamus)
  • db650a0 feat: support TypeScript syntax in no-invalid-this rule (#19532) (Tanuj Kanti)
  • dd20cf2 test: fix no-loop-func test with duplicate variable reports (#19610) (Milos Djermanovic)
  • 9535cff feat: support TS syntax in no-loop-func (#19559) (Nitin Kumar)

... (truncated)

Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    You can disable automated security fix PRs for this repo from the Security Alerts page.

Summary by CodeRabbit

  • Chores
    • Upgraded linting tooling across the web, admin, and library apps to the latest major version to maintain consistent code quality standards.
    • No user-facing impact: runtime behavior, UI, and APIs remain unchanged. This update improves developer experience and code health without altering features, configurations, or build outputs.

Bumps [eslint](https://github.com/eslint/eslint) from 8.57.1 to 9.26.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/v9.26.0/CHANGELOG.md)
- [Commits](eslint/eslint@v8.57.1...v9.26.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.26.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot bot added dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code labels Feb 2, 2026
@vercel
Copy link

vercel bot commented Feb 2, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
frontier Ready Ready Preview, Comment Feb 2, 2026 8:32am

@coveralls
Copy link

Pull Request Test Coverage Report for Build 21582801950

Warning: This coverage report may be inaccurate.

This pull request's base commit is no longer the HEAD commit of its target branch. This means it includes changes from outside the original pull request, including, potentially, unrelated coverage changes.

Details

  • 0 of 0 changed or added relevant lines in 0 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage remained the same at 37.882%

Totals Coverage Status
Change from base Build 21582758424: 0.0%
Covered Lines: 15887
Relevant Lines: 41938

💛 - Coveralls

@rsbh
Copy link
Member

rsbh commented Feb 4, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Feb 4, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai
Copy link

coderabbitai bot commented Feb 4, 2026

📝 Walkthrough

Walkthrough

ESLint versions were updated to ^9.26.0 in three package.json files across web, admin app, and lib. No other scripts, configs, or code were changed.

Changes

Cohort / File(s) Summary
ESLint version bumps
web/apps/admin/package.json, web/lib/package.json, web/package.json
Bumped eslint from ^8.x to ^9.26.0 in devDependencies/dependencies. No other modifications.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Poem

I nibbled through configs, hop by hop,
Upgrading lint to the tippy-top.
Carrots aligned, rules in a row,
Burrows clean with a tidy glow.
Boop goes the nose—version nine’s here,
Thump-thump! The code smells clear.

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Description check ⚠️ Warning The description lacks all required sections from the template (Summary, Changes, Technical Details, Test Plan). It only contains auto-generated Dependabot content with release notes and changelog. Add required sections: Summary (overview of the update), Changes (key updates), Technical Details (breaking changes or migration notes), and Test Plan (testing approach).
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: bumping eslint from version 8.57.1 to 9.26.0 across the /web directory.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch dependabot/npm_and_yarn/web/eslint-9.26.0

Important

Action Needed: IP Allowlist Update

If your organization protects your Git platform with IP whitelisting, please add the new CodeRabbit IP address to your allowlist:

  • 136.113.208.247/32 (new)
  • 34.170.211.100/32
  • 35.222.179.152/32

Reviews will stop working after February 8, 2026 if the new IP is not added to your allowlist.


Comment @coderabbitai help to get the list of available commands and usage tips.

@rsbh rsbh closed this Feb 4, 2026
@dependabot @github
Copy link
Contributor Author

dependabot bot commented on behalf of github Feb 4, 2026

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot dependabot bot deleted the dependabot/npm_and_yarn/web/eslint-9.26.0 branch February 4, 2026 16:42
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@web/apps/admin/package.json`:
- Line 53: The project updated ESLint to v9 which no longer reads legacy
.eslintrc.cjs; migrate the configuration to the flat format by converting
web/tools/eslint-config/index.js into a root-level flat config file
(eslint.config.js) or convert web/apps/admin/.eslintrc.cjs into the flat config
format, and update any string-based extends ("next","turbo","prettier") and
plugins to the new flat config plugin/processor syntax so the "lint" script in
package.json works; as a temporary stopgap you can set
ESLINT_USE_FLAT_CONFIG=false in the admin app's environment to avoid failures,
but prefer migrating the shared config (web/tools/eslint-config/index.js) to
eslint.config.js so all consumers use the new format.

In `@web/lib/package.json`:
- Line 76: Update the ESLint-related dependencies and config to be compatible
with ESLint v9: in package.json bump or pin dependencies referenced by
`@raystack/eslint-config`—replace or upgrade eslint-config-next to a v9-compatible
release (>=13.4.1 that supports Next.js 15+ or switch to a supported
alternative), upgrade eslint-config-turbo to a Turborepo v2.4+ compatible
version, and update eslint-plugin-react to >=7.35.0; then migrate or convert the
legacy .eslintrc.js to the new flat config format (or update
`@raystack/eslint-config` to publish a v9-compatible flat-config) and verify the
project's eslint script still invokes the correct config.

In `@web/package.json`:
- Line 26: Update the "eslint" dependency in package.json from "^9.26.0" to a
compatible version (e.g., "^8.57.0") to restore legacy .eslintrc.* behavior;
after changing the "eslint" entry, run your package manager to update lockfiles
(npm/yarn/pnpm install) and verify workspace linting passes.

"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react-swc": "^3.0.0",
"eslint": "^8.56.0",
"eslint": "^9.26.0",
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Find ESLint config files in the admin app
find web/apps/admin -maxdepth 3 -type f \( -name ".eslintrc*" -o -name "eslint.config.*" \) 2>/dev/null

Repository: raystack/frontier

Length of output: 89


🏁 Script executed:

# Check the full package.json to see eslint-related dependencies
cat web/apps/admin/package.json | head -80

Repository: raystack/frontier

Length of output: 1810


🏁 Script executed:

# Look for any eslint config in parent directories
find web/apps -maxdepth 2 -type f \( -name ".eslintrc*" -o -name "eslint.config.*" \) 2>/dev/null

Repository: raystack/frontier

Length of output: 123


🌐 Web query:

ESLint 9.0 breaking changes migration guide config format

💡 Result:

ESLint 9 config-format breaking change (and how to migrate)

1) Flat config is now the default

  • ESLint v9.0.0 defaults to “flat config” (eslint.config.js) and does not automatically look for .eslintrc* anymore (eslintrc is deprecated). [2][3]
  • If you must keep .eslintrc* temporarily, set ESLINT_USE_FLAT_CONFIG=false. [3]

2) Generate a starter eslint.config.js

Use the official migrator (good starting point, may need manual edits): [1]

npx `@eslint/migrate-config` .eslintrc.json

3) Key config format differences (eslintrc → flat config)

A) extends / plugins / parsers are no longer string-resolved

  • Flat config uses real JS imports and object-shaped plugins, and languageOptions.parser is the imported parser module. [1]

B) overrides becomes “the whole file”

  • Flat config exports an array of config objects; use files: [...] per entry (similar to eslintrc overrides). [1]

C) env is gone → use languageOptions.globals

  • Use the globals npm package and spread in env globals (browser/node/etc.). [1]

D) Ignoring files changed

  • Flat config doesn’t read .eslintignore and the CLI flag --ignore-path is not supported.
  • To include ignore patterns (e.g., from .gitignore), use includeIgnoreFile() from @eslint/compat. [1]

E) Other notable config-format removals/changes

  • root no longer exists (flat config behaves like root: true). [1]
  • package.json "eslintConfig" is no longer supported; move config to eslint.config.*. [1]

4) CLI flags that change because of flat config

  • --no-eslintrc → replaced by --no-config-lookup. [1]
  • These flags are not supported with flat config: --env, --ignore-path, --resolve-plugins-relative-to, --rulesdir. [1]

Minimal flat-config shape (for orientation)

// eslint.config.js
import globals from "globals";
import js from "@eslint/js";

export default [
  js.configs.recommended,
  {
    files: ["**/*.{js,mjs,cjs}"],
    languageOptions: {
      globals: { ...globals.node },
    },
  },
];

(Adjust files, imports, plugins, and rules to match your project.) [1]


🌐 Web query:

@raystack/eslint-config ESLint 9 compatibility support

💡 Result:

I couldn’t find any public npm package page or GitHub repository for @raystack/eslint-config, so I can’t confirm whether it currently supports ESLint v9 (or flat config) from public sources.

What “ESLint 9 compatible” typically means:

  • ESLint v9 uses flat config (eslint.config.js) by default and .eslintrc* is deprecated (still usable, but no longer the default). [1]
  • ESLint provides a migration path/tools for moving from .eslintrc to flat config. [2]
  • Many shareable configs need updates (or need to be wrapped with compat utilities) to work cleanly with v9/flat config. [2]

How to verify in your repo in 30 seconds:

  1. Open node_modules/@raystack/eslint-config/package.json
  2. Check:
    • peerDependencies.eslint includes ^9 (good sign), or only ^8 (likely not updated).
    • docs/exports include a flat-config entry (e.g., *.flat.js) vs only extends-style configs.

If you paste that package.json (or link the repo/package location you’re using), I can tell you exactly whether it’s ESLint 9 compatible and what change is needed.

Sources:
[1] ESLint: flat config becomes default in v9 / eslintrc deprecation https://eslint.org/blog/2023/10/flat-config-rollout-plans/
[2] ESLint: configuration migration guide https://eslint.org/docs/latest/use/configure/migration-guide


🏁 Script executed:

# Read the ESLint config
cat web/apps/admin/.eslintrc.cjs

Repository: raystack/frontier

Length of output: 124


🏁 Script executed:

# Check for any eslint-related packages in package.json
cat web/apps/admin/package.json | grep -i eslint

Repository: raystack/frontier

Length of output: 122


🏁 Script executed:

# Also check if there's a shared config at workspace root
find . -maxdepth 2 -type f \( -name "package.json" -o -name ".eslintrc*" -o -name "eslint.config.*" \) | grep -E "(eslint|package.json)" | head -10

Repository: raystack/frontier

Length of output: 118


🏁 Script executed:

# Find the tools/eslint-config directory
find . -type d -name "eslint-config" | grep tools

Repository: raystack/frontier

Length of output: 86


🏁 Script executed:

# Check if there's a tools directory at root and list its contents
ls -la tools/ 2>/dev/null || echo "No tools directory at root"

Repository: raystack/frontier

Length of output: 87


🏁 Script executed:

# Check the workspace/monorepo structure
cat package.json 2>/dev/null | head -30

Repository: raystack/frontier

Length of output: 43


🏁 Script executed:

# Look for the eslint-config in tools or similar locations
find . -path "*/tools/eslint-config*" -o -path "*/config/eslint*" 2>/dev/null | head -10

Repository: raystack/frontier

Length of output: 160


🏁 Script executed:

# Read the eslint-config package.json
cat web/tools/eslint-config/package.json

Repository: raystack/frontier

Length of output: 520


🏁 Script executed:

# Read the eslint-config index.js
cat web/tools/eslint-config/index.js

Repository: raystack/frontier

Length of output: 495


ESLint v9 requires configuration migration to flat config format.

The admin app's ESLint setup uses the deprecated .eslintrc.cjs format which ESLint v9 no longer reads by default. The shared config at web/tools/eslint-config extends string-based configs (next, turbo, prettier) and plugins, which are incompatible with ESLint v9's flat config.

Before merging:

  • Migrate web/tools/eslint-config/index.js to flat config format (eslint.config.js), or
  • Migrate web/apps/admin/.eslintrc.cjs to flat config, or
  • Set ESLINT_USE_FLAT_CONFIG=false as a temporary workaround (not recommended long-term)

Without migration, the lint script will fail when ESLint v9 attempts to load the configuration.

🤖 Prompt for AI Agents
In `@web/apps/admin/package.json` at line 53, The project updated ESLint to v9
which no longer reads legacy .eslintrc.cjs; migrate the configuration to the
flat format by converting web/tools/eslint-config/index.js into a root-level
flat config file (eslint.config.js) or convert web/apps/admin/.eslintrc.cjs into
the flat config format, and update any string-based extends
("next","turbo","prettier") and plugins to the new flat config plugin/processor
syntax so the "lint" script in package.json works; as a temporary stopgap you
can set ESLINT_USE_FLAT_CONFIG=false in the admin app's environment to avoid
failures, but prefer migrating the shared config
(web/tools/eslint-config/index.js) to eslint.config.js so all consumers use the
new format.

"esbuild-css-modules-plugin": "^2.7.1",
"esbuild-plugin-external-global": "^1.0.1",
"eslint": "^8.57.1",
"eslint": "^9.26.0",
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

ESLint 9.26.0 breaking changes migration guide

💡 Result:

Are there breaking changes in ESLint 9.26.0?

ESLint v9.26.0 is a minor release and its release notes do not list any “Breaking Changes” section; it’s primarily new features + bug fixes. The notable behavior change to watch is in no-unused-expressions for ES3 codebases: by default it now reports directives as unused expressions in ES3, and you can opt out via the new ignoreDirectives option. [1]

Migration guide for “ESLint 9.x” (the actual breaking changes)

If you’re migrating to ESLint 9 (e.g., from 8.x), follow ESLint’s official “Migrate to v9.x” guide, which covers the real breaking changes introduced in 9.0.0. Key items:

  • Node support changed: ESLint 9 requires Node v18.18.0+ (and drops Node 19). [2]
  • Flat config is now the default: eslint.config.js is the default config format; legacy eslintrc is deprecated and is not automatically searched. If you must keep eslintrc temporarily, set ESLINT_USE_FLAT_CONFIG=false. [2]
  • Removed: multiple built-in formatters; require-jsdoc and valid-jsdoc rules. [2]
  • CLI behavior changes: e.g. --quiet no longer runs "warn" rules; running ESLint with no patterns behaves differently depending on flat config vs eslintrc. [2]
  • Directive/config comment tightening: disallows multiple /* eslint */ comments for the same rule; stricter /* exported */ parsing, etc. [2]

For extra context, ESLint’s v9.0.0 announcement also points to the migration guide and highlights that v9 is the major breaking release. [3]

Sources:
[1] ESLint v9.26.0 release notes (May 2, 2025) (eslint.org)
[2] ESLint docs: “Migrate to v9.x” (eslint.org)
[3] ESLint blog: “ESLint v9.0.0 released” (eslint.org)

Citations:


🌐 Web query:

@raystack/eslint-config ESLint v9 compatibility support

💡 Result:

I couldn’t find any publicly indexed npm or GitHub listing for @raystack/eslint-config (searching npmjs.com and general web results for that exact scope/name returned unrelated packages only). If it is private/internal, ESLint v9 compatibility typically requires the following checks/changes:

  • Peer dependency: set peerDependencies.eslint to a v9-compatible range (ESLint recommends ">= 9" for shareable configs). [1]
  • Flat config support: ESLint v9 uses flat config (eslint.config.js) by default; .eslintrc is deprecated (still usable, but not the default). [2]
  • If you still need to consume legacy .eslintrc-style configs, use @eslint/eslintrc’s FlatCompat to bridge into flat config. [3]
  • Runtime floor: ESLint v9 dropped Node.js versions prior to 18.18.0. [2]

If you can share the package’s package.json (especially peerDependencies) and how it exports configs today (e.g., main/exports, and whether it ships a flat-config entry), I can tell you exactly whether it’s ESLint v9-compatible and what to change.

Sources:
[1] ESLint docs – Shareable configs (peerDependencies recommendation) https://eslint.org/docs/latest/extend/shareable-configs
[2] ESLint blog – ESLint v9.0.0 release (flat config default; Node support) https://eslint.org/blog/2024/04/eslint-v9.0.0-released/
[3] @eslint/eslintrc docs (FlatCompat for migrating legacy configs) https://github.com/eslint/eslintrc


🏁 Script executed:

find web/lib -name ".eslintrc*" -o -name "eslint.config.*" | head -20

Repository: raystack/frontier

Length of output: 43


🏁 Script executed:

cd web/lib && cat package.json | jq '.devDependencies, .dependencies' 2>/dev/null || grep -A 20 '"devDependencies"' web/lib/package.json | head -30

Repository: raystack/frontier

Length of output: 1491


🏁 Script executed:

cd web/lib && cat .eslintrc* 2>/dev/null || echo "No .eslintrc files found"

Repository: raystack/frontier

Length of output: 85


🏁 Script executed:

find . -path "*/node_modules" -prune -o -name "eslint.config.*" -type f -print | head -20

Repository: raystack/frontier

Length of output: 43


🏁 Script executed:

find . -path "*/node_modules" -prune -o -type d -name "eslint-config" -print | head -10

Repository: raystack/frontier

Length of output: 86


🏁 Script executed:

cd web/lib && find . -maxdepth 3 -name "*.eslint*" -o -name "eslint.config*" 2>/dev/null | head -20

Repository: raystack/frontier

Length of output: 43


🏁 Script executed:

grep -r "@raystack/eslint-config" . --include="package.json" 2>/dev/null | grep -v node_modules

Repository: raystack/frontier

Length of output: 269


🏁 Script executed:

cat -n web/tools/eslint-config/package.json

Repository: raystack/frontier

Length of output: 653


🏁 Script executed:

ls -la web/tools/eslint-config/

Repository: raystack/frontier

Length of output: 287


🏁 Script executed:

cat -n web/tools/eslint-config/index.js 2>/dev/null || cat -n web/tools/eslint-config/eslint.config.js 2>/dev/null || echo "Checking directory contents" && find web/tools/eslint-config -type f -maxdepth 1

Repository: raystack/frontier

Length of output: 712


🏁 Script executed:

cat -n web/lib/eslint.config.js 2>/dev/null || echo "No flat config in web/lib"

Repository: raystack/frontier

Length of output: 86


🏁 Script executed:

find . -maxdepth 2 -type f \( -name ".eslintrc*" -o -name "eslint.config.js" \) ! -path "*/node_modules/*" ! -path "*/.git/*"

Repository: raystack/frontier

Length of output: 79


🏁 Script executed:

cat -n web/lib/package.json | grep -A 3 -B 3 "lint"

Repository: raystack/frontier

Length of output: 1327


🏁 Script executed:

ls -la web/.eslintrc* .eslintrc* 2>/dev/null || echo "Checking for eslintrc files..."

Repository: raystack/frontier

Length of output: 156


🏁 Script executed:

cat -n web/.eslintrc.js

Repository: raystack/frontier

Length of output: 315


🏁 Script executed:

# Check if web/lib can use parent .eslintrc and if any config exists at root
cd web/lib && pwd && ls -la .eslintrc* eslint.config.* 2>/dev/null || echo "No config files in web/lib"

Repository: raystack/frontier

Length of output: 114


🌐 Web query:

eslint-config-next eslint-config-turbo eslint-plugin-react compatibility with ESLint v9

💡 Result:

Compatibility summary (ESLint v9)

Package ESLint v9 compatible? Since / requirement Notes
eslint-config-next Yes Next.js 15+ (and matching eslint-config-next version) Next.js documents that eslint-config-next includes @next/eslint-plugin-next plus recommended rules from eslint-plugin-react and eslint-plugin-react-hooks. It also provides guidance for using the plugin directly in flat config (eslint.config.*). [1] Next.js added ESLint v9 support across eslint-config-next / plugin / next lint as a breaking change (incl. moving to eslint-plugin-react-hooks@5.0.0). [2]
eslint-config-turbo Yes Turborepo 2.4+ Turborepo 2.4 explicitly introduced ESLint v9 (flat config) support for eslint-config-turbo (and eslint-plugin-turbo). [3]
eslint-plugin-react Yes v7.35.0+ Release notes for eslint-plugin-react@7.35.0 list “support eslint v9”. [4] (Older versions like 7.34.x may fail peer-dep resolution with ESLint 9.) [5]

Practical takeaways

  • If you’re on Next.js 15+, align next + eslint-config-next to the same major version and ESLint 9 should be fine. [1][2]
  • If you use Turborepo lint rules, use eslint-config-turbo/flat (or eslint-plugin-turbo flat configs) with Turbo 2.4+. [3]
  • Ensure eslint-plugin-react is ≥ 7.35.0 when on ESLint 9. [4][5]

Sources:
[1] Next.js ESLint docs (updated Nov 10, 2025) https://nextjs.org/docs/app/api-reference/config/eslint
[2] Next.js commit adding ESLint v9 support (incl. react-hooks 5.0.0 note) https://app.semanticdiff.com/gh/vercel/next.js/commit/300bfe52f4dd4fbf9b7e6aa7f9c832ce10ea9f41
[3] Turborepo 2.4 announcement (ESLint v9 / flat config support) https://turborepo.com/blog/turbo-2-4
[4] Yarn package page release notes for eslint-plugin-react@7.35.0 (lists ESLint v9 support) https://classic.yarnpkg.com/en/package/eslint-plugin-react
[5] eslint-plugin-react issue showing older peerDeps blocking ESLint 9 installs (7.34.1) jsx-eslint/eslint-plugin-react#3735


Update @raystack/eslint-config dependencies for ESLint v9 compatibility.

The upgrade to ESLint v9.26.0 requires updating incompatible plugins in @raystack/eslint-config:

  • eslint-config-next@^13.4.1 requires Next.js 15+ for v9 support; current is v13.4.12
  • eslint-config-turbo@^1.9.3 requires Turborepo 2.4+ for v9 support
  • eslint-plugin-react@7.28.0 requires v7.35.0+ for v9 support

The legacy .eslintrc.js format is deprecated in v9 (flat config is now default). Update the eslint-config package with v9-compatible versions and consider migrating to flat config format.

🤖 Prompt for AI Agents
In `@web/lib/package.json` at line 76, Update the ESLint-related dependencies and
config to be compatible with ESLint v9: in package.json bump or pin dependencies
referenced by `@raystack/eslint-config`—replace or upgrade eslint-config-next to a
v9-compatible release (>=13.4.1 that supports Next.js 15+ or switch to a
supported alternative), upgrade eslint-config-turbo to a Turborepo v2.4+
compatible version, and update eslint-plugin-react to >=7.35.0; then migrate or
convert the legacy .eslintrc.js to the new flat config format (or update
`@raystack/eslint-config` to publish a v9-compatible flat-config) and verify the
project's eslint script still invokes the correct config.

"dependencies": {
"@changesets/cli": "^2.26.2",
"eslint": "^8.57.1",
"eslint": "^9.26.0",
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# First, check the repository structure and find ESLint-related files
find . -type f -name ".eslintrc*" -o -name "eslint.config.*" | head -20

Repository: raystack/frontier

Length of output: 146


🏁 Script executed:

# Check package.json files to understand the workspace structure
git ls-files "**/package.json" | head -20

Repository: raystack/frontier

Length of output: 274


🏁 Script executed:

# Check the root and web package.json for eslint-related dependencies
cat web/package.json | grep -A 5 -B 5 "eslint"

Repository: raystack/frontier

Length of output: 331


🏁 Script executed:

# Check if there's a root-level package.json
test -f package.json && cat package.json | grep -A 5 -B 5 "eslint" || echo "No root package.json with eslint"

Repository: raystack/frontier

Length of output: 93


🏁 Script executed:

# Look for `@raystack/eslint-config` references
rg "@raystack/eslint-config" --type json

Repository: raystack/frontier

Length of output: 263


🏁 Script executed:

cat web/tools/eslint-config/package.json

Repository: raystack/frontier

Length of output: 520


🏁 Script executed:

cat web/.eslintrc.js

Repository: raystack/frontier

Length of output: 231


🏁 Script executed:

head -20 web/apps/admin/.eslintrc.cjs

Repository: raystack/frontier

Length of output: 124


🌐 Web query:

ESLint 9.26.0 breaking changes migration guide config format

💡 Result:

Are there breaking changes in ESLint 9.26.0?

No specific breaking changes are called out for 9.26.0—it’s a minor release focused on features/bugfixes (e.g., MCP server via --mcp, and a no-shadow-restricted-names update). [1]

If you’re seeing breakage on upgrade to 9.26.0, it’s usually because you’re crossing the v9.0.0 boundary (or tooling/plugins assuming legacy config).

The real “breaking changes” you need to migrate for (ESLint v9)

1) Config format: flat config is the default

ESLint v9 defaults to flat config (eslint.config.js) and treats eslintrc as deprecated. [2]
ESLint’s official config migration guide is here: [3]

2) Use the official config migrator

Convert .eslintrc.* to flat config:

  • npx @eslint/migrate-config .eslintrc.json (works best for JSON/YAML; .eslintrc.js is converted based on evaluated output) [3]

3) Key flat-config differences (common migration gotchas)

  • Plugins/parsers are imported as JS objects (not strings in plugins/extends). [3]
  • package.json eslintConfig is not supported in flat config (move to eslint.config.*). [3]
  • root is gone (flat config behaves like root: true). [3]
  • files must be an array (not a single string). [3]

4) Other notable v9 breaking changes that often surface during upgrades

  • Node support: Node < 18.18.0 and Node 19 are not supported. [4]
  • Various CLI/API and rule-behavior breaking changes are summarized in the v9 migration guide. [4]

Sources: ESLint v9.26.0 release notes [1], ESLint v9.0.0 release notes [2], ESLint Configuration Migration Guide (eslintrc → flat) [3], ESLint “Migrate to v9.x” breaking-changes guide [4].


🌐 Web query:

ESLint v9 flat config migration .eslintrc.js compatibility

💡 Result:

  • ESLint v9 uses “flat config” by default: it looks for eslint.config.(js|mjs|cjs) and does not automatically search for .eslintrc.* anymore (eslintrc is deprecated, not removed). [1][2]
  • If you want to keep using .eslintrc.js for now, you must opt back into legacy config by setting:
    • ESLINT_USE_FLAT_CONFIG=false (environment variable). [3][4]
  • Recommended path: migrate to flat config using the official migrator:
    • npx @eslint/migrate-config .eslintrc.js (or your actual file). [5][6]
      Notes: migration from .eslintrc.js is limited—the tool evaluates the JS config and converts the resulting data, but won’t preserve conditionals/functions/logic, so you should expect manual edits. [5][6]
  • Compatibility bridging during migration: the migrator can automatically add FlatCompat / compatibility utilities when needed (useful when extending older shareable configs/plugins). [5]

Sources
[1] ESLint “Migrate to v9.x” docs (new default config + eslintrc not auto-searched) (eslint.org)
[2] ESLint flat config rollout plan (v9 default; eslintrc deprecated) (eslint.org)
[3] ESLint v9.0.0 released notes (eslintrc deprecated; env var to keep using it) (eslint.nodejs.cn)
[4] ESLint v9 alpha release notes (same env var guidance) (eslint.nodejs.cn)
[5] ESLint blog: Configuration Migrator (capabilities + FlatCompat + limitations for .eslintrc.js) (eslint.org)
[6] ESLint Configuration Migration Guide (migrator usage + .eslintrc.js limitation) (eslint.org)

Citations:


🌐 Web query:

eslint-config-next v13 ESLint v9 compatibility support

💡 Result:

eslint-config-next v13 (Next.js 13) is not compatible with ESLint v9. ESLint v9 introduced breaking changes (notably flat config as the default, with .eslintrc no longer auto-detected unless you opt back in). [1]

In practice, eslint-config-next versions before the v15 line only peer-depended on ESLint ^7.23 || ^8 (example shown for 14.2.x), so npm/pnpm will flag ESLint v9 as an incompatible peer. [2] ESLint v9 support was added in the v15 line: eslint-config-next@15.0.1 (and newer) declares eslint peer dependency ^7.23.0 || ^8.0.0 || ^9.0.0. [3]

What to do

  • Stay on Next.js 13 / eslint-config-next 13.x: pin ESLint 8.x (not 9).
  • Use ESLint 9: upgrade to a newer Next.js that pulls in eslint-config-next ≥ 15, and use the modern flat-config setup (Next docs show importing eslint-config-next into eslint.config.mjs). [4]

Sources

  1. ESLint v9 changes / flat config default: https://eslint.org/blog/2024/04/eslint-v9.0.0-released/
  2. Next.js issue showing eslint-config-next@14.2.2 peers only ^7.23 || ^8: eslint-config-next to have eslint ^9.x.x+ as peerDependencies vercel/next.js#64833
  3. eslint-config-next@15.0.1 peer deps include ESLint ^9: https://app.unpkg.com/eslint-config-next@15.0.1/files/package.json
  4. Next.js ESLint (flat config) docs: https://nextjs.org/docs/app/api-reference/config/eslint

🌐 Web query:

eslint-config-turbo v1.9.3 ESLint v9 breaking changes

💡 Result:

With ESLint v9, the main “breaking change” you’ll hit with eslint-config-turbo@1.9.3 is configuration format/lookup, not Turbo rules.

What breaks (or surprises) when moving to ESLint v9

  • Flat config is the default in ESLint v9: ESLint now looks for eslint.config.* first, and if it can’t find one, it errors instead of falling back to .eslintrc.*. To keep using .eslintrc.*, you must set ESLINT_USE_FLAT_CONFIG=false (and ESLint will warn that eslintrc is deprecated). [1]
  • Node.js minimum version changes: ESLint v9 drops support for Node < 18.18.0 (and Node 19). [2]
  • Formatter removals / behavior changes: ESLint v9 removes most built-in formatters (leaving only stylish, html, json, json-with-meta). [2]
  • New default warning: unused eslint-disable directives are warned by default (can change noise level in CI). [2]

Why eslint-config-turbo@1.9.3 is a problem specifically

  • eslint-config-turbo@1.x is oriented around legacy extends: ["turbo"] usage (eslintrc). Under ESLint v9’s default flat-config behavior, that eslintrc config may simply never be loaded unless you force eslintrc mode via ESLINT_USE_FLAT_CONFIG=false. [1]

What to do

  • If you want ESLint v9 (recommended): upgrade eslint-config-turbo to a version that supports ESLint v9 flat config. Turborepo 2.4 introduced ESLint v9 support in eslint-config-turbo/eslint-plugin-turbo, and the flat-config usage is:
    import turboConfig from "eslint-config-turbo/flat"; export default [...turboConfig] [3][4]
  • If you must stay on eslint-config-turbo@1.9.3: keep using .eslintrc.* by setting ESLINT_USE_FLAT_CONFIG=false when running ESLint v9. [1]

Sources: ESLint flat-config rollout plan / how to keep eslintrc in v9 [1]; ESLint v9 release notes (Node support, formatters, unused-disable warnings) [2]; Turborepo 2.4 ESLint v9 support announcement [3]; Turborepo eslint-config-turbo flat-config docs [4].

[1] https://eslint.org/blog/2023/10/flat-config-rollout-plans/
[2] https://eslint.org/blog/2024/04/eslint-v9.0.0-released/
[3] https://v2-7-5-canary-3.turborepo.com/blog/turbo-2-4
[4] https://turborepo.ai/docs/reference/eslint-config-turbo


🏁 Script executed:

# Check if there's any eslint version pinning in root or CI configs
find . -name ".npmrc" -o -name ".yarnrc*" -o -name "pnpm-workspace.yaml" | xargs cat 2>/dev/null | head -50

Repository: raystack/frontier

Length of output: 225


🏁 Script executed:

# Check if any scripts set ESLINT_USE_FLAT_CONFIG environment variable
rg "ESLINT_USE_FLAT_CONFIG"

Repository: raystack/frontier

Length of output: 43


🏁 Script executed:

# Check package-lock or pnpm-lock for actual resolved versions
find . -name "pnpm-lock.yaml" -exec head -100 {} \;

Repository: raystack/frontier

Length of output: 7383


ESLint v9.26.0 breaks workspace linting with current configuration.

This upgrade introduces breaking changes that will prevent linting from working:

  1. Config format incompatibility: ESLint v9 defaults to flat config and will not auto-detect .eslintrc.* files. The workspace uses .eslintrc.js/.eslintrc.cjs without setting ESLINT_USE_FLAT_CONFIG=false to force legacy mode.

  2. Extended config incompatibility:

    • eslint-config-next@^13.4.1 only supports ESLint ^7.23 || ^8 (needs v15+ for ESLint v9)
    • eslint-config-turbo@^1.9.3 lacks ESLint v9 flat config support (needs Turborepo 2.4+ version)

Required action (choose one):

  • Downgrade: Change to "eslint": "^8.57.0" until configs are upgraded
  • Upgrade path: Update @raystack/eslint-config dependencies (eslint-config-next to v15+, eslint-config-turbo to v2.4+) and migrate to flat config using npx @eslint/migrate-config``
🤖 Prompt for AI Agents
In `@web/package.json` at line 26, Update the "eslint" dependency in package.json
from "^9.26.0" to a compatible version (e.g., "^8.57.0") to restore legacy
.eslintrc.* behavior; after changing the "eslint" entry, run your package
manager to update lockfiles (npm/yarn/pnpm install) and verify workspace linting
passes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants