Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable react-hooks/exhaustive-deps eslint rules #24914

Merged
merged 5 commits into from
Feb 9, 2023

Conversation

kevin940726
Copy link
Member

Description

As suggested in the Rules of hooks guide in the official doc, it's highly recommended to enable the react-hooks/exhaustive-deps eslint rules to prevent us from writing fragile code.

There are currently a lot of violations to the rules, this PR doesn't intend to fix them now, but only emit warnings to prevent breaking backward compatibility.

I have to also upgrade eslint and eslint-plugin-react-hooks to support optional chaining.

How has this been tested?

Run the npm run lint-js command.

Types of changes

New feature

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@github-actions
Copy link

github-actions bot commented Aug 29, 2020

Size Change: +7.61 kB (+1%)

Total Size: 1.33 MB

Filename Size Change
build/block-editor/index.min.js 193 kB +2 B (0%)
build/block-library/index.min.js 200 kB +124 B (0%)
build/blocks/index.min.js 51 kB +3 B (0%)
build/components/index.min.js 206 kB +5 B (0%)
build/customize-widgets/index.min.js 11.8 kB +5 B (0%)
build/data/index.min.js 8.57 kB -2 B (0%)
build/date/index.min.js 40.4 kB +8.38 kB (+26%) 🚨
build/edit-post/index.min.js 34.5 kB +9 B (0%)
build/edit-site/index.min.js 64 kB +5 B (0%)
build/edit-widgets/index.min.js 16.9 kB +7 B (0%)
build/editor/index.min.js 45.5 kB +6 B (0%)
build/experiments/index.min.js 0 B -938 B (removed) 🏆
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/style-rtl.css 14.4 kB
build/block-editor/style.css 14.4 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 265 B
build/block-library/blocks/file/style.css 265 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 298 B
build/block-library/blocks/latest-comments/style.css 298 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 376 B
build/block-library/blocks/page-list/editor.css 376 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 458 B
build/block-library/blocks/query/editor.css 457 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.6 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.6 kB
build/block-library/style.css 12.6 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.3 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/style-rtl.css 7.5 kB
build/edit-post/style.css 7.5 kB
build/edit-site/style-rtl.css 9.7 kB
build/edit-site/style.css 9.7 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.92 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 942 B
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.69 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@noisysocks
Copy link
Member

noisysocks commented Sep 1, 2020

It looks like react-hooks/exhaustive-deps was added in #14995 but then removed in #14985. There was some discussion about it in #14995 (comment) and https://github.com/WordPress/gutenberg/pull/14985/files#r355242262.

Personally I'm a 👍 as I've found myself wanting this rule on several occasions. When I glance at the list generated by running npm run lint-js it looks like most of the warnings are legitimate.

@youknowriad: Do you remember what exceptions to this rule we were running into?

@noisysocks
Copy link
Member

@kevin940726: Could you please add a CHANGELOG entry to packages/eslint-plugin? This change means that we need to increment the minor version field.

@kevin940726
Copy link
Member Author

@noisysocks Ahh didn't know that! Good to know ❤️

It seems like when we're removing it we didn't really understand the usage of it since there isn't much documentation about it either. I think that's not applicable now, it does more good than harm, and enabling them only gives us warnings not errors.

Sure, I'll add an entry!

@youknowriad
Copy link
Contributor

I think there are a lot of places where we explicitly rely on the fact that we don't want to run the "effect" when some variable changes. I don't know which ones though. So I'm not certain it's a good approach to just go ahead and add a warning for this.

I'd rather we audit where the rule fails and see what impact applying the rule has.

I know this just adds "warnings", but a warning on the output of eslint doesn't tell the whole story that potentially, this is not an issue.

@kevin940726
Copy link
Member Author

kevin940726 commented Sep 1, 2020

@youknowriad

Agreed with the "just add warnings" part, it definitely adds some noises, so I'd expect us to fix them all in the future.

I think there are a lot of places where we explicitly rely on the fact that we don't want to run the "effect" when some variable changes.

