From 177f90898170d363ef64fde663e4d13170688bfe Mon Sep 17 00:00:00 2001 From: Konv Suu <2583695112@qq.com> Date: Tue, 16 Dec 2025 08:37:18 +0800 Subject: [PATCH 1/4] Prevent trailing comma in SCSS `if()` function (#18471) Co-authored-by: fisker Cheung --- changelog_unreleased/scss/18471.md | 15 ++++++++++ src/language-css/utilities/index.js | 12 ++++++++ tests/format/scss/function/18465.scss | 1 + .../__snapshots__/format.test.js.snap | 30 +++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 changelog_unreleased/scss/18471.md create mode 100644 tests/format/scss/function/18465.scss diff --git a/changelog_unreleased/scss/18471.md b/changelog_unreleased/scss/18471.md new file mode 100644 index 000000000..f4ff3d42c --- /dev/null +++ b/changelog_unreleased/scss/18471.md @@ -0,0 +1,15 @@ +#### Prevent trailing comma in `if()` function (#18471 by @kovsu) + + +```scss +// Input +$value: if(sass(false): 1; else: -1); + +// Prettier stable +$value: if( + sass(false): 1; else: -1, +); + +// Prettier main +$value: if(sass(false): 1; else: -1); +``` diff --git a/src/language-css/utilities/index.js b/src/language-css/utilities/index.js index b2354bdca..6477cb24a 100644 --- a/src/language-css/utilities/index.js +++ b/src/language-css/utilities/index.js @@ -261,6 +261,18 @@ function isSCSSMapItemNode(path, options) { return false; } + const parentNode = path.parent; + + // Don't treat SCSS if function arguments as maps (`if(sass(condition): value; else: value)`) + // https://sass-lang.com/documentation/breaking-changes/if-function/ + if ( + parentNode && + parentNode.type === "value-func" && + parentNode.value === "if" + ) { + return false; + } + const parentParentNode = path.grandparent; // Check open parens contain key/value pair (i.e. `(key: value)` and `(key: (value, other-value)`) diff --git a/tests/format/scss/function/18465.scss b/tests/format/scss/function/18465.scss new file mode 100644 index 000000000..426305a74 --- /dev/null +++ b/tests/format/scss/function/18465.scss @@ -0,0 +1 @@ +$value: if(sass(false): 1; else: -1); diff --git a/tests/format/scss/function/__snapshots__/format.test.js.snap b/tests/format/scss/function/__snapshots__/format.test.js.snap index 78c6b2c6b..381e9685f 100644 --- a/tests/format/scss/function/__snapshots__/format.test.js.snap +++ b/tests/format/scss/function/__snapshots__/format.test.js.snap @@ -210,6 +210,36 @@ div { ================================================================================ `; +exports[`18465.scss - {"trailingComma":"es5"} format 1`] = ` +====================================options===================================== +parsers: ["scss"] +printWidth: 80 +trailingComma: "es5" + | printWidth +=====================================input====================================== +$value: if(sass(false): 1; else: -1); + +=====================================output===================================== +$value: if(sass(false): 1; else: -1); + +================================================================================ +`; + +exports[`18465.scss - {"trailingComma":"none"} format 1`] = ` +====================================options===================================== +parsers: ["scss"] +printWidth: 80 +trailingComma: "none" + | printWidth +=====================================input====================================== +$value: if(sass(false): 1; else: -1); + +=====================================output===================================== +$value: if(sass(false): 1; else: -1); + +================================================================================ +`; + exports[`arbitrary-arguments.scss - {"trailingComma":"es5"} format 1`] = ` ====================================options===================================== parsers: ["scss"] From d7108a79ec745c04292aabf22c4c1adbd690b191 Mon Sep 17 00:00:00 2001 From: fisker Date: Wed, 15 Apr 2026 08:53:50 +0800 Subject: [PATCH 2/4] Release 3.8.3 --- .github/ISSUE_TEMPLATE/formatting.md | 2 +- .github/ISSUE_TEMPLATE/integration.md | 2 +- CHANGELOG.md | 20 +++++++++++ package.json | 2 +- .../versioned_docs/version-stable/browser.md | 36 +++++++++---------- 5 files changed, 41 insertions(+), 21 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/formatting.md b/.github/ISSUE_TEMPLATE/formatting.md index eeb25ffd0..1c493aa7c 100644 --- a/.github/ISSUE_TEMPLATE/formatting.md +++ b/.github/ISSUE_TEMPLATE/formatting.md @@ -26,7 +26,7 @@ Don't fill the form below manually! Let a program create a report for you: --> -**Prettier 3.8.2** +**Prettier 3.8.3** [Playground link](https://prettier.io/playground/#.....) ```sh diff --git a/.github/ISSUE_TEMPLATE/integration.md b/.github/ISSUE_TEMPLATE/integration.md index 84a3febc5..85dd18b63 100644 --- a/.github/ISSUE_TEMPLATE/integration.md +++ b/.github/ISSUE_TEMPLATE/integration.md @@ -20,7 +20,7 @@ BEFORE SUBMITTING AN ISSUE: **Environments:** -- Prettier Version: 3.8.2 +- Prettier Version: 3.8.3 - Running Prettier via: - Runtime: - Operating System: diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ccd6026f..f73d9d1fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +# 3.8.3 + +[diff](https://github.com/prettier/prettier/compare/3.8.2...3.8.3) + +#### SCSS: Prevent trailing comma in `if()` function ([#18471](https://github.com/prettier/prettier/pull/18471) by [@kovsu](https://github.com/kovsu)) + + +```scss +// Input +$value: if(sass(false): 1; else: -1); + +// Prettier 3.8.2 +$value: if( + sass(false): 1; else: -1, +); + +// Prettier 3.8.3 +$value: if(sass(false): 1; else: -1); +``` + # 3.8.2 [diff](https://github.com/prettier/prettier/compare/3.8.1...3.8.2) diff --git a/package.json b/package.json index 83522fc7b..775986801 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prettier", - "version": "3.9.0-dev", + "version": "3.8.3", "description": "Prettier is an opinionated code formatter", "bin": "./bin/prettier.cjs", "repository": "prettier/prettier", diff --git a/website/versioned_docs/version-stable/browser.md b/website/versioned_docs/version-stable/browser.md index 614d523b8..6d2fc8a4e 100644 --- a/website/versioned_docs/version-stable/browser.md +++ b/website/versioned_docs/version-stable/browser.md @@ -21,7 +21,7 @@ Required options: - **[`parser`](options.md#parser) (or [`filepath`](options.md#file-path))**: One of these options has to be specified for Prettier to know which parser to use. -- **`plugins`**: Unlike the `format` function from the [Node.js-based API](api.md#prettierformatsource-options), this function doesn’t load plugins automatically. The `plugins` option is required because all the parsers included in the Prettier package come as plugins (for reasons of file size). These plugins are files in [https://unpkg.com/browse/prettier@3.8.2/plugins](https://unpkg.com/browse/prettier@3.8.2/plugins). Note that `estree` plugin should be loaded when printing JavaScript, TypeScript, Flow, or JSON. +- **`plugins`**: Unlike the `format` function from the [Node.js-based API](api.md#prettierformatsource-options), this function doesn’t load plugins automatically. The `plugins` option is required because all the parsers included in the Prettier package come as plugins (for reasons of file size). These plugins are files in [https://unpkg.com/browse/prettier@3.8.3/plugins](https://unpkg.com/browse/prettier@3.8.3/plugins). Note that `estree` plugin should be loaded when printing JavaScript, TypeScript, Flow, or JSON. You need to load the ones that you’re going to use and pass them to `prettier.format` using the `plugins` option. @@ -32,8 +32,8 @@ See below for examples. ### Global ```html - - + +