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

Scripts: Switch to Prettier 2.5 and change formatting around spacing #37607

Closed
wants to merge 3 commits into from

Conversation

gziolo
Copy link
Member

@gziolo gziolo commented Dec 23, 2021

Description

TLDR; I propose we switch to the original version of Prettier and update it to the most recent version 2.5. Consequently, we should also update the existing JavaScript Coding Standards around spacing to meet what Prettier can do.

Fixes #21872.
Fixes #37516.
Replaces and closes #37517.

We use an outdated fork of Prettier in the Gutenberg project because it didn't get any updates for more than a year:

wp-prettier prettier
Screenshot 2021-12-23 at 09 40 31 Screenshot 2021-12-23 at 09 42 18

The only motivation behind using a forked version of Prettier is its custom functionality overriding formatting behavior for spaces. It allows to align closer with the coding style convention used for PHP in the WordPress codebase as explained in JavaScript Coding Standards. Related rules:

Use spaces liberally throughout your code. “When in doubt, space it out.”

The WordPress JavaScript standards prefer slightly broader whitespace rules than the jQuery style guide. These deviations are for consistency between the PHP and JavaScript files in the WordPress codebase.

It's worth reminding that this topic was discussed several times, beginning in 2017 when the initial exploration of using Prettier started with #2819. Throughout all that time, the Prettier maintainers didn't change their mind about adding support for spaces between parens (()) and brackets ([]) despite many requests shared in prettier/prettier#1303 from users (including the WordPress community). That's why we decided to use the forked version developed by developers at Automattic.

In the meantime, there were three minor releases of Prettier with a long list of new features in the last year:

The Gutenberg project no longer uses only JavaScript for development. Some parts of the codebase use TypeScript, which we agreed upon a few months back. It means we can't use improvements added for newer versions of the TypeScript language and potentially for future additions to the JavaScript language. A deprecation was also added to one of the config options we use in the shared Prettier config that the community uses. It turns out that it prevents using @wordpress/prettier-config with the most recent version of Prettier in 3rd party projects, as explained in #37516. Finally, we had multiple reports in #21872 from the community members using @wordpress/scripts or @wordpress/eslint-plugin that the forked version of Prettier doesn't install correctly in their projects. The good news is that switching to the original Prettier will resolve all of the above!

JavaScript Coding Standard changes necessary

- Some whitespace rules differ, for consistency with the WordPress PHP coding standards.
+ Some whitespace rules differ, for consistency with the [Prettier](https://prettier.io) formatting tool.
- All new or updated JavaScript code will be reviewed to ensure it conforms to the standards, and passes JSHint.
+ All new or updated JavaScript code will be reviewed to ensure it conforms to the standards, and passes [ESLint](https://eslint.org).
- Use spaces liberally throughout your code. “When in doubt, space it out.”
- Any ! negation operator should have a following space.*
+ Any ! negation operator should not have a following space.
- Always include extra spaces around elements and arguments:
- array = [ a, b ]; 
- foo( arg );
- foo( 'string', object );
- foo( options, object[ property ] );
- foo( node, 'property', 2 );
- prop = object[ 'default' ];
- firstArrayElement = arr[ 0 ];
+ Never include extra spaces around elements and arguments: 
+ arg = [a, b]; 
+ foo(arg);
+ foo('string', object);
+ foo(options, object[property]);
+ foo(node, 'property', 2);
+ prop = object['default'];
+ firstArrayElement = arr[0];
- var i;
-
- if ( condition ) {
-    doSomething( 'with a string' );
- } else if ( otherCondition ) {
-     otherThing( {
-         key: value,
-         otherKey: otherValue
-     } );
- } else {
-     somethingElse( true );
- }
 
- // Unlike jQuery, WordPress prefers a space after the ! negation operator.
- // This is also done to conform to our PHP standards.
- while ( ! condition ) {
-     iterating++;
- }
-  
- for ( i = 0; i < 100; i++ ) {
-     object[ array[ i ] ] = someFn( i );
-     $( '.container' ).val( array[ i ] );
- }
-  
- try {
-     // Expressions
- } catch ( e ) {
-     // Expressions
- }
+ var i;
+
+ if (condition) {
+ 	doSomething('with a string');
+ } else if (otherCondition) {
+ 	otherThing({
+ 		key: value,
+ 		otherKey: otherValue,
+ 	});
+ } else {
+ 	somethingElse(true);
+ }
+ 
+ while (!condition) {
+ 	iterating++;
+ }
+ 
+ for (i = 0; i < 100; i++) {
+ 	object[array[i]] = someFn(i);
+ 	$('.container').val(array[i]);
+ }
+ 
+ try {
+ 	// Expressions
+ } catch (e) {
+ 	// Expressions
+ }

There are more code examples that we would have to update in the document, but they are very similar to those shared above.

How has this been tested?

npm install
npm run build
npm run lint-js
npm run test-unit
npm run test-e2e

I also ensured that there were no changes in the branch when running:

npm run docs:build
npm run format

Types of changes

Breaking change (fix or feature that would cause existing functionality not to work as expected).

TODO tasks

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • [-] My code follows the accessibility standards.
  • [-] I've tested my changes with keyboard and screen readers.
  • 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 (please manually search all *.native.js files for terms that need renaming or removal).

@gziolo gziolo added [Tool] WP Scripts /packages/scripts [Tool] Prettier config /packages/prettier-config [Tool] ESLint plugin /packages/eslint-plugin [Type] Code Quality Issues or PRs that relate to code quality [Type] Breaking Change For PRs that introduce a change that will break existing functionality labels Dec 23, 2021
@gziolo gziolo self-assigned this Dec 23, 2021
@gziolo gziolo force-pushed the update/prettier-2.5 branch from d9f6c4b to 04c3eeb Compare December 23, 2021 08:10
@gziolo gziolo changed the title Update/prettier 2.5 Scripts: Switch to Prettier 2.5 Dec 23, 2021
@github-actions
Copy link

github-actions bot commented Dec 23, 2021

Size Change: -33 B (0%)

Total Size: 1.13 MB

Filename Size Change
build/components/index.min.js 214 kB -33 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 140 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 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 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 134 B
build/block-library/blocks/code/theme.css 134 B
build/block-library/blocks/columns/editor-rtl.css 210 B
build/block-library/blocks/columns/editor.css 208 B
build/block-library/blocks/columns/style-rtl.css 502 B
build/block-library/blocks/columns/style.css 501 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 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/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.22 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 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 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 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 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 966 B
build/block-library/blocks/gallery/editor.css 970 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.6 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 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 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 810 B
build/block-library/blocks/image/editor.css 809 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 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 493 B
build/block-library/blocks/media-text/style.css 490 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 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 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-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.91 kB
build/block-library/blocks/navigation/editor.css 1.91 kB
build/block-library/blocks/navigation/style-rtl.css 1.8 kB
build/block-library/blocks/navigation/style.css 1.79 kB
build/block-library/blocks/navigation/view.min.js 2.82 kB
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 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 172 B
build/block-library/blocks/page-list/style.css 172 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 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/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 509 B
build/block-library/blocks/post-comments/style.css 509 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 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/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 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 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 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 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 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 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 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 245 B
build/block-library/blocks/separator/style.css 245 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 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 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 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 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 670 B
build/block-library/blocks/social-links/editor.css 669 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 910 B
build/block-library/common.css 908 B
build/block-library/editor-rtl.css 10 kB
build/block-library/editor.css 10 kB
build/block-library/index.min.js 165 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.8 kB
build/block-library/style.css 10.9 kB
build/block-library/theme-rtl.css 675 B
build/block-library/theme.css 679 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.3 kB
build/components/style-rtl.css 15.5 kB
build/components/style.css 15.5 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 13.2 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/data/index.min.js 7.49 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.5 kB
build/edit-post/style-rtl.css 7.16 kB
build/edit-post/style.css 7.16 kB
build/edit-site/index.min.js 35.8 kB
build/edit-site/style-rtl.css 6.62 kB
build/edit-site/style.css 6.61 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 37.9 kB
build/editor/style-rtl.css 3.75 kB
build/editor/style.css 3.74 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.58 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.71 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.72 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 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.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.57 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@gziolo gziolo force-pushed the update/prettier-2.5 branch from 17e3992 to 06889be Compare December 23, 2021 09:06
@gziolo gziolo changed the title Scripts: Switch to Prettier 2.5 Scripts: Switch to Prettier 2.5 and change formatting around spacing Dec 23, 2021
@Mamaduka
Copy link
Member

Mamaduka commented Jan 4, 2022

I'm also worried about how similar changes affect git blame history. I use GitLens on VS Code daily to find context around specific decisions or PRs that introduced them. Unfortunately, large-scale changes like this make it a little harder.

Yesterday, I came across this conversation on Twitter. So maybe we should also consider adding .git-blame-ignore-revs to a project.

Another commit we can consider for that list is 4857ad5.

P.S. Article linked in a tweet - https://akrabat.com/ignoring-revisions-with-git-blame/

@gziolo
Copy link
Member Author

gziolo commented Jan 5, 2022

I have just posted an official proposal at https://make.wordpress.org/core/2022/01/05/proposal-changes-to-javascript-coding-standards-for-full-prettier-compatibility/.

@kevin940726
Copy link
Member

I'm all in for aligning to the community's standard. However, wouldn't it be more backward-compatible if we continue to follow the WordPress style guide but using eslint --fix in conjunction with prettier --write?

So instead of running our own fork of prettier with wp-prettier --write, we can do prettier --write && eslint --fix to fix all those minor issues that prettier doesn't care about.

Sure, it's gonna be slower, but I don't think we'd be running that command that often, and it can be automated with lint-staged as well. IDE can also be configured to run both tools in order (or just disable them linting styling rules in IDE, it shouldn't care afterall).

I agree that just changing the rules once and for all is a much straightforward solution though, but I also have the concern brought up by @Mamaduka in #37607 (comment) that git blaming would be a pain to deal with.

@gziolo
Copy link
Member Author

gziolo commented Jan 10, 2022

However, wouldn't it be more backward-compatible if we continue to follow the WordPress style guide but using eslint --fix in conjunction with prettier --write?

@ntwb did several explorations in #4628 of the same approach you mentioned, but it wasn't good enough back then in 2018.

@kevin940726
Copy link
Member

@ntwb did several explorations in #4628 of the same approach you mentioned, but it wasn't good enough back then in 2018.

Is the reason still relevant today? Seems like the conclusion in #4628 is to not use prettier which has obviously changed now. Might be worth noting that I've tried using prettier --write && eslint --fix together before in one of my projects and it works really well.

@ntwb
Copy link
Member

ntwb commented Jan 11, 2022

Is the reason still relevant today? Seems like the conclusion in #4628 is to not use prettier which has obviously changed now. Might be worth noting that I've tried using prettier --write && eslint --fix together before in one of my projects and it works really well.

I think this would be an interesting task to explore, wondering if we can create a dedicated ESLint configuration that only fixes "spaces between parens and brackets", and if running lint-staging with Prettier first and then this ESLint config would work....

It seems pretty hacky to me to be honest, and not very friendly to the wider developer community to have to implement it in this manner,not sure if @wordpress/scripts could handle this either....

@gziolo
Copy link
Member Author

gziolo commented Jan 11, 2022

It seems pretty hacky to me to be honest, and not very friendly to the wider developer community to have to implement it in this manner,not sure if @wordpress/scripts could handle this either....

As long people would use npx wp-scripts format it would be fine, but in case someone would use Prettier directly they would get different styles, for example when using the default IDE integration.

@kevin940726
Copy link
Member

As long people would use npx wp-scripts format it would be fine, but in case someone would use Prettier directly they would get different styles, for example when using the default IDE integration.

True, but that shouldn't matter either though. People should be able to use any styling during development, as long as the code they pushed is following WP standard, that's the reason we have lint-staged in the first place.

wondering if we can create a dedicated ESLint configuration that only fixes "spaces between parens and brackets"

In theory, it should be possible, but I don't think we necessarily have to do this, it only has some performance benefits.

and if running lint-staging with Prettier first and then this ESLint config would work....

It should be possible.

@luisherranz
Copy link
Member

luisherranz commented Jan 11, 2022

lint-staged is a great tool, but I think IDE integrations should not be underestimated. For many developers (me included) it's an essential workflow:

  • Write some code.
  • Use IDE shortcut to run autoformat (for example, Prettier integration).
  • Write more code.
  • Use IDE shortcut to run autoformat again.
  • Repeat...

If the correct formating is only achieved using a CLI command like npx wp-scripts format, the developer experience won't be that good.

@kevin940726
Copy link
Member

kevin940726 commented Jan 11, 2022

If the correct formating is only achieved using a CLI command like npx wp-scripts format, the developer experience won't be that good.

My imagination would be that eslint will only be fixing some minor details (like spaces around parenthesis and such), so the overall styling is still pretty much the same. In addition, we'll still be providing prettier config and eslint config, so the existing IDE integration should still work. By any means, not enforcing formatting styling during development should be better for DX, not worse, so that developers can use whatever styling they feel comfortable with, as long as the final result is following the standard.

Moreover, it should be possible to configure IDE integration to run prettier --write && eslint --fix too, so that CLI isn't the only achievable method. But maybe each IDE has some quirks though 😅 .

@luisherranz
Copy link
Member

it should be possible to configure IDE integration to run prettier --write && eslint --fix too, so that CLI isn't the only achievable method

Yeah, I guess it is possible. But each step we deviate from the standard workflow is usually an additional step users need to do to configure the tooling. In that case, they would need to figure out how to run that command instead of just installing a Prettier plugin.

@ntwb
Copy link
Member

ntwb commented Jan 12, 2022

Thanks, I think it's worth exploring, if the workflows can be solved, without large amounts of pain, so that the Gutenberg Repo (Commit, Lint-Staged, GitHub Actions etc) and Developer IDE/Editor work (Prettier/ESLint save & format)

If the above can be achieved, then Gutenberg no longer needs to use (or update & maintain) the Prettier fork and can use the canonical Prettier then that covers I think all of the main objections to the make/core proposal here:

@kevin940726
Copy link
Member

I did some quick testing, but it turns out there are unfortunately some rules that won't be able to stay intact. There's the space-in-parens rule that will fix the prettier spaces issue for us, however, that will conflict with the printWidth rule in prettier. Since that eslint will be running after prettier, and there's no one-to-one equivalent of printWidth in eslint, it won't be able to recover from the width change. Take below as an example:

// Original code that's really long and exceeds the `printWidth` setting
fn(
  ...
);

// Prettier: the width is just below the threshold after removing the spaces
fn(...);

// eslint adds back the spaces, but it won't wrap them into multiple lines anymore
fn( 123 );

This creates some inconsistencies between the modified code and the original code. Even though the impact would be much lower than what this PR proposes, we still have to solve the same problem, just on a smaller scale.

Yeah, I guess it is possible. But each step we deviate from the standard workflow is usually an additional step users need to do to configure the tooling. In that case, they would need to figure out how to run that command instead of just installing a Prettier plugin.

We can provide documentation just like how we do currently. They don't "need" to though, I think it's an important point, the whole IDE setup should be optional.

@gziolo gziolo added the Needs Decision Needs a decision to be actionable or relevant label Jan 13, 2022
@gziolo
Copy link
Member Author

gziolo commented Jan 13, 2022

I also found PR where prettier-eslint was explored: #4374.

I did some quick testing, but it turns out there are unfortunately some rules that won't be able to stay intact. There's the space-in-parens rule that will fix the prettier spaces issue for us, however, that will conflict with the printWidth rule in prettier.

Yes, that was one of the concerns discussed during the initial explorations of Prettier. ESLint operates after Prettier, and it doesn't respect the line width setting. The same issue likely applies to the wp-prettier's fork.

Looking at the prettier-eslint solution more broadly, I think it suffers from the same root issue as wp-prettier – it’s a different external thing that needs to be maintained. In this case, we can also suffer from the lack of updates to the project. I checked the latest release 13.0.0 (6 months ago), and I discovered it depends on ESLint ^7.9.0, and we already use the next major version (8.6.0), so we would suddenly ship two different major versions of ESLint with @wordpress/scripts. I’m sure you could limit --fix to rules impacting spacing as mentioned in one of the comments, so it would most likely work fine after all. The fact that we use TypeScript more and more in the project brings another set of challenges because we would have to use fixers from TS rules to cover the entire codebase rather than those that ESLint ships by default.

Anyway, you usually modify only a few JS files so that you won’t notice any issues. However, we use also Prettier in Markdown files. It’s getting more interesting there because Prettier is smart enough to detect JS snippets there and format them. However, ESLint knows nothing about Markdown, so we would diverge there, or we would have to ignore those snippets when using Prettier, so they don't get formatted without the ESLint step that fixes spaces.

The most crucial part is optimizing the developer experience because many devs use IDE integrations. I know that the best part is that you just put a Prettier's config and everything magically works in Visual Studio Code when you save your code, and I suspect it's not that different experience in other editors listed at https://prettier.io/docs/en/editors.html.

While Prettier + ESLint seems like a viable solution, I don't think it is clearly better than the current setup with the wp-pretttier fork. They both have many disadvantages and keep us in a place where we need to workaround the limitations of Prettier. I personally would prefer to either change the coding styles as proposed or leave everything as is and eventually try to update the fork.

@simonhammes
Copy link
Contributor

@gziolo Sorry for bothering you, but are there any news on the proposal/this PR?

@gziolo
Copy link
Member Author

gziolo commented Apr 11, 2022

I'm re-sharing the comment from @ntwb that he left on WordPress Slack (link requires registration at https://make.wordpress.org/chat):

https://wordpress.slack.com/archives/C5UNMSU4R/p1648555187344279?thread_ts=1647357562.940759&cid=C5UNMSU4R

The consensus at the moment is a “No” from the core team.
I’ve a draft comment at the moment that I’ll post tomorrow, but the tl;dr of this is I think the WordPress project should resubmit it’s request upstream to Prettier in a more formal manner, and I’ll add why I think we might be able to achieve a better result this time

I'm closing this PR becaue of that.

@gziolo
Copy link
Member Author

gziolo commented Jul 14, 2022

I opened a new issue in the Prettier repository that proposed again the option of allowing extra spaces around elements and arguments in JavaScript code: prettier/prettier#13107.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs Decision Needs a decision to be actionable or relevant [Tool] ESLint plugin /packages/eslint-plugin [Tool] Prettier config /packages/prettier-config [Tool] WP Scripts /packages/scripts [Type] Breaking Change For PRs that introduce a change that will break existing functionality [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
6 participants