Have to disagree with this though. As pointed by Dan in facebook/create-react-app#6880 (comment), disabling it often leads to bugs and is usually a mistake. Furthermore, we have a big open source community with many contributors with different levels of skill, enabling the "official recommended" eslint rules not only helps us have consensus on coding style, but also helps contributors write resilient code. It also helps us reviewing the code too (#23952 (comment))!

I'd suggest to enable the rules, and if we did find a proper use case where eslint rules shouldn't be enabled, we can always disable it inline and add comments above it. If we believe it's a bug, we can even submit it to facebook/react#14920 :)

As per audit, I didn't do a full project-wide audit, but I have looked into some of the cases where the rule fails. IMHO, most of them are just oversights or bugs. For some of them that are technically "correct", they often have better ways to do it too. That's just my experience and preference though, I'd appreciate other's feedbacks ❤️ .

@youknowriad
Copy link
Contributor

Happy to be proved wrong here and I know Dan Abramov's opinion on this but IMO it's not black and white here. I'm certain that this rule is helpful in 80% of our current warnings but the audit will help make sure whether we can trust it 100%

@ZebulanStanphill
Copy link
Member

I think if we want to explicitly leave a variable out of a dependency array, we need to make it clear that we're doing so intentionally via a lint-rule disable for that line and an associated comment explaining why it's okay to not include every dependency in that particular use-case.

It's also worth noting that for cases where we want to run something only once, we could simply introduce an explicitly titled useEffectOnce (a pattern I've seen in a couple React libraries already).

For those reasons, I am completely in favor of introducing this ESLint rule.

@ellatrix
Copy link
Member

Not sure if I agree with adding refs to the dependencies. #27080 (comment)

A ref by definition never changes, so it is pointless to add to the dependencies. It gives the false sense that it will be reevaluated when the ref.current changes, which is not the case.

Also adding ref.current to the dependency array is not right, because setting .current does not cause a component to re-render.

I don't have a strong opinion on this though.

@etoledom etoledom removed their request for review December 8, 2020 16:38
@kevin940726 kevin940726 force-pushed the update/eslint-react-hooks-exhaustive-deps branch 3 times, most recently from 1877a12 to 0b3ec5d Compare January 4, 2021 06:03
@tyxla
Copy link
Member

tyxla commented Feb 9, 2023

Noting that it is currently enabled as error, but only for the components package:

'react-hooks/exhaustive-deps': 'error',

I'm happy to introduce this as a warning in the eslint plugin since we have great proof that it helps 👍

@getdave
Copy link
Contributor

getdave commented Feb 9, 2023

Shall we just merge this now then? Once done we can drop a note in Core Slack to advise everyone not to panic and how they can go about resolving errors.

@getdave getdave enabled auto-merge (squash) February 9, 2023 09:55
@tyxla
Copy link
Member

tyxla commented Feb 9, 2023

Shall we just merge this now then? Once done we can drop a note in Core Slack to advise everyone not to panic and how they can go about resolving errors.

I don't see why not. This will only land in the next release of the eslint-plugin package and it does have a CHANGELOG entry, plus it's only a warning, so it will not be blocking any work. Of course, a note in Slack or a dev note would be helpful to inform everyone interested.

@tyxla
Copy link
Member

tyxla commented Feb 9, 2023

Just another note - we should aim to fix any new warnings of that type in the Gutenberg codebase. The idea is not to clutter it with warnings 😉

@ciampo
Copy link
Contributor

ciampo commented Feb 9, 2023

With the changes from this PR, would the rule still error in the @wordpress/components package?


For the strategy towards "zero warnings", I suggest the approach that we took for the components package:

  • focus on one package at a time
  • remove all warnings, either by satisfying eslint demants, or by ignoring them when a rewrite would be complicated (while also adding a code comment explaining the reason for the disable)
  • once all warnings are gone, change the rule for that specific package from warn to error to avoid re-introducing more errors
  • pick a new package, repeat

@tyxla
Copy link
Member

tyxla commented Feb 9, 2023

