Skip to content

merge release-9.0.1 - #31409

Merged
thetaPC merged 17 commits into
9.0.xfrom
release-9.0.1
Aug 26, 2026
Merged

merge release-9.0.1#31409
thetaPC merged 17 commits into
9.0.xfrom
release-9.0.1

Conversation

@thetaPC

@thetaPC thetaPC commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Release 9.0.1

ShaneK and others added 17 commits August 19, 2026 19:37
Issue number: internal

---------

## What is the current behavior?

Currently, core builds with `target: es2022` and no
`useDefineForClassFields` setting, so TypeScript defaults it to `true`
and emits every `@Prop` default as a class field instead of a
constructor assignment. Stencil proxies props onto the component
prototype as getter/setter pairs, and its setter returns early when the
host ref isn't registered yet. An app that downlevels those class fields
hoists the initializers above `registerInstance()`, so the setter drops
every default.

That happens in any Stencil app importing `@ionic/core` with a target
below es2022, since the app re-transpiles core.

## What is the new behavior?

Setting `useDefineForClassFields: false` restores the emit v8 shipped:
`registerInstance()` runs first, then the defaults assign through
Stencil's setter. There's nothing left for a downstream bundler to
hoist, so the defaults survive whatever target the app uses. Every
output target picks it up.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

Regression from #31280, which moved core to `target: es2022` and flipped
the TypeScript default.

