Problem/Motivation
ESLint 9.0.0 was released in April 2024, and has a number of breaking changes. ESLint 8 was EOL'ed in October 2024 and is no longer supported. Drupal's coding standards are based on eslint-config-airbnb-base, which has not yet been updated to support ESLint v9.
https://eslint.org/blog/2024/04/eslint-v9.0.0-released/
https://eslint.org/docs/latest/use/migrate-to-9.0.0
ESLint v10 was released in February 2026.
https://eslint.org/blog/2026/02/eslint-v10.0.0-released/
Most notably:
Flat config is now the default configuration format for ESLint and eslintrc is officially deprecated. To continue using a such a legacy configuration file format, we need to set the ESLINT_USE_FLAT_CONFIG environment variable to false.
Proposed resolution
The original proposal here was to update Drupal Core to support ESLint v9 but this is dependent on the airbnb rules being updated first, and the eslint 9 support has still not been added as of May 17, 2026.
The current proposal is to stop depending on Airbnb and use ESLint 9 with the standard rules, as this eliminates an additional third party dependency and should make it easier to update to ESLint 10 later.
Remaining tasks
TBC
Release notes snippet
TBC
| Comment | File | Size | Author |
|---|---|---|---|
| #19 | estlint-config.txt | 3.67 KB | smustgrave |
Issue fork drupal-3440225
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
- 3440225-followup
changes, plain diff MR !16991
- 3440225-update-to-eslint-9
changes, plain diff MR !13889
Comments
Comment #2
nicrodgersComment #3
cilefen commentedI've been updating our non-Drupal projects to the new config file format. It's a bit different, but Drupal's configs are not enormous so it should not be very difficult. I don't think backward compatibility will be a problem because eslint 8 supports the config format.
Comment #4
neclimdulThe new config format is kind of confusing but it looks like it might be useful.
Playing around with the compat layer and eslint-config-drupal I found a couple things to keep an eye one that are kinda blocking.
Seems like things are still catching up in the community so don't know if the other plugins need changes to support v9 but that could be a problem.
Comment #5
spokjeComment #6
longwaveDoesn't seem like there's much we can do here until the upstream packages are all compatible too.
Comment #7
woldtwerk commentedis airbnb config still the preferred config?
I always found it quite cumbersome. Had much more joy without airbnb and prettier and instead using antfu's config which includes eslint stylistic.
Comment #8
longwave@woldtwerk if you want to propose changing our JS standards for something else please open an issue in https://www.drupal.org/project/issues/coding_standards with some more details as to what the change is and why you think it is better.
The Airbnb standards were chosen some years ago and the JS community moves fast so it is not surprising to me that better options have become available, and we can definitely consider changing if there are advantages to doing so.
Comment #9
xjmComment #10
neclimdulGuess eslint is EOLing this weekend(tomorrow)?
https://eslint.org/blog/2024/09/eslint-v8-eol-version-support/
plugin-import rushed an update out this week.
No update on airbnb and comments asking for an update have just been marked as spam...
Comment #11
spokjeComment #12
longwaveIt seems like there is little to no movement on supporting ESLint 9 upstream in
eslint-config-airbnb-base. Is it time we moved on to a different JavaScript standard?Comment #13
nicrodgersupdated the issue summary
Comment #14
tom kondaI don't try yet but find eslint-config-airbnb-extended which supporting ESLint flat config.
IMO, it is worth trying.
Comment #15
tom kondaThe valid-jsdoc rule was removed from ESLint 9.
#3269001: Replace valid-jsdoc rule with eslint-plugin-jsdoc for eslint is blocking this issue.
Comment #16
baluertlFix annoying style ignorance in IS.
Comment #17
smustgrave commentedExperienced this on a contrib theme where I'm trying to mimic core standards and noticed couldn't update to eslint 9. And noticed eslint-config-airbnb-base still hasn't done a release in 4 years.
eslint-config-airbnb-extended looks nice just not sure how to get it working with existing eslint-json config. I converted it to a .mjs file and tried eslint-config-airbnb-extended auto create .mjs file just merging the two has been tricky. But that's a me problem.
I'm +1 for moving away from eslint-config-airbnb-base
Comment #18
konfuzed commentedSeems even more relevant as ESLint has published their v10 roadmap and looks to have that out early 2026. v10 also removes the option to use an .eslintrc on top of the other security issues being past EOL involves for ESLint v8 in core.
https://eslint.org/blog/2025/10/whats-coming-in-eslint-10.0.0/
Comment #19
smustgrave commentedNot to be used by core but uploading a txt file of the mjs file I used on a contrib theme using eslint-config-airbnb-extended
ChatGPT did help some.
Comment #20
nishargshah commentedHey @everyone,
I heard from the chat that some of you are having issues with the `eslint-config-airbnb-extended` setup. I’d be happy to help out if needed.
Could someone please share the repository URL so I can take a look and raise a PR with the new config?
Comment #21
kmonty@nishargshah The repository is here: https://git.drupalcode.org/project/drupal/-/tree/11.x
You'll want to create an issue fork. The guide for doing so is here: https://www.drupal.org/community/contributor-guide/task/create-a-merge-r...
Comment #22
nishargshah commentedShould I raise a PR here https://github.com/drupal/core? and after that some of your team members can merge it in drupal main repo, works?
Comment #23
smustgrave commentedWould say before going to through the work we need the thumbs up if this is the path to go.
Comment #24
longwaveThis is purely a frontend decision. Wondering if we want to stick with ESLint or move to something newer like Biome; the ESLint 8 to 9 upgrade looks overly complicated to me with the new config format.
Comment #25
nishargshah commentedOkay, waiting for your go ahed, its around 2 hours of work, so not a big deal, let me know once you get all the approvals so I will raise a PR for the same.
Comment #26
longwaveDiscussed with @justafish and @nod_ who have no strong preference and have not used Biome, but suggested that if we stay with ESLint 9 then we could just use the standard style instead of the airbnb rules.
As that seems to be the simplest move forward here then let's try that to start with, if it turns out standard isn't enough for us for some reason then we could consider airbnb-extended.
Comment #28
longwaveMR!13889 upgrades to ESLint v9, trying to keep the config intact as much as possible.
yarn lint:core-js-passingpasses with no errors.yarn lint:core-jshas 5574 problems (82 errors, 5492 warnings) - compared to 1599 problems (156 errors, 1443 warnings) on ESLint v8. The jsdoc and no-jquery plugins seem a lot stricter than before, unsure if they need reconfiguring or if we should genuinely look to fix all those issues.I've removed
yarn lint:yamlas I'm not sure it was much use on its own, and I can't figure out how to get ESLint to only read YAML files with the existing config, unless I make a separate flat config just for that.We need to decide what to do about these files scaffolded in composer.json:
I suspect that nobody uses them; CSS Lint is obsolete, and #2876298: Remove scaffolded csslint and eslint config is stale, I think the same is likely for the ESLint config.
Comment #29
longwaveyarn lint:core-js-statson ESLint v9:vs
yarn lint:core-js-statson ESLint v8:Comment #30
smustgrave commentedThis looks really good!
Comment #31
longwave@jonathan1055 pointed out that contrib testing relies on some of this config: https://git.drupalcode.org/project/gitlab_templates/-/blob/main/includes...
We will have to figure out what to do there as well to help them out.
Given the scale of this change and the fact there is no way to provide BC I think this might have to be for Drupal 12 only.
Comment #32
fjgarlin commentedCreated #3559584: Move some scaffolding files for linting jobs from core to the assets folder for Contrib CI.
Comment #33
smustgrave commentedShould this be postponed on https://www.drupal.org/project/drupal/issues/2876298
Comment #34
longwaveWould like to leave it at NR in case anyone who has used ESLint 9 can help out with reviews, I don't think either issue can really land until 12.x opens.
Comment #35
smustgrave commentedComment #36
nishargshah commentedHey @longwave, have you decided whether to go with the standard setup or `eslint-extended`?
I will be available over Christmas, so I would be happy to contribute if your team is interested. Let me know what you think :)
Comment #37
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It no longer applies to Drupal core. Therefore, this issue status is now "Needs work".
This does not mean that the patch necessarily needs to be re-rolled or the MR rebased. Read the Issue Summary, the issue tags and the latest discussion here to determine what needs to be done.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.
Comment #38
nicrodgersSince updating to 11.3, core now seems to accidentally need Eslint 9 even though it doesn't work yet. See https://www.drupal.org/project/drupal/issues/3269001#comment-16391313
Comment #40
tom kondaESLint has been released v10 at Feb 6th.
https://eslint.org/blog/2026/02/eslint-v10.0.0-released/
Should we use newer version?
Comment #41
longwaveWe should try to upgrade if we can, if it looks tricky or dependencies are not ready maybe we just go to ESLint 9 first.
Comment #42
tom kondaOK.
eslint-plugin-import isn't satisfy with ESLint v10 at this point, need to go ESLint 9.
https://github.com/import-js/eslint-plugin-import/issues/3227
Comment #43
ptmkenny commentedDid a quick update of the issue summary to make it clear that:
1. ESLint 10 has been released.
2. The plan for now is to move to ESLint 9 with standard rules.
Comment #44
longwavehttps://github.com/import-js/eslint-plugin-import/issues/3227 is closed fixed and there should be a new release of
eslint-plugin-importsoon.Comment #45
catchI think we should try to do this for Drupal 12.0.0 if possible.
Comment #46
longwaveBumped eslint to the latest v9 and most plugins to their latest version; upgrading eslint-plugin-yml causes a crash so I've left that alone for now.
yarn lint:core-js-passingpasses on my machine and on CI.I think we could then try to go to eslint v10 in a followup when eslint-plugin-import is ready.
Comment #47
smustgrave commentedI'm going to mark. I've been using a similar setup on a contrib theme for months now without issue. Think it's a good improvement from before.
Comment #48
catchOne small issue on the MR. I'm not qualified to review the actual eslint config but it looks fine very superficially.
Comment #49
longwaveRemoved the dupe, think that is ok to self-RTBC.
Comment #50
longwaveMaybe we should swap
eslint-plugin-importforeslint-plugin-import-xwhich already supports ESLint 10 and seems to have moved on (it supportsexportsfor example, which I think would allow us to remove some ignores). One for a followup after this.Comment #51
godotislateWith the change to the standard rules, are there any updates needed for the Drupal JS coding standards per #8?
Comment #52
neclimdulYeah, seems like https://project.pages.drupalcode.org/coding_standards/javascript/coding/ should at least be updated to not reference airbnb since that's being dropped here.
Also, while this looks good for core, should probably update ls core/assets/scaffold/files/eslint* too.
Comment #53
longwave@neclimdul I propose removing the scaffolded eslint config entirely as I don't see the point in it: #2876298: Remove scaffolded csslint and eslint config
Comment #54
quietone commentedComment #55
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It no longer applies to Drupal core. Therefore, this issue status is now "Needs work".
This does not mean that the patch necessarily needs to be re-rolled or the MR rebased. Read the Issue Summary, the issue tags and the latest discussion here to determine what needs to be done.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.
Comment #57
longwaveBumping to critical because ESLint 8 is EOL.
Comment #58
longwaveRebased, back to RTBC.
Comment #60
godotislateTest fail is a known random. Committed a8b181e and pushed to main. Thanks!
Tagging for documentation updates per #52 and maybe also for the yaml command removal per #28.
D12 only per #31.
Comment #62
quietone commentedLet's go with a follow up issue to get the Coding standards updated.
Comment #63
quietone commentedAlthough stale there is an issue for #28 and there is now a follow up in Coding Standards, #3620782: Remove references to airbnb. I think that covers the follow ups.
Comment #64
jonathan1055 commentedIs this just for Core version 12, or is there going to be any backport to 11.x? I'm asking so that in Gitlab Templates we can plan any changes needed to support the contrib eslint job. Currently it uses the core config files, but we do not run linting/coding standards jobs using any core version other than the latest stable major (currently 11.4.5 but will become 11.5.0 when that is released)
Comment #65
longwaveTo me this is too disruptive to backport further and we should stay on the older version in Drupal 11.
Comment #66
nod_I should undust the JS packages and ship the lint config as a npm package
Comment #67
jonathan1055 commentedOK that's fine, and that's what I expected too. I just wanted to know the plan.
Comment #70
amateescu commentedThis broke
core/scripts/dev/commit-code-check.sh, opened a quick followup MR.Comment #72
longwaveCommitted from NR as this broke committer workflow, thanks!
Comment #74
amateescu commentedGuess how I found out :)))
Comment #76
gábor hojtsy@longwave bumped this to critical because ESLint 8 was EOL. But as of a month and a half ago ESLint 9 is also EOL!!
#3449808: [12.x] [meta] Requirements for tagging 12.0.0-beta1 only listed an ESLint 9 upgrade required. #3625189: Update to ESLint 10, as ESLint 9 has been end of life since 6 August 2026 is open to discuss the v10 upgrade.