With the changes from this PR, would the rule still error in the @wordpress/components package?

Yes. This is changing the default rules, but those are overridden by the project ESLint settings, where the rule is set to error for the components package.

@getdave
Copy link
Contributor

getdave commented Feb 9, 2023

What's going on with the failure on Static Analysis here?

@tyxla
Copy link
Member

tyxla commented Feb 9, 2023

Could it be because of the prettier dependency change? Is that even intentional or it got here during a bad rebase?

@Mamaduka
Copy link
Member

Mamaduka commented Feb 9, 2023

I disabled 'auto-merge' since lint checks are failing, and there's still an ongoing discussion.

@kevin940726, I remember you explored the idea of ignoring methods returned by useDispatch from the rules. Is it still a lot of work to customize this behavior?

@kevin940726
Copy link
Member Author

I remember you explored the idea of ignoring methods returned by useDispatch from the rules. Is it still a lot of work to customize this behavior?

I don't remember that 😅 . I think we can just add them to the dependencies array, it might be the simplest way. This is how react-redux's useDispatch does it too.

@getdave
Copy link
Contributor

getdave commented Feb 9, 2023

If the lint still fails then it might be we need to rebuild package-lock.json and commit that?

@github-actions
Copy link

github-actions bot commented Feb 9, 2023

Flaky tests detected in 8358467.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4135223140
📝 Reported issues:

@tyxla
Copy link
Member

tyxla commented Feb 9, 2023

Could it be because of the prettier dependency change? Is that even intentional or it got here during a bad rebase?

Seems like that was the cause.

@getdave getdave merged commit 5bd27ba into trunk Feb 9, 2023
@getdave getdave deleted the update/eslint-react-hooks-exhaustive-deps branch February 9, 2023 16:15
@github-actions github-actions bot added this to the Gutenberg 15.2 milestone Feb 9, 2023
@@ -171,6 +171,10 @@
- The bundled `eslint-plugin-react` dependency has been updated from requiring `^7.20.0` to requiring `^7.22.0` ([#27965](https://github.com/WordPress/gutenberg/pull/27965)).
- The bundled `eslint-plugin-react-hooks` dependency has been updated from requiring `^4.0.4` to requiring `^4.2.0` ([#27965](https://github.com/WordPress/gutenberg/pull/27965)).

### New Features
Copy link
Member

@gziolo gziolo Feb 10, 2023

Choose a reason for hiding this comment

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

This changelog entry is misplaced. It should be moved to ## Unreleased section.

We will have to rethink the way changelogs are maintained, as it's too easy to run accidentaly into this type of situation when merging the latest changes from trunk.

Copy link
Contributor

@ciampo ciampo Feb 10, 2023

Choose a reason for hiding this comment

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

We will have to rethink the way changelogs are maintained,

100%. I was thinking if we could semi-automate the changelog by asking the PR author to simply state:

  • which category this falls under (bug fix, enhancements, breaking change...)
  • message

The rest can be performed by the automated action at merge time, including picking the right CHANGELOG file and adding the message under the right version (or unreleased) ?

Copy link
Member

@gziolo gziolo Feb 13, 2023

Choose a reason for hiding this comment

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

I was looking at Jetpack monorepo the other day, and they use an interesting system.

They keep a changelog folder for every package:

Screenshot 2023-02-13 at 09 33 51

Every time a changelog entry is warranted (I don't know the rules), they create a new file:

Screenshot 2023-02-13 at 09 33 40

Those files are read and deleted at publishing time, which completely removes the risk of merge conflicts of any type.

Example PR from Jetpack with changelog entries included: Automattic/jetpack#28710.

Copy link
Contributor

Choose a reason for hiding this comment

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

That's interesting!

It could be worth chatting to whoever implemented / maintains that system to understand pros and cons, and if it could work well for our use case. For example, I see that they have a CI action that replies to the PR with a checklist, suggesting that a CHANGELOG entry is a mandatory requirement for all PRs?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] ESLint plugin /packages/eslint-plugin [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.