Visitar URL original
Fix `custom-property-no-missing-var-function` false positives for anchor positioning by giaBaoJS · Pull Request #9466 · stylelint/stylelint · GitHub
Skip to content

Fix custom-property-no-missing-var-function false positives for anchor positioning - #9466

Merged
jeddy3 merged 2 commits into
stylelint:mainfrom
giaBaoJS:fix-anchor-positioning-dashed-idents
Sep 3, 2026
Merged

jeddy3 merged 2 commits into
stylelint:mainfrom
giaBaoJS:fix-anchor-positioning-dashed-idents

Conversation

@giaBaoJS

Copy link
Copy Markdown
Contributor

Which issue, if any, is this issue related to?

None open. It's the same class of gap as #9163 (timeline-scope and animation-timeline), this time for the anchor positioning properties and functions.

Is there anything in the PR that needs further explanation?

The problem

anchor-name, anchor-scope, position-anchor, position-try-fallbacks and position-try take a <dashed-ident> as a value, not as a custom property reference, and so do the anchor() and anchor-size() functions. When that name also happens to be a declared custom property, the rule reports it:

@property --card {}

.anchor {
	anchor-name: --card;
}

.tooltip {
	position-anchor: --card;
	top: anchor(--card bottom);
}

On main all three declarations are flagged:

4:15 Missing var function for "--card" (custom-property-no-missing-var-function)
8:19 Missing var function for "--card" (custom-property-no-missing-var-function)
9:14 Missing var function for "--card" (custom-property-no-missing-var-function)

Wrapping any of them in var() would be invalid CSS. From CSS Anchor Positioning:

anchor-name: none | <anchor-name>#
<anchor-name> = <dashed-ident>
anchor-scope: none | all | <anchor-name>#
position-anchor: normal | none | auto | <anchor-name> | match-parent
position-try-fallbacks: none | [ [<dashed-ident> || <try-tactic>] | <position-area> ]#
position-try: <'position-try-order'>? <'position-try-fallbacks'>
<anchor()> = anchor( <anchor-name>? && <anchor-side>, <length-percentage>? )
anchor-size() = anchor-size( [<anchor-name> || <anchor-size>]?, <length-percentage>? )

The same grammar is in the css-tree syntax data Stylelint already ships, which is why declaration-property-value-no-unknown accepts a { anchor-name: --bar, --qux; } and rejects a { anchor-name: foo; }.

The cause

IGNORED_PROPERTIES (lib/rules/custom-property-no-missing-var-function/index.mjs:24) never picked up the anchor positioning properties, and check() (index.mjs:81) has no branch for anchor() or anchor-size(), so it walks their arguments and reports the anchor name.

The fix

Two parts, both following what the rule already does:

  • The five properties join IGNORED_PROPERTIES, as container-name, view-transition-name and timeline-scope did before them.
  • anchor() and anchor-size() get a branch that skips their arguments up to the comma and keeps checking everything after it, mirroring how style() skips the queried property name but still checks the value.

The second part matters because the fallback after the comma is an ordinary <length-percentage>, so top: anchor(--card bottom, --gap) is still a real missing var() and is still reported.

Cost

For the five properties the rule now skips the whole declaration value, so a missing var() inside one of them is no longer reported. That's the trade-off already accepted for the rest of the list, and those properties admit nothing but idents and keywords in practice.

Two related gaps are out of scope here because they belong to other specs: scroll-timeline-name / view-timeline-name (and their shorthands) and font-palette behave the same way. Happy to fold them in if you'd rather have one change.

Tests

lib/rules/custom-property-no-missing-var-function/__tests__/index.mjs goes from 41 to 54 cases.

With the tests in place and only the source reverted to main, 9 fail, e.g.