Brandy hit it on [the docs-demo v9
update](ionic-team/docs-demo#179), where the
Input OTP page renders an empty group. I packed this build into that
branch with no docs-demo changes and the boxes come back.

I put the flag in `core/tsconfig.json` rather than the shared
`tsconfig.base.json`, so the six packages extending the base emit the
same bytes as before.

I didn't add a test. It only breaks in a downstream build, so covering
it means asserting on the shape of core's emitted output, which we don't
do anywhere. Happy to add something if you'd rather have one.
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-node](https://redirect.github.com/actions/setup-node) |
action | major | `v6.4.0` → `v7.0.0` |

---

### Release Notes

<details>
<summary>actions/setup-node (actions/setup-node)</summary>

###
[`v7.0.0`](https://redirect.github.com/actions/setup-node/releases/tag/v7.0.0)

[Compare
Source](https://redirect.github.com/actions/setup-node/compare/v7.0.0...v7.0.0)

##### What's Changed

##### Enhancements:

- Add cache-primary-key and cache-matched-key as outputs by
[@&#8203;gowridurgad](https://redirect.github.com/gowridurgad) in
[#&#8203;1577](https://redirect.github.com/actions/setup-node/pull/1577)
- Migrate to ESM and upgrade dependencies by
[@&#8203;gowridurgad](https://redirect.github.com/gowridurgad) in
[#&#8203;1574](https://redirect.github.com/actions/setup-node/pull/1574)

##### Bug fixes:

- Remove dummy NODE\_AUTH\_TOKEN export by
[@&#8203;gowridurgad](https://redirect.github.com/gowridurgad) in
[#&#8203;1558](https://redirect.github.com/actions/setup-node/pull/1558)
- Only use `mirrorToken` in `getManifest` if it's provided by
[@&#8203;deiga](https://redirect.github.com/deiga) in
[#&#8203;1548](https://redirect.github.com/actions/setup-node/pull/1548)

##### Documentation updates:

- Add documentation for publishing to npm with Trusted Publisher (OIDC)
by
[@&#8203;chiranjib-swain](https://redirect.github.com/chiranjib-swain)
in
[#&#8203;1536](https://redirect.github.com/actions/setup-node/pull/1536)
- docs: Update restore-only cache documentation by
[@&#8203;priya-kinthali](https://redirect.github.com/priya-kinthali) in
[#&#8203;1550](https://redirect.github.com/actions/setup-node/pull/1550)
- docs: Update caching recommendations to mitigate cache poisoning risks
by
[@&#8203;chiranjib-swain](https://redirect.github.com/chiranjib-swain)
in
[#&#8203;1567](https://redirect.github.com/actions/setup-node/pull/1567)

##### Dependency update:

- Upgrade
[@&#8203;actions/cache](https://redirect.github.com/actions/cache) to
5.1.0, log cache write denied by
[@&#8203;jasongin](https://redirect.github.com/jasongin) in
[#&#8203;1569](https://redirect.github.com/actions/setup-node/pull/1569)

##### New Contributors

- [@&#8203;chiranjib-swain](https://redirect.github.com/chiranjib-swain)
made their first contribution in
[#&#8203;1536](https://redirect.github.com/actions/setup-node/pull/1536)
- [@&#8203;deiga](https://redirect.github.com/deiga) made their first
contribution in
[#&#8203;1548](https://redirect.github.com/actions/setup-node/pull/1548)
- [@&#8203;jasongin](https://redirect.github.com/jasongin) made their
first contribution in
[#&#8203;1569](https://redirect.github.com/actions/setup-node/pull/1569)

**Full Changelog**:
<actions/setup-node@v6...v7.0.0>

###
[`v7`](https://redirect.github.com/actions/setup-node/compare/v6.5.0...v7.0.0)

[Compare
Source](https://redirect.github.com/actions/setup-node/compare/v6.5.0...v7.0.0)

###
[`v6.5.0`](https://redirect.github.com/actions/setup-node/releases/tag/v6.5.0)

[Compare
Source](https://redirect.github.com/actions/setup-node/compare/v6.4.0...v6.5.0)

##### What's Changed

- Update
[@&#8203;actions/cache](https://redirect.github.com/actions/cache) to
5.1.0 and add security overrides for undici and fast-xml-parser by
[@&#8203;HarithaVattikuti](https://redirect.github.com/HarithaVattikuti)
in
[#&#8203;1579](https://redirect.github.com/actions/setup-node/pull/1579)

**Full Changelog**:
<actions/setup-node@v6.4.0...v6.5.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

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

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

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

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMy4yIiwidXBkYXRlZEluVmVyIjoiNDQuMzMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | patch | `v7.0.0` → `v7.0.1` |

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

###
[`v7.0.1`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v701)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v7...v7.0.1)

- Bump github/codeql-action from 3 to 4 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2475](https://redirect.github.com/actions/checkout/pull/2475)
- Bump actions/setup-node from 4 to 6 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2477](https://redirect.github.com/actions/checkout/pull/2477)
- Bump docker/build-push-action from 6.5.0 to 7.2.0 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2478](https://redirect.github.com/actions/checkout/pull/2478)
- Bump docker/login-action from 3.3.0 to 4.2.0 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2479](https://redirect.github.com/actions/checkout/pull/2479)
- Bump actions/checkout from 6 to 7 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2488](https://redirect.github.com/actions/checkout/pull/2488)
- Bump actions/upload-artifact from 4 to 7 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2476](https://redirect.github.com/actions/checkout/pull/2476)
- eslint 9 by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2474](https://redirect.github.com/actions/checkout/pull/2474)
- Bump the minor-actions-dependencies group with 2 updates by
[@&#8203;dependabot](https://redirect.github.com/dependabot)\[bot] in
[#&#8203;2499](https://redirect.github.com/actions/checkout/pull/2499)
- skip running unsafe pr check if input is default by
[@&#8203;aiqiaoy](https://redirect.github.com/aiqiaoy) in
[#&#8203;2518](https://redirect.github.com/actions/checkout/pull/2518)
- trim only ascii whitespace for branch by
[@&#8203;aiqiaoy](https://redirect.github.com/aiqiaoy) in
[#&#8203;2521](https://redirect.github.com/actions/checkout/pull/2521)
- escape values passed to --unset by
[@&#8203;aiqiaoy](https://redirect.github.com/aiqiaoy) in
[#&#8203;2530](https://redirect.github.com/actions/checkout/pull/2530)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

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

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

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

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMy4yIiwidXBkYXRlZEluVmVyIjoiNDQuMzMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [ts-morph](https://redirect.github.com/dsherret/ts-morph) | [`^25.0.0`
→ `^28.0.0`](https://renovatebot.com/diffs/npm/ts-morph/25.0.1/28.0.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/ts-morph/28.0.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/ts-morph/25.0.1/28.0.0?slim=true)
|

---

### Release Notes

<details>
<summary>dsherret/ts-morph (ts-morph)</summary>

###
[`v28.0.0`](https://redirect.github.com/dsherret/ts-morph/releases/tag/28.0.0)

[Compare
Source](https://redirect.github.com/dsherret/ts-morph/compare/27.0.2...28.0.0)

#### What's Changed

- feat(BREAKING): TypeScript 6.0 by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1669](https://redirect.github.com/dsherret/ts-morph/pull/1669)
- feat: standalone `printStructure` function by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1670](https://redirect.github.com/dsherret/ts-morph/pull/1670)
- fix: `InvalidOperationError` in `addTypeArgument` by
[@&#8203;jfirebaugh](https://redirect.github.com/jfirebaugh) in
[#&#8203;1663](https://redirect.github.com/dsherret/ts-morph/pull/1663)

Note there are some breaking changes due to TypeScript 6.0. Read more
here:
<https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/>

As part of this release, structures can now be printed to a string using
the `printStructure` function.

```ts
import { printStructure, StructureKind } from "ts-morph";

const code = printStructure({
  kind: StructureKind.Class,
  name: "MyClass",
  isExported: true,
  properties: [{ name: "myProp", type: "string" }],
  methods: [{
    name: "myMethod",
    parameters: [{ name: "param", type: "number" }],
    returnType: "void",
  }],
});
console.log(code);
```

Outputs:

```ts
export class MyClass {
  myProp: string;

  myMethod(param: number): void {
  }
}
```

#### New Contributors

- [@&#8203;jfirebaugh](https://redirect.github.com/jfirebaugh) made
their first contribution in
[#&#8203;1663](https://redirect.github.com/dsherret/ts-morph/pull/1663)

**Full Changelog**:
<dsherret/ts-morph@27.0.2...28.0.0>

###
[`v27.0.2`](https://redirect.github.com/dsherret/ts-morph/releases/tag/27.0.2)

[Compare
Source](https://redirect.github.com/dsherret/ts-morph/compare/27.0.0...27.0.2)

#### What's Changed

- Fixes the npm publish in order to get the fixes in from 27.0.1
- fix: browser support no longer working since
[#&#8203;1628](https://redirect.github.com/dsherret/ts-morph/pull/1628)
in 26.0.0 due to missing browser fields by
[@&#8203;BossSloth](https://redirect.github.com/BossSloth) in
[#&#8203;1654](https://redirect.github.com/dsherret/ts-morph/pull/1654)

**Full Changelog**:
<dsherret/ts-morph@27.0.1...27.0.2>

###
[`v27.0.0`](https://redirect.github.com/dsherret/ts-morph/releases/tag/27.0.0)

[Compare
Source](https://redirect.github.com/dsherret/ts-morph/compare/26.0.0...27.0.0)

#### What's Changed

- perf: switch to tinyglobby by
[@&#8203;benmccann](https://redirect.github.com/benmccann) in
[#&#8203;1635](https://redirect.github.com/dsherret/ts-morph/pull/1635)
- fix: re-export StandardizedFilePath from
[@&#8203;ts-morph/common](https://redirect.github.com/ts-morph/common)
by [@&#8203;kronodeus](https://redirect.github.com/kronodeus) in
[#&#8203;1637](https://redirect.github.com/dsherret/ts-morph/pull/1637)
- chore: fix ci by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1645](https://redirect.github.com/dsherret/ts-morph/pull/1645)
- feat: `TypeChecker` - add `getAwaitedType` by
[@&#8203;JHawk0224](https://redirect.github.com/JHawk0224) in
[#&#8203;1643](https://redirect.github.com/dsherret/ts-morph/pull/1643)
- feat: TypeScript 5.9 by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1646](https://redirect.github.com/dsherret/ts-morph/pull/1646)
- feat: wrap OptionalTypeNode by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1647](https://redirect.github.com/dsherret/ts-morph/pull/1647)
- feat: wrap `JSDocImportTag` by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1648](https://redirect.github.com/dsherret/ts-morph/pull/1648)
- fix: remove invalid sourceMappingURL from build output by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1649](https://redirect.github.com/dsherret/ts-morph/pull/1649)
- feat: ability to add and remove the defer keyword in imports by
[@&#8203;dsherret](https://redirect.github.com/dsherret) in
[#&#8203;1651](https://redirect.github.com/dsherret/ts-morph/pull/1651)

#### New Contributors

- [@&#8203;JHawk0224](https://redirect.github.com/JHawk0224) made their
first contribution in
[#&#8203;1643](https://redirect.github.com/dsherret/ts-morph/pull/1643)

**Full Changelog**:
<dsherret/ts-morph@26.0.0...27.0.0>

###
[`v26.0.0`](https://redirect.github.com/dsherret/ts-morph/releases/tag/26.0.0)

[Compare
Source](https://redirect.github.com/dsherret/ts-morph/compare/25.0.1...26.0.0)

#### What's Changed

- feat: TypeScript 5.8
[#&#8203;1628](https://redirect.github.com/dsherret/ts-morph/pull/1628)
- fix: Improve comma appending logic to handle nested template literals
correctly by [@&#8203;kingston](https://redirect.github.com/kingston) in
[#&#8203;1630](https://redirect.github.com/dsherret/ts-morph/pull/1630)
- fix(bootstrap): ignore dist-deno folder for npm publish
[#&#8203;1610](https://redirect.github.com/dsherret/ts-morph/pull/1610)
- feat: `npm publish` with provenance
[#&#8203;1634](https://redirect.github.com/dsherret/ts-morph/pull/1634)

#### New Contributors

- [@&#8203;kingston](https://redirect.github.com/kingston) made their
first contribution in
[#&#8203;1630](https://redirect.github.com/dsherret/ts-morph/pull/1630)

**Full Changelog**:
<dsherret/ts-morph@25.0.1...26.0.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

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

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

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

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMy4yIiwidXBkYXRlZEluVmVyIjoiNDQuMzMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Issue number: resolves #31376

---------

## What is the current behavior?

Currently, `ion-refresher` reads its `slot` attribute in
`connectedCallback` and gives up if it isn't `fixed`. In v9
`@ionic/react` uses the custom elements build, so `connectedCallback`
runs while the element is still being inserted, which is before React
assigns the slot. The check fails on perfectly correct markup, logs the
"Make sure you use" error, and the pull-to-refresh gesture never gets
created. This affects React 18 and 19.

## What is the new behavior?

The check now runs in `componentWillLoad`, which is late enough that
frameworks have assigned the slot, but still before rendering puts
`slot="fixed"` on the host. Gesture setup no longer bails, so the
refresher works whether the slot is in the markup or arrives later, and
correctly written React apps stop logging the error. Markup that
genuinely omits the slot still gets it.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

Current dev build:
```
9.0.1-dev.11787177893.1979eb13
```
Issue number: internal

---------

## What is the current behavior?

`StackManager.transitionPage()` clones the leaving page on same-view
transitions (`/user/1` to `/user/2`) so `commit()` gets a leaving
element distinct from the entering one. It clones even when nothing will
animate, which duplicates the page in the DOM for the length of the
commit. Playwright locators then resolve to two elements and fail on a
strict mode violation, which randomly fails CI and appears as a flake.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

The clone is gated on whether `commit()` will actually animate,
mirroring the check `ion-router-outlet` makes. When it won't, `commit()`
gets `undefined` for the leaving element, which it already handles, and
no duplicate reaches the DOM. Two regression tests record the peak
number of matching pages across a navigation so a reappearing duplicate
fails directly instead of surfacing as a flake.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

## Other information

The duplicate was never visible on screen. With animations off the clone
is attached for about 5ms without crossing a frame boundary, and with
animations on it carries `ion-page-invisible` (opacity 0) until
`afterTransition`, which runs just before it's removed. This is a
DOM-level fix, not a rendering one.
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@capacitor/core](https://capacitorjs.com)
([source](https://redirect.github.com/ionic-team/capacitor)) | [`8.3.4`
→
`8.5.0`](https://renovatebot.com/diffs/npm/@capacitor%2fcore/8.3.4/8.5.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@capacitor%2fcore/8.5.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@capacitor%2fcore/8.3.4/8.5.0?slim=true)
|
|
[@capacitor/status-bar](https://redirect.github.com/ionic-team/capacitor-plugins)
| [`8.0.2` →
`8.0.3`](https://renovatebot.com/diffs/npm/@capacitor%2fstatus-bar/8.0.2/8.0.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@capacitor%2fstatus-bar/8.0.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@capacitor%2fstatus-bar/8.0.2/8.0.3?slim=true)
|

---

### Release Notes

<details>
<summary>ionic-team/capacitor (@&#8203;capacitor/core)</summary>

###
[`v8.5.0`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#850-2026-07-31)

[Compare
Source](https://redirect.github.com/ionic-team/capacitor/compare/8.4.2...8.5.0)

##### Bug Fixes

- **cli:** support TypeScript 7 when loading capacitor.config.ts
([#&#8203;8534](https://redirect.github.com/ionic-team/capacitor/issues/8534))
([4c1c870](https://redirect.github.com/ionic-team/capacitor/commit/4c1c8709413b9c19b008c99122ca330cc3c90e6f))

##### Features

- **cli:** add migrator functionality for adopting UIScene
([#&#8203;8544](https://redirect.github.com/ionic-team/capacitor/issues/8544))
([984fa85](https://redirect.github.com/ionic-team/capacitor/commit/984fa85ba0adab0aacf895aed6323bf4b503dccb))
- **ios:** UIScene Support
([#&#8203;8536](https://redirect.github.com/ionic-team/capacitor/issues/8536))
([3fa04a3](https://redirect.github.com/ionic-team/capacitor/commit/3fa04a357c92af34cd6fccb8124791963804a9dc))

####
[8.4.2](https://redirect.github.com/ionic-team/capacitor/compare/8.4.1...8.4.2)
(2026-07-14)

##### Bug Fixes

- **android:** explicitly grant URI permissions for image capture intent
([#&#8203;8526](https://redirect.github.com/ionic-team/capacitor/issues/8526))
([6f2d328](https://redirect.github.com/ionic-team/capacitor/commit/6f2d3283897a375d09ca9ec8784a9f0d65f0a530))

####
[8.4.1](https://redirect.github.com/ionic-team/capacitor/compare/8.4.0...8.4.1)
(2026-06-19)

##### Bug Fixes

- **cli:** make SPM dependency patch work on prereleases
([#&#8203;8508](https://redirect.github.com/ionic-team/capacitor/issues/8508))
([6048e90](https://redirect.github.com/ionic-team/capacitor/commit/6048e90171afa0229a3c25b52a23c377c6bb804c))
- **cli:** patch Capacitor SPM dependency version in plugins
([#&#8203;8492](https://redirect.github.com/ionic-team/capacitor/issues/8492))
([28bb2c6](https://redirect.github.com/ionic-team/capacitor/commit/28bb2c687069dfdd6aa7abc866004a1c6388d103))

###
[`v8.4.2`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#842-2026-07-14)

[Compare
Source](https://redirect.github.com/ionic-team/capacitor/compare/8.4.1...8.4.2)

##### Bug Fixes

- **android:** explicitly grant URI permissions for image capture intent
([#&#8203;8526](https://redirect.github.com/ionic-team/capacitor/issues/8526))
([6f2d328](https://redirect.github.com/ionic-team/capacitor/commit/6f2d3283897a375d09ca9ec8784a9f0d65f0a530))

###
[`v8.4.1`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#841-2026-06-19)

[Compare
Source](https://redirect.github.com/ionic-team/capacitor/compare/8.4.0...8.4.1)

##### Bug Fixes

- **cli:** make SPM dependency patch work on prereleases
([#&#8203;8508](https://redirect.github.com/ionic-team/capacitor/issues/8508))
([6048e90](https://redirect.github.com/ionic-team/capacitor/commit/6048e90171afa0229a3c25b52a23c377c6bb804c))
- **cli:** patch Capacitor SPM dependency version in plugins
([#&#8203;8492](https://redirect.github.com/ionic-team/capacitor/issues/8492))
([28bb2c6](https://redirect.github.com/ionic-team/capacitor/commit/28bb2c687069dfdd6aa7abc866004a1c6388d103))

###
[`v8.4.0`](https://redirect.github.com/ionic-team/capacitor/blob/HEAD/CHANGELOG.md#840-2026-06-02)

[Compare
Source](https://redirect.github.com/ionic-team/capacitor/compare/8.3.4...8.4.0)

##### Bug Fixes

- **android:** show only the requested system bar
([#&#8203;8480](https://redirect.github.com/ionic-team/capacitor/issues/8480))
([4c6c321](https://redirect.github.com/ionic-team/capacitor/commit/4c6c3219afb5223211e857457e46283c37eb9424))
- **cli:** revert live reload config on failure
([#&#8203;8485](https://redirect.github.com/ionic-team/capacitor/issues/8485))
([1d031a4](https://redirect.github.com/ionic-team/capacitor/commit/1d031a4abec2c793079ba8897ad2e40c4cc6c7f9))
- **SystemBars:** make `safe-area-inset-x` available on API <= 34
([#&#8203;8424](https://redirect.github.com/ionic-team/capacitor/issues/8424))
([e456de0](https://redirect.github.com/ionic-team/capacitor/commit/e456de083e19644f484bec5a5359cb67960ac8bc))
- **SystemBars:** respect `insetsHandling` disable
([#&#8203;8481](https://redirect.github.com/ionic-team/capacitor/issues/8481))
([d4ad7ff](https://redirect.github.com/ionic-team/capacitor/commit/d4ad7ffe39daf66e0cfc63af9028d5c05543bde7))

##### Features

- add method getDouble to plugin config
([#&#8203;7638](https://redirect.github.com/ionic-team/capacitor/issues/7638))
([93c72de](https://redirect.github.com/ionic-team/capacitor/commit/93c72de40a2ec4c78b33659250cb08340083088e))
- **cli:** add experimental packageOptions
([#&#8203;8471](https://redirect.github.com/ionic-team/capacitor/issues/8471))
([258867b](https://redirect.github.com/ionic-team/capacitor/commit/258867b7bf37b1837b99b02ec9638e5a6df08d97))
- **cli:** capture ios\_package\_manager in telemetry
([#&#8203;8482](https://redirect.github.com/ionic-team/capacitor/issues/8482))
([b4b297a](https://redirect.github.com/ionic-team/capacitor/commit/b4b297a52f8732659662d5e5aaeff81c0f7d9835))

####
[8.3.4](https://redirect.github.com/ionic-team/capacitor/compare/8.3.3...8.3.4)
(2026-05-12)

**Note:** Version bump only for package capacitor

####
[8.3.3](https://redirect.github.com/ionic-team/capacitor/compare/8.3.2...8.3.3)
(2026-05-08)

##### Bug Fixes

- **cli:** copy plugin files in CocoaPods projects
([#&#8203;8467](https://redirect.github.com/ionic-team/capacitor/issues/8467))
([b2d7719](https://redirect.github.com/ionic-team/capacitor/commit/b2d771926a180e60deea31992d7d4abcd5ca3bc7))

####
[8.3.2](https://redirect.github.com/ionic-team/capacitor/compare/8.3.1...8.3.2)
(2026-05-07)

##### Bug Fixes

- **cli:** add cSettings support for compiler flags in generated
Package.swift
([#&#8203;8448](https://redirect.github.com/ionic-team/capacitor/issues/8448))
([0bd0676](https://redirect.github.com/ionic-team/capacitor/commit/0bd0676315c5fd77e50312dd7b5bf4990dcbd7d0))
- **cli:** add system framework and weak framework support in SPM
Package.swift
([#&#8203;8447](https://redirect.github.com/ionic-team/capacitor/issues/8447))
([3232f0f](https://redirect.github.com/ionic-team/capacitor/commit/3232f0fe1d9811b0b5c500e3dc05cb8a250177f8))
- **cli:** correct Capacitor plugin SPM compat check
([#&#8203;8440](https://redirect.github.com/ionic-team/capacitor/issues/8440))
([e5ccc45](https://redirect.github.com/ionic-team/capacitor/commit/e5ccc451dda27d56bca824ed644bd20fe4d988cb))
- **cli:** generate binaryTarget entries for custom xcframeworks in
Package.swift
([#&#8203;8445](https://redirect.github.com/ionic-team/capacitor/issues/8445))
([1f7e33f](https://redirect.github.com/ionic-team/capacitor/commit/1f7e33fca43d183332ec19d22b0d75ef81d8cc6d))
- **cli:** generate resource entries in Package.swift
([#&#8203;8455](https://redirect.github.com/ionic-team/capacitor/issues/8455))
([790bd27](https://redirect.github.com/ionic-team/capacitor/commit/790bd27123497111984227010c3162cec94a108e))
- **cli:** handle Cordova plugins without iOS source files
([#&#8203;8443](https://redirect.github.com/ionic-team/capacitor/issues/8443))
([0da130e](https://redirect.github.com/ionic-team/capacitor/commit/0da130eb7a861bee4e2c35bc0aac53ba9c983fc3))
- **cli:** link plugin dependencies in Package.swift
([#&#8203;8457](https://redirect.github.com/ionic-team/capacitor/issues/8457))
([b3c769e](https://redirect.github.com/ionic-team/capacitor/commit/b3c769e856c826b1174518877cf86ac7ce73bf09))
- **ios:** support Cordova plugins with Package.swift
([#&#8203;8438](https://redirect.github.com/ionic-team/capacitor/issues/8438))
([139943b](https://redirect.github.com/ionic-team/capacitor/commit/139943b0c05fddb2d1ce2d6f468800fddf17b4cf))
- **SystemBars:** avoid extra view padding on API <= 34
([#&#8203;8439](https://redirect.github.com/ionic-team/capacitor/issues/8439))
([5b135a7](https://redirect.github.com/ionic-team/capacitor/commit/5b135a70217be560e7176c8d5b514cc92ed3e4e4))

####
[8.3.1](https://redirect.github.com/ionic-team/capacitor/compare/8.3.0...8.3.1)
(2026-04-16)

##### Bug Fixes

- **android:** handle null versionName in isNewBinary()
([#&#8203;8397](https://redirect.github.com/ionic-team/capacitor/issues/8397))
([aa1a660](https://redirect.github.com/ionic-team/capacitor/commit/aa1a660f364f9b5f5a1e350e279c8864b04dd13b))
- boundary value extraction for form-data requests
([#&#8203;7518](https://redirect.github.com/ionic-team/capacitor/issues/7518))
([64ab854](https://redirect.github.com/ionic-team/capacitor/commit/64ab854c12330804c24275d88d3a9f7c8e52a73d))
- **cli:** check CAPACITOR\_COCOAPODS\_PATH in determinePackageManager
([#&#8203;8407](https://redirect.github.com/ionic-team/capacitor/issues/8407))
([acb64ab](https://redirect.github.com/ionic-team/capacitor/commit/acb64ab92a37ff53701cde453558e272e2e11eb6))
- **system-bars:** use separate current styles
([#&#8203;8409](https://redirect.github.com/ionic-team/capacitor/issues/8409))
([3d1f8d1](https://redirect.github.com/ionic-team/capacitor/commit/3d1f8d1b61480187375f5cd4de7ba999db007542))

</details>

<details>
<summary>ionic-team/capacitor-plugins
(@&#8203;capacitor/status-bar)</summary>

###
[`v8.0.3`](https://redirect.github.com/ionic-team/capacitor-plugins/releases/tag/%40capacitor/status-bar%408.0.3)

[Compare
Source](https://redirect.github.com/ionic-team/capacitor-plugins/compare/@capacitor/status-bar@8.0.2...@capacitor/status-bar@8.0.3)

**Note:** Version bump only for package
[@&#8203;capacitor/status-bar](https://redirect.github.com/capacitor/status-bar)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

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

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

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

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zMy4yIiwidXBkYXRlZEluVmVyIjoiNDQuMzMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
… them (#31391)

Issue number: resolves #31388

---------

## What is the current behavior?

Currently, `ion-item-sliding` reads `side` off each `ion-item-options`
in `connectedCallback`. It only waits for the option first if the
element has a `componentOnReady` method, and the custom elements build
doesn't add one, so it reads straight away and every option comes back
as the default `end`. In v9 React that means `side="start"` options
can't be swiped open.

There's the same problem in `ion-segment-button`, where the check that
stops a button tied to an `ion-segment-content` from being disabled also
runs in `connectedCallback`, before `contentId` or `disabled` exist.

Both come from `@ionic/react` v9 going through `@lit/react`, which
assigns element props in a `useLayoutEffect` after React commits the
DOM.

## What is the new behavior?

Now `updateOptions` waits for every `ion-item-options` through the
`componentOnReady` helper before reading `side`. The helper waits a
frame in the custom elements build, which is after the props land, and
is unchanged in the lazy build. That also drops the repo's only
`eslint-disable custom-rules/no-component-on-ready-method`, since
bypassing the helper was the bug.

The `ion-segment-button` check moved to `componentWillLoad`, and it now
also requires the parent segment to be enabled. A disabled `ion-segment`
pushes `disabled` onto its buttons through `updateState`, which is why
the check used to run first, and without the new condition the fix
force-enables every button inside `<ion-segment disabled>`.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

I swept every core component with a `connectedCallback` for this pattern
and only these two break, the rest self-heal through a `@Watch` or an
existing `await`. Only `ion-radio-group` drifts, cosmetically, and I
left it alone.

The real fix isn't in core. If `@stencil/react-output-target` passed
serializable props through `React.createElement` the way the v8 wrapper
did, they'd be set before insertion and none of this would reach
`connectedCallback` late. Could be worth trying to fix there for later.

## Current Dev Build
```
9.0.1-dev.11787248963.10a00c73
```
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [vitest](https://vitest.dev)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest))
| [`^3.0.0` →
`^4.0.0`](https://renovatebot.com/diffs/npm/vitest/3.2.7/4.1.11) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/4.1.11?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/3.2.7/4.1.11?slim=true)
|

---

### Release Notes

<details>
<summary>vitest-dev/vitest (vitest)</summary>

###
[`v4.1.11`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.11)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.10...v4.1.11)

#####    🐞 Bug Fixes

- Revive global concurrency limit for test lifecycle \[backport to v4]
 -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va)
and [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10992](https://redirect.github.com/vitest-dev/vitest/issues/10992)
[<samp>(5146d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5146df80b)
- **browser**:
- Encode iframeId in tester iframe URL \[backport to v4]  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va),
**Pduhard** and **Claude Opus 4.8** in
[#&#8203;10955](https://redirect.github.com/vitest-dev/vitest/issues/10955)
[<samp>(10b2c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/10b2cd201)
- Trigger playwright/chromium gc on lower disk availability \[backport
to v4]  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa),
**Hiroshi Ogawa** and **OpenCode** in
[#&#8203;10951](https://redirect.github.com/vitest-dev/vitest/issues/10951)
[<samp>(9851d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9851dbc41)
- **mocker**:
- Restrict redirect mocks to the fs allowlist \[backport to v4]  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10974](https://redirect.github.com/vitest-dev/vitest/issues/10974)
[<samp>(fe5a1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fe5a11d3c)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.10...v4.1.11)

###
[`v4.1.10`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.10)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.9...v4.1.10)

#####    🐞 Bug Fixes

- **browser**: Check fs access in builtin commands \[backport to v4]  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Hiroshi
Ogawa** and **OpenCode (claude-opus-4-8)** in
[#&#8203;10680](https://redirect.github.com/vitest-dev/vitest/issues/10680)
[<samp>(5c18d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5c18dd267)
- **vm**: Fix external module resolve error with deps optimizer query
for encoded URI \[backport to v4]  -  by
[@&#8203;SveLil](https://redirect.github.com/SveLil) and
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10661](https://redirect.github.com/vitest-dev/vitest/issues/10661)
[<samp>(bae52)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/bae52b511)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.9...v4.1.10)

###
[`v4.1.9`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.9)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.8...v4.1.9)

##### 🐞 Bug Fixes

- Fix `importOriginal` with optimizer and query import \[backport to v4]
- by **Hiroshi Ogawa**, **David Harris**, **Codex**and **Vladimir** in
[#&#8203;10546](https://redirect.github.com/vitest-dev/vitest/issues/10546)
[<samp>(a5180)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a5180190c)
- **browser**:
- Wait for orchestrator readiness before resolving browser sessions
\[backport to v4] - by **Vladimir** and **Séamus O'Connor** in
[#&#8203;10555](https://redirect.github.com/vitest-dev/vitest/issues/10555)
[<samp>(7fb29)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7fb29651a)
- Wait for iframe tester readiness before preparing \[backport to v4] -
by **Vladimir** and **Séamus O'Connor** in
[#&#8203;10497](https://redirect.github.com/vitest-dev/vitest/issues/10497)
and
[#&#8203;10556](https://redirect.github.com/vitest-dev/vitest/issues/10556)
[<samp>(fbc62)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fbc626c40)
- **mocker**:
- Hoist vi.mock() for vite-plus/test imports \[backport to v4] - by
**Hiroshi Ogawa**, **LongYinan**, **Claude Opus 4.8** and **Vladimir**
in
[#&#8203;10548](https://redirect.github.com/vitest-dev/vitest/issues/10548)
[<samp>(2c955)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2c9559c02)
- **pool**:
- Prevent test run hang on worker crash \[backport to v4] - by **Ari
Perkkiö** and **Jattioui Ismail** in
[#&#8203;10543](https://redirect.github.com/vitest-dev/vitest/issues/10543)
and
[#&#8203;10564](https://redirect.github.com/vitest-dev/vitest/issues/10564)
[<samp>(934b0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/934b0f587)

##### [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.8...v4.1.9)

###
[`v4.1.8`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.8)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.7...v4.1.8)

#####    🐞 Bug Fixes

- **browser**:
- Disable client `cdp` API when `allowWrite/allowExec: false` \[backport
to v4]  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa)
and **Codex** in
[#&#8203;10450](https://redirect.github.com/vitest-dev/vitest/issues/10450)
[<samp>(e4067)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e4067b3b1)
- Remove orphaned Playwright route when same module is mocked via
multiple ids \[backport to v4]  -  by
[@&#8203;toxik](https://redirect.github.com/toxik) and
[@&#8203;Zelys-DFKH](https://redirect.github.com/Zelys-DFKH) in
[#&#8203;10474](https://redirect.github.com/vitest-dev/vitest/issues/10474)
[<samp>(675b4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/675b4343f)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.7...v4.1.8)

###
[`v4.1.7`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.7)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.6...v4.1.7)

#####    🐞 Bug Fixes

- **runner**: Limit concurrency per task branch in addition to per leaf
callbacks (backport)  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10384](https://redirect.github.com/vitest-dev/vitest/issues/10384)
[<samp>(4f0f2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4f0f2a1ee)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.6...v4.1.7)

###
[`v4.1.6`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.6)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6)

#####    🐞 Bug Fixes

- **browser**: Provide project reference in
`ToMatchScreenshotResolvePath`  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10138](https://redirect.github.com/vitest-dev/vitest/issues/10138)
[<samp>(31882)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/31882607c)
- Global `sequence.concurrent: true` with top-level `test(..., {
concurrent: false })` + depreacte `sequential` test API and options  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Codex**
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10196](https://redirect.github.com/vitest-dev/vitest/issues/10196)
[<samp>(2847d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2847dfa2a)
- **browser**: Simplify orchestrator otel carrier  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10285](https://redirect.github.com/vitest-dev/vitest/issues/10285)
[<samp>(18af9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/18af98cee)

#####    🏎 Performance

- Stringify diff objects only once  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10276](https://redirect.github.com/vitest-dev/vitest/issues/10276)
[<samp>(9f7b1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9f7b1528c)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6)

###
[`v4.1.5`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.5)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.4...v4.1.5)

#####    🚀 Experimental Features

- **coverage**: Istanbul to support `instrumenter` option  -  by
[@&#8203;BartWaardenburg](https://redirect.github.com/BartWaardenburg)
and [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;10119](https://redirect.github.com/vitest-dev/vitest/issues/10119)
[<samp>(0e0ff)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0e0ff41c7)

#####    🐞 Bug Fixes

- \--project negation excludes browser instances  -  by
[@&#8203;felamaslen](https://redirect.github.com/felamaslen) in
[#&#8203;10131](https://redirect.github.com/vitest-dev/vitest/issues/10131)
[<samp>(9423d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9423dc084)
- Project color label on html reporter  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10142](https://redirect.github.com/vitest-dev/vitest/issues/10142)
[<samp>(596f7)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/596f73986)
- Fix `vi.defineHelper` called as object method  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10163](https://redirect.github.com/vitest-dev/vitest/issues/10163)
[<samp>(122c2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/122c25b5b)
- Alias `agent` reporter to `minimal`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10157](https://redirect.github.com/vitest-dev/vitest/issues/10157)
[<samp>(663b9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/663b99fe3)
- Respect diff config options in soft assertions  -  by
[@&#8203;Copilot](https://redirect.github.com/Copilot), **sheremet-va**
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;8696](https://redirect.github.com/vitest-dev/vitest/issues/8696)
[<samp>(9787d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9787dedad)
- Respect diff config options in soft assertions "  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;8696](https://redirect.github.com/vitest-dev/vitest/issues/8696)
[<samp>(7dc6d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7dc6d54fd)
- **ast-collect**: Recognize \_*vi\_import* prefix in static test
discovery  -  by
[@&#8203;Yejneshwar](https://redirect.github.com/Yejneshwar) in
[#&#8203;10129](https://redirect.github.com/vitest-dev/vitest/issues/10129)
[<samp>(32546)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/325463ab2)
- **coverage**: Descriptive error message when reports directory is
removed during test run  -  by
[@&#8203;DaveT1991](https://redirect.github.com/DaveT1991) and
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;10117](https://redirect.github.com/vitest-dev/vitest/issues/10117)
[<samp>(14133)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1413382e1)
- **snapshot**: Increase default snapshot max output length  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex**
in
[#&#8203;10150](https://redirect.github.com/vitest-dev/vitest/issues/10150)
[<samp>(21e66)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/21e66ff63)
- **ui**: Fix jsx/tsx syntax highlight  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10152](https://redirect.github.com/vitest-dev/vitest/issues/10152)
[<samp>(f1b1f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f1b1f6c7b)
- **web-worker**: Support MessagePort objects referenced inside
postMessage data  -  by
[@&#8203;whitphx](https://redirect.github.com/whitphx) and **Claude Opus
4.6 (1M context)** in
[#&#8203;9927](https://redirect.github.com/vitest-dev/vitest/issues/9927)
and
[#&#8203;10124](https://redirect.github.com/vitest-dev/vitest/issues/10124)
[<samp>(7ad7d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7ad7d39af)
- **api**: Make test-specification options writable  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10154](https://redirect.github.com/vitest-dev/vitest/issues/10154)
[<samp>(6abd5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6abd557b7)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.4...v4.1.5)

###
[`v4.1.4`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.4)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.3...v4.1.4)

#####    🚀 Features

- **coverage**:
- Default to text reporter `skipFull` if agent detected  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10018](https://redirect.github.com/vitest-dev/vitest/issues/10018)
[<samp>(53757)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/53757804c)
- **experimental**:
- Expose `assertion` as a public field  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10095](https://redirect.github.com/vitest-dev/vitest/issues/10095)
[<samp>(a120e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a120e3ab8)
- Support aria snapshot  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Claude Opus
4.6 (1M context)**,
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio), **Codex**
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9668](https://redirect.github.com/vitest-dev/vitest/issues/9668)
[<samp>(d4fbb)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d4fbb5cc9)
- **reporter**:
- Add filterMeta option to json reporter  -  by
[@&#8203;nami8824](https://redirect.github.com/nami8824) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10078](https://redirect.github.com/vitest-dev/vitest/issues/10078)
[<samp>(b77de)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b77de968e)

#####    🐞 Bug Fixes

- Use "black" foreground for labeled terminal message to ensure contrast
 -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;10076](https://redirect.github.com/vitest-dev/vitest/issues/10076)
[<samp>(203f0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/203f07af7)
- Make `expect(..., message)` consistent as error message prefix  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex**
in
[#&#8203;10068](https://redirect.github.com/vitest-dev/vitest/issues/10068)
[<samp>(a1b5f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a1b5f0f4f)
- Do not hoist imports whose names match class properties .  -  by
[@&#8203;SunsetFi](https://redirect.github.com/SunsetFi) in
[#&#8203;10093](https://redirect.github.com/vitest-dev/vitest/issues/10093)
and
[#&#8203;10094](https://redirect.github.com/vitest-dev/vitest/issues/10094)
[<samp>(0fc4b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0fc4b47e0)
- **browser**: Spread user server options into browser Vite server in
project  -  by
[@&#8203;GoldStrikeArch](https://redirect.github.com/GoldStrikeArch) in
[#&#8203;10049](https://redirect.github.com/vitest-dev/vitest/issues/10049)
[<samp>(65c9d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/65c9d55eb)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.3...v4.1.4)

###
[`v4.1.3`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.3)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.2...v4.1.3)

#####    🚀 Experimental Features

- Add `experimental.preParse` flag  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10070](https://redirect.github.com/vitest-dev/vitest/issues/10070)
[<samp>(78273)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7827363bd)
- Support `browser.locators.exact` option  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10013](https://redirect.github.com/vitest-dev/vitest/issues/10013)
[<samp>(48799)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/487990a19)
- Add `TestAttachment.bodyEncoding`  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9969](https://redirect.github.com/vitest-dev/vitest/issues/9969)
[<samp>(89ca0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/89ca0e254)
- Support custom snapshot matcher  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Claude
Sonnet 4.6** and **Codex** in
[#&#8203;9973](https://redirect.github.com/vitest-dev/vitest/issues/9973)
[<samp>(59b0e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/59b0e6411)

#####    🐞 Bug Fixes

- Advance fake timers with `expect.poll` interval  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Sonnet 4.6** in
[#&#8203;10022](https://redirect.github.com/vitest-dev/vitest/issues/10022)
[<samp>(3f5bf)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3f5bfa365)
- Add `@vitest/coverage-v8` and `@vitest/coverage-istanbul` as optional
dependency  -  by
[@&#8203;alan-agius4](https://redirect.github.com/alan-agius4) in
[#&#8203;10025](https://redirect.github.com/vitest-dev/vitest/issues/10025)
[<samp>(146d4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/146d4f0a0)
- Fix `defineHelper` for webkit async stack trace + update playwright
1.59.0  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa)
in
[#&#8203;10036](https://redirect.github.com/vitest-dev/vitest/issues/10036)
[<samp>(5a5fa)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5a5fa49fe)
- Fix suite hook throwing errors for unused auto test-scoped fixture  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Sonnet 4.6** in
[#&#8203;10035](https://redirect.github.com/vitest-dev/vitest/issues/10035)
[<samp>(39865)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/398657e8d)
- **expect**:
- Remove `JestExtendError.context` from verbose error reporting  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9983](https://redirect.github.com/vitest-dev/vitest/issues/9983)
[<samp>(66751)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/66751c9e8)
- Don't leak "runner" types  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10004](https://redirect.github.com/vitest-dev/vitest/issues/10004)
[<samp>(ec204)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/ec2045543)
- **snapshot**:
- Fix flagging obsolete snapshots for snapshot properties mismatch  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Sonnet 4.6** in
[#&#8203;9986](https://redirect.github.com/vitest-dev/vitest/issues/9986)
[<samp>(6b869)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6b869156b)
- Export custom snapshot matcher helper from `vitest`  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex**
in
[#&#8203;10042](https://redirect.github.com/vitest-dev/vitest/issues/10042)
[<samp>(691d3)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/691d341fd)
- **ui**:
- Don't leak vite types  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;10005](https://redirect.github.com/vitest-dev/vitest/issues/10005)
[<samp>(fdff1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fdff1bf9a)
- **vm**:
- Fix external module resolve error with deps optimizer query  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Sonnet 4.6** in
[#&#8203;10024](https://redirect.github.com/vitest-dev/vitest/issues/10024)
[<samp>(9dbf4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9dbf47786)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.2...v4.1.3)

###
[`v4.1.2`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.2)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.1...v4.1.2)

This release bumps Vitest's `flatted` version and removes version
pinning to resolve `flatted`'s CVE related issues
([#&#8203;9975](https://redirect.github.com/vitest-dev/vitest/issues/9975)).

#####    🐞 Bug Fixes

- Don't resolve `setupFiles` from parent directory  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9960](https://redirect.github.com/vitest-dev/vitest/issues/9960)
[<samp>(7aa93)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7aa937776)
- Ensure sequential mock/unmock resolution  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6** in
[#&#8203;9830](https://redirect.github.com/vitest-dev/vitest/issues/9830)
[<samp>(7c065)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7c06598db)
- **browser**: Take failure screenshot if `toMatchScreenshot` can't
capture a stable screenshot  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) in
[#&#8203;9847](https://redirect.github.com/vitest-dev/vitest/issues/9847)
[<samp>(faace)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/faace1fbe)
- **coverage**: Correct `coverageConfigDefaults` values and types  -  by
[@&#8203;Arthie](https://redirect.github.com/Arthie) in
[#&#8203;9940](https://redirect.github.com/vitest-dev/vitest/issues/9940)
[<samp>(b3c99)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b3c992cb2)
- **pretty-format**: Fix output limit over counting  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9965](https://redirect.github.com/vitest-dev/vitest/issues/9965)
[<samp>(d3b7a)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d3b7a40fa)
- Disable colors if agent is detected  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) and
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9851](https://redirect.github.com/vitest-dev/vitest/issues/9851)
[<samp>(6f97b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6f97b55dd)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.1...v4.1.2)

###
[`v4.1.1`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.1)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.0...v4.1.1)

#####    🚀 Features

- **experimental**:
- Expose `matchesTagsFilter` to test if the current filter matches tags
 -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9913](https://redirect.github.com/vitest-dev/vitest/issues/9913)
[<samp>(eec53)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/eec53d9f5)
- Introduce `experimental.vcsProvider`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9928](https://redirect.github.com/vitest-dev/vitest/issues/9928)
[<samp>(56115)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/561150036)

#####    🐞 Bug Fixes

- Mark `TestProject.testFilesList` internal properly  -  by
[@&#8203;sapphi-red](https://redirect.github.com/sapphi-red) in
[#&#8203;9867](https://redirect.github.com/vitest-dev/vitest/issues/9867)
[<samp>(54f26)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/54f2660f5)
- Detect fixture that returns without calling `use`  -  by
[@&#8203;oilater](https://redirect.github.com/oilater) in
[#&#8203;9831](https://redirect.github.com/vitest-dev/vitest/issues/9831)
and
[#&#8203;9861](https://redirect.github.com/vitest-dev/vitest/issues/9861)
[<samp>(633ae)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/633ae2303)
- Drop vite 8.beta support  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9862](https://redirect.github.com/vitest-dev/vitest/issues/9862)
[<samp>(b78f5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b78f5389d)
- Type regression in vi.mocked() static class methods  -  by
[@&#8203;purepear](https://redirect.github.com/purepear) and
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9857](https://redirect.github.com/vitest-dev/vitest/issues/9857)
[<samp>(90926)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/90926641b)
- Properly re-evaluate actual modules of mocked external  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9898](https://redirect.github.com/vitest-dev/vitest/issues/9898)
[<samp>(ae5ec)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/ae5ec03ef)
- Preserve coverage report when html reporter overlaps  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9889](https://redirect.github.com/vitest-dev/vitest/issues/9889)
[<samp>(2d81a)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2d81ad897)
- Provide `vi.advanceTimers` to the preview provider  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9891](https://redirect.github.com/vitest-dev/vitest/issues/9891)
[<samp>(1bc3e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1bc3e63be)
- Don't leak event listener in playwright provider  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9910](https://redirect.github.com/vitest-dev/vitest/issues/9910)
[<samp>(d9355)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d93550ff7)
- Open browser in `--standalone` mode without running tests  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9911](https://redirect.github.com/vitest-dev/vitest/issues/9911)
[<samp>(e78ad)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e78adcf97)
- Guard disposable and optional `body`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9912](https://redirect.github.com/vitest-dev/vitest/issues/9912)
[<samp>(6fdb2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6fdb2ba61)
- Resolve `retry.condition` RegExp serialization issue  -  by
[@&#8203;nstepien](https://redirect.github.com/nstepien) and
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9942](https://redirect.github.com/vitest-dev/vitest/issues/9942)
[<samp>(7b605)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7b6054328)
- **collect**:
- Don't treat extra props on `test` return as tests  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9871](https://redirect.github.com/vitest-dev/vitest/issues/9871)
[<samp>(141e7)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/141e72aa1)
- **coverage**:
- Simplify provider types  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9931](https://redirect.github.com/vitest-dev/vitest/issues/9931)
[<samp>(aaf9f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/aaf9f18ae)
- Load built-in provider without module runner  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9939](https://redirect.github.com/vitest-dev/vitest/issues/9939)
[<samp>(bf892)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/bf8920817)
- **expect**:
- Soft assertions continue after .resolves/.rejects promise errors  - 
by [@&#8203;mixelburg](https://redirect.github.com/mixelburg), **Maks
Pikov**, **Claude Opus 4.6 (1M context)** and
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9843](https://redirect.github.com/vitest-dev/vitest/issues/9843)
[<samp>(6d74b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6d74b4948)
- Fix sinon-chai style API  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9943](https://redirect.github.com/vitest-dev/vitest/issues/9943)
[<samp>(0f08d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0f08dda2c)
- **pretty-format**:
- Limit output for large object  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6 (1M context)** in
[#&#8203;9949](https://redirect.github.com/vitest-dev/vitest/issues/9949)
[<samp>(0d5f9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0d5f9d6ef)

#####     [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.0...v4.1.1)

###
[`v4.1.0`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.0)

[Compare
Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.18...v4.1.0)

Vitest 4.1 is out!

This release page lists all changes made to the project during the 4.1
beta. To get a review of all the new features, read our [blog
post](https://vitest.dev/blog/vitest-4).

#####    🚀 Features

- Return a disposable from doMock()  -  by
[@&#8203;kirkwaiblinger](https://redirect.github.com/kirkwaiblinger) in
[#&#8203;9332](https://redirect.github.com/vitest-dev/vitest/issues/9332)
[<samp>(e3e65)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e3e659a96)
- Added chai style assertions  -  by
[@&#8203;ronnakamoto](https://redirect.github.com/ronnakamoto) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;8842](https://redirect.github.com/vitest-dev/vitest/issues/8842)
[<samp>(841df)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/841df9ac5)
- Update to sinon/fake-timers v15 and add `setTickMode` to timer
controls  -  by [@&#8203;atscott](https://redirect.github.com/atscott)
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;8726](https://redirect.github.com/vitest-dev/vitest/issues/8726)
[<samp>(4b480)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4b480aaed)
- Expose matcher types  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9448](https://redirect.github.com/vitest-dev/vitest/issues/9448)
[<samp>(3e4b9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3e4b913b1)
- Add `toTestSpecification` to reported tasks  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9464](https://redirect.github.com/vitest-dev/vitest/issues/9464)
[<samp>(1a470)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1a4705da9)
- Show a warning if `vi.mock` or `vi.hoisted` are declared outside of
top level of the module  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9387](https://redirect.github.com/vitest-dev/vitest/issues/9387)
[<samp>(5db54)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5db54a468)
- Track and display expectedly failed tests (.fails) in UI and CLI  - 
by [@&#8203;Copilot](https://redirect.github.com/Copilot),
**sheremet-va** and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9476](https://redirect.github.com/vitest-dev/vitest/issues/9476)
[<samp>(77d75)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/77d75fd34)
- Support tags  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9478](https://redirect.github.com/vitest-dev/vitest/issues/9478)
[<samp>(de7c8)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/de7c8a521)
- Implement `aroundEach` and `aroundAll` hooks  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9450](https://redirect.github.com/vitest-dev/vitest/issues/9450)
[<samp>(2a8cb)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2a8cb9dc2)
- Stabilize experimental features  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9529](https://redirect.github.com/vitest-dev/vitest/issues/9529)
[<samp>(b5fd2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b5fd2a16a)
- Accept `new` or `all` in `--update` flag  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9543](https://redirect.github.com/vitest-dev/vitest/issues/9543)
[<samp>(a5acf)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a5acf28a5)
- Support `meta` in test options  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9535](https://redirect.github.com/vitest-dev/vitest/issues/9535)
[<samp>(7d622)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7d622e3d1)
- Support type inference with a new `test.extend` syntax  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9550](https://redirect.github.com/vitest-dev/vitest/issues/9550)
[<samp>(e5385)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e53854fcc)
- Support vite 8 beta, fix type issues in the config with different vite
versions  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9587](https://redirect.github.com/vitest-dev/vitest/issues/9587)
[<samp>(99028)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/990281dfd)
- Add assertion helper to hide internal stack traces  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6** in
[#&#8203;9594](https://redirect.github.com/vitest-dev/vitest/issues/9594)
[<samp>(eeb0a)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/eeb0ae2f8)
- Store failure screenshots using artifacts API  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) in
[#&#8203;9588](https://redirect.github.com/vitest-dev/vitest/issues/9588)
[<samp>(24603)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/24603e3c4)
- Allow `vitest list` to statically collect tests instead of running
files to collect them  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9630](https://redirect.github.com/vitest-dev/vitest/issues/9630)
[<samp>(7a8e7)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7a8e7fc20)
- Add `--detect-async-leaks`  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9528](https://redirect.github.com/vitest-dev/vitest/issues/9528)
[<samp>(c594d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c594d4af3)
- Implement `mockThrow` and `mockThrowOnce`  -  by
[@&#8203;thor-juhasz](https://redirect.github.com/thor-juhasz) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9512](https://redirect.github.com/vitest-dev/vitest/issues/9512)
[<samp>(61917)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/619179fb7)
- Support `update: "none"` and add docs about snapshots behavior on CI
 -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9700](https://redirect.github.com/vitest-dev/vitest/issues/9700)
[<samp>(05f18)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/05f1854e2)
- Support playwright `launchOptions` with `connectOptions`  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9702](https://redirect.github.com/vitest-dev/vitest/issues/9702)
[<samp>(f0ff1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f0ff1b2a0)
- Add `page/locator.mark` API to enhance playwright trace  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9652](https://redirect.github.com/vitest-dev/vitest/issues/9652)
[<samp>(d0ee5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d0ee546fe)
- **api**:
- Support tests starting or ending with `test` in
`experimental_parseSpecification`  -  by
[@&#8203;jgillick](https://redirect.github.com/jgillick) and **Jeremy
Gillick** in
[#&#8203;9235](https://redirect.github.com/vitest-dev/vitest/issues/9235)
[<samp>(2f367)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2f367fad3)
- Add filters to `createSpecification`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9336](https://redirect.github.com/vitest-dev/vitest/issues/9336)
[<samp>(c8e6c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c8e6c7fbf)
- Expose `runTestFiles` as alternative to `runTestSpecifications`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9443](https://redirect.github.com/vitest-dev/vitest/issues/9443)
[<samp>(43d76)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/43d761821)
- Add `allowWrite` and `allowExec` options to `api`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9350](https://redirect.github.com/vitest-dev/vitest/issues/9350)
[<samp>(20e00)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/20e00ef78)
- Allow passing down test cases to `toTestSpecification`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9627](https://redirect.github.com/vitest-dev/vitest/issues/9627)
[<samp>(6f17d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6f17d5ddf)
- **browser**:
- Add `userEvent.wheel` API  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) in
[#&#8203;9188](https://redirect.github.com/vitest-dev/vitest/issues/9188)
[<samp>(66080)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/660801979)
- Add `filterNode` option to prettyDOM for filtering browser assertion
error output  -  by
[@&#8203;Copilot](https://redirect.github.com/Copilot), **sheremet-va**
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9475](https://redirect.github.com/vitest-dev/vitest/issues/9475)
[<samp>(d3220)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d3220fcd8)
- Support playwright persistent context  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Claude Opus
4.6** and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va)
in
[#&#8203;9229](https://redirect.github.com/vitest-dev/vitest/issues/9229)
[<samp>(f865d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f865d2ba4)
- Added `detailsPanelPosition` option and button  -  by
[@&#8203;shairez](https://redirect.github.com/shairez) in
[#&#8203;9525](https://redirect.github.com/vitest-dev/vitest/issues/9525)
[<samp>(c8a31)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c8a31147c)
- Use BlazeDiff instead of pixelmatch  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) in
[#&#8203;9514](https://redirect.github.com/vitest-dev/vitest/issues/9514)
[<samp>(30936)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/309362089)
- Add `findElement` and enable strict mode in webdriverio and preview
 -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9677](https://redirect.github.com/vitest-dev/vitest/issues/9677)
[<samp>(c3f37)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c3f37721c)
- **cli**:
- Add [@&#8203;bomb](https://redirect.github.com/bomb).sh/tab
completions  -  by
[@&#8203;AmirSa12](https://redirect.github.com/AmirSa12) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;8639](https://redirect.github.com/vitest-dev/vitest/issues/8639)
[<samp>(200f3)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/200f31704)
- **coverage**:
- Support `ignore start/stop` ignore hints  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9204](https://redirect.github.com/vitest-dev/vitest/issues/9204)
[<samp>(e59c9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e59c94ba6)
- Add `coverage.changed` option to report only changed files  -  by
[@&#8203;kykim00](https://redirect.github.com/kykim00) and
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9521](https://redirect.github.com/vitest-dev/vitest/issues/9521)
[<samp>(1d939)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1d9392c67)
- **experimental**:
- Add `onModuleRunner` hook to `worker.init`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9286](https://redirect.github.com/vitest-dev/vitest/issues/9286)
[<samp>(e977f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e977f3deb)
- Option to disable the module runner  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) and
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9210](https://redirect.github.com/vitest-dev/vitest/issues/9210)
[<samp>(9be61)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9be6121ee)
- Add `importDurations: { limit, print }` options  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **Claude Opus
4.6** and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va)
in
[#&#8203;9401](https://redirect.github.com/vitest-dev/vitest/issues/9401)
[<samp>(7e10f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7e10fb356)
- Add print and fail thresholds for `importDurations`  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6** in
[#&#8203;9533](https://redirect.github.com/vitest-dev/vitest/issues/9533)
[<samp>(3f7a5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3f7a5f8f8)
- **fixtures**:
- Pass down file context to `beforeAll`/`afterAll`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9572](https://redirect.github.com/vitest-dev/vitest/issues/9572)
[<samp>(c8339)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c83395f2c)
- **reporters**:
- Add `agent` reporter to reduce ai agent token usage  -  by
[@&#8203;cpojer](https://redirect.github.com/cpojer) in
[#&#8203;9779](https://redirect.github.com/vitest-dev/vitest/issues/9779)
[<samp>(3e9e0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3e9e096a2)
- **runner**:
- Enhance `retry` options  -  by
[@&#8203;MazenSamehR](https://redirect.github.com/MazenSamehR), **Matan
Shavit**, [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio)
and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9370](https://redirect.github.com/vitest-dev/vitest/issues/9370)
[<samp>(9e4cf)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9e4cfd295)
- **ui**:
- Allow run individual test/suites  -  by
[@&#8203;userquin](https://redirect.github.com/userquin) in
[#&#8203;9465](https://redirect.github.com/vitest-dev/vitest/issues/9465)
[<samp>(73b10)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/73b10f1b9)
- Add project filter/sort support  -  by
[@&#8203;userquin](https://redirect.github.com/userquin) in
[#&#8203;8689](https://redirect.github.com/vitest-dev/vitest/issues/8689)
[<samp>(0c7ea)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0c7eaac16)
- Add duration sorting to explorer  -  by
[@&#8203;julianhahn](https://redirect.github.com/julianhahn) and
[@&#8203;cursoragent](https://redirect.github.com/cursoragent) in
[#&#8203;9603](https://redirect.github.com/vitest-dev/vitest/issues/9603)
[<samp>(209b1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/209b1b0e1)
- Implement filter for slow tests  -  by
[@&#8203;DerYeger](https://redirect.github.com/DerYeger) and
[@&#8203;userquin](https://redirect.github.com/userquin) in
[#&#8203;9705](https://redirect.github.com/vitest-dev/vitest/issues/9705)
[<samp>(8880c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/8880c907a)
- **vitest**:
- Add run summary in GitHub Actions Reporter  -  by
[@&#8203;macarie](https://redirect.github.com/macarie) and **jhnance**
in
[#&#8203;9579](https://redirect.github.com/vitest-dev/vitest/issues/9579)
[<samp>(96bfc)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/96bfc8345)

#####    🐞 Bug Fixes

- Deprecate several vitest/\* entry points  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9347](https://redirect.github.com/vitest-dev/vitest/issues/9347)
[<samp>(fd459)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fd45928be)
- Use `meta.url` in `createRequire`  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9441](https://redirect.github.com/vitest-dev/vitest/issues/9441)
[<samp>(e3422)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e34225563)
- Preact browser mode init example of render function not async  -  by
[@&#8203;WuMingDao](https://redirect.github.com/WuMingDao) in
[#&#8203;9375](https://redirect.github.com/vitest-dev/vitest/issues/9375)
[<samp>(2bea5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2bea549c7)
- Deprecate unused types in matcher context  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9449](https://redirect.github.com/vitest-dev/vitest/issues/9449)
[<samp>(20f87)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/20f8753a2)
- Handle `external/noExternal` during `configEnvironment` hook  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6** in
[#&#8203;9508](https://redirect.github.com/vitest-dev/vitest/issues/9508)
[<samp>(59ea2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/59ea27c1c)
- Replace default ssr environment runner with Vitest server module
runner  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa)
and **Claude Opus 4.6** in
[#&#8203;9506](https://redirect.github.com/vitest-dev/vitest/issues/9506)
[<samp>(cd5db)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/cd5db660c)
- Propagate experimental CLI options to child projects  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6** in
[#&#8203;9531](https://redirect.github.com/vitest-dev/vitest/issues/9531)
[<samp>(b624f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b624fae53)
- Show a warning when `browser.isolate` is used  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9410](https://redirect.github.com/vitest-dev/vitest/issues/9410)
[<samp>(3d48e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3d48ebcb9)
- Fix `vi.mock({ spy: true })` node v8 coverage  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa), **hi-ogawa**
and **Claude Opus 4.6** in
[#&#8203;9541](https://redirect.github.com/vitest-dev/vitest/issues/9541)
[<samp>(687b6)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/687b633c1)
- Don't show internal ssr handler in errors  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9547](https://redirect.github.com/vitest-dev/vitest/issues/9547)
[<samp>(76c43)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/76c4397b5)
- Close vitest if it failed to start  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9573](https://redirect.github.com/vitest-dev/vitest/issues/9573)
[<samp>(728ba)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/728ba617f)
- Fix ssr environment runner in project  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9584](https://redirect.github.com/vitest-dev/vitest/issues/9584)
[<samp>(09006)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/090064f97)
- Trim trailing white spaces in code block  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9591](https://redirect.github.com/vitest-dev/vitest/issues/9591)
[<samp>(f78be)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f78bea992)
- Support inline snapshot inside test.for/each  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9590](https://redirect.github.com/vitest-dev/vitest/issues/9590)
[<samp>(615fd)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/615fd521e)
- Apply source maps for external module stack trace  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9152](https://redirect.github.com/vitest-dev/vitest/issues/9152)
[<samp>(79e20)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/79e20d5a3)
- Remove the `.name` from statically collected test  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9596](https://redirect.github.com/vitest-dev/vitest/issues/9596)
[<samp>(b66ff)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b66ff691a)
- Don't suppress warnings on pnp  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9602](https://redirect.github.com/vitest-dev/vitest/issues/9602)
[<samp>(89cbd)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/89cbdaea3)
- Support snapshot with `expect.soft`  -  by
[@&#8203;iumehara](https://redirect.github.com/iumehara),
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6** in
[#&#8203;9231](https://redirect.github.com/vitest-dev/vitest/issues/9231)
[<samp>(3eb2c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3eb2cd541)
- Log seed when only `sequence.shuffle.tests` is enabled  -  by
[@&#8203;kaigritun](https://redirect.github.com/kaigritun), **Kai
Gritun** and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9576](https://redirect.github.com/vitest-dev/vitest/issues/9576)
[<samp>(8182b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/8182b77ad)
- Externalize `expect/src/utils` from `vitest`  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9616](https://redirect.github.com/vitest-dev/vitest/issues/9616)
[<samp>(48739)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/487398422)
- Ignore test.override during static collection  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9620](https://redirect.github.com/vitest-dev/vitest/issues/9620)
[<samp>(09174)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0917470ce)
- Increase stacktrace limit for `--detect-async-leaks`  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9638](https://redirect.github.com/vitest-dev/vitest/issues/9638)
[<samp>(9fd4c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9fd4ce533)
- Hanging-reporter link in cli  -  by
[@&#8203;flx-sta](https://redirect.github.com/flx-sta) in
[#&#8203;9649](https://redirect.github.com/vitest-dev/vitest/issues/9649)
[<samp>(7c103)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7c103055c)
- Fix teardown timeout of `aroundEach/All` when inner `aroundEach/All`
throws  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa)
in
[#&#8203;9657](https://redirect.github.com/vitest-dev/vitest/issues/9657)
[<samp>(4ec6c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4ec6cb305)
- Fix ui mode / html reporter and coverage integration  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude
Opus 4.6** in
[#&#8203;9626](https://redirect.github.com/vitest-dev/vitest/issues/9626)
[<samp>(86fad)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/86fad4b42)
- Don't continue when `aroundEach/All` setup timed out  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9670](https://redirect.github.com/vitest-dev/vitest/issues/9670)
[<samp>(bb013)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/bb013d54b)
- Align `VitestRunnerConfig` optional fields with `SerializedConfig`  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9661](https://redirect.github.com/vitest-dev/vitest/issues/9661)
[<samp>(79520)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/79520d82d)
- Handle Symbol values in format utility  -  by
[@&#8203;nami8824](https://redirect.github.com/nami8824) in
[#&#8203;9658](https://redirect.github.com/vitest-dev/vitest/issues/9658)
[<samp>(0583f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0583f067e)
- Deprecate `toBe*` spy assertions in favor of `toHaveBeen*` (and
`toThrowError`)  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9665](https://redirect.github.com/vitest-dev/vitest/issues/9665)
[<samp>(4d390)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4d390dfe9)
- Don't propagate nested `aroundEach/All` errors but aggregate them on
runner  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa)
in
[#&#8203;9673](https://redirect.github.com/vitest-dev/vitest/issues/9673)
[<samp>(b6365)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b63653f5a)
- Show a better error if there is a pending dynamic import  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9676](https://redirect.github.com/vitest-dev/vitest/issues/9676)
[<samp>(7ef5c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7ef5cf4b7)
- Preserve stack trace of `resolves/rejects` chained assertion error  - 
by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9679](https://redirect.github.com/vitest-dev/vitest/issues/9679)
[<samp>(c6151)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c61511d4a)
- Handle module-sync condition in vmThreads/vmForks require  -  by
[@&#8203;lesleh](https://redirect.github.com/lesleh) in
[#&#8203;9650](https://redirect.github.com/vitest-dev/vitest/issues/9650)
and
[#&#8203;9651](https://redirect.github.com/vitest-dev/vitest/issues/9651)
[<samp>(bb203)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/bb20389f4)
- Hooks should respect `maxConcurrency`  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9653](https://redirect.github.com/vitest-dev/vitest/issues/9653)
[<samp>(16d13)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/16d13d981)
- Recursively autospy module object  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9687](https://redirect.github.com/vitest-dev/vitest/issues/9687)
[<samp>(695a8)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/695a86b41)
- Remove trailing spaces from diff error log  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) and
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9680](https://redirect.github.com/vitest-dev/vitest/issues/9680)
[<samp>(395d1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/395d1a29e)
- Respect project `resolve.conditions` for externals  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9717](https://redirect.github.com/vitest-dev/vitest/issues/9717)
[<samp>(1d498)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1d4987498)
- Use object for WeakMap instead of a symbol to support webcontainers
 -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9731](https://redirect.github.com/vitest-dev/vitest/issues/9731)
[<samp>(c5225)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c52259330)
- Fix re-mocking virtual module  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9748](https://redirect.github.com/vitest-dev/vitest/issues/9748)
[<samp>(3cbbb)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3cbbb17f1)
- Cancelling should stop current test immediately  -  by
[@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in
[#&#8203;9729](https://redirect.github.com/vitest-dev/vitest/issues/9729)
[<samp>(0cb2f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0cb2f7239)
- Make `mockObject` change backwards compatible  -  by
[@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in
[#&#8203;9744](https://redirect.github.com/vitest-dev/vitest/issues/9744)
[<samp>(84c69)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/84c69497f)
- Fix `URL.name` on jsdom  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9767](https://redirect.github.com/vitest-dev/vitest/issues/9767)
[<samp>(031f3)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/031f3a374)
- Save and restore module graph in blob reporter  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9740](https://redirect.github.com/vitest-dev/vitest/issues/9740)
[<samp>(84355)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/843554bf0)
- Don't silence reporter errors from test runtime events handler in
normal run and --merge-reports  -  by
[@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in
[#&#8203;9727](https://redirect.github.com/vitest-dev/vitest/issues/9727)
[<samp>(4072d)</samp>](https://redirect.github.

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

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

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

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

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zNS40IiwidXBkYXRlZEluVmVyIjoiNDQuMzUuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Issue number: resolves #31381

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

`ion-select` derives the text it displays for the selected option, and
that option's
contribution to the button's `aria-label`, from the option's child
nodes. In v9 that
derivation is wrong whenever an option has more than one child node, or
has its text
wrapped in an element.

| `ion-select-option` content | browser renders | v8 | v9 |
| --- | --- | --- | --- |
| `Star` | `Star` | `Star` | `Star` |
| two sibling text nodes, `{'★'}{'Star'}` | `★Star` | `★Star` | `★ Star`
|
| `A <b>Star</b>` | `A Star` | `A Star` | `A` |
| `<b>Star</b>` | `Star` | `Star` | *(empty)* |

Two distinct defects:

1. **A space is inserted between adjacent text nodes.** Every framework
renders
`{icon}{label}` as two sibling text nodes with no whitespace between
them, so any
option with an emoji, flag, or icon prefix gains a space that is not in
the DOM.

2. **Text wrapped in an element is dropped entirely.** An option whose
content is
`<b>Star</b>`, `<span>Star</span>`, or an i18n component's wrapper
element renders as
an **empty select** with an empty accessible name, silently. This is the
more damaging
   of the two.

Both affect the visible selected text and the `aria-label`, and both
propagate to every
overlay interface — `createAlertInputs`, `createActionSheetButtons`, and
`createOverlaySelectOptions` read the option through the same helper. In
the linked
reproduction, opening the first select shows an alert radio labelled `★
Star`.

There is no error or warning; the text is just wrong.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

The selected text and `aria-label` should match what the browser renders
for the option's
content, which is what v8 produced via `textContent`: `★Star` for two
adjacent text nodes,
and `A Star` for `A <b>Star</b>`.

-
-
-

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

(It fixes an unreported breaking change made in
#31241)

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/docs/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

---------

Co-authored-by: Shane <shane@shanessite.net>
## What is the current behavior?

The latest version of `@stencil/core` changes a line in the generated
`components.d.ts`, failing the nightly build.

## What is the new behavior?

Bump `@stencil/core` on the main branch and commit the new
`components.d.ts`.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No
Issue number: resolves #30449

---------

## What is the current behavior?

`ion-picker-column` commits the centered option on a 250ms idle timer
that only starts once the wheel stops moving. Flick a wheel and tap a
Save button while it's still coasting, and the click handler reads the
previous value. On an `ion-datetime` with `preferWheel`, the wheel shows
one date while `value` still reports another.

## What is the new behavior?

During a scroll the user started, the column watches for `pointerdown`
anywhere outside itself. On that press it halts the wheel on the option
under the highlight and commits it synchronously, so an application's
own click handler reads the value the user can see. A press on a sibling
wheel in the same picker is exempt, so reaching for the next column
leaves the first one coasting. The datetime wheel handlers now read the
working and active parts at event time, because an outside press settles
every coasting column in one synchronous dispatch and the previous
render-time reads clobbered each other.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

## Other information

The community PR for this issue, #30674, was a great attempt, but it
takes the reporter's other suggestion and adds public `ionScrollStart`
and `ionScrollEnd` events to `ion-picker-column` and `ion-datetime`. I
didn't go that way for two reasons. It's permanent public API on two
components plus the Angular and Vue proxies, carried by every consumer
forever, to work around a bug. More importantly it doesn't fix the stale
value: every app has to write the disable-Save logic itself, and its
`ionScrollEnd` is debounced 300ms after the wheel settles, so a tap
during the flick still reads the old value at the moment the click
handler runs. Committing on `pointerdown` fixes existing apps with no
code change. The scroll events are a fair feature request on their own,
just a separate one from this bug fix.

Preview:

- Picker column scroll:
[iOS](https://ionic-framework-git-fw-7706-ionic1.vercel.app/src/components/picker-column/test/scroll?ionic:mode=ios)
/
[MD](https://ionic-framework-git-fw-7706-ionic1.vercel.app/src/components/picker-column/test/scroll?ionic:mode=md)
- Datetime prefer-wheel:
[iOS](https://ionic-framework-git-fw-7706-ionic1.vercel.app/src/components/datetime/test/prefer-wheel?ionic:mode=ios)
/
[MD](https://ionic-framework-git-fw-7706-ionic1.vercel.app/src/components/datetime/test/prefer-wheel?ionic:mode=md)
Issue number: resolves #31389

---------

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

Currently, `componentWillUnmount` in `createInlineOverlayComponent`
removes a nested inline overlay host that `CoreDelegate` has teleported
out of its `<template>`. React also runs that hook when it only *hides*
a subtree, so a Suspense fallback, an Offscreen tree, or the StrictMode
cycle deletes an overlay that is still presenting. React did not remove
the host, so React never puts it back. Core emits `ionMount` and then
goes quiet: no `willPresent`, no `didPresent`, and no dismiss lifecycle,
while the React tree still believes the overlay is open. The user sees
nothing at all.

## What is the new behavior?

The wrapper now tells a React hide from a real destroy instead of
treating both as an unmount. The marker `<template>` is the
discriminator, since it stays at the JSX position and leaves the
document only on a real unmount, so the teardown defers a microtask and
runs only if the marker really left. A hide leaves the host exactly
where it is, `present()` and `didDismiss` keep working while the subtree
is hidden, and a destroy that hits while it is already hidden still
cleans up even though React skips the second `componentWillUnmount`
there. This addresses #31223's requirements by making a relocated
portaled host move back into `portalTarget` synchronously, and the
StrictMode cycle still leaves exactly one copy in the DOM.

Separately, the five overlays that release the app root on disconnect
(`modal`, `popover`, `alert`, `action-sheet`, `loading`) now restore it
on reconnect, along with the modal's safe-area overrides and
parent-removal observer, and the button gesture on `alert` and
`action-sheet`. A presented overlay that gets detached and re-inserted
across a task previously came back with the root lock and safe-area
gone.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

## Other information

This supersedes #31390, which fixes the same issue by recording the
removed host and re-appending it on remount. That works for the reported
case, but it keeps the removal, and the removal costs more than the DOM
node: the disconnect releases the root lock, clears the safe-area
overrides and the sheet's `--ion-modal-offset-top`, destroys the button
gesture, and drops the parent-removal observer. Putting the node back
restores none of that, so the smaller fix needs the core half of this PR
anyway. Not removing it in the first place avoids all of that, and also
covers the portaled overlays, the destroy-while-hidden case, and a
dismiss landing during the hidden window, which #31390 doesn't reach.
Thanks to @ptmkenny for the report, the analysis, and the original
patch, which is where the diagnosis came from.

Note that the core half is defence-in-depth rather than a requirement
for #31389. Once the React wrapper stops removing the host, core no
longer sees a detach and re-attach in the reported flow. It does fix a
real pre-existing bug though, since a presented modal moved by anything
else lost its safe-area, so it's worth keeping.

Preview:
- [Inline modal
(iOS)](https://ionic-framework-git-fix-react-inline-overlay-hide-vs-unmount-ionic1.vercel.app/src/components/modal/test/inline?ionic:mode=ios)
- [Modal safe-area
(iOS)](https://ionic-framework-git-fix-react-inline-overlay-hide-vs-unmount-ionic1.vercel.app/src/components/modal/test/safe-area?ionic:mode=ios)

## Current dev build:
```
9.0.1-dev.11787589191.1e183b55
```

---------

Co-authored-by: ptmkenny <github@ptmkenny.com>
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[github/codeql-action](https://redirect.github.com/github/codeql-action)
| action | patch | `v4.37.7` → `v4.37.8` |

---

### Release Notes

<details>
<summary>github/codeql-action (github/codeql-action)</summary>

###
[`v4.37.8`](https://redirect.github.com/github/codeql-action/compare/v4.37.7...v4.37.8)

[Compare
Source](https://redirect.github.com/github/codeql-action/compare/v4.37.7...v4.37.8)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekday before 11am"
- Automerge
  - At any time (no schedule defined)

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

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

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

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/ionic-team/ionic-framework).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4zOS4wIiwidXBkYXRlZEluVmVyIjoiNDQuMzkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@thetaPC
thetaPC requested a review from a team as a code owner August 26, 2026 18:09
@thetaPC
thetaPC requested review from OS-jacobbell and removed request for a team August 26, 2026 18:09
@github-actions github-actions Bot added package: core @ionic/core package package: angular @ionic/angular package package: vue @ionic/vue package package: react @ionic/react package labels Aug 26, 2026
@thetaPC
thetaPC merged commit 1fb8ca7 into 9.0.x Aug 26, 2026
12 of 13 checks passed
@thetaPC
thetaPC deleted the release-9.0.1 branch August 26, 2026 18:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

package: angular @ionic/angular package package: core @ionic/core package package: react @ionic/react package package: vue @ionic/vue package

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants