From 504d75103642deab79f9da6512175027a5efd7bb Mon Sep 17 00:00:00 2001 From: Sosuke Suzuki Date: Fri, 29 Apr 2022 17:42:42 +0900 Subject: [PATCH] Preserve blank line between export specifiers (#12746) * Preserve blank line between export specifiers * Add changelog * rename --- changelog_unreleased/javascript/12746.md | 33 ++++++ src/language-js/comments.js | 15 ++- .../export/__snapshots__/jsfmt.spec.js.snap | 109 ++++++++++++++++++ .../export/blank-line-between-specifiers.js | 21 ++++ 4 files changed, 172 insertions(+), 6 deletions(-) create mode 100644 changelog_unreleased/javascript/12746.md create mode 100644 tests/format/js/export/blank-line-between-specifiers.js diff --git a/changelog_unreleased/javascript/12746.md b/changelog_unreleased/javascript/12746.md new file mode 100644 index 000000000..d7b895ef7 --- /dev/null +++ b/changelog_unreleased/javascript/12746.md @@ -0,0 +1,33 @@ +#### Preserve blank line between export specifiers (#12746 by @sosukesuzuki) + + +```jsx +// Input +export { + // a + foo1, + + // b + bar1, + baz1, +} from "mod"; + +// Prettier stable +export { + // a + foo1, + // b + bar1, + baz1, +} from "mod"; + +// Prettier main +export { + // a + foo1, + + // b + bar1, + baz1, +} from "mod"; +``` diff --git a/src/language-js/comments.js b/src/language-js/comments.js index 4a23aba07..22b1bed4b 100644 --- a/src/language-js/comments.js +++ b/src/language-js/comments.js @@ -65,7 +65,7 @@ function handleOwnLineComment(context) { handleForComments, handleUnionTypeComments, handleOnlyComments, - handleImportDeclarationComments, + handleModuleSpecifiersComments, handleAssignmentPatternComments, handleMethodNameComments, handleLabeledStatementComments, @@ -787,17 +787,20 @@ function handleForComments({ comment, enclosingNode }) { return false; } -function handleImportDeclarationComments({ +function handleModuleSpecifiersComments({ comment, precedingNode, enclosingNode, text, }) { + const isImportDeclaration = + precedingNode?.type === "ImportSpecifier" && + enclosingNode?.type === "ImportDeclaration"; + const isExportDeclaration = + precedingNode?.type === "ExportSpecifier" && + enclosingNode?.type === "ExportNamedDeclaration"; if ( - precedingNode && - precedingNode.type === "ImportSpecifier" && - enclosingNode && - enclosingNode.type === "ImportDeclaration" && + (isImportDeclaration || isExportDeclaration) && hasNewline(text, locEnd(comment)) ) { addTrailingComment(precedingNode, comment); diff --git a/tests/format/js/export/__snapshots__/jsfmt.spec.js.snap b/tests/format/js/export/__snapshots__/jsfmt.spec.js.snap index f34ad6b8c..ae949438c 100644 --- a/tests/format/js/export/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/js/export/__snapshots__/jsfmt.spec.js.snap @@ -1,5 +1,114 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`blank-line-between-specifiers.js - {"bracketSpacing":false} format 1`] = ` +====================================options===================================== +bracketSpacing: false +parsers: ["babel", "flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +export { + // a + foo1, + + // b + bar1, + baz1, +} from "mod"; + +const foo2 = 1; +const bar2 = 1; +const baz2 = 1; + +export { + // a + foo2, + + // b + bar2, + baz2, +}; + +=====================================output===================================== +export { + // a + foo1, + + // b + bar1, + baz1, +} from "mod"; + +const foo2 = 1; +const bar2 = 1; +const baz2 = 1; + +export { + // a + foo2, + + // b + bar2, + baz2, +}; + +================================================================================ +`; + +exports[`blank-line-between-specifiers.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +export { + // a + foo1, + + // b + bar1, + baz1, +} from "mod"; + +const foo2 = 1; +const bar2 = 1; +const baz2 = 1; + +export { + // a + foo2, + + // b + bar2, + baz2, +}; + +=====================================output===================================== +export { + // a + foo1, + + // b + bar1, + baz1, +} from "mod"; + +const foo2 = 1; +const bar2 = 1; +const baz2 = 1; + +export { + // a + foo2, + + // b + bar2, + baz2, +}; + +================================================================================ +`; + exports[`bracket.js - {"bracketSpacing":false} format 1`] = ` ====================================options===================================== bracketSpacing: false diff --git a/tests/format/js/export/blank-line-between-specifiers.js b/tests/format/js/export/blank-line-between-specifiers.js new file mode 100644 index 000000000..82cd20637 --- /dev/null +++ b/tests/format/js/export/blank-line-between-specifiers.js @@ -0,0 +1,21 @@ +export { + // a + foo1, + + // b + bar1, + baz1, +} from "mod"; + +const foo2 = 1; +const bar2 = 1; +const baz2 = 1; + +export { + // a + foo2, + + // b + bar2, + baz2, +};