● custom-property-no-missing-var-function › accept › true › '@property --foo {} a { anchor-name: --foo; }' › names an anchor element

    expect(received).toEqual(expected) // deep equality

    - Expected  -  1
    + Received  + 13

    - Array []
    + Array [
    +   Object {
    +     "column": 37,
    ...
    +     "text": "Missing var function for \"--foo\" (custom-property-no-missing-var-function)",

Two mutations fail disjoint sets, so neither half of the change rides on the other's tests:

  • keep the property list, drop the anchor() / anchor-size() branch: 3 accept cases fail, both new reject cases pass.
  • keep the branch but let it skip the whole function: both new reject cases fail, all accept cases pass.

Full suite on this branch: 335 suites, 11168 passed, 14 skipped. npm run lint is clean.

@changeset-bot

changeset-bot Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f618729

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
stylelint Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@jeddy3 jeddy3 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thank you for the PR request. It's looking good.

I've requested a couple of changes. Please follow the contributing guide when making them:

  • commit commitable suggestions
  • don't force-push

Two related gaps are out of scope here because they belong to other specs...

I've opened a separate issue for this:

@github-actions

github-actions Bot commented Aug 30, 2026 •

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview is available (f618729). View the demo website.

Install it locally:

npm i -D https://pkg.pr.new/stylelint@f618729

Ignore only the `<anchor-name>` argument of `anchor()` and `anchor-size()`
instead of every dashed-ident before the fallback comma, so custom
properties used in the `<anchor-side>` are still flagged.

Also trim the tests for conciseness.
@giaBaoJS

giaBaoJS commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

All six suggestions are in f618729, pushed on top rather than force-pushed. The filter now uses the comma index, so top: anchor(--bar calc(50% + --foo)) flags --foo again; that case is the one reject test that goes red without the change.

@jeddy3 jeddy3 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks.

@ybiquitous ybiquitous left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Thank you. 👍🏼

@jeddy3
jeddy3 merged commit ac19a3c into stylelint:main Sep 3, 2026
20 checks passed
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Sep 6, 2026
| datasource | package   | from    | to      |
| ---------- | --------- | ------- | ------- |
| npm        | stylelint | 17.14.0 | 17.15.0 |


## [v17.15.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17150---2026-09-04)

It adds 1 new rule and 2 new rule options, and fixes 4 bugs.

- Added: `selector-no-unmatchable` rule ([#9451](stylelint/stylelint#9451)) ([@jeddy3](https://github.com/jeddy3)).
- Added: `ignoreFunctions: []` to `color-named` and `color-no-hex` ([#9463](stylelint/stylelint#9463)) ([@jsmitty12](https://github.com/jsmitty12)).
- Fixed: `custom-property-no-missing-var-function` false positives for anchor positioning ([#9466](stylelint/stylelint#9466)) ([@giaBaoJS](https://github.com/giaBaoJS)).
- Fixed: `declaration-block-no-redundant-longhand-properties` autofix for `font` shorthand ([#9402](stylelint/stylelint#9402)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `declaration-property-max-values` false positives for interpolated inline expressions ([#9437](stylelint/stylelint#9437)) ([@alexchen-sys](https://github.com/alexchen-sys)).
- Fixed: `selector-no-invalid` false negatives for pseudo-elements, combinators and nested `:has()` ([#9452](stylelint/stylelint#9452)) ([@jeddy3](https://github.com/jeddy3)).


## [v17.14.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17141---2026-07-20)

- Fixed: `declaration-block-no-redundant-longhand-properties` autofix producing invalid `background` shorthand when `background-size` is present ([#9364](stylelint/stylelint#9364)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `quiet` option suppresses `report*` warning reports. ([#9387](stylelint/stylelint#9387)) ([@ychampion](https://github.com/ychampion)).
- Fixed: `rule-empty-line-before` false positives for shared-line comments with `except: ["after-single-line-comment"]` ([#9394](stylelint/stylelint#9394)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: reported range of unknown rules ([#9385](stylelint/stylelint#9385)) ([@ybiquitous](https://github.com/ybiquitous)).
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Sep 6, 2026
| datasource | package   | from    | to      |
| ---------- | --------- | ------- | ------- |
| npm        | stylelint | 17.14.0 | 17.15.0 |


## [v17.15.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17150---2026-09-04)

It adds 1 new rule and 2 new rule options, and fixes 4 bugs.

- Added: `selector-no-unmatchable` rule ([#9451](stylelint/stylelint#9451)) ([@jeddy3](https://github.com/jeddy3)).
- Added: `ignoreFunctions: []` to `color-named` and `color-no-hex` ([#9463](stylelint/stylelint#9463)) ([@jsmitty12](https://github.com/jsmitty12)).
- Fixed: `custom-property-no-missing-var-function` false positives for anchor positioning ([#9466](stylelint/stylelint#9466)) ([@giaBaoJS](https://github.com/giaBaoJS)).
- Fixed: `declaration-block-no-redundant-longhand-properties` autofix for `font` shorthand ([#9402](stylelint/stylelint#9402)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `declaration-property-max-values` false positives for interpolated inline expressions ([#9437](stylelint/stylelint#9437)) ([@alexchen-sys](https://github.com/alexchen-sys)).
- Fixed: `selector-no-invalid` false negatives for pseudo-elements, combinators and nested `:has()` ([#9452](stylelint/stylelint#9452)) ([@jeddy3](https://github.com/jeddy3)).


## [v17.14.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17141---2026-07-20)

- Fixed: `declaration-block-no-redundant-longhand-properties` autofix producing invalid `background` shorthand when `background-size` is present ([#9364](stylelint/stylelint#9364)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `quiet` option suppresses `report*` warning reports. ([#9387](stylelint/stylelint#9387)) ([@ychampion](https://github.com/ychampion)).
- Fixed: `rule-empty-line-before` false positives for shared-line comments with `except: ["after-single-line-comment"]` ([#9394](stylelint/stylelint#9394)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: reported range of unknown rules ([#9385](stylelint/stylelint#9385)) ([@ybiquitous](https://github.com/ybiquitous)).
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Sep 6, 2026
| datasource | package   | from    | to      |
| ---------- | --------- | ------- | ------- |
| npm        | stylelint | 17.14.0 | 17.15.0 |


## [v17.15.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17150---2026-09-04)

It adds 1 new rule and 2 new rule options, and fixes 4 bugs.

- Added: `selector-no-unmatchable` rule ([#9451](stylelint/stylelint#9451)) ([@jeddy3](https://github.com/jeddy3)).
- Added: `ignoreFunctions: []` to `color-named` and `color-no-hex` ([#9463](stylelint/stylelint#9463)) ([@jsmitty12](https://github.com/jsmitty12)).
- Fixed: `custom-property-no-missing-var-function` false positives for anchor positioning ([#9466](stylelint/stylelint#9466)) ([@giaBaoJS](https://github.com/giaBaoJS)).
- Fixed: `declaration-block-no-redundant-longhand-properties` autofix for `font` shorthand ([#9402](stylelint/stylelint#9402)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `declaration-property-max-values` false positives for interpolated inline expressions ([#9437](stylelint/stylelint#9437)) ([@alexchen-sys](https://github.com/alexchen-sys)).
- Fixed: `selector-no-invalid` false negatives for pseudo-elements, combinators and nested `:has()` ([#9452](stylelint/stylelint#9452)) ([@jeddy3](https://github.com/jeddy3)).


## [v17.14.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17141---2026-07-20)

- Fixed: `declaration-block-no-redundant-longhand-properties` autofix producing invalid `background` shorthand when `background-size` is present ([#9364](stylelint/stylelint#9364)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `quiet` option suppresses `report*` warning reports. ([#9387](stylelint/stylelint#9387)) ([@ychampion](https://github.com/ychampion)).
- Fixed: `rule-empty-line-before` false positives for shared-line comments with `except: ["after-single-line-comment"]` ([#9394](stylelint/stylelint#9394)) ([@sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: reported range of unknown rules ([#9385](stylelint/stylelint#9385)) ([@ybiquitous](https://github.com/ybiquitous)).
robbevp pushed a commit to robbevp/website-robbevanpetegem that referenced this pull request Oct 16, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [eslint](https://eslint.org) ([source](https://github.com/eslint/eslint)) | devDependencies | patch | [`9.39.4` -> `9.39.5`](https://renovatebot.com/diffs/npm/eslint/9.39.4/9.39.5) |
| [prettier](https://prettier.io) ([source](https://github.com/prettier/prettier)) | devDependencies | minor | [`3.8.3` -> `3.9.10`](https://renovatebot.com/diffs/npm/prettier/3.8.3/3.9.10) |
| [stylelint](https://stylelint.io) ([source](https://github.com/stylelint/stylelint)) | devDependencies | minor | [`17.12.0` -> `17.16.0`](https://renovatebot.com/diffs/npm/stylelint/17.12.0/17.16.0) |

---

### Release Notes

<details>
<summary>eslint/eslint (eslint)</summary>

### [`v9.39.5`](https://github.com/eslint/eslint/releases/tag/v9.39.5)

[Compare Source](eslint/eslint@v9.39.4...v9.39.5)

#### Bug Fixes

- [`253be16`](eslint/eslint@253be16) fix: handle unavailable require cache (backport of [#&#8203;20812](eslint/eslint#20812) to v9.x) ([#&#8203;21065](eslint/eslint#21065)) (Eric)

#### Documentation

- [`74930ed`](eslint/eslint@74930ed) docs: switch build to Node.js 24 ([#&#8203;20894](eslint/eslint#20894)) (Milos Djermanovic)
- [`eaec8bb`](eslint/eslint@eaec8bb) docs: Add ESLint v9.x EOL notice ([#&#8203;20828](eslint/eslint#20828)) (Milos Djermanovic)

#### Chores

- [`458205f`](eslint/eslint@458205f) chore: update `@eslint/eslintrc` and `@eslint/js` for v9.39.5 ([#&#8203;21077](eslint/eslint#21077)) (Francesco Trotta)
- [`202117b`](eslint/eslint@202117b) chore: package.json update for [@&#8203;eslint/js](https://github.com/eslint/js) release (Jenkins)
- [`d9eb6ed`](eslint/eslint@d9eb6ed) test: disable warning for `vm.constants.USE_MAIN_CONTEXT_DEFAULT_LOADER` ([#&#8203;21074](eslint/eslint#21074)) (Francesco Trotta)
- [`7b431a7`](eslint/eslint@7b431a7) chore: override `re2` dependency for `@metascraper/helpers` ([#&#8203;21068](eslint/eslint#21068)) (Milos Djermanovic)
- [`daf7791`](eslint/eslint@daf7791) chore: pin fflate@0.8.2 ([#&#8203;20895](eslint/eslint#20895)) (Milos Djermanovic)
- [`daee8ba`](eslint/eslint@daee8ba) ci: use pnpm in `eslint-flat-config-utils` type integration test ([#&#8203;20829](eslint/eslint#20829)) (Milos Djermanovic)
- [`116d4be`](eslint/eslint@116d4be) ci: unpin Node.js 25.x in CI ([#&#8203;20619](eslint/eslint#20619)) (Copilot)

</details>

<details>
<summary>prettier/prettier (prettier)</summary>

### [`v3.9.10`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#3910)

[Compare Source](prettier/prettier@3.9.9...3.9.10)

[diff](prettier/prettier@3.9.9...3.9.10)

##### Markdown: Update `micromark-extension-gfm-table` to fix the table parse issue on performance ([#&#8203;20266](prettier/prettier#20266) by [@&#8203;fisker](https://github.com/fisker))

See micromark/micromark-extension-gfm-table@4f43ead for details.

### [`v3.9.9`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#399)

[Compare Source](prettier/prettier@3.9.8...3.9.9)

[diff](prettier/prettier@3.9.8...3.9.9)

##### Markdown: Fix text with `$` been incorrectly parsed as math syntax ([#&#8203;20140](prettier/prettier#20140) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```md
<!-- Input -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here.

<!-- Prettier 3.9.8 -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR`from`c.sh`, before anything else runs here.

<!-- Prettier 3.9.9 -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here.
```

### [`v3.9.8`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#398)

[Compare Source](prettier/prettier@3.9.7...3.9.8)

[diff](prettier/prettier@3.9.7...3.9.8)

##### Markdown: Don't let Liquid objects interrupt paragraphs ([#&#8203;20087](prettier/prettier#20087) by [@&#8203;seiyab](https://github.com/seiyab))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a
{{jsxref("TypeError")}} is thrown.

<!-- Prettier 3.9.7 -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a

{{jsxref("TypeError")}} is thrown.

<!-- Prettier 3.9.8 -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a
{{jsxref("TypeError")}} is thrown.
```

### [`v3.9.7`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#397)

[Compare Source](prettier/prettier@3.9.6...3.9.7)

[diff](prettier/prettier@3.9.6...3.9.7)

##### Markdown: Prevent indentation drift in list-item code blocks ([#&#8203;19647](prettier/prettier#19647), [#&#8203;19990](prettier/prettier#19990) by [@&#8203;Austin1serb](https://github.com/Austin1serb), [@&#8203;giaBaoJS](https://github.com/giaBaoJS))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
- [x] short first line.

      second paragraph at six spaces that wraps
      onto another line here.

<!-- Prettier 3.9.6 -->
- [x] short first line.

      second paragraph at six spaces that wraps
          onto another line here.

<!-- Prettier 3.9.7 -->
- [x] short first line.

      second paragraph at six spaces that wraps
      onto another line here.
```

##### JavaScript: Fix embedded template literal idempotency ([#&#8203;19725](prettier/prettier#19725) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```jsx
// Input
const foo = html`
            <div>${getText({
            value,
            })}</div>
`;

// Prettier 3.9.6 (first format)
const foo = html`
  <div>
    ${getText({
              value,
            })}
  </div>
`;

// Prettier 3.9.6 (second format)
const foo = html`
  <div>
    ${getText({
      value,
    })}
  </div>
`;

// Prettier 3.9.7
const foo = html`
  <div>
    ${getText({
      value,
    })}
  </div>
`;
```

##### Markdown: Preserve Liquid blocks after Markdown tables ([#&#8203;19730](prettier/prettier#19730) by [@&#8203;wanxiankai](https://github.com/wanxiankai), [@&#8203;seiyab](https://github.com/seiyab))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
| Argument | Type |
| -------- | ---- |
{% set default_params = {
    "model": ["str"],
} %}

<!-- Prettier 3.9.6 -->
| Argument                  | Type |
| ------------------------- | ---- |
| {% set default_params = { |

    "model": ["str"],

} %}

<!-- Prettier 3.9.7 -->
| Argument | Type |
| -------- | ---- |
{% set default_params = {
    "model": ["str"],
} %}
```

##### Markdown: Preserve single tildes in Markdown ([#&#8203;19739](prettier/prettier#19739) by [@&#8203;lazerg](https://github.com/lazerg))

Since 3.9.0, single-tilde spans like `H~2~O` were rewritten to double tildes, turning subscript syntax into strike-through. Only double tildes are treated that way now, matching GitHub.

<!-- prettier-ignore -->

```markdown
<!-- Input -->
H~2~O

<!-- Prettier 3.9.6 -->
H~~2~~O

<!-- Prettier 3.9.7 -->
H~2~O
```

##### Markdown: Fix Markdown blockquote containing `>` characters ([#&#8203;19802](prettier/prettier#19802) by [@&#8203;seiyab](https://github.com/seiyab))

<!-- prettier-ignore -->

```md
<!-- Input -->
> **test**\>

<!-- Prettier 3.9.6 -->
> **test**>\>

<!-- Prettier 3.9.7 -->
> **test**\>
```

##### Markdown: Strip blockquote markers from a setext heading's continuation lines ([#&#8203;19878](prettier/prettier#19878) by [@&#8203;Kjubikstronk](https://github.com/Kjubikstronk))

A setext heading spanning multiple lines inside a blockquote kept the `>` marker of its continuation lines as literal text.

<!-- prettier-ignore -->

```md
<!-- Input -->
> Multi
> Line
> ===

<!-- Prettier 3.9.6 -->
> Multi > Line
> ===

<!-- Prettier 3.9.7 -->
> Multi
> Line
> ===
```

##### Markdown: Fix HTML block indentation drift in markdown list items ([#&#8203;19987](prettier/prettier#19987) by [@&#8203;lazerg](https://github.com/lazerg))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
1. Enable images:

    <p align="center">
      <img alt="example">
    </p>

<!-- Prettier 3.9.6 (--tab-width=4) -->
1. Enable images:

     <p align="center">
       <img alt="example">
     </p>

<!-- Prettier 3.9.7 (--tab-width=4) -->
1. Enable images:

    <p align="center">
      <img alt="example">
    </p>
```

##### Angular: Support `@boundary` error boundaries ([#&#8203;20014](prettier/prettier#20014) by [@&#8203;Yahiro025](https://github.com/Yahiro025))

<!-- prettier-ignore -->

```html
<!-- Input -->
@&#8203;boundary {
<complex-chart [data]="data"/>
}
@&#8203;error (let err) {
<p>{{err.message}}</p>
}

<!-- Prettier 3.9.6 -->
SyntaxError: Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.) (6:1)

<!-- Prettier 3.9.7 -->
@&#8203;boundary {
  <complex-chart [data]="data" />
} @&#8203;error (let err) {
  <p>{{ err.message }}</p>
}
```

### [`v3.9.6`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#396)

[Compare Source](prettier/prettier@3.9.5...3.9.6)

[diff](prettier/prettier@3.9.5...3.9.6)

##### TypeScript: Preserve quotes for methods named `new` ([#&#8203;19621](prettier/prettier#19621) by [@&#8203;kovsu](https://github.com/kovsu))

<!-- prettier-ignore -->

```tsx
// Input
interface Container {
  "new"(id: string): number;
}

// Prettier 3.9.5
interface Container {
  new(id: string): number;
}

// Prettier 3.9.6
interface Container {
  "new"(id: string): number;
}
```

##### TypeScript: Support `import defer` ([#&#8203;19624](prettier/prettier#19624), [#&#8203;19675](prettier/prettier#19675) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```tsx
// Input
import defer * as foo from "foo";

// Prettier 3.9.5
import * as foo from "foo";

// Prettier 3.9.6
import defer * as foo from "foo";
```

##### JavaScript: Added a new official plugin `@prettier/plugin-yuku` ([#&#8203;19628](prettier/prettier#19628), [#&#8203;19629](prettier/prettier#19629) by [@&#8203;fisker](https://github.com/fisker))

`@prettier/plugin-yuku` is powered by [Yuku](https://yuku.fyi/) (A high-performance JavaScript/TypeScript compiler toolchain written in Zig).

This plugin includes two new parsers: `yuku` (JavaScript syntax) and `yuku-ts` (TypeScript syntax).

**To use this plugin:**

1. Install the plugin:

   ```bash
   yarn add --dev prettier @&#8203;prettier/plugin-yuku
   ```

2. Add it to your `.prettierrc`:

   ```yaml
   plugins:
     - "@&#8203;prettier/plugin-yuku"
   ```

Due to package size limitations, this plugin is not bundled with the main prettier package and must be installed separately.

For more information, check [the package homepage](https://github.com/prettier/prettier/tree/main/packages/plugin-yuku).

Big thanks to [@&#8203;arshad-yaseen](https://github.com/arshad-yaseen) for his excellent work.

### [`v3.9.5`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#395)

[Compare Source](prettier/prettier@3.9.4...3.9.5)

[diff](prettier/prettier@3.9.4...3.9.5)

##### Markdown: Cap ordered list mark at 999,999,999 ([#&#8203;19351](prettier/prettier#19351) by [@&#8203;tats-u](https://github.com/tats-u))

CommonMark parsers only support ordered list item numbers up to 999,999,999.

With this change, Prettier now caps the ordered list item number at 999,999,999 to ensure that the output is correctly parsed as an ordered list by CommonMark parsers. Numbers larger than 999,999,999 are not parsed as list item numbers and are left unchanged in the output:

<!-- prettier-ignore -->

```markdown
<!-- Input -->
999999998. text
999999998. text
999999998. text
999999998. text

1234567890123456789012) text

<!-- Prettier 3.9.4 -->
999999998. text
999999999. text
1000000000. text
1000000001. text

1234567890123456789012) text

<!-- Prettier 3.9.5 -->
999999998. text
999999999. text
999999999. text
999999999. text

1234567890123456789012) text
```

##### Markdown: Avoid corrupting empty link with title ([#&#8203;19487](prettier/prettier#19487) by [@&#8203;andersk](https://github.com/andersk))

Do not remove `<>` from an inline link or image with an empty URL and a title, as this removal would change its interpretation.

<!-- prettier-ignore -->

```md
<!-- Input -->
[link](<> "title")

<!-- Prettier 3.9.4 -->
[link]( "title")

<!-- Prettier 3.9.5 -->
[link](<> "title")
```

##### Less: Remove extra spaces after `[` in map lookups ([#&#8203;19503](prettier/prettier#19503) by [@&#8203;kovsu](https://github.com/kovsu))

<!-- prettier-ignore -->

```less
// Input
.foo {
  color: #theme[ primary];
  color: #theme[@&#8203;name];
  color: #theme[@&#8203;@&#8203;name];
}

// Prettier 3.9.4
.foo {
  color: #theme[ primary];
  color: #theme[ @&#8203;name];
  color: #theme[ @&#8203;@&#8203;name];
}

// Prettier 3.9.5
.foo {
  color: #theme[primary];
  color: #theme[@&#8203;name];
  color: #theme[@&#8203;@&#8203;name];
}
```

##### CSS: Prevent addition space in `type()` with `+` ([#&#8203;19516](prettier/prettier#19516) by [@&#8203;bigandy](https://github.com/bigandy))

This fixes the addition space before `+` in CSS `type()` declaration. For example `type(<number>+)` was being converted into `type(<number> +)` which is invalid CSS and does not work.

<!-- prettier-ignore -->

```css
/* Input */
div {
  border-radius: attr(br type(<length>+));
}

/* Prettier 3.9.4 */
div {
  border-radius: attr(br type(<length> +));
}

/* Prettier 3.9.5 */
div {
  border-radius: attr(br type(<length>+));
}
```

##### Less: Remove spaces between merge markers and colons ([#&#8203;19517](prettier/prettier#19517) by [@&#8203;kovsu](https://github.com/kovsu))

<!-- prettier-ignore -->

```less
// Input
a {
  box-shadow  +  : 0 0 1px #&#8203;000;
}

// Prettier 3.9.4
a {
  box-shadow+  : 0 0 1px #&#8203;000;
}

// Prettier 3.9.5
a {
  box-shadow+: 0 0 1px #&#8203;000;
}
```

##### Markdown: Preserve wiki links with aliases ([#&#8203;19527](prettier/prettier#19527) by [@&#8203;kovsu](https://github.com/kovsu))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
[[Foo:Bar]]

<!-- Prettier 3.9.4 -->
[[Foo]]

<!-- Prettier 3.9.5 -->
[[Foo:Bar]]
```

##### TypeScript: Fix comments being dropped on shorthand `type` import/export specifiers ([#&#8203;19565](prettier/prettier#19565) by [@&#8203;kirkwaiblinger](https://github.com/kirkwaiblinger))

<!-- prettier-ignore -->

```tsx
// Input
export { type /* comment */ T } from "foo";
import { type /* comment */ T } from "foo";

// Prettier 3.9.4
Error: Comment "comment" was not printed. Please report this error!

// Prettier 3.9.5
export { type /* comment */ T } from "foo";
import { type /* comment */ T } from "foo";
```

##### Miscellaneous: Preserving comments' `placement` property ([#&#8203;19567](prettier/prettier#19567) by [@&#8203;Janther](https://github.com/Janther))

Prettier@3.9.0 deleted an undocumented property on comments, which was already used by plugins, `comment.placement` is now available again after comment attach.

##### Flow: Stop enforcing empty module declaration to break ([#&#8203;19568](prettier/prettier#19568) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```flow
// Input
declare module "foo" {}

// Prettier 3.9.4
declare module "foo" {
}

// Prettier 3.9.5
declare module "foo" {}
```

##### Angular: Support expression for exhaustive typechecking ([#&#8203;19571](prettier/prettier#19571) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```html
<!-- Input -->
@&#8203;switch (state.mode) {
  @&#8203;default never(state);
}

<!-- Prettier 3.9.4 -->
@&#8203;switch (state.mode) {
  @&#8203;default never;
}

<!-- Prettier 3.9.5 -->
@&#8203;switch (state.mode) {
  @&#8203;default never(state);
}
```

##### TypeScript: Ignore comments inside mapped type when checking type parameter comments ([#&#8203;19572](prettier/prettier#19572) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```tsx
// Input
foo<{
  // comment
  [key in keyof Foo]: number
}>();

// Prettier 3.9.4
foo<
  {
    // comment
    [key in keyof Foo]: number;
  }
>();

// Prettier 3.9.5
foo<{
  // comment
  [key in keyof Foo]: number;
}>();
```

##### Less: Fix adjacent block comments being corrupted ([#&#8203;19574](prettier/prettier#19574) by [@&#8203;kovsu](https://github.com/kovsu))

<!-- prettier-ignore -->

```less
// Input
/* a *//* b */
/* a */* {
  color: red;
}

// Prettier 3.9.4
/* a */
/* b */
/* a * {
  color: red;
}

// Prettier 3.9.5
/* a */ /* b */
/* a */
* {
  color: red;
}
```

##### JavaScript: Handle dangling comments in `SwitchStatement` ([#&#8203;19581](prettier/prettier#19581) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```jsx
// Input
switch (foo) {
 // comment
}

// Prettier 3.9.4
switch (
  foo
  // comment
) {
}

// Prettier 3.9.5
switch (foo) {
  // comment
}
```

##### TypeScript: Remove space in comment-only object type ([#&#8203;19583](prettier/prettier#19583) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```tsx
// Input
var foo = {
  /* comment */
};
type Foo = {
  /* comment */
};

// Prettier 3.9.4
var foo = {/* comment */};
type Foo = { /* comment */ };

// Prettier 3.9.5
var foo = {/* comment */};
type Foo = {/* comment */};
```

### [`v3.9.4`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#394)

[Compare Source](prettier/prettier@3.9.3...3.9.4)

[diff](prettier/prettier@3.9.3...3.9.4)

##### Angular: Format `@content(name)` -> `@content (name)` to align with other block syntax ([#&#8203;19499](prettier/prettier#19499) by [@&#8203;fisker](https://github.com/fisker))

<!-- prettier-ignore -->

```html
<!-- Input -->
<FancyButton [label]="title">
  @&#8203;content (icon) {
    <span>Icon!</span>
  }
  @&#8203;content (description) {
    <span>Description text</span>
  }
  <span>Other children</span>
</FancyButton>

<!-- Prettier 3.9.3 -->
<FancyButton [label]="title">
  @&#8203;content(icon) {
    <span>Icon!</span>
  }
  @&#8203;content(description) {
    <span>Description text</span>
  }
  <span>Other children</span>
</FancyButton>

<!-- Prettier 3.9.4 -->
<FancyButton [label]="title">
  @&#8203;content (icon) {
    <span>Icon!</span>
  }
  @&#8203;content (description) {
    <span>Description text</span>
  }
  <span>Other children</span>
</FancyButton>
```

### [`v3.9.3`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#393)

[Compare Source](prettier/prettier@3.9.2...3.9.3)

[diff](prettier/prettier@3.9.1...3.9.3)

##### Markdown: Fix unexpected removal of characters in liquid syntax ([#&#8203;19489](prettier/prettier#19489) by [@&#8203;seiyab](https://github.com/seiyab))

<!-- prettier-ignore -->

```md
// Input
<!-- Input -->
{{ page.title
}} text

<!-- Prettier 3.9.1 -->
{{ page.title
 text

<!-- Prettier 3.9.3 -->
{{ page.title
}} text
```

##### TypeScript: Allow decorators to be used with declare on class fields ([#&#8203;19492](prettier/prettier#19492) by [@&#8203;evoactivity](https://github.com/evoactivity))

Extensively used within the Ember ecosystem, decorators with `declare` on class fields will ignore the babel parser error and allow Prettier to format the code without breaking it.

<!-- prettier-ignore -->

```ts
// Input
export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
  @&#8203;service declare server: ServerService;
}

// Prettier 3.9.1
// SyntaxError: Decorators can't be used with a declare field. (2:3)
//  1 | export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
//> 2 |   @&#8203;service declare server: ServerService;
//    |   ^
//  3 | }

// Prettier 3.9.3
export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
  @&#8203;service declare server: ServerService;
}
```

### [`v3.9.2`](prettier/prettier@3.9.1...3.9.2)

[Compare Source](prettier/prettier@3.9.1...3.9.2)

### [`v3.9.1`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#3910)

[Compare Source](prettier/prettier@3.9.0...3.9.1)

[diff](prettier/prettier@3.9.9...3.9.10)

##### Markdown: Update `micromark-extension-gfm-table` to fix the table parse issue on performance ([#&#8203;20266](prettier/prettier#20266) by [@&#8203;fisker](https://github.com/fisker))

See micromark/micromark-extension-gfm-table@4f43ead for details.

### [`v3.9.0`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#390)

[Compare Source](prettier/prettier@3.8.5...3.9.0)

[diff](prettier/prettier@3.8.5...3.9.0)

🔗 [Release Notes](https://prettier.io/blog/2026/06/27/3.9.0)

### [`v3.8.5`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#385)

[Compare Source](prettier/prettier@3.8.4...3.8.5)

[diff](prettier/prettier@3.8.4...3.8.5)

##### Flow: Support `readonly` as a variance annotation ([#&#8203;19022](prettier/prettier#19022) by [@&#8203;marcoww6](https://github.com/marcoww6))

Flow now accepts `readonly` as a property variance annotation, equivalent to `+` (covariant/read-only).

<!-- prettier-ignore -->

```jsx
// Input
type T = {
  readonly foo: string,
};

// Prettier 3.8.4
SyntaxError

// Prettier 3.8.5
type T = {
  readonly foo: string,
};
```

### [`v3.8.4`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#384)

[Compare Source](prettier/prettier@3.8.3...3.8.4)

[diff](prettier/prettier@3.8.3...3.8.4)

##### Markdown: Fix blank lines between list items and nested sub-lists being removed in Markdown/MDX ([#&#8203;17746](prettier/prettier#17746) by [@&#8203;byplayer](https://github.com/byplayer))

Prettier was removing blank lines between list items and their nested sub-lists, converting loose lists into tight lists and changing their semantic meaning.

<!-- prettier-ignore -->

```markdown
<!-- Input -->
- a

  - b

- c

  - d

<!-- Prettier 3.8.3 -->
- a
  - b
- c
  - d

<!-- Prettier 3.8.4 -->
- a

  - b

- c

  - d
```

</details>

<details>
<summary>stylelint/stylelint (stylelint)</summary>

### [`v17.16.0`](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17160---2026-10-01)

[Compare Source](stylelint/stylelint@17.15.0...17.16.0)

It fixes 2 bugs in the `layout-mappings` rules. This will likely be the last `17.x` release, as we prepare for `18.0.0`.

- Fixed: `property-layout-mappings` and `unit-layout-mappings` false negatives for uppercase property names and units ([#&#8203;9485](stylelint/stylelint#9485)) ([@&#8203;giaBaoJS](https://github.com/giaBaoJS)).
- Fixed: `value-keyword-layout-mappings` false positives for `caption-side` ([#&#8203;9483](stylelint/stylelint#9483)) ([@&#8203;giaBaoJS](https://github.com/giaBaoJS)).

### [`v17.15.0`](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17150---2026-09-04)

[Compare Source](stylelint/stylelint@17.14.1...17.15.0)

It adds 1 new rule and 2 new rule options, and fixes 4 bugs.

- Added: `selector-no-unmatchable` rule ([#&#8203;9451](stylelint/stylelint#9451)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Added: `ignoreFunctions: []` to `color-named` and `color-no-hex` ([#&#8203;9463](stylelint/stylelint#9463)) ([@&#8203;jsmitty12](https://github.com/jsmitty12)).
- Fixed: `custom-property-no-missing-var-function` false positives for anchor positioning ([#&#8203;9466](stylelint/stylelint#9466)) ([@&#8203;giaBaoJS](https://github.com/giaBaoJS)).
- Fixed: `declaration-block-no-redundant-longhand-properties` autofix for `font` shorthand ([#&#8203;9402](stylelint/stylelint#9402)) ([@&#8203;sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `declaration-property-max-values` false positives for interpolated inline expressions ([#&#8203;9437](stylelint/stylelint#9437)) ([@&#8203;alexchen-sys](https://github.com/alexchen-sys)).
- Fixed: `selector-no-invalid` false negatives for pseudo-elements, combinators and nested `:has()` ([#&#8203;9452](stylelint/stylelint#9452)) ([@&#8203;jeddy3](https://github.com/jeddy3)).

### [`v17.14.1`](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17141---2026-07-20)

[Compare Source](stylelint/stylelint@17.14.0...17.14.1)

It fixes 4 bugs.

- Fixed: `quiet` option suppresses `report*` warning reports ([#&#8203;9387](stylelint/stylelint#9387)) ([@&#8203;ychampion](https://github.com/ychampion)).
- Fixed: reported range of unknown rules ([#&#8203;9385](stylelint/stylelint#9385)) ([@&#8203;ybiquitous](https://github.com/ybiquitous)).
- Fixed: `declaration-block-no-redundant-longhand-properties` autofix producing invalid `background` shorthand when `background-size` is present ([#&#8203;9364](stylelint/stylelint#9364)) ([@&#8203;sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `rule-empty-line-before` false positives for shared-line comments with `except: ["after-single-line-comment"]` ([#&#8203;9394](stylelint/stylelint#9394)) ([@&#8203;sarathfrancis90](https://github.com/sarathfrancis90)).

### [`v17.14.0`](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17140---2026-06-25)

[Compare Source](stylelint/stylelint@17.13.0...17.14.0)

It fixes 3 bugs, including a false negative one.

- Fixed: performance of getting module paths ([#&#8203;9354](stylelint/stylelint#9354)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Fixed: performance by dynamically importing `TIMING` only on use ([#&#8203;9356](stylelint/stylelint#9356)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Fixed: `function-calc-no-unspaced-operator` false negatives for unspaced `+` and `-` operators following a `*` or `/` operator ([#&#8203;9357](stylelint/stylelint#9357)) ([@&#8203;sarathfrancis90](https://github.com/sarathfrancis90)).

### [`v17.13.0`](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#17130---2026-06-06)

[Compare Source](stylelint/stylelint@17.12.0...17.13.0)

It fixes 3 bugs, including a false negative one.

- Fixed: `declaration-block-no-duplicate-properties` false negatives for interleaved non-consecutive duplicates with `ignore: ["consecutive-duplicates(-*)"]` ([#&#8203;9324](stylelint/stylelint#9324)) ([@&#8203;sarathfrancis90](https://github.com/sarathfrancis90)).
- Fixed: `selector-max-type` false positives for nested selectors ([#&#8203;9319](stylelint/stylelint#9319)) ([@&#8203;romainmenke](https://github.com/romainmenke)).
- Fixed: `selector-type-no-unknown` false positives for `install` ([#&#8203;9308](stylelint/stylelint#9308)) ([@&#8203;Mouvedia](https://github.com/Mouvedia)).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS42MS4wIiwidXBkYXRlZEluVmVyIjoiNDEuNjEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: https://git.robbevp.be/robbevp/website-robbevanpetegem/pulls/511
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants