Skip to content

Instantly share code, notes, and snippets.

@laymonage
Last active February 5, 2026 17:42
Show Gist options
  • Select an option

  • Save laymonage/aba29ed3b18cb3f9bb31b8626764e946 to your computer and use it in GitHub Desktop.

Select an option

Save laymonage/aba29ed3b18cb3f9bb31b8626764e946 to your computer and use it in GitHub Desktop.
eslint-config-wagtail migration

Rules

For each item in this table, do:

  • Check the documentation page from the package that defines the rule (there's a link)
  • If it's enabled by default via recommended rules that we're already using, mark "Copied" as ❌ and add a note about it being enabled by default
  • If it's not enabled by default, review if it makes sense for us to adopt it (based on usefulness and relevance with modern practices)
  • If it makes sense, copy the rule to index.js and mark "Copied" as ✅. Try to retain the "Config" value, but if any config value already matches the default for that rule, then leave it be
  • If the "Config" says "see Config", don't bother following the link for the config and just enable the rule, but add a note about this like "review config"
  • If it doesn't make sense to enable this, mark "Copied" as ❌ and add a note on why it's not enabled
  • When in doubt, lean towards enabling the rule, but write a note on further considerations
Rule Severity Config Copied Notes
array-callback-return error {"allowImplicit":true,"checkForEach":false,"allowVoid":false} checkForEach and allowVoid values already match defaults
arrow-body-style error "as-needed", {"requireReturnForObjectLiteral":false} requireReturnForObjectLiteral value already matches default
block-scoped-var error
camelcase error see Config
consistent-return error
constructor-super error Included in js/recommended, enforced by TypeScript by default
default-case error {"commentPattern":"^no default$"}
default-case-last error
default-param-last error
dot-notation error {"allowKeywords":true,"allowPattern":""} allowKeywords (and allowPattern?) already match defaults
eqeqeq error "always", {"null":"ignore"}
for-direction error Included in js/recommended
func-names warn
getter-return error {"allowImplicit":true} Added to index.js
global-require error Deprecated in favor of no-require-imports or import-x/no-commonjs
grouped-accessor-pairs error Not critical, skipping to reduce noise
guard-for-in error Classic Airbnb rule, good to have
id-length warn {"min":2,"exceptions":["x","y","e","i","j","k","d","n","_","$"]} Already in index.js
import/export error Enabled by default in import-x/recommended (as import-x/export)
import/extensions error "ignorePackages", {"js":"never","mjs":"never","jsx":"never"} Often handled by TS/bundlers, skipping for now
import/first error Useful for order
import/named error Disabled in import-x/typescript config as TS handles it
import/newline-after-import error Stylistic, nice to have
import/no-absolute-path error Good practice
import/no-amd error Good practice
import/no-cycle error see Config Expensive rule, can be strict. Skip for now unless requested
import/no-duplicates error Enabled by default in import-x/recommended (as import-x/no-duplicates)
import/no-dynamic-require error Maybe covered by no-require-imports? Skipping for now
import/no-extraneous-dependencies error see Config Very useful Airbnb rule
import/no-import-module-exports error {"exceptions":[]} Specific edge case, skip
import/no-mutable-exports error Good practice
import/no-named-as-default error Enabled by default in import-x/recommended (as import-x/no-named-as-default)
import/no-named-as-default-member error Enabled by default in import-x/recommended (as import-x/no-named-as-default-member)
import/no-named-default error Good style
import/no-relative-packages error Monorepo specific usually, skip for general config
import/no-self-import error Likely caught by other tools/TS, but okay to skip
import/no-unresolved error {"commonjs":true,"caseSensitive":true,"caseSensitiveStrict":false} Enabled by default in import-x/recommended (as import-x/no-unresolved)
import/no-useless-path-segments error {"commonjs":true} Cleaner imports
import/no-webpack-loader-syntax error Good practice
import/order error see Config Useful formatting rule
import/prefer-default-export error Controversial Airbnb rule, often annoying. Skipping.
jsx-a11y/alt-text error see Config Enabled by default in jsx-a11y/recommended
jsx-a11y/anchor-has-content error {"components":[]} Enabled by default in jsx-a11y/recommended
jsx-a11y/anchor-is-valid error see Config Enabled by default in jsx-a11y/recommended
jsx-a11y/aria-activedescendant-has-tabindex error Enabled by default in jsx-a11y/recommended
jsx-a11y/aria-props error Enabled by default in jsx-a11y/recommended
jsx-a11y/aria-proptypes error Enabled by default in jsx-a11y/recommended
jsx-a11y/aria-role error {"ignoreNonDOM":false} Enabled by default in jsx-a11y/recommended
jsx-a11y/aria-unsupported-elements error Enabled by default in jsx-a11y/recommended
jsx-a11y/click-events-have-key-events error Enabled by default in jsx-a11y/recommended
jsx-a11y/control-has-associated-label error see Config Not enabled by default. Airbnb had it. Enabling.
jsx-a11y/heading-has-content error {"components":[""]} Enabled by default in jsx-a11y/recommended
jsx-a11y/html-has-lang error Enabled by default in jsx-a11y/recommended
jsx-a11y/iframe-has-title error Enabled by default in jsx-a11y/recommended
jsx-a11y/img-redundant-alt error Enabled by default in jsx-a11y/recommended
jsx-a11y/interactive-supports-focus error Enabled by default in jsx-a11y/recommended
jsx-a11y/label-has-associated-control error see Config Enabled by default in jsx-a11y/recommended
jsx-a11y/lang error Not in effective config (it seems). Adding.
jsx-a11y/media-has-caption error {"audio":[],"video":[],"track":[]} Enabled by default in jsx-a11y/recommended
jsx-a11y/mouse-events-have-key-events error Enabled by default in jsx-a11y/recommended
jsx-a11y/no-access-key error Enabled by default in jsx-a11y/recommended
jsx-a11y/no-autofocus error {"ignoreNonDOM":true} Enabled by default in jsx-a11y/recommended
jsx-a11y/no-distracting-elements error {"elements":["marquee","blink"]} Enabled by default in jsx-a11y/recommended
jsx-a11y/no-interactive-element-to-noninteractive-role error {"tr":["none","presentation"]} Enabled by default in jsx-a11y/recommended
jsx-a11y/no-noninteractive-element-interactions error see Config Enabled by default in jsx-a11y/recommended
jsx-a11y/no-noninteractive-element-to-interactive-role error see Config Enabled by default in jsx-a11y/recommended
jsx-a11y/no-noninteractive-tabindex error {"tags":[],"roles":["tabpanel"]} Enabled by default in jsx-a11y/recommended
jsx-a11y/no-redundant-roles error Enabled by default in jsx-a11y/recommended
jsx-a11y/no-static-element-interactions error see Config Enabled by default in jsx-a11y/recommended
jsx-a11y/role-has-required-aria-props error Enabled by default in jsx-a11y/recommended
jsx-a11y/role-supports-aria-props error Enabled by default in jsx-a11y/recommended
jsx-a11y/scope error Enabled by default in jsx-a11y/recommended
jsx-a11y/tabindex-no-positive error Enabled by default in jsx-a11y/recommended
lines-around-directive error {"before":"always","after":"always"} Deprecated rule. Replaced by padding-line-between-statements or ignore.
lines-between-class-members error "always", {"exceptAfterSingleLine":false} Stylistic, good for readability.
new-cap error see Config Good practice.
no-alert warn Good practice.
no-array-constructor error Handled by typescript-eslint (and we have it enabled)
no-async-promise-executor error Enabled by default in js/recommended
no-await-in-loop error Potential performance issue, good to flag.
no-bitwise error Rarely needed in web apps, intentional toggle.
no-buffer-constructor error Deprecated/Node specific. Less relevant for frontend config?
no-caller error Good practice.
no-case-declarations error Enabled by default in js/recommended
no-class-assign error Enabled by default in js/recommended
no-compare-neg-zero error Enabled by default in js/recommended
no-cond-assign error "always" Default is except-parens. Airbnb forced always. Keeping.
no-console warn Common rule.
no-const-assign error Enabled by default in js/recommended
no-constant-binary-expression error Already in index.js
no-constant-condition warn Recommended is error. Keeping warn.
no-constructor-return error Good practice.
no-continue error Airbnb style, often annoying. Skipping.
no-control-regex error Enabled by default in js/recommended
no-debugger error Enabled by default in js/recommended
no-delete-var error Enabled by default in js/recommended
no-dupe-args error Enabled by default in js/recommended
no-dupe-class-members error Enabled by default in js/recommended (and ts-eslint)
no-dupe-else-if error Enabled by default in js/recommended
no-dupe-keys error Enabled by default in js/recommended
no-duplicate-case error Enabled by default in js/recommended
no-else-return error {"allowElseIf":false} Stylistic, good for readability.
no-empty error Enabled by default in js/recommended
no-empty-character-class error Enabled by default in js/recommended
no-empty-function error {"allow":["arrowFunctions","functions","methods"]} Handled by typescript-eslint
no-empty-pattern error Enabled by default in js/recommended
no-eval error Good practice.
no-ex-assign error Enabled by default in js/recommended
no-extend-native error Good practice.
no-extra-bind error Good practice.
no-extra-boolean-cast error Enabled by default in js/recommended
no-extra-label error Good practice.
no-fallthrough error Enabled by default in js/recommended
no-func-assign error Enabled by default in js/recommended
no-global-assign error {"exceptions":[]} Enabled by default in js/recommended
no-implied-eval error Good practice.
no-import-assign error Enabled by default in js/recommended
no-inner-declarations error Enabled by default in js/recommended
no-invalid-regexp error Enabled by default in js/recommended
no-irregular-whitespace error Enabled by default in js/recommended
no-iterator error Good practice.
no-label-var error Good practice.
no-labels error {"allowLoop":false,"allowSwitch":false} Good practice.
no-lone-blocks error Good practice.
no-lonely-if error Stylistic.
no-loop-func error Good practice.
no-loss-of-precision error Enabled by default in js/recommended
no-misleading-character-class error Enabled by default in js/recommended
no-multi-assign error Stylistic.
no-multi-str error Good practice.
no-nested-ternary error Stylistic.
no-new warn Already in index.js
no-new-func error Good practice.
no-new-object error Good practice.
no-new-require error Replaced by no-require-imports?
no-new-symbol error Enabled by default in js/recommended (as no-new-native-nonconstructor? no, wait. no-new-symbol is deprecated in favor of no-new-native-nonconstructor.
no-new-wrappers error Good practice.
no-nonoctal-decimal-escape error Enabled by default in js/recommended
no-obj-calls error Enabled by default in js/recommended
no-octal error Enabled by default in js/recommended
no-octal-escape error Good practice.
no-param-reassign error {"props":false} Already in index.js
no-path-concat error Good practice (Node).
no-plusplus error Airbnb style, opinionated. Skipping.
no-promise-executor-return error Good practice.
no-proto error Good practice.
no-prototype-builtins error Enabled by default in js/recommended
no-redeclare error Enabled by default in js/recommended (and ts-eslint)
no-regex-spaces error Enabled by default in js/recommended
no-restricted-exports error {"restrictedNamedExports":["default","then"]} Good practice to avoid confusing exports.
no-restricted-globals error see Config Airbnb custom list. Good to copy.
no-restricted-properties error see Config Specific to Airbnb. Skipping unless we have our own.
no-restricted-syntax error see Config Already in index.js (customized)
no-return-assign error "always" Good practice.
no-return-await error Deprecated. Using no-return-await logic via return-await? no, it's no-return-await. skipping.
no-script-url error Good practice.
no-self-assign error {"props":true} Enabled by default in js/recommended
no-self-compare error Good practice.
no-sequences error Good practice.
no-setter-return error Enabled by default in js/recommended
no-shadow error Covered by ts-eslint.
no-shadow-restricted-names error Enabled by default in js/recommended
no-sparse-arrays error Enabled by default in js/recommended
no-template-curly-in-string error Good practice.
no-this-before-super error Enabled by default in js/recommended
no-throw-literal error Covered by @typescript-eslint/only-throw-error usually.
no-undef error Enabled by default in js/recommended
no-undef-init error Stylistic.
no-underscore-dangle error see Config Opinionated, often leads to issues. Skipping.
no-unneeded-ternary error {"defaultAssignment":false} Stylistic.
no-unreachable error Enabled by default in js/recommended
no-unreachable-loop error {"ignore":[]} Good practice.
no-unsafe-finally error Enabled by default in js/recommended
no-unsafe-negation error Enabled by default in js/recommended
no-unsafe-optional-chaining error {"disallowArithmeticOperators":true} Enabled by default in js/recommended
no-unused-expressions error see Config Handled by typescript-eslint (and covered by effective config)
no-unused-labels error Enabled by default in js/recommended
no-unused-vars error {"vars":"all","args":"after-used","ignoreRestSiblings":true} Handled by typescript-eslint (and covered by effective config)
no-use-before-define error {"functions":true,"classes":true,"variables":true} Handled by typescript-eslint
no-useless-backreference error Enabled by default in js/recommended
no-useless-catch error Enabled by default in js/recommended
no-useless-computed-key error Stylistic.
no-useless-concat error Good practice.
no-useless-constructor error Handled by typescript-eslint
no-useless-escape error Enabled by default in js/recommended
no-useless-rename error {"ignoreDestructuring":false,"ignoreImport":false,"ignoreExport":false} Stylistic.
no-useless-return error Stylistic.
no-void error We already had update-rules task that added no-void? check index.js. Not there. Maybe skip.
no-with error Enabled by default in js/recommended
object-shorthand error "methods" Prefer always or properties. Airbnb uses always. Good practice.
one-var error "never" Good practice.
operator-assignment error "always" Stylistic.
prefer-arrow-callback error {"allowNamedFunctions":false,"allowUnboundThis":true} Good practice.
prefer-const error {"destructuring":"any","ignoreReadBeforeAssign":true} Good practice.
prefer-destructuring error see Config Airbnb style, but useful.
prefer-exponentiation-operator error Good practice.
prefer-numeric-literals error Good practice.
prefer-object-spread error Good practice.
prefer-promise-reject-errors error {"allowEmptyReject":true} Good practice.
prefer-regex-literals error {"disallowRedundantWrapping":true} Good practice.
prefer-rest-params error Good practice.
prefer-spread error Good practice.
prefer-template error Good practice.
quote-props error "as-needed", {"keywords":false,"unnecessary":true,"numbers":false} Handled by Prettier.
quotes error "single", {"avoidEscape":true} Handled by Prettier.
radix error Good practice.
react-hooks/exhaustive-deps error
react-hooks/rules-of-hooks error
react/button-has-type error {"button":true,"submit":true,"reset":false} Good practice for a11y/forms.
react/default-props-match-prop-types error {"allowRequiredDefaults":false}
react/destructuring-assignment error ["always"] Opinionated. Skipping.
react/display-name error {"ignoreTranspilerName":false} Enabled by default in react/recommended
react/forbid-foreign-prop-types warn {"allowInPropTypes":true}
react/forbid-prop-types error {"forbid":["any","array","object"],"checkContextTypes":true} Outdated/Strict. TypeScript handles types better.
react/function-component-definition error see Config Opinionated style. Skipping.
react/hook-use-state error Opinionated.
react/jsx-boolean-value error ["never",{"always":[]}] Stylistic.
react/jsx-closing-bracket-location error "line-aligned" Handled by Prettier.
react/jsx-closing-tag-location error Handled by Prettier.
react/jsx-curly-brace-presence error {"props":"never","children":"never"} Stylistic.
react/jsx-curly-newline error {"multiline":"consistent","singleline":"consistent"} Handled by Prettier.
react/jsx-curly-spacing error see Config Handled by Prettier.
react/jsx-equals-spacing error ["never"] Handled by Prettier.
react/jsx-filename-extension error {"extensions":[".jsx"]} We use TSX usually, and file extensions are handled by resolution.
react/jsx-first-prop-new-line error "multiline-multiprop" Handled by Prettier.
react/jsx-fragments error "syntax" Stylistic.
react/jsx-indent error [2] Handled by Prettier.
react/jsx-indent-props error [2] Handled by Prettier.
react/jsx-key error Enabled by default in react/recommended
react/jsx-no-comment-textnodes error Enabled by default in react/recommended
react/jsx-no-constructed-context-values error Good practice for performance.
react/jsx-no-duplicate-props error {"ignoreCase":true} Enabled by default in react/recommended
react/jsx-no-script-url error [{"name":"Link","props":["to"]}] Security.
react/jsx-no-target-blank error {"enforceDynamicLinks":"always"} Enabled by default in react/recommended
react/jsx-no-undef error Enabled by default in react/recommended
react/jsx-no-useless-fragment error Good practice.
react/jsx-one-expression-per-line error {"allow":"single-child"} Opinionated and annoying. Skipping.
react/jsx-pascal-case error {"allowAllCaps":true,"ignore":[]} Good practice.
react/jsx-props-no-multi-spaces error Handled by Prettier.
react/jsx-tag-spacing error see Config Handled by Prettier.
react/jsx-uses-react error Obsolete with React 17+ JSX transform.
react/jsx-uses-vars error Enabled by default in react/recommended
react/jsx-wrap-multilines error see Config Handled by Prettier.
react/no-access-state-in-setstate error Good practice.
react/no-array-index-key error Good practice.
react/no-arrow-function-lifecycle error Opinionated. Skipping.
react/no-children-prop error Enabled by default in react/recommended
react/no-danger warn Good practice (warns about dangerouslySetInnerHTML).
react/no-danger-with-children error Enabled by default in react/recommended
react/no-deprecated error Enabled by default in react/recommended
react/no-did-mount-set-state error Enabled by default in react/recommended (or obsolete).
react/no-did-update-set-state error Enabled by default in react/recommended
react/no-direct-mutation-state error Enabled by default in react/recommended
react/no-find-dom-node error Enabled by default in react/recommended
react/no-invalid-html-attribute error ["rel"] Covered by TS.
react/no-is-mounted error Enabled by default in react/recommended
react/no-namespace error Covered by TS presumably.
react/no-redundant-should-component-update error Good practice.
react/no-render-return-value error Enabled by default in react/recommended
react/no-string-refs error Enabled by default in react/recommended
react/no-this-in-sfc error Good practice.
react/no-typos error Good practice.
react/no-unescaped-entities error Enabled by default in react/recommended
react/no-unknown-property error Enabled by default in react/recommended
react/no-unstable-nested-components error
react/no-unsafe error Enabled by default in react/recommended
react/no-unused-class-component-methods error Class components are rare now.
react/no-unused-prop-types error {"customValidators":[],"skipShapeProps":true} TS handles prop validation.
react/no-unused-state error Class components.
react/no-will-update-set-state error Class components.
react/prefer-es6-class error ["always"] Enabled by default in react/recommended (I assume)
react/prefer-exact-props error Flow/PropTypes related mostly.
react/prefer-stateless-function error {"ignorePureComponents":true} We prefer hooks anyway.
[react/prop-types][268] error see Config Enabled by default in react/recommended
[react/react-in-jsx-scope][269] error Enabled by default but turned off by react/jsx-runtime which we use.
[react/require-default-props][270] error {"forbidDefaultForRequired":true} Deprecated in favor of default params for functional components.
[react/require-render-return][271] error Enabled by default in react/recommended
[react/self-closing-comp][272] error Stylistic.
[react/sort-comp][273] error see Config Class component sorting. Skipping.
[react/state-in-constructor][274] error "always" Class components.
[react/static-property-placement][275] error "property assignment" Class components.
[react/style-prop-object][276] error Good practice.
[react/void-dom-elements-no-children][277] error Good practice.
require-yield error Enabled by default in recommended
spaced-comment error see Config Stylistic. Good to have.
strict error "never" Modules are strict by default. never prevents 'use strict'.
symbol-description error Good practice.
template-curly-spacing error "never" Handled by Prettier.
unicode-bom error "never" Good practice.
use-isnan error Enabled by default in recommended
valid-typeof error {"requireStringLiterals":true} Enabled by default in recommended
vars-on-top error Stylistic.
wrap-iife error "outside", {"functionPrototypeMethods":false} Handled by Prettier.
[yoda][268] error "never" Stylistic.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment