kolaente
b365be1881
chore: v2.2.0 release preparations
2026-03-20 13:40:18 +01:00
kolaente
c81b0eb463
fix(attachments): sync kanban store and task ref on attachment changes
...
When attachments are uploaded (either via file picker or pasting into
the description editor), update both the local task ref and the kanban
store so that the attachment list and kanban card icons stay in sync.
2026-03-20 10:38:47 +01:00
kolaente
ade91c92db
refactor(attachments): remove global attachment store
...
The attachment store was a global singleton shared between concurrent
TaskDetailView instances, causing a race condition when navigating
between tasks via related tasks from the Kanban view. Attachments
now live on the task ref like every other task field.
2026-03-20 10:38:47 +01:00
kolaente
2675bcb56c
refactor(attachments): use local state instead of global attachment store
...
TaskDetailView now computes hasAttachments from the task ref and
handles the update:attachments emit from the Attachments component.
2026-03-20 10:38:47 +01:00
kolaente
eaec206301
refactor(attachments): return uploaded attachments instead of writing to store
...
uploadFiles now returns the array of uploaded IAttachment objects
so callers can handle state updates themselves.
2026-03-20 10:38:47 +01:00
kolaente
5dbc906d47
refactor(attachments): read from task prop instead of global store
...
The Attachments component now reads attachments from its task prop
and emits update:attachments events instead of using the global
attachment store singleton.
2026-03-20 10:38:47 +01:00
renovate[bot]
9c3fa8e91b
chore(deps): update dependency stylelint to v17.5.0
2026-03-20 10:17:24 +01:00
Frederick [Bot]
de1d5d1241
chore(i18n): update translations via Crowdin
2026-03-20 01:14:18 +00:00
kolaente
3bc0093686
fix: invalidate all sessions when enabling TOTP
...
When a user enables two factor authentication, all existing sessions are
now invalidated, requiring re-authentication. This prevents pre-existing
sessions from bypassing 2FA. The frontend now shows a notice explaining
the logout before the user confirms, and properly logs out after enabling.
Ref: GHSA-pgc7-cmvg-mvp4
2026-03-19 12:27:44 +01:00
Weijie Zhao
7b6b432301
fix: collapse view buttons into dropdown when overflowing ( #2306 )
2026-03-19 00:09:29 +01:00
renovate[bot]
aed93b9389
chore(deps): update dev-dependencies to v4.2.2
2026-03-18 17:57:57 +01:00
kolaente
50eb68fb2b
fix(menu): show all project menu items in sidebar dropdown
...
The `simple` prop was introduced to hide some menu items (Views, Set
Background, Archive) in the sidebar to prevent overflow. Since the
Dropdown component now uses @floating-ui/dom with autoPlacement and
shift middleware, overflow is handled automatically, making the prop
unnecessary.
2026-03-17 19:19:36 +01:00
renovate[bot]
650ceabd3c
chore(deps): update dependency vue-tsc to v3.2.6
2026-03-17 19:01:11 +01:00
renovate[bot]
176588bf1d
chore(deps): update dev-dependencies
2026-03-17 10:12:15 +01:00
kolaente
e20af6df40
fix(deps): override flatted to 3.4.1 to fix unbounded recursion DoS
...
Adds pnpm override for flatted to resolve GHSA-25h7-pfq9-p65f.
2026-03-17 09:52:49 +01:00
renovate[bot]
88a011aadc
chore(deps): update dependency caniuse-lite to v1.0.30001779
2026-03-16 08:59:31 +01:00
renovate[bot]
9bcdbb6433
chore(deps): update dev-dependencies ( #2395 )
...
This PR contains the following updates:
| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/ ) |
[Confidence](https://docs.renovatebot.com/merge-confidence/ ) |
|---|---|---|---|
|
[@vitejs/plugin-vue](https://redirect.github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#readme )
([source](https://redirect.github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue ))
| [`6.0.4` →
`6.0.5`](https://renovatebot.com/diffs/npm/@vitejs%2fplugin-vue/6.0.4/6.0.5 )
|

|

|
| [caniuse-lite](https://redirect.github.com/browserslist/caniuse-lite )
| [`1.0.30001777` →
`1.0.30001778`](https://renovatebot.com/diffs/npm/caniuse-lite/1.0.30001777/1.0.30001778 )
|

|

|
| [electron](https://redirect.github.com/electron/electron ) | [`40.8.0`
→ `40.8.2`](https://renovatebot.com/diffs/npm/electron/40.8.0/40.8.2 ) |

|

|
| [esbuild](https://redirect.github.com/evanw/esbuild ) | [`0.27.3` →
`0.27.4`](https://renovatebot.com/diffs/npm/esbuild/0.27.3/0.27.4 ) |

|

|
| [happy-dom](https://redirect.github.com/capricorn86/happy-dom ) |
[`20.8.3` →
`20.8.4`](https://renovatebot.com/diffs/npm/happy-dom/20.8.3/20.8.4 ) |

|

|
| [vite-plugin-vue-devtools](https://redirect.github.com/vuejs/devtools )
([source](https://redirect.github.com/vuejs/devtools/tree/HEAD/packages/vite ))
| [`8.0.7` →
`8.1.0`](https://renovatebot.com/diffs/npm/vite-plugin-vue-devtools/8.0.7/8.1.0 )
|

|

|
| [vitest](https://vitest.dev )
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest ))
| [`4.0.18` →
`4.1.0`](https://renovatebot.com/diffs/npm/vitest/4.0.18/4.1.0 ) |

|

|
---
### Release Notes
<details>
<summary>vitejs/vite-plugin-vue (@​vitejs/plugin-vue)</summary>
###
[`v6.0.5`](https://redirect.github.com/vitejs/vite-plugin-vue/blob/HEAD/packages/plugin-vue/CHANGELOG.md#small-605-2026-03-12-small )
##### Miscellaneous Chores
- remove Vite 8 beta from supported range
([#​746](https://redirect.github.com/vitejs/vite-plugin-vue/issues/746 ))
([b3f23e4](b3f23e4d08 ))
</details>
<details>
<summary>browserslist/caniuse-lite (caniuse-lite)</summary>
###
[`v1.0.30001778`](https://redirect.github.com/browserslist/caniuse-lite/compare/1.0.30001777...1.0.30001778 )
[Compare
Source](https://redirect.github.com/browserslist/caniuse-lite/compare/1.0.30001777...1.0.30001778 )
</details>
<details>
<summary>electron/electron (electron)</summary>
###
[`v40.8.2`](https://redirect.github.com/electron/electron/releases/tag/v40.8.2 ):
electron v40.8.2
[Compare
Source](https://redirect.github.com/electron/electron/compare/v40.8.1...v40.8.2 )
### Release Notes for v40.8.2
#### Other Changes
- Backported fix for b/491421267.
[#​50229](https://redirect.github.com/electron/electron/pull/50229 )
- Fixed an issue where running app icons were not correctly retrieved on
macOS Tahoe.
[#​50188](https://redirect.github.com/electron/electron/pull/50188 )
###
[`v40.8.1`](https://redirect.github.com/electron/electron/releases/tag/v40.8.1 ):
electron v40.8.1
[Compare
Source](https://redirect.github.com/electron/electron/compare/v40.8.0...v40.8.1 )
### Release Notes for v40.8.1
#### Fixes
- Added validation to protocol client methods to reject protocol names
that do not conform to the RFC 3986 URI scheme grammar.
[#​50158](https://redirect.github.com/electron/electron/pull/50158 )
<sup>(Also in
[38](https://redirect.github.com/electron/electron/pull/50157 ),
[39](https://redirect.github.com/electron/electron/pull/50156 ),
[41](https://redirect.github.com/electron/electron/pull/50155 ))</sup>
- Fixed an issue on macOS where calling `autoUpdater.quitAndInstall()`
could fail if `checkForUpdates()` was called again after an update was
already downloaded.
[#​50216](https://redirect.github.com/electron/electron/pull/50216 )
<sup>(Also in
[39](https://redirect.github.com/electron/electron/pull/50215 ),
[41](https://redirect.github.com/electron/electron/pull/50217 ))</sup>
- Fixed an issue where Chrome Devtools menus may not appear in certain
embedded windows.
[#​50138](https://redirect.github.com/electron/electron/pull/50138 )
<sup>(Also in
[39](https://redirect.github.com/electron/electron/pull/50136 ),
[41](https://redirect.github.com/electron/electron/pull/50137 ))</sup>
- Fixed an issue where `additionalData` passed to
`app.requestSingleInstanceLock` on Windows could be truncated or fail to
deserialize in the primary instance's `second-instance` event.
[#​50162](https://redirect.github.com/electron/electron/pull/50162 )
<sup>(Also in
[38](https://redirect.github.com/electron/electron/pull/50177 ),
[39](https://redirect.github.com/electron/electron/pull/50174 ),
[41](https://redirect.github.com/electron/electron/pull/50154 ))</sup>
- Fixed an issue where `screen.getCursorScreenPoint()` crashed on
Wayland when it was called before a `BrowserWindow` had been created.
[#​50104](https://redirect.github.com/electron/electron/pull/50104 )
<sup>(Also in
[39](https://redirect.github.com/electron/electron/pull/50106 ),
[41](https://redirect.github.com/electron/electron/pull/50105 ))</sup>
- Fixed an issue where calling `setBounds` on a `WebContentsView` could
trigger redundant `page-favicon-updated` events even when the favicon
had not changed.
[#​50084](https://redirect.github.com/electron/electron/pull/50084 )
<sup>(Also in
[39](https://redirect.github.com/electron/electron/pull/50086 ),
[41](https://redirect.github.com/electron/electron/pull/50085 ))</sup>
- Fixed an issue where invalid characters in custom protocol or
webRequest response header values were not rejected.
[#​50131](https://redirect.github.com/electron/electron/pull/50131 )
<sup>(Also in
[38](https://redirect.github.com/electron/electron/pull/50130 ),
[39](https://redirect.github.com/electron/electron/pull/50129 ),
[41](https://redirect.github.com/electron/electron/pull/50132 ))</sup>
- Fixed an issue where permission and device-chooser handlers received
the top-level page origin instead of the requesting subframe's origin.
[#​50149](https://redirect.github.com/electron/electron/pull/50149 )
<sup>(Also in
[38](https://redirect.github.com/electron/electron/pull/50151 ),
[39](https://redirect.github.com/electron/electron/pull/50147 ),
[41](https://redirect.github.com/electron/electron/pull/50148 ))</sup>
- Fixed an issue where traffic light buttons would flash at position
(0,0) when restoring a window with a custom `trafficLightPosition` from
minimization on macOS.
[#​50207](https://redirect.github.com/electron/electron/pull/50207 )
<sup>(Also in
[39](https://redirect.github.com/electron/electron/pull/50208 ),
[41](https://redirect.github.com/electron/electron/pull/50209 ))</sup>
- Fixed bug where opening a message box immediately upon closing a child
window may cause the parent window to freeze on Windows.
[#​50189](https://redirect.github.com/electron/electron/pull/50189 )
<sup>(Also in
[39](https://redirect.github.com/electron/electron/pull/50190 ),
[41](https://redirect.github.com/electron/electron/pull/50191 ))</sup>
- Reverted AltGr key fix that caused menu bar to no longer show on
Windows.
[#​50110](https://redirect.github.com/electron/electron/pull/50110 )
<sup>(Also in
[39](https://redirect.github.com/electron/electron/pull/50109 ),
[41](https://redirect.github.com/electron/electron/pull/50111 ))</sup>
#### Other Changes
- Backported fix for chromium:485622239.
[#​50168](https://redirect.github.com/electron/electron/pull/50168 )
</details>
<details>
<summary>evanw/esbuild (esbuild)</summary>
###
[`v0.27.4`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0274 )
[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.27.3...v0.27.4 )
- Fix a regression with CSS media queries
([#​4395](https://redirect.github.com/evanw/esbuild/issues/4395 ),
[#​4405](https://redirect.github.com/evanw/esbuild/issues/4405 ),
[#​4406](https://redirect.github.com/evanw/esbuild/issues/4406 ))
Version 0.25.11 of esbuild introduced support for parsing media queries.
This unintentionally introduced a regression with printing media queries
that use the `<media-type> and <media-condition-without-or>` grammar.
Specifically, esbuild was failing to wrap an `or` clause with
parentheses when inside `<media-condition-without-or>`. This release
fixes the regression.
Here is an example:
```css
/* Original code */
@​media only screen and ((min-width: 10px) or (min-height: 10px))
{
a { color: red }
}
/* Old output (incorrect) */
@​media only screen and (min-width: 10px) or (min-height: 10px) {
a {
color: red;
}
}
/* New output (correct) */
@​media only screen and ((min-width: 10px) or (min-height: 10px))
{
a {
color: red;
}
}
```
- Fix an edge case with the `inject` feature
([#​4407](https://redirect.github.com/evanw/esbuild/issues/4407 ))
This release fixes an edge case where esbuild's `inject` feature could
not be used with arbitrary module namespace names exported using an
`export {} from` statement with bundling disabled and a target
environment where arbitrary module namespace names is unsupported.
With the fix, the following `inject` file:
```js
import jquery from 'jquery';
export { jquery as 'window.jQuery' };
```
Can now always be rewritten as this without esbuild sometimes
incorrectly generating an error:
```js
export { default as 'window.jQuery' } from 'jquery';
```
- Attempt to improve API handling of huge metafiles
([#​4329](https://redirect.github.com/evanw/esbuild/issues/4329 ),
[#​4415](https://redirect.github.com/evanw/esbuild/issues/4415 ))
This release contains a few changes that attempt to improve the behavior
of esbuild's JavaScript API with huge metafiles (esbuild's name for the
build metadata, formatted as a JSON object). The JavaScript API is
designed to return the metafile JSON as a JavaScript object in memory,
which makes it easy to access from within a JavaScript-based plugin.
Multiple people have encountered issues where this API breaks down with
a pathologically-large metafile.
The primary issue is that V8 has an implementation-specific maximum
string length, so using the `JSON.parse` API with large enough strings
is impossible. This release will now attempt to use a fallback
JavaScript-based JSON parser that operates directly on the UTF8-encoded
JSON bytes instead of using `JSON.parse` when the JSON metafile is too
big to fit in a JavaScript string. The new fallback path has not yet
been heavily-tested. The metafile will also now be generated with
whitespace removed if the bundle is significantly large, which will
reduce the size of the metafile JSON slightly.
However, hitting this case is potentially a sign that something else is
wrong. Ideally you wouldn't be building something so enormous that the
build metadata can't even fit inside a JavaScript string. You may want
to consider optimizing your project, or breaking up your project into
multiple parts that are built independently. Another option could
potentially be to use esbuild's command-line API instead of its
JavaScript API, which is more efficient (although of course then you
can't use JavaScript plugins, so it may not be an option).
</details>
<details>
<summary>capricorn86/happy-dom (happy-dom)</summary>
###
[`v20.8.4`](https://redirect.github.com/capricorn86/happy-dom/compare/v20.8.3...82a0888cb2c87a6123e05424b528f8e8c9b3e426 )
[Compare
Source](https://redirect.github.com/capricorn86/happy-dom/compare/v20.8.3...v20.8.4 )
</details>
<details>
<summary>vuejs/devtools (vite-plugin-vue-devtools)</summary>
###
[`v8.1.0`](https://redirect.github.com/vuejs/devtools/releases/tag/v8.1.0 )
[Compare
Source](https://redirect.github.com/vuejs/devtools/compare/v8.0.7...v8.1.0 )
*No significant changes*
##### [View changes on
GitHub](https://redirect.github.com/vuejs/devtools/compare/v8.0.8...v8.1.0 )
</details>
<details>
<summary>vitest-dev/vitest (vitest)</summary>
###
[`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
[@​kirkwaiblinger](https://redirect.github.com/kirkwaiblinger ) in
[#​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
[@​ronnakamoto](https://redirect.github.com/ronnakamoto ) and
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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 [@​atscott](https://redirect.github.com/atscott )
and [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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 [@​Copilot](https://redirect.github.com/Copilot ),
**sheremet-va** and
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​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
[@​macarie](https://redirect.github.com/macarie ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​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
[@​thor-juhasz](https://redirect.github.com/thor-juhasz ) and
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​jgillick](https://redirect.github.com/jgillick ) and **Jeremy
Gillick** in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​macarie](https://redirect.github.com/macarie ) in
[#​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
[@​Copilot](https://redirect.github.com/Copilot ), **sheremet-va**
and [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ), **Claude Opus
4.6** and [@​sheremet-va](https://redirect.github.com/sheremet-va )
in
[#​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
[@​shairez](https://redirect.github.com/shairez ) in
[#​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
[@​macarie](https://redirect.github.com/macarie ) in
[#​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 [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9677](https://redirect.github.com/vitest-dev/vitest/issues/9677 )
[<samp>(c3f37)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c3f37721c )
- **cli**:
- Add [@​bomb](https://redirect.github.com/bomb ).sh/tab
completions - by
[@​AmirSa12](https://redirect.github.com/AmirSa12 ) and
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​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
[@​kykim00](https://redirect.github.com/kykim00 ) and
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) and
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ), **Claude Opus
4.6** and [@​sheremet-va](https://redirect.github.com/sheremet-va )
in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​cpojer](https://redirect.github.com/cpojer ) in
[#​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
[@​MazenSamehR](https://redirect.github.com/MazenSamehR ), **Matan
Shavit**, [@​AriPerkkio](https://redirect.github.com/AriPerkkio )
and [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​userquin](https://redirect.github.com/userquin ) in
[#​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
[@​userquin](https://redirect.github.com/userquin ) in
[#​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
[@​julianhahn](https://redirect.github.com/julianhahn ) and
[@​cursoragent](https://redirect.github.com/cursoragent ) in
[#​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
[@​DerYeger](https://redirect.github.com/DerYeger ) and
[@​userquin](https://redirect.github.com/userquin ) in
[#​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
[@​macarie](https://redirect.github.com/macarie ) and **jhnance**
in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​WuMingDao](https://redirect.github.com/WuMingDao ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa )
and **Claude Opus 4.6** in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ), **hi-ogawa**
and **Claude Opus 4.6** in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​iumehara](https://redirect.github.com/iumehara ),
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​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
[@​kaigritun](https://redirect.github.com/kaigritun ), **Kai
Gritun** and
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​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
[@​flx-sta](https://redirect.github.com/flx-sta ) in
[#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa )
in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​nami8824](https://redirect.github.com/nami8824 ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa )
in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​lesleh](https://redirect.github.com/lesleh ) in
[#​9650](https://redirect.github.com/vitest-dev/vitest/issues/9650 )
and
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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 [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​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
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​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
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​9727](https://redirect.github.com/vitest-dev/vitest/issues/9727 )
[<samp>(4072d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4072d0132 )
- Fix `vi.importActual()` for virtual modules - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​9772](https://redirect.github.com/vitest-dev/vitest/issues/9772 )
[<samp>(1e89e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1e89ec020 )
- Throw `FixtureAccessError` if suite hook accesses undefined fixture
- by [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9786](https://redirect.github.com/vitest-dev/vitest/issues/9786 )
[<samp>(fc2ce)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fc2cea2b7 )
- Allow hyphens in project config file name pattern - by
[@​Koutaro-Hanabusa](https://redirect.github.com/Koutaro-Hanabusa )
and [@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​9760](https://redirect.github.com/vitest-dev/vitest/issues/9760 )
[<samp>(33e96)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/33e96311a )
- Manual and redirect mock shouldn't `load` or `transform` original
module - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa )
and **Claude Opus 4.6** in
[#​9774](https://redirect.github.com/vitest-dev/vitest/issues/9774 )
[<samp>(a8216)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a8216b001 )
- `hideSkippedTests` should not hide `test.todo` - by
[@​oilater](https://redirect.github.com/oilater ) in
[#​9562](https://redirect.github.com/vitest-dev/vitest/issues/9562 )
and
[#​9781](https://redirect.github.com/vitest-dev/vitest/issues/9781 )
[<samp>(8181e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/8181e06e7 )
- Allow catch/finally for async assertion - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​9827](https://redirect.github.com/vitest-dev/vitest/issues/9827 )
[<samp>(031f0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/031f02a89 )
- Resolve fixture overrides from test's suite in `beforeEach` hooks -
by [@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​9826](https://redirect.github.com/vitest-dev/vitest/issues/9826 )
[<samp>(99e52)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/99e52fe58 )
- Use isAgent check, not just TTY, for watch mode - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9841](https://redirect.github.com/vitest-dev/vitest/issues/9841 )
[<samp>(c3cac)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c3cac1c1b )
- Use `performance.now` to measure test timeout duration - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​9795](https://redirect.github.com/vitest-dev/vitest/issues/9795 )
[<samp>(f48a6)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f48a60114 )
- Correctly identify concurrent test during static analysis - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9846](https://redirect.github.com/vitest-dev/vitest/issues/9846 )
[<samp>(1de0a)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1de0aa22d )
- **browser**:
- Avoid updating screenshots when `toMatchScreenshot` passes - by
[@​macarie](https://redirect.github.com/macarie ) in
[#​9289](https://redirect.github.com/vitest-dev/vitest/issues/9289 )
[<samp>(46aab)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/46aabaa44 )
- Hide injected data-testid attributes - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9503](https://redirect.github.com/vitest-dev/vitest/issues/9503 )
[<samp>(c8d2c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c8d2c411c )
- Throw an error if iframe was reloaded - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9516](https://redirect.github.com/vitest-dev/vitest/issues/9516 )
[<samp>(73a81)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/73a81f880 )
- Encode projectName in browser client URL - by
[@​dkkim0122](https://redirect.github.com/dkkim0122 ) in
[#​9523](https://redirect.github.com/vitest-dev/vitest/issues/9523 )
[<samp>(5b164)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5b16483c3 )
- Don't take failure screenshot if tests have artifacts created by
`toMatchScreenshot` - by
[@​macarie](https://redirect.github.com/macarie ) in
[#​9552](https://redirect.github.com/vitest-dev/vitest/issues/9552 )
[<samp>(83ca0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/83ca02547 )
- Remove `--remote-debugging-address` from chrome args - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​9712](https://redirect.github.com/vitest-dev/vitest/issues/9712 )
[<samp>(f09bb)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f09bb5c32 )
- Make sure userEvent actions support `ensureAwaited` - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9732](https://redirect.github.com/vitest-dev/vitest/issues/9732 )
[<samp>(97685)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9768517b8 )
- Types of `getCDPSession` and `cdp()` - by
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​9716](https://redirect.github.com/vitest-dev/vitest/issues/9716 )
[<samp>(689a2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/689a22a1b )
- Skip esbuild.legalComments when using rolldown-vite - by
[@​Copilot](https://redirect.github.com/Copilot ), **hi-ogawa** and
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​9803](https://redirect.github.com/vitest-dev/vitest/issues/9803 )
[<samp>(3505f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3505fa5a3 )
- **chai**:
- Don't allow `deepEqual` in the config because it's not serializable
- by [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9666](https://redirect.github.com/vitest-dev/vitest/issues/9666 )
[<samp>(9ee99)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9ee999d73 )
- **coverage**:
- Infer transform mode for uncovered files - by
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​9435](https://redirect.github.com/vitest-dev/vitest/issues/9435 )
[<samp>(f3967)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f396792d6 )
- `thresholds.autoUpdate` to preserve ending whitespace - by
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​9436](https://redirect.github.com/vitest-dev/vitest/issues/9436 )
[<samp>(7e534)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7e534a0b6 )
- **deps**:
- Update all non-major dependencies - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) in
[#​9192](https://redirect.github.com/vitest-dev/vitest/issues/9192 )
[<samp>(90c30)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/90c302f3b )
- Update all non-major dependencies - in
[#​9485](https://redirect.github.com/vitest-dev/vitest/issues/9485 )
[<samp>(c0118)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c01186022 )
- Update all non-major dependencies - in
[#​9567](https://redirect.github.com/vitest-dev/vitest/issues/9567 )
[<samp>(13c9e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/13c9e022b )
- **docs**:
- Fix old `/config/#option` hash links causing hydration errors - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ), **Claude Opus
4.6** and [@​sheremet-va](https://redirect.github.com/sheremet-va )
in
[#​9610](https://redirect.github.com/vitest-dev/vitest/issues/9610 )
[<samp>(a603c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a603c3a30 )
- **expect**:
- `toMatchObject(Map/Set)` should expect `Map/Set` on left hand side -
by [@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​9532](https://redirect.github.com/vitest-dev/vitest/issues/9532 )
[<samp>(381da)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/381da4a9d )
- Fix objectContaining with proxy - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​9554](https://redirect.github.com/vitest-dev/vitest/issues/9554 )
[<samp>(7ce34)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7ce3417b1 )
- Support arbitrary value equality for `toThrow` and make Error
detection robust - by
[@​hi-ogawa](https://redirect.github.com/hi-ogawa ) and **Claude
Opus 4.6** in
[#​9570](https://redirect.github.com/vitest-dev/vitest/issues/9570 )
[<samp>(de215)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/de215c19c )
- **mock**:
- Inject helpers after hashbang if present - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9545](https://redirect.github.com/vitest-dev/vitest/issues/9545 )
[<samp>(65432)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/65432a74b )
- **mocker**:
- Update vite's peer dependency range - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9808](https://redirect.github.com/vitest-dev/vitest/issues/9808 )
[<samp>(36f9a)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/36f9a81a2 )
- **reporter**:
- `dot` reporter leaves pending tests - by
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​9684](https://redirect.github.com/vitest-dev/vitest/issues/9684 )
[<samp>(4d793)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4d7938a56 )
- **runner**:
- Mark repeated tests as finished on last run - by
[@​AriPerkkio](https://redirect.github.com/AriPerkkio ) in
[#​9707](https://redirect.github.com/vitest-dev/vitest/issues/9707 )
[<samp>(cc735)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/cc735970a )
- **spy**:
- Support deep partial in vi.mocked - by
[@​j2h30728](https://redirect.github.com/j2h30728 ) in
[#​8152](https://redirect.github.com/vitest-dev/vitest/issues/8152 )
and
[#​9493](https://redirect.github.com/vitest-dev/vitest/issues/9493 )
[<samp>(71cb5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/71cb51ffc )
- Fallback to object accessor if descriptor's value is `undefined` -
by [@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9511](https://redirect.github.com/vitest-dev/vitest/issues/9511 )
[<samp>(6f181)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6f18103fa )
- Throw correct errors when shorthand methods are used on a class - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9513](https://redirect.github.com/vitest-dev/vitest/issues/9513 )
[<samp>(5d0fd)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5d0fd3b62 )
- **types**:
- `bench.reporters` no longer gives type errors when passing file name
string paths - by
[@​Bertie690](https://redirect.github.com/Bertie690 ) in
[#​9695](https://redirect.github.com/vitest-dev/vitest/issues/9695 )
[<samp>(093c8)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/093c8f6b5 )
- **ui**:
- Process artifact attachments when generating HTML reporter - by
[@​macarie](https://redirect.github.com/macarie ) in
[#​9472](https://redirect.github.com/vitest-dev/vitest/issues/9472 )
[<samp>(96eb9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/96eb92826 )
- Don't fail if --ui and --root are specified together - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9536](https://redirect.github.com/vitest-dev/vitest/issues/9536 )
[<samp>(d9305)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d93055fc7 )
##### 🏎 Performance
- **pretty-format**: Combine DOMElement plugins - by
[@​sheremet-va](https://redirect.github.com/sheremet-va ) in
[#​9581](https://redirect.github.com/vitest-dev/vitest/issues/9581 )
[<samp>(da85a)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/da85a3267 )
##### [View changes on
GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.17...v4.1.0 )
</details>
---
### Configuration
📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3
* * * ) (UTC), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions ) if
that's undesired.
---
- [ ] <!-- 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/go-vikunja/vikunja ).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-14 22:49:09 +00:00
Tink
28cc9e0571
fix: prevent authenticated UI flash when server rejects JWT session ( #2387 )
2026-03-11 09:37:46 +01:00
renovate[bot]
c57c884fd4
chore(deps): update dependency sass-embedded to v1.98.0
2026-03-11 08:53:39 +01:00
kolaente
d196af0503
fix: remove debounce from color picker to prevent stale color on save
...
The color picker had a 500ms debounce before propagating the selected
color to the parent component. Since all usages save via an explicit
button click (not automatically), the debounce only caused a race
condition where the model value could be stale when the user clicked
Save within 500ms of picking a color.
Closes go-vikunja/vikunja#2312
2026-03-10 23:26:24 +01:00
Frederick [Bot]
30fccfb058
chore(i18n): update translations via Crowdin
2026-03-10 01:08:39 +00:00
renovate[bot]
271da6a2ec
chore(deps): update dev-dependencies to v8.57.0
2026-03-09 21:06:23 +01:00
kolaente
2e1648ef4c
feat: add user-level webhooks settings page
...
Add a new settings page for managing user-level webhooks. Extract
webhook form into shared WebhookManager component used by both
project and user webhook settings. Add routing, translations,
and navigation entry.
2026-03-08 19:45:53 +01:00
renovate[bot]
52e47c732f
chore(deps): update dependency eslint to v9.39.4
2026-03-08 12:09:25 +01:00
Frederick [Bot]
bc583b2efb
chore(i18n): update translations via Crowdin
2026-03-07 01:09:03 +00:00
renovate[bot]
c49d8e129a
chore(deps): update dev-dependencies
2026-03-06 10:02:55 +01:00
dependabot[bot]
b85ad9c298
chore(deps): bump dompurify from 3.3.1 to 3.3.2 in /frontend
...
Bumps [dompurify](https://github.com/cure53/DOMPurify ) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/cure53/DOMPurify/releases )
- [Commits](https://github.com/cure53/DOMPurify/compare/3.3.1...3.3.2 )
---
updated-dependencies:
- dependency-name: dompurify
dependency-version: 3.3.2
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-03-06 10:02:38 +01:00
renovate[bot]
e5701fc0e3
chore(deps): update dev-dependencies
2026-03-06 08:47:55 +01:00
Frederick [Bot]
4b5b7e69cc
chore(i18n): update translations via Crowdin
2026-03-06 01:17:05 +00:00
renovate[bot]
2dd4421fb5
chore(deps): update dependency vite-svg-loader to v5.1.1
2026-03-05 19:43:50 +01:00
Noah Neukam
d7722d0193
fix(menu): prevent dropdown from closing when cursor crosses offset gap ( #2367 )
2026-03-05 12:50:04 +01:00
kolaente
b5d8576c2a
chore(deps): update svgo to 3.3.3
2026-03-05 11:05:32 +01:00
kolaente
5f0f3cc820
chore(deps): update immutable to 5.1.5
2026-03-05 11:05:32 +01:00
Frederick [Bot]
74aec78701
chore(i18n): update translations via Crowdin
2026-03-05 01:13:59 +00:00
kolaente
6c9407c58f
feat: add duplicate button to task detail view
2026-03-04 17:20:26 +01:00
kolaente
2014d50b95
feat: add duplicateTask action to task store
2026-03-04 17:20:26 +01:00
kolaente
52bee379d4
feat: add task duplicate frontend model and service
2026-03-04 17:20:26 +01:00
renovate[bot]
3fad03d40f
chore(deps): update dependency rollup-plugin-visualizer to v6.0.11
2026-03-04 11:03:35 +01:00
kolaente
79ac50b99b
fix(test): update mobile kanban test to use close button instead of back button
...
The back button was removed from modal mode in the previous commit.
On mobile kanban, tasks open as modals, so the test now uses the
close button from the Heading component instead.
2026-03-03 16:04:37 +01:00
Claude
8a4f3a916f
fix: remove duplicate close button on mobile task detail view
...
When viewing a task in modal mode on mobile, both a back button and a close button were displayed, causing confusion. The back button condition `!isModal || isMobile` meant it would show on mobile even in modal mode.
This fix changes the back button to only display when not in modal mode (`!isModal`), ensuring only the close button appears when viewing tasks in a modal on mobile devices.
Also removed the now-unused `isMobile` variable and its import.
2026-03-03 16:04:37 +01:00
Copilot
c6f0d8babe
feat: surface API validation errors to registration form fields ( #1902 )
...
This PR surfaces API validation errors from the registration endpoint
directly onto the corresponding form fields, instead of only showing a
generic "invalid data" message. A new `parseValidationErrors` helper
extracts field names and messages from the API's `invalid_fields` array
(e.g. `["email: email is not a valid email address"]`) and maps them to
the appropriate form fields. The Register component integrates this
parser into its error handling, prioritizing client-side validation but
falling back to server-side field errors when present. Errors are
cleared as the user types.
A follow-up commit addressed PR review feedback: the `ValidationError`
interface is now exported from the parser module and reused in
`Register.vue` (eliminating a duplicate `ApiValidationError` interface),
the type guard was tightened to check specifically for `invalid_fields`
rather than broadly matching any object with a `message` property, the
fallback error message always uses the localized translation key instead
of potentially surfacing raw backend messages, and the
`serverValidationErrors` ref uses `Partial<Record>` to accurately
reflect that keys are optional.
🐰 A parser hops through error fields,
Catching field names as each one yields,
Client and server now both agree,
Validation flows harmoniously free!
Whitespace trimmed, no colon? It hops along,
Register form now validated strong! ✨
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: kolaente <k@knt.li>
2026-03-03 14:27:24 +01:00
kolaente
da9cb87448
fix(shortcuts): track active sequences explicitly to prevent misfires
...
Replace the global sequenceBuffer (which only tracked key count) with
per-candidate ActiveSequence tracking. This fixes two bugs:
- Sequences with different prefixes could misfire once any sequence
started, since only buffer length was checked, not which sequence
was being matched.
- Single-key shortcuts could fire during an in-progress sequence,
preempting sequence completion depending on binding iteration order.
2026-03-03 14:00:25 +01:00
kolaente
f8763d812e
fix: correct package.json indentation after dependency removal
2026-03-03 14:00:25 +01:00
kolaente
8bf0d581ce
test(shortcuts): add unit tests for shortcut parsing logic
...
Add 46 tests covering:
- parseKey: single keys, modifiers, multi-modifier combos, special keys
- matchesKey: code matching, modifier matching, Mod platform-adaptive behavior
- eventToShortcutString: plain keys, modifiers, modifier-only filtering, non-Latin layouts
- isFormField: input/textarea/select/contentEditable detection
Export parseKey, matchesKey, and isFormField for testability.
2026-03-03 14:00:25 +01:00
kolaente
c5703acedf
fix(shortcuts): resolve lint errors in shortcut module
...
Replace `any` type assertions with proper types:
- Use WeakMap for element-to-binding mapping instead of expando properties
- Use typed intersection for Firefox's explicitOriginalTarget property
2026-03-03 14:00:25 +01:00
kolaente
18969e61be
chore(deps): remove @github/hotkey dependency
...
Remove @github/hotkey package, its patch file, and the
patchedDependencies entry since all shortcut handling is now done by
the custom @/helpers/shortcut module.
2026-03-03 14:00:25 +01:00
kolaente
79cd3433f5
refactor(shortcuts): use event.code for raw keyboard handlers
...
Change e.key to e.code in global keyboard shortcut handlers for
consistency with the new event.code-based shortcut system:
- ProjectList.vue: 'j'/'k'/'Enter' -> 'KeyJ'/'KeyK'/'Enter'
- useGanttBar.ts: 'ArrowLeft'/'ArrowRight' (identical values, for consistency)
- Modal.vue: 'Escape' (identical value, for consistency)
2026-03-03 14:00:25 +01:00
kolaente
e3fdaed94a
refactor(shortcuts): replace eventToHotkeyString with eventToShortcutString
...
Migrate all imperative shortcut matching from @github/hotkey's
eventToHotkeyString to the new event.code-based eventToShortcutString.
Updated comparison strings:
- 'Meta+k'/'Control+k' -> 'Meta+KeyK'/'Control+KeyK'
- 'Control+s'/'Meta+s' -> 'Control+KeyS'/'Meta+KeyS'
- 'Control+.' -> 'Control+Period'
- '.' -> 'Period'
- 'Enter' stays 'Enter' (identical in event.code)
2026-03-03 14:00:25 +01:00
kolaente
f2901deb00
refactor(shortcuts): update v-shortcut values to event.code format
...
Change all shortcut strings from character-based format to event.code
format:
- Single letters: 't' -> 'KeyT', 's' -> 'KeyS', etc.
- Sequences: 'g o' -> 'KeyG KeyO', etc.
- Modifiers: 'Mod+e' -> 'Mod+KeyE', 'Shift+?' -> 'Shift+Slash'
- edit-shortcut prop: 'e' -> 'KeyE'
Shortcuts like 'Escape' and 'Shift+Delete' remain unchanged as their
event.code values are identical.
2026-03-03 14:00:25 +01:00
kolaente
8dc6e77ba0
refactor(shortcuts): update directive to use new shortcut module
...
Change import in the v-shortcut directive from @github/hotkey to the
new @/helpers/shortcut module. The install/uninstall API is identical.
2026-03-03 14:00:25 +01:00