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