Upgrade ESLint to 9.39.4 and update configurations across descriptors - #7780
Merged
Conversation
Bumps ESLint from 8.57.1 (EOL) to 9.39.4 (maintenance LTS). Swaps unmaintained eslint-config-airbnb for eslint-config-airbnb-extended 3.1.0 and eslint-config-standard for neostandard 0.13.0 (both are the community-blessed v9-compatible successors). Removes the --no-eslintrc and --ignore-path flags that v9 deleted. Adds @eslint/eslintrc 3.3.5 to bridge legacy .eslintrc.* configs via FlatCompat. BREAKING CHANGE: end-users extending 'airbnb' must rename to 'airbnb-extended'; end-users extending 'standard' must rename to 'neostandard'.
Mirrors the javascript descriptor changes from the previous commit: ESLint 8.57.1 -> 9.39.4, airbnb -> airbnb-extended 3.1.0, standard -> neostandard 0.13.0, eslint-plugin-n -> 18.0.1, eslint-plugin-promise -> 7.3.0. Keeps the TypeScript-specific plugins (@typescript-eslint/*, prettier, prettyjson) intact.
Bumps ESLint 8.57.1 -> 9.39.4 and adds @eslint/eslintrc 3.3.5 for FlatCompat. Removes leftover .eslintignore / --ignore-path knobs that no longer exist in ESLint 9. JSX descriptor has no airbnb or standard configs to swap, so the dependency list is otherwise unchanged.
Mirrors the pattern from javascript, typescript, and jsx descriptors: ESLint 8.57.1 -> 9.39.4, airbnb -> airbnb-extended 3.1.0, adds @eslint/eslintrc 3.3.5 FlatCompat bridge. Removes --no-eslintrc, --ignore-path, and ignore_file_name. Keeps TSX-specific packages (typescript, @typescript-eslint/*, prettier, prettyjson) intact.
…bug) Fixes a latent peer-dep mismatch: eslint-plugin-jsonc@3.1.2 declares peer eslint>=9.38.0 but the image shipped eslint@8.57.1. Bumping ESLint to 9.39.4 resolves the mismatch and adds @eslint/eslintrc 3.3.5 for FlatCompat. Removes --no-eslintrc and --ignore-path knobs deleted by ESLint 9. The linter itself remains disabled by default per the existing disabled_reason (upstream eslint-plugin-jsonc issue oxsecurity#328).
ESLint 9 removed --no-eslintrc and --ignore-path. Strip --no-eslintrc defensively if it leaks in from upstream cli_config_extra_args or end-user MEGALINTER variables that target the v8 CLI. Keeps the existing --ignore-path branch harmless for forward compatibility.
ESLint 9 uses flat config by default. The js and ts fixtures keep their existing .eslintrc.json files and add an eslint.config.js that bridges to them via @eslint/eslintrc's FlatCompat shim, exercising the same backward-compat path end-users will rely on. The tsx fixture gains a minimal flat config from scratch (react + @typescript-eslint recommended).
Replaces the from-scratch flat config for the tsx test fixture with a FlatCompat bridge to its existing .eslintrc.json, matching the javascript and typescript fixtures. Keeps the rule set identical across the v8/v9 transition and exercises the same backward-compat path end-users will rely on.
@eslint/eslintrc v3 FlatCompat does not bundle the eslint:recommended config (to avoid a circular dependency on eslint). Pass it explicitly via recommendedConfig/allConfig from @eslint/js, which is a transitive dep of eslint@9 and available at NODE_PATH=/node-deps/node_modules. Without this, all three fixtures (js/ts/tsx) crash with 'TypeError: Missing parameter recommendedConfig' when their .eslintrc.json extends eslint:recommended.
opravil-jan
requested review from
Kurt-von-Laven,
bdovaz,
echoix and
nvuillam
as code owners
May 14, 2026 07:00
Member
|
@opravil-jan if it works (CI will tell ^^), that would be the best "first PR" ever on MegaLinter, thanks a lot :) |
ESLint 9 upgrade introduces neostandard@0.13.0 as the v9-compatible successor to eslint-config-standard. cspell's repository scan flags the word as unknown in 5 files (descriptors, Dockerfiles, root Dockerfile).
Contributor
Author
|
Shoul I fix the problem with go version also? |
Member
|
@opravil-jan i solved it in another PR, it won't be blocking now :) |
nvuillam
approved these changes
May 15, 2026
nvuillam
left a comment
Member
There was a problem hiding this comment.
The last test class should pass after i update so i force-merge :)
Thanks a lot for your PR :)
lumarel
pushed a commit
to lumarel/oxsecurity-megalinter
that referenced
this pull request
May 18, 2026
…oxsecurity#7780) * feat(eslint)!: bump ESLint to 9.39.4 in javascript descriptor Bumps ESLint from 8.57.1 (EOL) to 9.39.4 (maintenance LTS). Swaps unmaintained eslint-config-airbnb for eslint-config-airbnb-extended 3.1.0 and eslint-config-standard for neostandard 0.13.0 (both are the community-blessed v9-compatible successors). Removes the --no-eslintrc and --ignore-path flags that v9 deleted. Adds @eslint/eslintrc 3.3.5 to bridge legacy .eslintrc.* configs via FlatCompat. BREAKING CHANGE: end-users extending 'airbnb' must rename to 'airbnb-extended'; end-users extending 'standard' must rename to 'neostandard'. * feat(eslint)!: bump ESLint to 9.39.4 in typescript descriptor Mirrors the javascript descriptor changes from the previous commit: ESLint 8.57.1 -> 9.39.4, airbnb -> airbnb-extended 3.1.0, standard -> neostandard 0.13.0, eslint-plugin-n -> 18.0.1, eslint-plugin-promise -> 7.3.0. Keeps the TypeScript-specific plugins (@typescript-eslint/*, prettier, prettyjson) intact. * feat(eslint)!: bump ESLint to 9.39.4 in jsx descriptor Bumps ESLint 8.57.1 -> 9.39.4 and adds @eslint/eslintrc 3.3.5 for FlatCompat. Removes leftover .eslintignore / --ignore-path knobs that no longer exist in ESLint 9. JSX descriptor has no airbnb or standard configs to swap, so the dependency list is otherwise unchanged. * feat(eslint)!: bump ESLint to 9.39.4 in tsx descriptor Mirrors the pattern from javascript, typescript, and jsx descriptors: ESLint 8.57.1 -> 9.39.4, airbnb -> airbnb-extended 3.1.0, adds @eslint/eslintrc 3.3.5 FlatCompat bridge. Removes --no-eslintrc, --ignore-path, and ignore_file_name. Keeps TSX-specific packages (typescript, @typescript-eslint/*, prettier, prettyjson) intact. * fix(eslint)!: bump ESLint to 9.39.4 in json descriptor (jsonc latent bug) Fixes a latent peer-dep mismatch: eslint-plugin-jsonc@3.1.2 declares peer eslint>=9.38.0 but the image shipped eslint@8.57.1. Bumping ESLint to 9.39.4 resolves the mismatch and adds @eslint/eslintrc 3.3.5 for FlatCompat. Removes --no-eslintrc and --ignore-path knobs deleted by ESLint 9. The linter itself remains disabled by default per the existing disabled_reason (upstream eslint-plugin-jsonc issue oxsecurity#328). * feat(eslint): strip removed v8 CLI flags in EslintLinter ESLint 9 removed --no-eslintrc and --ignore-path. Strip --no-eslintrc defensively if it leaks in from upstream cli_config_extra_args or end-user MEGALINTER variables that target the v8 CLI. Keeps the existing --ignore-path branch harmless for forward compatibility. * test(eslint): add flat eslint.config.js to js/ts/tsx fixtures ESLint 9 uses flat config by default. The js and ts fixtures keep their existing .eslintrc.json files and add an eslint.config.js that bridges to them via @eslint/eslintrc's FlatCompat shim, exercising the same backward-compat path end-users will rely on. The tsx fixture gains a minimal flat config from scratch (react + @typescript-eslint recommended). * test(eslint): use FlatCompat bridge for tsx fixture too Replaces the from-scratch flat config for the tsx test fixture with a FlatCompat bridge to its existing .eslintrc.json, matching the javascript and typescript fixtures. Keeps the rule set identical across the v8/v9 transition and exercises the same backward-compat path end-users will rely on. * chore: regenerate Dockerfiles and test classes for ESLint 9 * docs(changelog): note ESLint 9 upgrade and jsonc latent bug fix * fix(eslint): provide recommendedConfig to FlatCompat in test fixtures @eslint/eslintrc v3 FlatCompat does not bundle the eslint:recommended config (to avoid a circular dependency on eslint). Pass it explicitly via recommendedConfig/allConfig from @eslint/js, which is a transitive dep of eslint@9 and available at NODE_PATH=/node-deps/node_modules. Without this, all three fixtures (js/ts/tsx) crash with 'TypeError: Missing parameter recommendedConfig' when their .eslintrc.json extends eslint:recommended. * chore: regenerate auto-tracked changelog entries and helps/versions JSON * chore(cspell): add 'neostandard' to dictionary ESLint 9 upgrade introduces neostandard@0.13.0 as the v9-compatible successor to eslint-config-standard. cspell's repository scan flags the word as unknown in 5 files (descriptors, Dockerfiles, root Dockerfile). * Fix test case * Last fix :) --------- Co-authored-by: Nicolas Vuillamy <nicolas.vuillamy@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Proposed Changes
8.57.1→9.39.4inJAVASCRIPT_ES,TYPESCRIPT_ES,JSX_ESLINT,TSX_ESLINT, andJSON_ESLINT_PLUGIN_JSONC. Added@eslint/eslintrc@3.3.5to bridge legacy.eslintrc.*configs viaFlatCompat. Detectseslint.config.{js,mjs,cjs,ts}first inactive_only_if_file_found, with legacy.eslintrc.*filenames preserved for fallback. Removed the--no-eslintrcand--ignore-pathCLIflags (deleted in ESLint 9) from both descriptors and
EslintLinter.build_lint_command.eslint-config-airbnb@19.0.4→eslint-config-airbnb-extended@3.1.0,eslint-config-standard@17.1.0→neostandard@0.13.0. Neither original package ever shipped ESLint 9 support; the successors are the community-maintained continuations. End-users extending the legacy names must renameextends: ["airbnb"]→extends: ["airbnb-extended"]andextends: ["standard"]→extends: ["neostandard"].eslint-plugin-n16.6.2→18.0.1,eslint-plugin-promise6.6.0→7.3.0.JSON_ESLINT_PLUGIN_JSONC:eslint-plugin-jsonc@3.1.2declares peereslint>=9.38.0while the image shippedeslint@8.57.1. The upgrade resolves the mismatch; the linter itself remains default-disabled per the existingdisabled_reason(upstreameslint-plugin-jsoncissue Build errors: Python invocation, YAML version #328)..automation/test/{javascript,typescript,tsx}/eslint.config.js) using@eslint/eslintrc'sFlatCompatbridge to the existing.eslintrc.jsonfiles — exercises the same backward-compat code path end-users will rely on, while keeping the legacy fixtures intact. Required passingrecommendedConfig/allConfigfrom@eslint/js(transitive dep ofeslint@9, available viaNODE_PATH=/node-deps/node_modules).All four affected linters tested locally with
TEST_KEYWORDS=<linter>_test: 6 passed / 1 skipped per linter (javascript_es,typescript_es,jsx_eslint,tsx_eslint).json_eslint_plugin_jsoncimage smoke-builds clean (linter remains default-disabled).Readiness Checklist
Author/Contributor
Reviewing Maintainer
breakingif this is a large fundamental changeautomation,bug,documentation,enhancement,infrastructure, orperformance