π§ chore(sync): advance main to dev/v1.6 - #600
Conversation
Review-driven corrections to the v1.5.2 docs/api batch (040d490), found by two adversarially-verified review passes. Targets v1.6 (no standalone v1.5.2). - π fix(api): define NotificationOutboxEntry/NotificationOutboxResult schemas β both were referenced by $ref but never declared, making the assembled OpenAPI document invalid (Swagger UI/Redoc/codegen failed on the unresolved refs) - β test(api): add a recursive guard that fails on ANY dangling #/components/schemas/* $ref, so this class of bug can't regress - π fix(api): emit the canonical /api/v1 base in every pagination _links (container list, watch, security vulnerabilities, update-operations, audit) to match the migrated spec - π fix(api): correct registryWebhookSignature headers in the spec β drop x-gitlab-token (never checked), add x-registry-signature + x-harbor-signature (both accepted by the handler) - π fix(api): revert LogoutResponse.logoutUrl to type:string (the handler omits the field, it never emits null) - π fix(api): correct the remote-trigger 409 description (rollback-container only), document the outbox GET 500, and the scan-all 400 scanner-not-configured case - β test(api): add spec-structure tests for /api/v1/log/components, /auth/status, /api/v1/app auth posture, RegistryWebhookResponse, and the full /api/v1/webhooks/registry responses - π docs(api): correct the registry webhook header list in api/index.mdx; drop legacy dd.trigger.include from the edited eligibility row; document the now-reachable GET /api/v1/containers/backups in CHANGELOG
- π fix(ui): cancelUpdateOperation now POSTs /api/v1/operations/:id/cancel (was the deprecated /api/ alias slated for removal in v1.6.0, which would have 404'd) - π fix(ui): ConfigView webhook panel and copyable curl example show /api/v1/webhook/* to match the published docs
β¦anches - π docs(readme): point the docs-refresh note and roadmap row at v1.6 (the standalone v1.5.2 lane was dropped β folded into v1.6) - π docs(contributing): add the qlty-smells advisory row and renumber the pre-push pipeline table to match lefthook.yml - β test(web): cover the docs-link-rewriter bare /docs/assets and single-quoted-attribute branches
- suppressHydrationWarning on the 7 homepage .reveal wrappers (the pre-hydration reveal bootstrap mutates them, causing a hydration mismatch) - og:image + twitter:image on /compare, /compare/[slug], and the Trivy security advisory (page-level openGraph was replacing the layout's and dropping the share image) - dockge compare: i18n row reflects shipped 17-locale support (was stale 'Planned'/competitor; both ship i18n now β tie)
- discord-icon.tsx: official Discord mark, mirrors github-icon API - site-config: discordUrl invite - footer: Discord social link between GitHub and Docs - README: Community section pointing to Discord + GitHub Issues
First commit of #242 table unification. Adds an isMobile prop (default false, non-regressive): the first non-icon column pins sticky-left during horizontal scroll, interactive rows are floored at a 44px touch target, and the 8px resize handle is hidden on touch. 3769 ui tests green at 100% coverage. Refs: #242
Removes the DataCardGrid/DataListAccordion render branches and the view-mode switcher binding from the 5 simple data views; DataTable now renders unconditionally. Also drops AuditView's ?view= URL-query mode mechanism (now a no-op). useViewMode/DataCardGrid/DataListAccordion source files are deleted in a later commit. 3763 ui tests green at 100% coverage, typecheck clean. Refs: #242
Removes the card/list render branches and view-mode switcher from the 4 remaining non-container views. AgentsView drops its non-table EmptyState (DataTable empty slot covers it); SecurityView keeps its breakpoint-driven isCompact column swap; TriggersView's inline test button moves into the DataTable actions column. 3763 ui tests green at 100% coverage, typecheck clean. Refs: #242
Removes the ~427-line DataCardGrid/DataListAccordion render block and the containerViewMode switcher from ContainersGroupedViews/ContainersView/ContainersListContent; the column picker is now always shown, and the template-context type + its typecheck guard drop containerViewMode. Dead helpers (getContainerViewMemo, getGroupByKey) removed. 3747 ui tests green at 100% coverage, tsc clean. Refs: #242
Removes DataCardGrid.vue and DataListAccordion.vue (now-unused card/list surfaces) plus useViewMode.ts and auditViewMode.ts, each with its spec. Cleans up the main.ts global registrations, the preferences index export, the ComponentImports/main registration assertions, the data-view stubs, and rewrites the lifecycle spec off useViewMode. 3674 ui tests green at 100% coverage, tsc clean. Refs: #242
The table/cards/list switcher is dead now that every view is table-only. Removes the modelValue/viewModes props, the update:modelValue emit, defaultViewModes, viewModeName/viewModeLabel, and the switcher button group; keeps the count display, filter toggle, badge, slots, and filter panel. Test stubs simplified to match. 3669 ui tests green at 100% coverage, tsc clean. Refs: #242
Every view is table-only now, so viewMode/mode are dead. Bumps CURRENT_SCHEMA_VERSION 7->8, removes containers.viewMode and views.*.mode from the schema and DEFAULTS (security/agents keep their sort fields; the mode-only views collapse to empty stubs), and strips the dead migration branches (SIMPLE_VIEW_MODE_KEYS, migrateSimpleViewModePreferences, migrateAuditViewPreference, the mode logic in migrateSortableViewPreference/migrateContainersPreference/sanitizeContainers). Legacy dd-*-view-v1 keys stay in LEGACY_KEYS so they're still cleaned up, just not migrated. mergeDefaults drops any persisted mode field, so no explicit v7->v8 transform is needed. 3657 ui tests green at 100% coverage, tsc clean. Refs: #242
After schema v8 dropped every view-mode field, the ViewMode type, VIEW_MODES set, and isViewMode guard have zero consumers. Removes them from schema.ts/validators.ts and the preferences index re-export, with their validators.spec/index.spec tests. 3651 ui tests green at 100% coverage, tsc clean. Refs: #242
The v1.5.1 brand refresh (#439) moved the website to the cropped whale "headshot" icon but left the app UI on the old full-body whale. Ship the same icon set in ui/ so the product matches getdrydock.com. - Replace ui/public favicon.ico, favicon-96x96.png, apple-touch-icon.png and both web-app-manifest PNGs with the website's headshot assets - Remove the stale favicon.svg (browsers preferred it over the PNGs, so it kept rendering the old mark) and its <link>; the website ships no SVG - Add a ?v=2 cache-buster to the icon links so existing installs re-fetch instead of serving the aggressively cached old favicon - Match the website manifest's "any maskable" PWA icon purpose Ref: #439
β¦ast (#466) The SPA history-mode fallback returned index.html for every unmatched path, including a request for a content-hashed /assets/*.js bundle that a prior build referenced but the upgrade deleted. Browsers won't execute a module script served as text/html, so a page cached from the old build (often by a reverse proxy that ignores the HTML's Cache-Control: no-store) white-screened, and caching proxies could poison the asset URL with HTML. - π fix(api): return a clean 404 (no-store) for /assets/* misses in the UI catch-all instead of the SPA shell (app/api/ui.ts) - β test(api): cover the 404 branch + the index.html fallback branch (app/api/ui.test.ts β 100% coverage on ui.ts) - π docs(server): add a "Reverse proxy caching (blank page after an update)" section with browser/proxy cache guidance + per-proxy notes Doesn't self-heal an already-blank page (clearing the browser/proxy cache is still the fix for that), but stops drydock turning a missing bundle into a silent white screen. Ref: #466
C8-fix for #242 responsive DataTable β corrects the a11y/touch defects shipped in 4b11bd8: - logical inset props (start-0/end-0) so the sticky identity + actions columns render correctly in RTL (ar) - z-stack fix: header sticky cell z-20 out-stacks body sticky cell z-10 - 48px min touch row height (Material 3), overscroll-x-contain (Safari back-nav), scope=col on all header cells - new per-theme --dd-sticky-separator token (>=3:1, WCAG 1.4.11) replacing the sub-threshold grey box-shadow; avoids reusing the 1.58:1 --dd-border-strong Follow-up (not in this commit): AppIconButton size=toolbar renders 32px β clears WCAG 2.5.8 min (24px) but under the 44px target.
β¦ainer width - β¨ feat(ui): card mode renders each row as a stacked card (title from the first non-icon column, priority-or-order subtitle, dt/dd body) reusing the existing cell/actions/full-row slots β no per-view changes needed - β¨ feat(ui): native sort select + direction toggle replace the clickable table header in card mode, emitting the same update:sortKey/update:sortAsc - π i18n(ui): add sharedComponents.dataTable.sortBy + sort direction labels - β test(ui): 41 new card-mode specs (breakpoint boundaries, slot reuse, sort control edge cases, virtual-scroll spacers, 44px touch targets, logical-properties-only RTL guard) Card mode triggers on DataTable's own container width (ResizeObserver), deliberately separate from the 768px window-based isMobile prop. Refs: #242
- β¨ feat(ui): first @media print rules in the app β cards keep break-inside: avoid so a card never splits across pages, the card-mode sort chrome (select + direction toggle) is hidden on paper, and the table's horizontal scroll container becomes overflow: visible so off-screen columns print instead of being clipped - β test(ui): source-assertion specs for the print block (house pattern from the column-sizing standard) + DOM assertions for the two new hook classes (dd-data-table-scroll, dd-data-table-card-sort-bar) Refs: #242
β¦ composition - β¨ feat(ui): new DataTableColumn fields β cardTitle forces a column to be the card title (table mode unaffected); cardPriority drives subtitle promotion (highest positive wins, ties by declared order) and body demotion (negative = out of the card; data stays reachable via the DetailPanel). Deliberately distinct from the auto-hide priority field, whose semantics run the opposite direction (higher = dropped first) β Containers pipes those values through, so reusing them would have promoted registry/uptime as the subtitle - π fix(ui): NotificationsView card title was the bare enabled ToggleSwitch (first non-icon column) β name is now flagged cardTitle, triggers is the subtitle - π fix(ui): AuditView card title was the raw timestamp β containerName is now the title, action the subtitle - β¨ feat(ui): density annotations β Containers subtitle = update kind with server/registry/uptime demoted; Watchers demotes cron; Agents subtitle = status with docker/os demoted; Servers subtitle = status; Security wide branch subtitle = critical - π fix(ui): Dashboard recent-updates widget mobile columns had empty labels, rendering blank dt labels in card mode β now reuse the desktop i18n keys - β test(ui): 27 new specs across DataTable, useColumnVisibility, and eight view suites, incl. regression proof that the auto-hide priority field no longer influences card composition Refs: #242
- β¨ feat(ui): new useFocusTrap composable β saves the previously focused element on activation, focuses the container (tabindex=-1), cycles Tab/Shift+Tab within focusable descendants, and restores focus on deactivation or scope disposal when the saved element is still connected. Built on a post-flush watchEffect because watch with immediate+post still runs its first call synchronously at setup, before template refs bind - β¨ feat(ui): DetailPanel activates the trap only when open on mobile β the desktop panel is a non-modal sticky sidebar that stays open across row clicks, so trapping or moving focus there would break keyboard row-browsing (matches the existing conditional aria-modal) - π fix(ui): mobile panel offset used physical right-0 β now logical end-0 so the overlay anchors correctly in RTL locales - β test(ui): 15 composable specs (activation, restore, disconnected restore target, wrap both directions, no-focusables, disposal) + 6 DetailPanel specs incl. desktop must-not-steal-focus guards Refs: #242
β¦only User column pickers hide columns from the table, but card mode (<640px container) deliberately ignores the hidden set β mobile has no picker to un-hide a column, so every non-demoted column must stay reachable there. - β¨ feat(ui): hiddenColumnKeys prop filters the table pipeline at normalizedColumns, so flex width redistribution excludes hidden columns and the template loops need no changes; full-width/spacer colspans follow the filtered count - β¨ feat(ui): card computeds now read an unfiltered normalized set (cardResolvedColumns) with a card-side first-non-icon fallback, so the card title stays stable even when its column is table-hidden - β test(ui): 10 specs β th/td/colgroup omission, width redistribution, sticky-column reflow when the first non-icon column is hidden, colspan shrink, card-mode precedence (hidden column reappears in cards), and composition with cardPriority demotion (each mechanism in its own mode) Refs: #242
β¦ble, picker)
- β¨ feat(ui): defaulted views.{security,watchers,servers,audit,agents}
.hiddenColumns preference fields β persisted as the HIDDEN set (not the
visible set, unlike Containers) so columns added in future releases stay
visible for existing users; no schema version bump needed, mergeDefaults
backfills; sanitizeViews clamps garbage, unknown keys, and required keys
- β¨ feat(ui): useViewColumnVisibility composable β per-call state seeded
from preferences with deep-watch write-back, required-column toggle
no-op, hiddenCount scoped to the current column set, reset
- β¨ feat(ui): shared DataTableColumnPicker component modeled on the
Containers picker (config icon trigger + hidden-count badge, teleported
flip-aware popover, Escape/outside-click close), hidden below 640px β
no picker on mobile since card mode ignores hiding; required rows never
emit toggle
- π i18n(ui): sharedComponents.columnPicker keys (tooltip, heading,
reset, badge tooltip)
- β
test(ui): 41 specs across sanitize clamps, composable persistence,
and picker interaction; preferences .ts files stay gate-enforced at 100%
Refs: #242
β¦and Audit - β¨ feat(ui): each view marks its identity column required, derives pickerColumns from tableColumns, persists hiding via useViewColumnVisibility, and renders DataTableColumnPicker in the filter bar's extra-buttons slot - β»οΈ refactor(ui): SecurityView's compact (<1024px window) branch no longer swaps to a two-column set β tableColumns always returns all 7 and the severity columns are force-hidden via the hiddenColumnKeys union instead, so card mode finally sees the full set (critical subtitle annotation engages on mobile); the picker hides in compact so users can't toggle columns the override would re-hide - π fix(ui): SecurityView spec mocked useBreakpoints with plain objects instead of refs, so template auto-unwrap never applied and every isCompact v-if was constantly truthy in tests β dormant infra bug, now real refs - β test(ui): sync guards pinning each view's column keys to VIEW_TABLE_COLUMN_KEYS, picker render/toggle/persistence per view, Security compact-union and picker-absence cases Refs: #242
β¦ path - β»οΈ refactor(ui): delete the bespoke picker (in-memory visible-set ref, non-teleported popover, hand-rolled positioning) in favor of DataTableColumnPicker + useViewColumnVisibility - β¨ feat(ui): picker choices now persist to preferences.views.agents.hiddenColumns β the bespoke picker had no persistence and reset on every reload - β»οΈ refactor(ui): the compact (<1024px window) collapse to required columns now flows through the hiddenColumnKeys union instead of pre-filtering, so card mode sees the full 7-column set; the in-name compact badge row is unchanged - ποΈ remove(ui): dead agentsView.list.toggleColumns/columnPickerHeading keys across all 17 locales (key-parity gate forbids orphans) - β test(ui): sync guard, required flag, persistence, compact union/picker-absence, badge-row cases; useBreakpoints mock switched to real refs (same dormant auto-unwrap bug class as SecurityView.spec) Refs: #242
Containers pre-filtered its columns before DataTable saw them, so picker-hidden and width-auto-hidden columns vanished from mobile cards β where no picker exists to bring them back. - π fix(ui): tableColumns now maps the full column catalog and hiding flows through DataTable's hiddenColumnKeys prop (picker-hidden βͺ width-auto-hidden), which card mode ignores by design; the uptime ticker stays gated on picker-visibility so opt-out users pay no cost - β»οΈ refactor(ui): ContainersListContent adopts the shared DataTableColumnPicker; bespoke popover, showColumnPicker plumbing, and global click/scroll handlers deleted; new resetColumns restores the shipped default set (opt-in uptime stays hidden) - ποΈ remove(ui): activeColumns (zero consumers) and the +N auto-hidden badge (picker-hidden count is the actionable signal); dead containerComponents.listContent picker keys purged from all 17 locales - β test(ui): hiddenColumnKeys cases (picker-only, auto-only, union, opt-in column), reset, wiring assertions across five containers specs Refs: #242
- ποΈ remove(ui): dataFilterBar.viewMode/viewModeLabel/viewModes.* (the switcher died in a76780f) and dataCardGrid/dataListAccordion keys (components died in d3329a0) from sharedComponents - ποΈ remove(ui): dead per-view card/list label sets (audit, security, registries, servers, triggers, watchers, agents) β every removal backed by a zero-consumer grep incl. template-literal t() sweeps - π i18n(ui): securityView.card.total kept (live in SecurityDetailPanel); all 17 locales updated in lockstep, -884 lines Refs: #242
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@fontsource/comic-mono](https://fontsource.org/fonts/comic-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/other/comic-mono)) | [`5.2.5` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fcomic-mono/5.2.5/5.3.0) |  |  | | [@fontsource/commit-mono](https://fontsource.org/fonts/commit-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/other/commit-mono)) | [`5.2.5` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fcommit-mono/5.2.5/5.3.0) |  |  | | [@fontsource/ibm-plex-mono](https://fontsource.org/fonts/ibm-plex-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/ibm-plex-mono)) | [`5.2.7` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fibm-plex-mono/5.2.7/5.3.0) |  |  | | [@fontsource/inconsolata](https://fontsource.org/fonts/inconsolata) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/inconsolata)) | [`5.2.8` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2finconsolata/5.2.8/5.3.0) |  |  | | [@fontsource/jetbrains-mono](https://fontsource.org/fonts/jetbrains-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/jetbrains-mono)) | [`5.2.8` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fjetbrains-mono/5.2.8/5.3.0) |  |  | | [@fontsource/source-code-pro](https://fontsource.org/fonts/source-code-pro) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/source-code-pro)) | [`5.2.7` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fsource-code-pro/5.2.7/5.3.0) |  |  | | [@iconify-json/lucide](https://icon-sets.iconify.design/lucide/) | [`1.2.116` β `1.2.118`](https://renovatebot.com/diffs/npm/@iconify-json%2flucide/1.2.116/1.2.118) |  |  | | [@iconify-json/tabler](https://icon-sets.iconify.design/tabler/) | [`1.2.35` β `1.2.37`](https://renovatebot.com/diffs/npm/@iconify-json%2ftabler/1.2.35/1.2.37) |  |  | | [@tailwindcss/vite](https://tailwindcss.com) ([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite)) | [`4.3.2` β `4.3.3`](https://renovatebot.com/diffs/npm/@tailwindcss%2fvite/4.3.2/4.3.3) |  |  | | [@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`25.9.4` β `25.9.5`](https://renovatebot.com/diffs/npm/@types%2fnode/25.9.4/25.9.5) |  |  | | [@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.7` β `6.0.8`](https://renovatebot.com/diffs/npm/@vitejs%2fplugin-vue/6.0.7/6.0.8) |  |  | | [@vitest/coverage-v8](https://vitest.dev/guide/coverage) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8)) | [`4.1.9` β `4.1.10`](https://renovatebot.com/diffs/npm/@vitest%2fcoverage-v8/4.1.9/4.1.10) |  |  | | [knip](https://knip.dev) ([source](https://redirect.github.com/webpro-nl/knip/tree/HEAD/packages/knip)) | [`6.24.0` β `6.27.0`](https://renovatebot.com/diffs/npm/knip/6.24.0/6.27.0) |  |  | | [postcss](https://postcss.org/) ([source](https://redirect.github.com/postcss/postcss)) | [`8.5.16` β `8.5.21`](https://renovatebot.com/diffs/npm/postcss/8.5.16/8.5.21) |  |  | | [tailwindcss](https://tailwindcss.com) ([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss)) | [`4.3.2` β `4.3.3`](https://renovatebot.com/diffs/npm/tailwindcss/4.3.2/4.3.3) |  |  | | [vite](https://vite.dev) ([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`8.1.3` β `8.1.5`](https://renovatebot.com/diffs/npm/vite/8.1.3/8.1.5) |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.9` β `4.1.10`](https://renovatebot.com/diffs/npm/vitest/4.1.9/4.1.10) |  |  | | [vue](https://vuejs.org/) ([source](https://redirect.github.com/vuejs/core)) | [`3.5.39` β `3.5.40`](https://renovatebot.com/diffs/npm/vue/3.5.39/3.5.40) |  |  | | [vue-i18n](https://redirect.github.com/intlify/vue-i18n/tree/master/packages/vue-i18n#readme) ([source](https://redirect.github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n)) | [`11.4.6` β `11.4.7`](https://renovatebot.com/diffs/npm/vue-i18n/11.4.6/11.4.7) |  |  | | [vue-router](https://router.vuejs.org) ([source](https://redirect.github.com/vuejs/router)) | [`5.1.0` β `5.2.0`](https://renovatebot.com/diffs/npm/vue-router/5.1.0/5.2.0) |  |  | --- ### Release Notes <details> <summary>fontsource/font-files (@​fontsource/comic-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/commit-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/ibm-plex-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/inconsolata)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/jetbrains-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/source-code-pro)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/9c74cedc2a2c1989d2faf595c62c23f617144a30...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/9c74cedc2a2c1989d2faf595c62c23f617144a30...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>tailwindlabs/tailwindcss (@​tailwindcss/vite)</summary> ### [`v4.3.3`](https://redirect.github.com/tailwindlabs/tailwindcss/blob/HEAD/CHANGELOG.md#433---2026-07-16) [Compare Source](https://redirect.github.com/tailwindlabs/tailwindcss/compare/v4.3.2...v4.3.3) ##### Fixed - Support `--watch --poll[=ms]` in `@tailwindcss/cli` when filesystem events are unreliable or unavailable ([#​20297](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20297)) - Canonicalization: match arbitrary hex colors against theme colors case-insensitively (e.g. `bg-[#fff]` and `bg-[#FFF]` β `bg-white`) ([#​20298](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20298)) - Prevent Preflight from overriding Firefox's native `iframe:focus-visible` outline styles ([#​20292](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20292)) - Ensure `theme('colors.foo')` in JS plugins resolves correctly when both `--color-foo` and `--color-foo-bar` exist ([#​20299](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20299)) - Ensure fractional opacity modifiers work with named shadow sizes like `shadow-sm/12.5`, `text-shadow-sm/12.5`, `drop-shadow-sm/12.5`, and `inset-shadow-sm/12.5` ([#​20302](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20302)) - Parse selectors like `[data-foo]div` as two selectors instead of one ([#​20303](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20303)) - Ensure `@tailwindcss/postcss` rebuilds when a preprocessor like Sass changes the input CSS without changing the input file on disk ([#​20310](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20310)) - Ensure CSS nesting is handled even when Lightning CSS isn't run, such as in `@tailwindcss/browser` and Tailwind Play ([#​20124](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20124)) - Prevent achromatic theme colors from shifting hue when mixed in polar color spaces like `oklch` ([#​20314](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20314)) - Ensure `--spacing(0)` is optimized to `0px` instead of `0` so it remains a `<length>` when used in `calc(β¦)` ([#​20319](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20319)) - Load `@parcel/watcher` only when needed in `@tailwindcss/cli --watch` mode, so one-off builds and `--watch --poll` work when `@parcel/watcher` can't be loaded ([#​20325](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20325)) - Use explicit platform fonts instead of `system-ui` and `ui-sans-serif` so CJK text respects the page's `lang` attribute on Windows ([#​20318](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20318)) - Prevent `@tailwindcss/upgrade` from rewriting ignored files when run from a subdirectory ([#​20329](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20329)) - Ensure earlier `@source` rules pointing to nested files are scanned when later `@source` rules point to files in parent folders ([#​20335](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20335)) - Prevent `@tailwindcss/vite` from triggering full page reloads when scanned files are processed by Vite but haven't been loaded as modules yet ([#​20336](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20336)) </details> <details> <summary>vitejs/vite-plugin-vue (@​vitejs/plugin-vue)</summary> ### [`v6.0.8`](https://redirect.github.com/vitejs/vite-plugin-vue/blob/HEAD/packages/plugin-vue/CHANGELOG.md#small-608-2026-07-14-small) ##### Features - **plugin-vue:** add forced vapor mode option ([#​766](https://redirect.github.com/vitejs/vite-plugin-vue/issues/766)) ([d59c3c0](https://redirect.github.com/vitejs/vite-plugin-vue/commit/d59c3c04b0c5cd920bab5f0f6000bedfef901e1c)) ##### Bug Fixes - **deps:** update all non-major dependencies ([#​781](https://redirect.github.com/vitejs/vite-plugin-vue/issues/781)) ([d369e5a](https://redirect.github.com/vitejs/vite-plugin-vue/commit/d369e5a57592ed525c4da5ef0458cb89a6977ad2)) </details> <details> <summary>vitest-dev/vitest (@​vitest/coverage-v8)</summary> ### [`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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (claude-opus-4-8)** in [#​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 [@​SveLil](https://redirect.github.com/SveLil) and [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​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) </details> <details> <summary>webpro-nl/knip (knip)</summary> ### [`v6.27.0`](https://redirect.github.com/webpro-nl/knip/releases/tag/knip%406.27.0): Release 6.27.0 [Compare Source](https://redirect.github.com/webpro-nl/knip/compare/knip@6.26.0...knip@6.27.0) - Add Temporal plugin ([`98191a0`](https://redirect.github.com/webpro-nl/knip/commit/98191a04aad0572bead191b101bfecef75067b0c)) - Handle -d alias for react-email dir argument ([`53d1fec`](https://redirect.github.com/webpro-nl/knip/commit/53d1fec3213db8d6a84dfa7a82050b122782e065)) - Expand pnpm script references with forwarded arguments ([`33e9799`](https://redirect.github.com/webpro-nl/knip/commit/33e9799df39450033061b9c4c07daf22f5d15721)) - Treat path-shaped script tokens as file references, extend known global binaries ([`d9508c2`](https://redirect.github.com/webpro-nl/knip/commit/d9508c282ab81351beda4b2f859435b49f142c51)) - Mark tsdown neverBundle dependencies as referenced ([`5fd863b`](https://redirect.github.com/webpro-nl/knip/commit/5fd863ba12e68842f91ab1a94e7e30d1e571da92)) - Support TanStack Start in tanstack-router plugin ([`bd63cd8`](https://redirect.github.com/webpro-nl/knip/commit/bd63cd8af88dac03a98aa17f1add322f7bdf4a94)) - Mark vite ssr.external dependencies as referenced ([`91de938`](https://redirect.github.com/webpro-nl/knip/commit/91de938032062cb667bced0eadef9e67d1e20b1f)) - Expand bun, npm, and yarn script references with forwarded arguments ([`b5a3176`](https://redirect.github.com/webpro-nl/knip/commit/b5a31767a83e2cec3fb20c3b146d94c0412a4fd6)) - Add Latitude as sponsor ([`4267675`](https://redirect.github.com/webpro-nl/knip/commit/42676759cad5fb10ac96fd7c0457037e906f4b68)) - Regenerate plugin list in docs ([`1d2cdff`](https://redirect.github.com/webpro-nl/knip/commit/1d2cdffb4d4151f848c44e066eff43e9efbf44fe)) - Support Vue 2 template auto-imports (close [#​1881](https://redirect.github.com/webpro-nl/knip/issues/1881)) ([`2157f39`](https://redirect.github.com/webpro-nl/knip/commit/2157f3913f77216d268b2255899b6fc58609f9bb)) - Ignore block-commented stylesheet imports (resolve [#​1880](https://redirect.github.com/webpro-nl/knip/issues/1880), close [#​1882](https://redirect.github.com/webpro-nl/knip/issues/1882)) ([`a627f53`](https://redirect.github.com/webpro-nl/knip/commit/a627f53221547d5397d70722fcc2fd723889e579)) - Support TypeScript 5.0 narrowing for ssr.external ([`989292f`](https://redirect.github.com/webpro-nl/knip/commit/989292f79b9d19028bfc7ba988b74ba691041a45)) - Resolve local binaries from bun run ([`5e9a7f0`](https://redirect.github.com/webpro-nl/knip/commit/5e9a7f0286e2c2175bb299c514cc7b67a7cf24f1)) - Support Vitest inline project config extensions ([`f682327`](https://redirect.github.com/webpro-nl/knip/commit/f682327f6181f44e3924715efa7404aa39e532f0)) - Resolve package names from aliased node\_modules paths ([`c273d5f`](https://redirect.github.com/webpro-nl/knip/commit/c273d5fbc1b0d3eaf27b38c3f31d3a2a4b6b184a)) - Support Tailwind CSS URL imports ([`57a4770`](https://redirect.github.com/webpro-nl/knip/commit/57a4770447cc4c8f9ea4ffb9171c0c92eed4f255)) - Resolve unbuilt workspace package exports (close [#​1877](https://redirect.github.com/webpro-nl/knip/issues/1877)) ([`1b0a2c0`](https://redirect.github.com/webpro-nl/knip/commit/1b0a2c0ee784db165c7f92fe10397a6cb513c1cf)) - Skip unresolved imports of gitignored generated files ([`605c904`](https://redirect.github.com/webpro-nl/knip/commit/605c9049f73838beb1c6fee83c6a5421ae1a6d07)) - Attribute imports of aliased packages to the declared dependency ([`d05e775`](https://redirect.github.com/webpro-nl/knip/commit/d05e775c9a3a5676dc9eadcc1093f7d9983efd06)) - Flag unresolvable imports of transitive peer deps as unlisted (resolve [#​1883](https://redirect.github.com/webpro-nl/knip/issues/1883)) ([`18f0bff`](https://redirect.github.com/webpro-nl/knip/commit/18f0bff4ea683837f75ca744d3fbde52df49b297)) - Don't count ambient module declarations in script files as imports ([`e52aecf`](https://redirect.github.com/webpro-nl/knip/commit/e52aecfd7c022cbe72b1c11dde3f4968579ac409)) - Update rolldown snapshot ([`a63e927`](https://redirect.github.com/webpro-nl/knip/commit/a63e92788239062682603a5727ede371db7845c8)) - Remove obsolete workarounds from ecosystem tests ([`a521cf7`](https://redirect.github.com/webpro-nl/knip/commit/a521cf790d726c18e644e2e316cdc09eb654f607)) - Handle snapshotSerializers in Vitest plugin (resolve [#​1884](https://redirect.github.com/webpro-nl/knip/issues/1884)) ([`b597de9`](https://redirect.github.com/webpro-nl/knip/commit/b597de951f6f0e897afdbbbb8a7d0c06c8d2437d)) - Set the stage ([`c059c2b`](https://redirect.github.com/webpro-nl/knip/commit/c059c2be5803609924b852c2bf0cd90906a6a831)) ### [`v6.26.0`](https://redirect.github.com/webpro-nl/knip/releases/tag/knip%406.26.0): Release 6.26.0 [Compare Source](https://redirect.github.com/webpro-nl/knip/compare/knip@6.25.0...knip@6.26.0) - ci: add path filters ([#​1871](https://redirect.github.com/webpro-nl/knip/issues/1871)) ([`4249935`](https://redirect.github.com/webpro-nl/knip/commit/4249935adffe1b8eca9570fb325fa19cc8010584)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Add CodeRabbit as gold sponsor ([`1da09fd`](https://redirect.github.com/webpro-nl/knip/commit/1da09fdc8f4d851f3cad30659200018bfb47a5e0)) - Fix up docs a bit more ([`39125a7`](https://redirect.github.com/webpro-nl/knip/commit/39125a7f473e006f61629781bff1ac4a050ca460)) - Don't report ambient declaration files as unused ([`aed361c`](https://redirect.github.com/webpro-nl/knip/commit/aed361c00a82829c2fc80a65a2f7af174316782e)) - Register oclif command files as entries ([`3b4d58c`](https://redirect.github.com/webpro-nl/knip/commit/3b4d58c9da83d93b6821a2b24f57b919ba886756)) - Add electron-vite plugin ([`d92107e`](https://redirect.github.com/webpro-nl/knip/commit/d92107ea504833b3ee7ad2b695e22d40528b24c3)) - Add esbuild plugin ([`ef3b601`](https://redirect.github.com/webpro-nl/knip/commit/ef3b601d957546554de2cb1fbff859f5bdafb741)) - Ignore more globally available binaries ([`8292981`](https://redirect.github.com/webpro-nl/knip/commit/829298129fdfd1b41a1f8dff5022b9fbbe25f454)) - Resolve `#`-imports to source when node condition is unbuilt (resolve [#​1873](https://redirect.github.com/webpro-nl/knip/issues/1873)) ([`f2713ed`](https://redirect.github.com/webpro-nl/knip/commit/f2713ed1e499ab286b86615d4b8ec34f711d1bd2)) - Ignore gh as a globally available binary ([`a6f0772`](https://redirect.github.com/webpro-nl/knip/commit/a6f0772e5db03a8412a3ac036756779f22d1a27d)) - Resolve Vitest benchmark files as entries ([`5742913`](https://redirect.github.com/webpro-nl/knip/commit/57429139f7e93f2a4bee35a53d450c4f45dea9ff)) - Extract shared Vue auto-import machinery into plugins/\_vue ([`7301075`](https://redirect.github.com/webpro-nl/knip/commit/73010753d432ae58eb12c7eec9c5723036009749)) - Scope compiler extensions per workspace ([`5e6f82b`](https://redirect.github.com/webpro-nl/knip/commit/5e6f82b963a83e5801484efbc01a4b6a9ce39ea3)) - Resolve auto-imported components in the Vue SFC compiler ([`009aad8`](https://redirect.github.com/webpro-nl/knip/commit/009aad8f9dab589898e5dba4c85fa41ea57c1a49)) - Add plugins for the Vue auto-import ecosystem ([`f638c83`](https://redirect.github.com/webpro-nl/knip/commit/f638c8302cdd26a63e477344a7cf44ef60af7788)) - Enable Vue SFC compiler on unplugin-vue and [@​vitejs/plugin-vue](https://redirect.github.com/vitejs/plugin-vue) ([`9396ab1`](https://redirect.github.com/webpro-nl/knip/commit/9396ab159919147ef81dad16e365e531b32b4b12)) - Recognize vite-plugin-vue-meta-layouts (same layouts convention) ([`3ceee89`](https://redirect.github.com/webpro-nl/knip/commit/3ceee89228b0173eddc0466bf50e8181286ffebc)) - Add vite-plugin-pages and unplugin-icons plugins ([`9bc1754`](https://redirect.github.com/webpro-nl/knip/commit/9bc17540bcf8eb142474ed84837c1e2cebb7fe73)) - Add vite-plugin-pwa and [@​intlify/unplugin-vue-i18n](https://redirect.github.com/intlify/unplugin-vue-i18n) plugins ([`45dea0a`](https://redirect.github.com/webpro-nl/knip/commit/45dea0a397ed754c34617ed18deef4dc6f0ec0d4)) - Dog, food. ([`e1249ad`](https://redirect.github.com/webpro-nl/knip/commit/e1249ade2558d3801d85e2dc63349d884f3443d4)) - Update query snapshot ([`a45941d`](https://redirect.github.com/webpro-nl/knip/commit/a45941d2db381c04f8a38416533217ee84f77ca7)) - Don't misread Nitro route types as Vue component auto-imports ([`43aecd5`](https://redirect.github.com/webpro-nl/knip/commit/43aecd5414eb63bec3637f37ffac0c62a71e7e74)) - Read oxlint jsPlugins from vite-plus vite.config and .oxlintrc.json ([`589ffda`](https://redirect.github.com/webpro-nl/knip/commit/589ffda4e3a7d0c0d772191ad6f8d6e60dd298cf)) - Add vite-plus plugin for run.tasks and staged scripts ([`f041c19`](https://redirect.github.com/webpro-nl/knip/commit/f041c191e4e10dd181ad212b71079e3e10bcf341)) - Support [@​vite-pwa/nuxt](https://redirect.github.com/vite-pwa/nuxt) PWA config in nuxt.config ([`8fa7b11`](https://redirect.github.com/webpro-nl/knip/commit/8fa7b116690e37484798ad98eca002d26c0c80fe)) - Add [@​vite-pwa/assets-generator](https://redirect.github.com/vite-pwa/assets-generator) plugin ([`4254f7d`](https://redirect.github.com/webpro-nl/knip/commit/4254f7d53a284a4ea4612f650ae03495bcb0d582)) - Add [@​nuxtjs/i18n](https://redirect.github.com/nuxtjs/i18n) plugin ([`dfb9acb`](https://redirect.github.com/webpro-nl/knip/commit/dfb9acbe5a08ebc85562f59a04e7f4bedb4925f1)) - Read plugin entries from vite.config options and index.html ([`d533da8`](https://redirect.github.com/webpro-nl/knip/commit/d533da8cc2b431d206eb7c55323ea51846eca0bb)) - Fix false positives in VitePress, next-mdx and unplugin-vue-i18n plugins ([`b99702a`](https://redirect.github.com/webpro-nl/knip/commit/b99702a76e26b1943a16517f1633de3a0713c196)) - Respect optional peers in pnpm and Yarn packageExtensions ([`aab080b`](https://redirect.github.com/webpro-nl/knip/commit/aab080bbd436494316df045011ab22cbebca06b4)) - Detect babel plugins in the Storybook config ([`5dea975`](https://redirect.github.com/webpro-nl/knip/commit/5dea975adf9b88971ad56434132282a099c7d58c)) - Add shared AST helpers for imported calls and first property values ([`c84bb7a`](https://redirect.github.com/webpro-nl/knip/commit/c84bb7a87a17f1921c12bb02bcfd43f905cae595)) - Inline trivial resolveFromAST wrappers and normalize orval and sst ([`620079d`](https://redirect.github.com/webpro-nl/knip/commit/620079d1d07b69a69bbb67b6a6e68963b6c2fc21)) - Extract inline resolveFromAST implementations to dedicated files ([`b5231c1`](https://redirect.github.com/webpro-nl/knip/commit/b5231c12f915428067d790187d2dd4c44e2559d4)) - Normalize resolveFromAST files to a uniform contract ([`fc1ba0f`](https://redirect.github.com/webpro-nl/knip/commit/fc1ba0fb45aaf623de678a57bea3b5567ea04750)) - chore: migrate to Astro 7 and SΓ€tteri ([#​1875](https://redirect.github.com/webpro-nl/knip/issues/1875)) ([`f256a5b`](https://redirect.github.com/webpro-nl/knip/commit/f256a5b276c3d69dd5081c591bbb183aacebf766)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Show contributor count on docs homepage ([`6b8454a`](https://redirect.github.com/webpro-nl/knip/commit/6b8454a2841905ce7f08e1a23b54bc17a0854608)) - Exclude gitignored package entry points ([`606e5d0`](https://redirect.github.com/webpro-nl/knip/commit/606e5d051b4f0620c776aa23352153b8253bd75b)) - Add Tauri plugin ([`199180d`](https://redirect.github.com/webpro-nl/knip/commit/199180da79c71acc80865dc65ce89653a26d9579)) - Add Laravel plugin ([`1974533`](https://redirect.github.com/webpro-nl/knip/commit/197453378f2b60e5143a30ec78b438f02b37c53b)) - Add Quasar plugin ([`a220729`](https://redirect.github.com/webpro-nl/knip/commit/a220729074bfbb9e7d03ba329e89ad553c3a7799)) ### [`v6.25.0`](https://redirect.github.com/webpro-nl/knip/releases/tag/knip%406.25.0): Release 6.25.0 [Compare Source](https://redirect.github.com/webpro-nl/knip/compare/knip@6.24.0...knip@6.25.0) - fix: derive package name from package.json under Yarn `nodeLinker: pnpm` store ([#​1852](https://redirect.github.com/webpro-nl/knip/issues/1852)) ([`3764605`](https://redirect.github.com/webpro-nl/knip/commit/3764605ed150b975fb6c88c4c4aa47f5bf9ae149)) - thanks [@​blowery](https://redirect.github.com/blowery)! - Pick up types used in module augmentations via path aliases (resolve [#​1850](https://redirect.github.com/webpro-nl/knip/issues/1850)) ([`9cc5a41`](https://redirect.github.com/webpro-nl/knip/commit/9cc5a4132793990b5fcf9eae6f3db37426d979c0)) - feat: add support for `packageExtensions` in yarn and pnpm ([#​1847](https://redirect.github.com/webpro-nl/knip/issues/1847)) ([`61d3164`](https://redirect.github.com/webpro-nl/knip/commit/61d3164cdac6e9252b3c52ce3bb2909949b4690e)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - fix(ci): do not run integration on forks ([#​1855](https://redirect.github.com/webpro-nl/knip/issues/1855)) ([`d23c10d`](https://redirect.github.com/webpro-nl/knip/commit/d23c10d1ae764c0b70addaafc79f01c543cc5efa)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - chore(ci): improve security through specific permissions ([#​1856](https://redirect.github.com/webpro-nl/knip/issues/1856)) ([`1eb42e6`](https://redirect.github.com/webpro-nl/knip/commit/1eb42e639f9ec12d6d2ef88e1aaf07397b5bf226)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - chore(ci): add concurrency blocks ([#​1857](https://redirect.github.com/webpro-nl/knip/issues/1857)) ([`3bf3d11`](https://redirect.github.com/webpro-nl/knip/commit/3bf3d115cf677fadcfe8fa72ce0e68cfd435d399)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - fix(next): resolve src/ entry patterns like Next.js does ([#​1859](https://redirect.github.com/webpro-nl/knip/issues/1859)) ([`6e6a509`](https://redirect.github.com/webpro-nl/knip/commit/6e6a5094e924a5cd104867f3907dbbb378f871b3)) - thanks [@​dayongkr](https://redirect.github.com/dayongkr)! - Fix Bun test defaults ([#​1860](https://redirect.github.com/webpro-nl/knip/issues/1860)) ([`2ac4c04`](https://redirect.github.com/webpro-nl/knip/commit/2ac4c0427d2ac03939661f6dc236d15d11414fd5)) - thanks [@​jakeleventhal](https://redirect.github.com/jakeleventhal)! - Extend agentic guidelines re. plugins ([`da606eb`](https://redirect.github.com/webpro-nl/knip/commit/da606eb522f01187def8747d7ddb917c6735157d)) - Support rspack and path aliases in require.context ([`d231d67`](https://redirect.github.com/webpro-nl/knip/commit/d231d67a5e8713c2f48f9d695ae12a9dbfa0260e)) - Support path aliases in import.meta.glob (resolve [#​1821](https://redirect.github.com/webpro-nl/knip/issues/1821)) ([`fc7bb1e`](https://redirect.github.com/webpro-nl/knip/commit/fc7bb1ecc194e69f9f493bff5b33a4cc807fd788)) - Register MDX compiler in Storybook plugin ([`6f18138`](https://redirect.github.com/webpro-nl/knip/commit/6f1813809608cd36e44af22583805e686c51c5bd)) - Resolve TypeDoc customCss and customJs files ([`105687d`](https://redirect.github.com/webpro-nl/knip/commit/105687daf682884257a2d40f26967d80ea4abef8)) - Resolve inline Babel presets/plugins in Jest transform ([`38e4a4a`](https://redirect.github.com/webpro-nl/knip/commit/38e4a4a4a06d902cf55457155f666c3b91e05f28)) - Mark graphql-codegen generated outputs as entries ([`1255369`](https://redirect.github.com/webpro-nl/knip/commit/125536921f1845eeec1347091b238bb615f329e0)) - Add Fumadocs plugin ([`77c2142`](https://redirect.github.com/webpro-nl/knip/commit/77c2142fcc6ad6fdee651c5dc60a74c158cd8de3)) - Support next.config.mts in Next.js plugin ([`0f27e77`](https://redirect.github.com/webpro-nl/knip/commit/0f27e772935bba5eaeca73ee75ce028412c4a1cc)) - Add script command parser built on unbash ([`195510c`](https://redirect.github.com/webpro-nl/knip/commit/195510c6c912ade9cd7846302d2f9256ede9852c)) - Gate Bun test entries on an actual bun test invocation ([`92903ec`](https://redirect.github.com/webpro-nl/knip/commit/92903ec29bb8b86586e3d7e846236d8c38787ea9)) - Detect Node.js test runner via script command parser ([`a0bfe7b`](https://redirect.github.com/webpro-nl/knip/commit/a0bfe7ba2958a1270604764a9ebf09425ce857d4)) - Extract shared command walker for bash-parser and plugins ([`1301475`](https://redirect.github.com/webpro-nl/knip/commit/13014753d5031cf1de8081b3d148212a5894dde0)) - Normalize aliased glob patterns to posix for Win ([`23b4a74`](https://redirect.github.com/webpro-nl/knip/commit/23b4a744330d0dddd2b1517f2f2d72c9d373a0b9)) - Resolve inherited tsconfig paths from the extended config's directory (resolve [#​1866](https://redirect.github.com/webpro-nl/knip/issues/1866)) ([`e3f0e5c`](https://redirect.github.com/webpro-nl/knip/commit/e3f0e5c69641bb7dfab06585251c98e3b3def049)) - Handle var interpolations in shell cmd scripts (resolve [#​1867](https://redirect.github.com/webpro-nl/knip/issues/1867)) ([`9422d06`](https://redirect.github.com/webpro-nl/knip/commit/9422d06adb07fd29a3388ee6b037cda47fe28d1a)) - Update query snapshot ([`5e192e9`](https://redirect.github.com/webpro-nl/knip/commit/5e192e996fd680c41674c9503437ee148b0f1870)) - Add support for Prettier overrides ([#​1869](https://redirect.github.com/webpro-nl/knip/issues/1869)) ([`5dc7f12`](https://redirect.github.com/webpro-nl/knip/commit/5dc7f1235ff201c461a71f8a757c611441f1607a)) - thanks [@​remcohaszing](https://redirect.github.com/remcohaszing)! - Handle Serverless esbuild inject entries ([#​1865](https://redirect.github.com/webpro-nl/knip/issues/1865)) ([`46111ef`](https://redirect.github.com/webpro-nl/knip/commit/46111ef2f42c2ea89a43d8944b5efdcde7db2884)) - thanks [@​jakeleventhal](https://redirect.github.com/jakeleventhal)! - docs: add links to Discord and Contributing in issue templates ([#​1868](https://redirect.github.com/webpro-nl/knip/issues/1868)) ([`5ab3483`](https://redirect.github.com/webpro-nl/knip/commit/5ab3483e30733edc234e9913b3bf4bf05de45470)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Add eve (Vercel framework) plugin ([#​1864](https://redirect.github.com/webpro-nl/knip/issues/1864)) ([`20cd970`](https://redirect.github.com/webpro-nl/knip/commit/20cd970d2039835dd9bad79ee2e7f3a82cef1b6e)) - thanks [@​jakeleventhal](https://redirect.github.com/jakeleventhal)! - Add circular dependencies as opt-in `cycles` issue type (resolve [#​1734](https://redirect.github.com/webpro-nl/knip/issues/1734)) ([#​1812](https://redirect.github.com/webpro-nl/knip/issues/1812)) ([`1b0ed6b`](https://redirect.github.com/webpro-nl/knip/commit/1b0ed6b3906d726b37a89b495fb22331ec2a0fbb)) - chore(ci): remove redundant tag triggers ([#​1863](https://redirect.github.com/webpro-nl/knip/issues/1863)) ([`c61d008`](https://redirect.github.com/webpro-nl/knip/commit/c61d0086e4e669a8aeee230dc5ac3606832ea893)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Fix up docs a bit ([`89a2d8d`](https://redirect.github.com/webpro-nl/knip/commit/89a2d8d6ac27ee866a15a8bcf5a49da3cba91b08)) </details> <details> <summary>postcss/postcss (postcss)</summary> ### [`v8.5.21`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8521) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.20...8.5.21) - Fixed childless at-rule losing semicolon before comment (by [@​sarathfrancis90](https://redirect.github.com/sarathfrancis90)). - Fixed docs (by [@​isker](https://redirect.github.com/isker)). ### [`v8.5.20`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8520) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.19...8.5.20) - Fixed missing space if `AtRule#params` is set after (by [@​sarathfrancis90](https://redirect.github.com/sarathfrancis90)). - Fixed mixing AST error on warnings (by [@​MahinAnowar](https://redirect.github.com/MahinAnowar)). ### [`v8.5.19`](https://redirect.github.com/postcss/postcss/releases/tag/8.5.19) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.18...8.5.19) - Fixed cleaning `before` for new nodes inserted to `Root` (by [@​MahinAnowar](https://redirect.github.com/MahinAnowar)). ### [`v8.5.18`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8518) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.17...8.5.18) - Restricted loading previous source maps file to the `opts.from` folder for security reasons (use `unsafeMap: true` to disable the check). ### [`v8.5.17`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8517) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.16...8.5.17) - Fixed `Maximum call stack size exceeded` error. - Fixed Prototype hijacking for `postcss.fromJSON()`. - Fixed `Input#origin()` for unmapped end position (by [@​chatman-media](https://redirect.github.com/chatman-media)). </details> <details> <summary>vitejs/vite (vite)</summary> ### [`v8.1.5`](https://redirect.github.com/vitejs/vite/releases/tag/v8.1.5) [Compare Source](https://redirect.github.com/vitejs/vite/compare/v8.1.4...v8.1.5) Please refer to [CHANGELOG.md](https://redirect.github.com/vitejs/vite/blob/v8.1.5/packages/vite/CHANGELOG.md) for details. ### [`v8.1.4`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-814-2026-07-09-small) [Compare Source](https://redirect.github.com/vitejs/vite/compare/v8.1.3...v8.1.4) ##### Features - **legacy:** prefer oxc as minifier (fix [#​21973](https://redirect.github.com/vitejs/vite/issues/21973)) ([#​22468](https://redirect.github.com/vitejs/vite/issues/22468)) ([ab5dafa](https://redirect.github.com/vitejs/vite/commit/ab5dafa8e66296ef201f615489fb57954bb740ce)) ##### Bug Fixes - **build:** add workaround for building on stackblitz ([#​22840](https://redirect.github.com/vitejs/vite/issues/22840)) ([575c32c](https://redirect.github.com/vitejs/vite/commit/575c32c29925c554f4ef4068738ab89c6878f615)) - **build:** keep `import.meta.url` in preload function as-is ([#​22839](https://redirect.github.com/vitejs/vite/issues/22839)) ([f1f90ed](https://redirect.github.com/vitejs/vite/commit/f1f90ed4742b3cf453428c7e581a6016a4d47321)) - **deps:** update all non-major dependencies ([#​22865](https://redirect.github.com/vitejs/vite/issues/22865)) ([d4295a9](https://redirect.github.com/vitejs/vite/commit/d4295a9ffce428c0e51892373e00c07fccc0498a)) - **deps:** update rolldown-related dependencies ([#​22866](https://redirect.github.com/vitejs/vite/issues/22866)) ([7cf07e4](https://redirect.github.com/vitejs/vite/commit/7cf07e4c5f7a6af276012e0c2ec06e08499e951e)) - **html:** avoid backtracking in import-only check ([#​22848](https://redirect.github.com/vitejs/vite/issues/22848)) ([b5868c0](https://redirect.github.com/vitejs/vite/commit/b5868c01a124d345664450aaebd677bfba964c05)) - **optimizer:** avoid optimizer run for transform request before init ([#​22852](https://redirect.github.com/vitejs/vite/issues/22852)) ([72a5e21](https://redirect.github.com/vitejs/vite/commit/72a5e2192506f51a5efd09c059815a5c43a9eacb)) - **ssr:** align named export function call stacktrace column with Node ([#​22829](https://redirect.github.com/vitejs/vite/issues/22829)) ([173a1b6](https://redirect.github.com/vitejs/vite/commit/173a1b648c321e0f836e5a94fc47c4fa9b081bfc)) - strip pure CSS chunk imports when chunkImportMap is enabled ([#​22841](https://redirect.github.com/vitejs/vite/issues/22841)) ([648bd04](https://redirect.github.com/vitejs/vite/commit/648bd04933093d0aac9565f21a49811437776886)) ##### Documentation - fix incorrect `@default` for `server.cors` ([#​22859](https://redirect.github.com/vitejs/vite/issues/22859)) ([70435b2](https://redirect.github.com/vitejs/vite/commit/70435b2551ee4fe3a0d55c8a3bb61b96f44d2763)) ##### Miscellaneous Chores - **deps:** update dependency postcss-modules to v9 ([#​22867](https://redirect.github.com/vitejs/vite/issues/22867)) ([a9539d6](https://redirect.github.com/vitejs/vite/commit/a9539d69efc7a4ccf988bbf5da31c2b416ba990e)) ##### Code Refactoring - eliminate ineffectiveDynamicImport warn ([#​22876](https://redirect.github.com/vitejs/vite/issues/22876)) ([ea22fb3](https://redirect.github.com/vitejs/vite/commit/ea22fb352aad9a42c0a9d08f39d8a0bae8c111a5)) ##### Tests - avoid warnings ([#​22851](https://redirect.github.com/vitejs/vite/issues/22851)) ([af21ab6](https://redirect.github.com/vitejs/vite/commit/af21ab68adac3380dc9a854d2fe3f776654301cd)) ##### Build System - remove the custom onLog function ([#​22878](https://redirect.github.com/vitejs/vite/issues/22878)) ([2c4a217](https://redirect.github.com/vitejs/vite/commit/2c4a217a63dc0a7fcb10bc710a988f32b173f481)) - replace deprecated `onwarn` with `onLog` ([#​22741](https://redirect.github.com/vitejs/vite/issues/22741)) ([c581b55](https://redirect.github.com/vitejs/vite/commit/c581b5588cb8e94603d17bce2ff9fec8e8e0a3bf)) </details> <details> <summary>vuejs/core (vue)</summary> ### [`v3.5.40`](https://redirect.github.com/vuejs/core/blob/HEAD/CHANGELOG.md#3540-2026-07-16) [Compare Source](https://redirect.github.com/vuejs/core/compare/v3.5.39...v3.5.40) ##### Bug Fixes - **compiler-core:** avoid leaking slot branch keys ([#​15051](https://redirect.github.com/vuejs/core/issues/15051)) ([20c9d26](https://redirect.github.com/vuejs/core/commit/20c9d263d3bfafdfbcc1921f259fd8f711e18659)), closes [#​15048](https://redirect.github.com/vuejs/core/issues/15048) - **hydration:** pass namespace when patching dynamic props ([#​15082](https://redirect.github.com/vuejs/core/issues/15082)) ([e0d2723](https://redirect.github.com/vuejs/core/commit/e0d27234ddd2061383cb5dcc475d6b9558ed8e4f)), closes [#​15081](https://redirect.github.com/vuejs/core/issues/15081) [#​15050](https://redirect.github.com/vuejs/core/issues/15050) - **reactivity:** handle effect removal during scope stop ([#​15084](https://redirect.github.com/vuejs/core/issues/15084)) ([378f978](https://redirect.github.com/vuejs/core/commit/378f9783248a4a4f20781d665d4f7089f39cae6e)), closes [#​15083](https://redirect.github.com/vuejs/core/issues/15083) - **runtime-core:** skip lazy hydration for detached roots ([#​15092](https://redirect.github.com/vuejs/core/issues/15092)) ([97f3525](https://redirect.github.com/vuejs/core/commit/97f3525551ad06103083eb2cbf9858c5e57cd58e)), closes [#​15091](https://redirect.github.com/vuejs/core/issues/15091) - **runtime-core:** unwind dangling blocks when slot content throws ([#​15071](https://redirect.github.com/vuejs/core/issues/15071)) ([ddc132d](https://redirect.github.com/vuejs/core/commit/ddc132d7c054ecd2029ddcc95bcba770cd44f022)), closes [#​15070](https://redirect.github.com/vuejs/core/issues/15070) - **runtime-dom:** respect current select model type ([#​15010](https://redirect.github.com/vuejs/core/issues/15010)) ([eb89e93](https://redirect.github.com/vuejs/core/commit/eb89e935a771ab7fc3f8e67a82bc8fc7ea28bdaa)), closes [#​15009](https://redirect.github.com/vuejs/core/issues/15009) - **server-renderer:** handle errors in optimized component renders ([#​12601](https://redirect.github.com/vuejs/core/issues/12601)) ([474907c](https://redirect.github.com/vuejs/core/commit/474907c0f01d021c564545137051a2b56eb4a769)), closes [#​12575](https://redirect.github.com/vuejs/core/issues/12575) - **server-renderer:** remove package dependency cycle ([#​15063](https://redirect.github.com/vuejs/core/issues/15063)) ([4d35eca](https://redirect.github.com/vuejs/core/commit/4d35ecadb6f625b0f7407ccee0e357c2dd8084c7)) - **shared:** prevent SSR comment escaping from creating closing delimiters ([#​15045](https://redirect.github.com/vuejs/core/issues/15045)) ([bd962bb](https://redirect.github.com/vuejs/core/commit/bd962bbaca746d8f65775a07723420406ebad0da)) - **types:** don't constrain component $el type to Element ([#​15040](https://redirect.github.com/vuejs/core/issues/15040)) ([164460a](https://redirect.github.com/vuejs/core/commit/164460a52988c44dc34a541219c88120078372a0)) </details> <details> <summary>intlify/vue-i18n (vue-i18n)</summary> ### [`v11.4.7`](https://redirect.github.com/intlify/vue-i18n/releases/tag/v11.4.7) [Compare Source](https://redirect.github.com/intlify/vue-i18n/compare/v11.4.6...v11.4.7) <!-- Release notes generated using configuration in .github/release.yml at v11.4.7 --> **Full Changelog**: <intlify/vue-i18n@v11.4.6...v11.4.7> </details> <details> <summary>vuejs/router (vue-router)</summary> ### [`v5.2.0`](https://redirect.github.com/vuejs/router/releases/tag/v5.2.0) [Compare Source](https://redirect.github.com/vuejs/router/compare/v5.1.0...v5.2.0) ##### Β Β Β π Features - Add helpful diagnostics Β -Β by [@​posva](https://redirect.github.com/posva) in [#​2737](https://redirect.github.com/vuejs/router/issues/2737) [<samp>(628fe)</samp>](https://redirect.github.com/vuejs/router/commit/628fe18a) ##### Β Β Β π Bug Fixes - Allow pinia 4 Β -Β by [@​posva](https://redirect.github.com/posva) [<samp>(16535)</samp>](https://redirect.github.com/vuejs/router/commit/16535337) - **scroll**: Ignore stale async scrollBehavior results Β -Β by [@​baozjj](https://redirect.github.com/baozjj) and [@​cursoragent](https://redirect.github.com/cursoragent) in [#​2730](https://redirect.github.com/vuejs/router/issues/2730) [<samp>(303df)</samp>](https://redirect.github.com/vuejs/router/commit/303dfe19) - **unplugin**: Reject invalid hex digits in \[x+hh] character codes Β -Β by [@​greymoth-jp](https://redirect.github.com/greymoth-jp) in [#​2744](https://redirect.github.com/vuejs/router/issues/2744) [<samp>(4d967)</samp>](https://redirect.github.com/vuejs/router/commit/4d967411) ##### Β Β Β Β [View changes on GitHub](https://redirect.github.com/vuejs/router/compare/v5.1.0...v5.2.0) </details> --- ### Configuration π **Schedule**: (in timezone America/New_York) - Branch creation - "before 6am on monday" - Automerge - At any time (no schedule defined) π¦ **Automerge**: Disabled by config. Please merge this manually once you are satisfied. β» **Rebasing**: Whenever PR is behind base branch, 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/CodesWhat/drydock). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDIuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI3NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: scttbnsn <80784472+scttbnsn@users.noreply.github.com>
> βΉοΈ **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/) |
|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev)
([source](https://redirect.github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome))
| [`2.4.16` β
`2.5.5`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.16/2.5.5)
|

|

|
| [@tailwindcss/postcss](https://tailwindcss.com)
([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss))
| [`4.3.1` β
`4.3.3`](https://renovatebot.com/diffs/npm/@tailwindcss%2fpostcss/4.3.1/4.3.3)
|

|

|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`25.9.4` β
`25.9.5`](https://renovatebot.com/diffs/npm/@types%2fnode/25.9.4/25.9.5)
|

|

|
| [fumadocs-core](https://fumadocs.dev) | [`16.10.6` β
`16.11.5`](https://renovatebot.com/diffs/npm/fumadocs-core/16.10.6/16.11.5)
|

|

|
| [fumadocs-mdx](https://fumadocs.dev) | [`15.0.13` β
`15.2.0`](https://renovatebot.com/diffs/npm/fumadocs-mdx/15.0.13/15.2.0)
|

|

|
| [fumadocs-ui](https://fumadocs.dev) | [`16.10.6` β
`16.11.5`](https://renovatebot.com/diffs/npm/fumadocs-ui/16.10.6/16.11.5)
|

|

|
| [lefthook](https://redirect.github.com/evilmartians/lefthook) |
[`2.1.9` β
`2.1.10`](https://renovatebot.com/diffs/npm/lefthook/2.1.9/2.1.10) |

|

|
| [lucide-react](https://lucide.dev)
([source](https://redirect.github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react))
| [`1.21.0` β
`1.25.0`](https://renovatebot.com/diffs/npm/lucide-react/1.21.0/1.25.0)
|

|

|
| [tailwindcss](https://tailwindcss.com)
([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss))
| [`4.3.1` β
`4.3.3`](https://renovatebot.com/diffs/npm/tailwindcss/4.3.1/4.3.3) |

|

|
---
### Release Notes
<details>
<summary>biomejs/biome (@​biomejs/biome)</summary>
###
[`v2.5.5`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#255)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.5.4...@biomejs/biome@2.5.5)
##### Patch Changes
- [#​10972](https://redirect.github.com/biomejs/biome/pull/10972)
[`ab8c21b`](https://redirect.github.com/biomejs/biome/commit/ab8c21b35e81708276e4283a4a0ff86ea815e345)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/)
for unions of bigint literals. The rule now reports missing bigint cases
and compares bigint literals by value, including binary, octal,
hexadecimal, and separator-containing spellings. For example, this
switch now reports the missing `2n` case:
```ts
declare const value: 1n | 2n;
switch (value) {
case 1n:
break;
}
```
- [#​10972](https://redirect.github.com/biomejs/biome/pull/10972)
[`ab8c21b`](https://redirect.github.com/biomejs/biome/commit/ab8c21b35e81708276e4283a4a0ff86ea815e345)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed false positives in
[`noBaseToString`](https://biomejs.dev/linter/rules/no-base-to-string/)
and
[`useNullishCoalescing`](https://biomejs.dev/linter/rules/use-nullish-coalescing/)
when member, stringification, or nullish inference cannot complete.
These rules now suppress diagnostics instead of reporting from partial
type information. For example, neither expression is reported when a
recursive type cannot be fully resolved:
```ts
type Recursive = Recursive;
declare const value: Recursive;
String(value);
value || "fallback";
```
- [#​10977](https://redirect.github.com/biomejs/biome/pull/10977)
[`0bf7486`](https://redirect.github.com/biomejs/biome/commit/0bf748653e488d0b959d39847641438cdb28188b)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10922](https://redirect.github.com/biomejs/biome/issues/10922):
the action
[`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/)
no longer triggers for HTML instructions.
- [#​10957](https://redirect.github.com/biomejs/biome/pull/10957)
[`cf263c4`](https://redirect.github.com/biomejs/biome/commit/cf263c4700e9f24115e541d1f142934a9b2d878f)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed
[`noThenProperty`](https://biomejs.dev/linter/rules/no-then-property/)
failing to detect `Object.fromEntries`, `Object.defineProperty`, and
`Reflect.defineProperty` calls with comments between their tokens.
- [#​10983](https://redirect.github.com/biomejs/biome/pull/10983)
[`edc0ed7`](https://redirect.github.com/biomejs/biome/commit/edc0ed738ab8da3d512d527196684bd668090854)
Thanks [@​ayaangazali](https://redirect.github.com/ayaangazali)! -
Fixed
[#​10980](https://redirect.github.com/biomejs/biome/issues/10980):
[`useAriaPropsSupportedByRole`](https://biomejs.dev/linter/rules/use-aria-props-supported-by-role/)
no longer reports false positives when the attribute that determines an
element's implicit ARIA role is written as a shorthand attribute, such
as `<a {href} aria-label="...">` in Astro and Svelte files.
Shorthand attributes are now taken into account when computing the
implicit role, so the anchor above correctly resolves to the `link` role
instead of `generic`.
- [#​10889](https://redirect.github.com/biomejs/biome/pull/10889)
[`89526e3`](https://redirect.github.com/biomejs/biome/commit/89526e3858c437408ec9ff192c35a866ad991d1b)
Thanks [@​denbezrukov](https://redirect.github.com/denbezrukov)! -
Fixed CSS formatter casing for syntax-owned names while preserving
author-defined names, including scoped keyframes and container
scroll-state queries.
```diff
- A:HOVER { COLOR: INITIAL; }
+ A:hover { color: initial; }
- @​KEYFRAMES :GLOBAL KeepFrames { FROM { COLOR: RED; } }
+ @​keyframes :GLOBAL KeepFrames { from { color: RED; } }
- @​CONTAINER scroll-state((SCROLLED: TOP) AND (STUCK)) { A:HOVER
{ COLOR: RED; } }
+ @​container scroll-state((SCROLLED: TOP) AND (STUCK)) { A:hover
{ color: RED; } }
```
- [#​10964](https://redirect.github.com/biomejs/biome/pull/10964)
[`794ccd0`](https://redirect.github.com/biomejs/biome/commit/794ccd0528345c4eaa87af1d86f02475277a0a22)
Thanks [@​denbezrukov](https://redirect.github.com/denbezrukov)! -
Fixed CSS formatting for comments between declaration values and
`!important`.
```diff
-a { color: /* before */ /* after */ red !important; }
+a { color: /* before */ red /* after */ !important; }
```
- [#​10993](https://redirect.github.com/biomejs/biome/pull/10993)
[`b7a9694`](https://redirect.github.com/biomejs/biome/commit/b7a969425d4292fc7c50440da7aea41ce5c9a9c2)
Thanks [@​denbezrukov](https://redirect.github.com/denbezrukov)! -
Fixed the CSS formatter to preserve comments on the correct side of
selector combinators and before declaration blocks.
```diff
-.before > /* comment */ .after {}
+.before /* comment */ > .after {}
```
It now also keeps selectors with escaped newlines in attribute values
inline when they fit.
```diff
-div
- span[foo="bar\
+div span[foo="bar\
value"] {}
```
- [#​10978](https://redirect.github.com/biomejs/biome/pull/10978)
[`8ebafe1`](https://redirect.github.com/biomejs/biome/commit/8ebafe1c7489f1f7af379b8e52b8ad063c82d28a)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10870](https://redirect.github.com/biomejs/biome/issues/10870):
[`noUnresolvedImports`](https://biomejs.dev/linter/rules/no-unresolved-imports/)
no longer reports false positives such as `import type { NextRequest }
from "next/server"`.
- [#​10901](https://redirect.github.com/biomejs/biome/pull/10901)
[`68c10e6`](https://redirect.github.com/biomejs/biome/commit/68c10e672fc886b31423b18be01e873d3bf77f43)
Thanks
[@​Socialpranker](https://redirect.github.com/Socialpranker)! -
Fixed
[#​10622](https://redirect.github.com/biomejs/biome/issues/10622):
the HTML/Vue parser no longer panics on the argument-less `v-bind`
shorthand (`:="props"`).
This syntax is valid Vue and equivalent to `v-bind="props"`, so the
parser now accepts it (along with the longhand `v-bind:="props"`)
instead of crashing while building a diagnostic for a missing argument.
- [#​10936](https://redirect.github.com/biomejs/biome/pull/10936)
[`7df46f5`](https://redirect.github.com/biomejs/biome/commit/7df46f5be0880a02cb37453f01b83c1ba59b1e44)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Improved generic tuple inference for
[`useIncludes`](https://biomejs.dev/linter/rules/use-includes/). The
rule now recognizes specialised tuple element types returned through
generic aliases.
- [#​10941](https://redirect.github.com/biomejs/biome/pull/10941)
[`f787725`](https://redirect.github.com/biomejs/biome/commit/f7877258271e20523d5c673e62912fce1d85cd56)
Thanks [@​siketyan](https://redirect.github.com/siketyan)! - Fixed
[`#10855`](https://redirect.github.com/biomejs/biome/issues/10855):
Biome now supports parsing and formatting CSS custom media queries
declared with
[`@custom-media`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@​custom-media).
- [#​10969](https://redirect.github.com/biomejs/biome/pull/10969)
[`72d309b`](https://redirect.github.com/biomejs/biome/commit/72d309b655cee70473e20b061f5a45112139688c)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where Biome logs became too verbose, dumping information
not relevant to user's operations.
-
[`e62f6b6`](https://redirect.github.com/biomejs/biome/commit/e62f6b61461227bbfd57fdf1b50b2dc8c01ea5a0)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10963](https://redirect.github.com/biomejs/biome/issues/10963):
Biome no longer panics when a type-aware rule such as
[`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/)
checks a call to a function with multiple call signatures imported from
another module.
- [#​10931](https://redirect.github.com/biomejs/biome/pull/10931)
[`899c60d`](https://redirect.github.com/biomejs/biome/commit/899c60d506115b3f62030236cbd0901bf294e6ab)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed `check --write` command. Now the command reports code frame of the
formatted code, if the formatter is enabled.
- [#​10904](https://redirect.github.com/biomejs/biome/pull/10904)
[`ceee4f4`](https://redirect.github.com/biomejs/biome/commit/ceee4f43dabf88d86b87c9a4ce6051b6738869c2)
Thanks [@​qzwxsaedc](https://redirect.github.com/qzwxsaedc)! -
Fixed
[#​10892](https://redirect.github.com/biomejs/biome/issues/10892):
[`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/)
no longer reports a false positive when checking a member of a
discriminated union that is accessed through a default type-only
namespace import. The following code is no longer flagged:
```ts
import type Types from "./types";
declare function parse(): Types.Result<string>;
const result = parse();
if (!result.success) {
}
```
- [#​10962](https://redirect.github.com/biomejs/biome/pull/10962)
[`f0a67f2`](https://redirect.github.com/biomejs/biome/commit/f0a67f2e56c0785595c5cf14a93dba5bb32acf2d)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Biome no longer removes embedded styles and scripts in HTML files.
- [#​11000](https://redirect.github.com/biomejs/biome/pull/11000)
[`5039a1e`](https://redirect.github.com/biomejs/biome/commit/5039a1ee35771d0193de65a6326781313ab77afb)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed a bug where closing one editor stopped a shared Biome daemon used
by other editors. LSP proxy processes now exit when either the editor or
daemon disconnects.
- [#​10957](https://redirect.github.com/biomejs/biome/pull/10957)
[`cf263c4`](https://redirect.github.com/biomejs/biome/commit/cf263c4700e9f24115e541d1f142934a9b2d878f)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Improved the
performance of the
[`noThenProperty`](https://biomejs.dev/linter/rules/no-then-property/)
lint rule by about 50%.
- [#​10992](https://redirect.github.com/biomejs/biome/pull/10992)
[`4bf9b21`](https://redirect.github.com/biomejs/biome/commit/4bf9b21319df240e2c5ef2e5a9cb2e9582a0e1d1)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/):
The rule now reports Promise-returning callbacks where a synchronous
callback is expected when calls use tuple spreads or tuple rest
parameters, including generic and deeply nested tuples, and when
constructor signatures come from interface or object types. Recursive or
excessively nested tuple spreads use a conservative fallback so analysis
terminates.
For example, the following callback is now reported.
```ts
declare function consume(...args: [number, () => void]): void;
const prefix: [number] = [1];
consume(...prefix, async () => {});
```
- [#​10915](https://redirect.github.com/biomejs/biome/pull/10915)
[`b3b12b3`](https://redirect.github.com/biomejs/biome/commit/b3b12b3fe390feabbd9ba097922d6c7e56823406)
Thanks [@​Functionhx](https://redirect.github.com/Functionhx)! -
Added the rule
[`noNegationInEqualityCheck`](https://biomejs.dev/linter/rules/no-negation-in-equality-check/).
The rule flags negated expressions on the left side of strict equality
checks like `!foo === bar` β due to operator precedence this evaluates
as `(!foo) === bar` which is almost always a mistake for `foo !== bar`.
The rule provides an unsafe fix that flips the operator.
```js
// Invalid
!foo === bar;
!foo !== bar;
// Valid
foo !== bar;
foo === bar;
```
- [#​10970](https://redirect.github.com/biomejs/biome/pull/10970)
[`bd1038b`](https://redirect.github.com/biomejs/biome/commit/bd1038be1ad110aae60bcdbe9a154c6a2fc85c14)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Improved overload selection for
[`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/).
Biome now handles overloaded calls, overloaded constructors, rest
parameters, union arguments, and generic constraints without selecting
an incompatible signature. For example, `noMisusedPromises` now reports
the async callback passed to the synchronous overload:
```ts
declare function consume(kind: "async", callback: () => Promise<void>):
void;
declare function consume(kind: "sync", callback: () => void): void;
consume("sync", async () => {});
```
- [#​10933](https://redirect.github.com/biomejs/biome/pull/10933)
[`48a4abb`](https://redirect.github.com/biomejs/biome/commit/48a4abb99d41b1241b2a5812a12247b671d0dfed)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed [`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/)
to recognize bigint zero indexes.
- [#​10931](https://redirect.github.com/biomejs/biome/pull/10931)
[`899c60d`](https://redirect.github.com/biomejs/biome/commit/899c60d506115b3f62030236cbd0901bf294e6ab)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an orchestration issue that could lead to deadlocks when
type-aware rules are enabled.
- [#​10969](https://redirect.github.com/biomejs/biome/pull/10969)
[`72d309b`](https://redirect.github.com/biomejs/biome/commit/72d309b655cee70473e20b061f5a45112139688c)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Hardened the Biome Language Server by improving its synchronisation
logic.
- [#​10972](https://redirect.github.com/biomejs/biome/pull/10972)
[`ab8c21b`](https://redirect.github.com/biomejs/biome/commit/ab8c21b35e81708276e4283a4a0ff86ea815e345)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed false positives in
[`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/)
and
[`useAwaitThenable`](https://biomejs.dev/linter/rules/use-await-thenable/)
when Promise or thenable inference cannot complete. These rules now
suppress diagnostics instead of treating incomplete type information as
a definite result. For example, `useAwaitThenable` no longer reports
`await value` when the value's thenability is unknown:
```ts
declare const value: unknown;
async function consume() {
await value;
}
```
###
[`v2.5.4`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#254)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.5.3...@biomejs/biome@2.5.4)
##### Patch Changes
- [#​10665](https://redirect.github.com/biomejs/biome/pull/10665)
[`55ff995`](https://redirect.github.com/biomejs/biome/commit/55ff995098148446b7e7fdfc19053902bb987122)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Improved the
performance of the HTML parser slightly in our synthetic benchmarks.
- [#​10894](https://redirect.github.com/biomejs/biome/pull/10894)
[`f4fb10e`](https://redirect.github.com/biomejs/biome/commit/f4fb10e176e537e8ce2cac0c3fd4c38a77f91886)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​6392](https://redirect.github.com/biomejs/biome/issues/6392):
On-type formatting no longer moves comments before an `if` statement
into its body.
- [#​10939](https://redirect.github.com/biomejs/biome/pull/10939)
[`f2799db`](https://redirect.github.com/biomejs/biome/commit/f2799db38e3d8a644207d9b8f957abea6cb3d9fa)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10930](https://redirect.github.com/biomejs/biome/issues/10930):
[`noLabelWithoutControl`](https://biomejs.dev/linter/rules/no-label-without-control/)
now correctly detects text interpolation in Astro, Svelte & Vue as valid
accessible content.
- [#​10945](https://redirect.github.com/biomejs/biome/pull/10945)
[`ae15d98`](https://redirect.github.com/biomejs/biome/commit/ae15d98bbf2222fbb34e3e31832cba9676a6d01c)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10942](https://redirect.github.com/biomejs/biome/issues/10942):
Svelte directives don't throw an accidental debug log anymore.
- [#​10842](https://redirect.github.com/biomejs/biome/pull/10842)
[`5e1abfe`](https://redirect.github.com/biomejs/biome/commit/5e1abfee59155b5fdca8813314371ed54c06acfb)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​9196](https://redirect.github.com/biomejs/biome/issues/9196):
`biome check --write --unsafe` no longer hangs forever when applying the
[`noCommentText`](https://biomejs.dev/linter/rules/no-comment-text/)
code fix.
The rule's fix now wraps the comment in a real JSX expression container
(`{/* comment */}`) instead of re-inserting the braces as plain JSX
text, so the fixed code is no longer reported again by the same rule.
- [#​10891](https://redirect.github.com/biomejs/biome/pull/10891)
[`ecca79e`](https://redirect.github.com/biomejs/biome/commit/ecca79e8ff10f40aa676212c0db0a970c6091615)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[`#10885`](https://redirect.github.com/biomejs/biome/issues/10885):
prevented a module-inference regression introduced by a housekeeping
change.
- [#​10886](https://redirect.github.com/biomejs/biome/pull/10886)
[`60c8043`](https://redirect.github.com/biomejs/biome/commit/60c8043527f7ccc7b505471e1042f2a4324e4d31)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed
[#​10727](https://redirect.github.com/biomejs/biome/issues/10727):
Biome now breaks the arguments of curried `test.each`, `it.each`,
`describe.each`, and `test.for` calls when they exceed the configured
line width.
```diff
- test.each([[1, 2]])("a description that is long enough to push the
hugged opening line beyond the print width", (a, b) => {
- expect(a).toBe(b);
- });
+ test.each([[1, 2]])(
+ "a description that is long enough to push the hugged opening line
beyond the print width",
+ (a, b) => {
+ expect(a).toBe(b);
+ },
+ );
```
- [#​10895](https://redirect.github.com/biomejs/biome/pull/10895)
[`01a85f0`](https://redirect.github.com/biomejs/biome/commit/01a85f04b09f0af05b16a15c137421e312ceada5)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Biome will now remove stale Unix daemon sockets from older Biome
versions when starting a newer daemon.
###
[`v2.5.3`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#253)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.5.2...@biomejs/biome@2.5.3)
##### Patch Changes
- [#​10815](https://redirect.github.com/biomejs/biome/pull/10815)
[`86613d5`](https://redirect.github.com/biomejs/biome/commit/86613d5b01eb965b460ccefbf27f168d87774aaf)
Thanks
[@​WaterWhisperer](https://redirect.github.com/WaterWhisperer)! -
Fixed a parser panic reported in
[#​10708](https://redirect.github.com/biomejs/biome/issues/10708):
Biome now recovers when unsupported CSS Modules `@value` rules or scoped
`@keyframes` names end at EOF.
- [#​10534](https://redirect.github.com/biomejs/biome/pull/10534)
[`da9b403`](https://redirect.github.com/biomejs/biome/commit/da9b403b6bbacc8d75d56e327a46f4ed0285913e)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Fixed
[`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/)
false positives in Svelte files: Svelte store subscriptions (`$store`
references in templates now keep the underlying `store` binding from
being flagged), and `$bindable()` props that are only written to in the
script block (write-only is intentional for bindable props) are no
longer reported as unused.
- [#​10827](https://redirect.github.com/biomejs/biome/pull/10827)
[`098ba41`](https://redirect.github.com/biomejs/biome/commit/098ba41c99e6efaac8eb182eec258a567bb00123)
Thanks [@​Aqu1bp](https://redirect.github.com/Aqu1bp)! - Fixed
[#​10698](https://redirect.github.com/biomejs/biome/issues/10698):
The
[`noUnsafeOptionalChaining`](https://biomejs.dev/linter/rules/no-unsafe-optional-chaining/)
rule now reports unsafe optional chains wrapped in TypeScript `as`,
`satisfies`, type assertion, and instantiation expressions, such as `new
(value?.constructor as Constructor)()`.
- [#​10773](https://redirect.github.com/biomejs/biome/pull/10773)
[`3c6513d`](https://redirect.github.com/biomejs/biome/commit/3c6513d4e9a82a195785144caa9d96093c3861ff)
Thanks [@​otkrickey](https://redirect.github.com/otkrickey)! -
Fixed
[#​10772](https://redirect.github.com/biomejs/biome/issues/10772):
[`useVueValidVOn`](https://biomejs.dev/linter/rules/use-vue-valid-v-on/)
no longer reports a missing handler for v-on directives using a verb
modifier (`.stop` / `.prevent`) without an expression, e.g. `<div
@​click.stop></div>`. The rule also accepts the arg-less object
syntax `<div v-on="$listeners"></div>` instead of reporting a missing
event name.
- [#​10721](https://redirect.github.com/biomejs/biome/pull/10721)
[`d83c66b`](https://redirect.github.com/biomejs/biome/commit/d83c66b39a820703d94100f8a6502cc6dbad26a1)
Thanks [@​minseong0324](https://redirect.github.com/minseong0324)!
- Improved type-aware lint rule inference for built-in globals and
indexed function calls. Biome now resolves `Error(...)`, `new
Error(...)`, optional `Error#stack`, and calls through indexed function
values such as `handlers[0]()` more accurately.
- [#​10865](https://redirect.github.com/biomejs/biome/pull/10865)
[`6450276`](https://redirect.github.com/biomejs/biome/commit/6450276764ee4794a0fcb46c139f95b68d892427)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10845](https://redirect.github.com/biomejs/biome/issues/10845).
Biome Language Server no longer goes in deadlock when the scanner is
enabled.
- [#​10853](https://redirect.github.com/biomejs/biome/pull/10853)
[`93d8e53`](https://redirect.github.com/biomejs/biome/commit/93d8e5352454bccfbd179db03b3155776599c52c)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10840](https://redirect.github.com/biomejs/biome/issues/10840):
Astro shorthand attribute syntax is now correctly being parsed from
embedded nodes.
- [#​10820](https://redirect.github.com/biomejs/biome/pull/10820)
[`bba3092`](https://redirect.github.com/biomejs/biome/commit/bba30920715920142e933939f6270feedca933a5)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​10619](https://redirect.github.com/biomejs/biome/issues/10619):
[`noProcessEnv`](https://biomejs.dev/linter/rules/no-process-env/) now
also reports computed (bracket) member access. Previously only dot
access was checked, so `process["env"]` and `env["NODE_ENV"]` (where
`env` is imported from `node:process`) were missed. Both static and
computed accesses are now reported.
- [#​10835](https://redirect.github.com/biomejs/biome/pull/10835)
[`3447b2f`](https://redirect.github.com/biomejs/biome/commit/3447b2f5a3c430efc8e917514260af5341c5509d)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed
[#​10824](https://redirect.github.com/biomejs/biome/issues/10824):
[`useDomQuerySelector`](https://biomejs.dev/linter/rules/use-dom-query-selector/)
now supports an `ignore` option for receiver identifiers that should not
be reported.
- [#​10875](https://redirect.github.com/biomejs/biome/pull/10875)
[`b12e486`](https://redirect.github.com/biomejs/biome/commit/b12e486d0f0b80d02d2208e239190f8756d39d48)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed
[#​10795](https://redirect.github.com/biomejs/biome/issues/10795):
`--profile-rules` now reports timings for each plugin separately as
`plugin/<pluginName>`, matching the naming used by plugin suppressions,
instead of aggregating all plugins under a single `plugin/plugin` entry.
- [#​10877](https://redirect.github.com/biomejs/biome/pull/10877)
[`d6bc447`](https://redirect.github.com/biomejs/biome/commit/d6bc4473a210758ee49f6cad41bc69587a7cf125)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[biome-zed#164](https://redirect.github.com/biomejs/biome-zed/issues/164):
Biome no longer inserts stray whitespace when format-on-type runs after
closing delimiters such as `)`, `]`, and `}`.
- [#​10867](https://redirect.github.com/biomejs/biome/pull/10867)
[`a21463e`](https://redirect.github.com/biomejs/biome/commit/a21463e5f616a2db5035b470cd206ac9da4d9423)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed
[#​10864](https://redirect.github.com/biomejs/biome/issues/10864):
Biome no longer crashes when checking or linting HTML files with
unquoted attribute values such as `<textarea rows=4></textarea>`.
###
[`v2.5.2`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#252)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.5.1...@biomejs/biome@2.5.2)
##### Patch Changes
- [#​10595](https://redirect.github.com/biomejs/biome/pull/10595)
[`f458028`](https://redirect.github.com/biomejs/biome/commit/f4580289094a8fe5c85252adc3399c060bab811e)
Thanks [@​pkallos](https://redirect.github.com/pkallos)! - Added
the option `ignoreBooleanCoercion` to
[useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/).
When enabled, Biome ignores `||` and `||=` used inside a `Boolean()`
call, where coalescing on falsy values is intentional.
- [#​10798](https://redirect.github.com/biomejs/biome/pull/10798)
[`4a32b63`](https://redirect.github.com/biomejs/biome/commit/4a32b63eb41f144dc8faf6b5cdb05e1de5dbcb63)
Thanks [@​pkallos](https://redirect.github.com/pkallos)! - Added
the option `ignorePrimitives` to
[useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/).
When enabled, Biome ignores `||`, `||=`, and ternary expressions whose
non-nullish operands are all primitives the option opts out of. Use
`true` to ignore all primitives, or an object selecting `string`,
`number`, `boolean`, or `bigint`.
- [#​10545](https://redirect.github.com/biomejs/biome/pull/10545)
[`f3d4c00`](https://redirect.github.com/biomejs/biome/commit/f3d4c0082676c5188e9a6aa516318c7e3d59bda6)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Added the
new nursery rule
[`noSvelteUnnecessaryStateWrap`](https://biomejs.dev/linter/rules/no-svelte-unnecessary-state-wrap/),
which reports unnecessary `$state()` wrapping of classes from
`svelte/reactivity` that are already reactive.
```svelte
<script>
import { SvelteMap } from "svelte/reactivity";
const map = $state(new SvelteMap()); // redundant
</script>
```
- [#​10752](https://redirect.github.com/biomejs/biome/pull/10752)
[`f62fb8b`](https://redirect.github.com/biomejs/biome/commit/f62fb8b53092fe85e16f9d4ea0e584fee7031ab5)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10739](https://redirect.github.com/biomejs/biome/issues/10739).
Now the rule
[`useValidAutocomplete`](https://biomejs.dev/linter/rules/use-valid-autocomplete/)
correctly flags the `autoComplete` attribute.
- [#​10796](https://redirect.github.com/biomejs/biome/pull/10796)
[`f1b3ab2`](https://redirect.github.com/biomejs/biome/commit/f1b3ab2c09522a52c93f669ce679675237b96813)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10768](https://redirect.github.com/biomejs/biome/issues/10768).
Improved the performance of the Biome Language Server by cancelling
certain in-flight operations when there are fast updates.
- [#​10719](https://redirect.github.com/biomejs/biome/pull/10719)
[`aa649b5`](https://redirect.github.com/biomejs/biome/commit/aa649b586a2221bf058af7ce80af6faa11faf846)
Thanks [@​minseong0324](https://redirect.github.com/minseong0324)!
- Fixed
[`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/)
false positive on returns that use a widening type assertion: `"a" as
string` is no longer reported as misleading. The rule now also reports a
literal-pinning assertion such as `false as false`, matching the
existing `as const` behavior.
```ts
// No longer flagged (returns are `string`):
function getValue(b: boolean): string {
if (b) return "a" as string;
return "b" as string;
}
// Now also reported, like `as const` (returns `false`):
function isReady(): boolean {
return false as false;
}
```
- [#​10678](https://redirect.github.com/biomejs/biome/pull/10678)
[`8f073a7`](https://redirect.github.com/biomejs/biome/commit/8f073a7cd72b4cf46c2ebf2bc08f4068fc4b5e34)
Thanks
[@​PranavAchar01](https://redirect.github.com/PranavAchar01)! -
Fixed
[#​7718](https://redirect.github.com/biomejs/biome/issues/7718):
Biome now correctly parses CSS nesting selectors when `&` appears as a
trailing sub-selector after a type selector, e.g. `h1& { color: red; }`.
- [#​10756](https://redirect.github.com/biomejs/biome/pull/10756)
[`5ec965a`](https://redirect.github.com/biomejs/biome/commit/5ec965a2620dec7cb40aa4946ba1d41408b11fd9)
Thanks [@​denbezrukov](https://redirect.github.com/denbezrukov)! -
Fixed CSS formatter output for selector lists with
`allowWrongLineComments` and `//` comments after a selector comma. Biome
now keeps the selector before the line comment inline instead of
breaking it across descendant combinators.
```diff
-.powerPathNavigator
- .helm
- button.pressedButton, // pressed
+.powerPathNavigator .helm button.pressedButton, // pressed
.powerPathNavigator .helm button:active:not(.disabledButton) {
}
```
- [#​10757](https://redirect.github.com/biomejs/biome/pull/10757)
[`6232fcd`](https://redirect.github.com/biomejs/biome/commit/6232fcdef77471e6a6a74bcc33ff7b2b2a9f85a2)
Thanks
[@​PranavAchar01](https://redirect.github.com/PranavAchar01)! -
Fixed
[#​8269](https://redirect.github.com/biomejs/biome/issues/8269):
the CSS parser now accepts Tailwind `@variant` and `@utility` names that
start with a digit, such as the `2xl` breakpoint.
```css
@​utility container {
@​variant 2xl {
max-width: 1400px;
}
}
```
- [#​10777](https://redirect.github.com/biomejs/biome/pull/10777)
[`575ced6`](https://redirect.github.com/biomejs/biome/commit/575ced6fd7fe3597fdec36e572763e4a5d590244)
Thanks
[@​WaterWhisperer](https://redirect.github.com/WaterWhisperer)! -
Fixed an issue reported in
[#​10708](https://redirect.github.com/biomejs/biome/issues/10708):
the GitLab reporter now handles `--verbose` diagnostics filtering
correctly.
- [#​10281](https://redirect.github.com/biomejs/biome/pull/10281)
[`0efe244`](https://redirect.github.com/biomejs/biome/commit/0efe2442e9b81d83f7332fd792ad6096678f8b2c)
Thanks [@​Zelys-DFKH](https://redirect.github.com/Zelys-DFKH)! -
Fixed a bug where GritQL patterns rejected positional (unkeyed)
arguments.
- [#​10758](https://redirect.github.com/biomejs/biome/pull/10758)
[`e36fd8a`](https://redirect.github.com/biomejs/biome/commit/e36fd8a9f1314744276df515a1137f21802d3aa5)
Thanks
[@​henrybrewer00-dotcom](https://redirect.github.com/henrybrewer00-dotcom)!
- Fixed
[#​10697](https://redirect.github.com/biomejs/biome/issues/10697):
The formatter no longer removes the parentheses around an `await` or
`yield` expression used as the target of a TypeScript instantiation
expression. For example, `(await makeFactory)<Value>` is no longer
reformatted to `await makeFactory<Value>`, which would change the
meaning of the code.
- [#​10586](https://redirect.github.com/biomejs/biome/pull/10586)
[`3617094`](https://redirect.github.com/biomejs/biome/commit/3617094f00e90f7167ff20baf3c12b5014188b35)
Thanks [@​IxxyDev](https://redirect.github.com/IxxyDev)! - Fixed
[#​9568](https://redirect.github.com/biomejs/biome/issues/9568):
[`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/)
no longer reports a false positive when calling an overloaded function
and the selected overload does not return a promise.
```ts
function bestEffort(cb: () => Promise<number>): Promise<number>;
function bestEffort(cb: () => number): number;
function bestEffort(
cb: () => number | Promise<number>,
): Promise<number> | number {
return cb() as Promise<number> | number;
}
// This resolves to the second overload, which returns `number`, so it
is no
// longer flagged as a floating promise.
bestEffort(() => 42);
```
- [#​10766](https://redirect.github.com/biomejs/biome/pull/10766)
[`7aff4c1`](https://redirect.github.com/biomejs/biome/commit/7aff4c11900579a62dc27ef4e02a4c4760fbbff4)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​2862](https://redirect.github.com/biomejs/biome/issues/2862):
[`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/)
no longer reports custom elements (a tag name containing a dash, e.g.
`<my-button role="img" />`). Per the [W3C HTML-ARIA
specification](https://www.w3.org/TR/html-aria/#el-autonomous-custom-element),
a custom element may be given any role or none.
- [#​10680](https://redirect.github.com/biomejs/biome/pull/10680)
[`771daa4`](https://redirect.github.com/biomejs/biome/commit/771daa4f7d229a8754f47923f03b899dc0fc5630)
Thanks
[@​WaterWhisperer](https://redirect.github.com/WaterWhisperer)! -
Fixed
[#​10635](https://redirect.github.com/biomejs/biome/issues/10635):
Biome now recognizes chained
table tests such as `test.concurrent.each()` and `it.concurrent.each()`
as test calls, fixing
`noMisplacedAssertion` false positives and improving formatting for
those test declarations.
- [#​10759](https://redirect.github.com/biomejs/biome/pull/10759)
[`34570b5`](https://redirect.github.com/biomejs/biome/commit/34570b5b793c44e978b12589dafcfda22dba7df1)
Thanks
[@​henrybrewer00-dotcom](https://redirect.github.com/henrybrewer00-dotcom)!
- Fixed
[#​10636](https://redirect.github.com/biomejs/biome/issues/10636):
[noStaticElementInteractions](https://biomejs.dev/linter/rules/no-static-element-interactions/)
no longer reports a false positive for event handlers on Svelte special
elements such as `<svelte:window>`, `<svelte:document>`, and
`<svelte:body>`. These are not real DOM elements, so they are now
ignored by the rule.
- [#​10741](https://redirect.github.com/biomejs/biome/pull/10741)
[`bd2364e`](https://redirect.github.com/biomejs/biome/commit/bd2364e3d077e3a77addcab6dbe127db38654e4a)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​6686](https://redirect.github.com/biomejs/biome/issues/6686):
the `rage` command now respects the `--config-path` option and the
`BIOME_CONFIG_PATH` environment variable when loading the Biome
configuration. Previously it always used the default configuration
resolution and reported the configuration as `Not set` when no
`biome.json` existed in the working directory.
- [#​10763](https://redirect.github.com/biomejs/biome/pull/10763)
[`2c3e82d`](https://redirect.github.com/biomejs/biome/commit/2c3e82d0235ad2f8331744aefc708d1b71f7177c)
Thanks [@​Aqu1bp](https://redirect.github.com/Aqu1bp)! - Fixed
[#​10742](https://redirect.github.com/biomejs/biome/issues/10742):
[`noSolidDestructuredProps`](https://biomejs.dev/linter/rules/no-solid-destructured-props)
now reports destructured props in Solid function components and JSX
children.
- [#​10606](https://redirect.github.com/biomejs/biome/pull/10606)
[`a4cc4ab`](https://redirect.github.com/biomejs/biome/commit/a4cc4ab0b01a8ef1731d37cb44bccc5522876f2e)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Fixed false
positives in `noUnusedImports`, `noUnusedVariables`, and `useImportType`
for Svelte components that use both a `<script module>` and a `<script>`
block. The two blocks compile to a single module and share a top-level
scope, so a binding (import, function, or variable) declared in one
block and used only in the other is no longer reported as unused.
- [#​10767](https://redirect.github.com/biomejs/biome/pull/10767)
[`36d5aa7`](https://redirect.github.com/biomejs/biome/commit/36d5aa77d751bf33485cd2c92d89e4c5764e1e50)
Thanks [@​otkrickey](https://redirect.github.com/otkrickey)! -
Fixed
[#​10754](https://redirect.github.com/biomejs/biome/issues/10754):
[`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/)
no longer reports the Vue 3.4+ same-name shorthand as missing a value.
`:foo` and `v-bind:foo` are now accepted as equivalent to `:foo="foo"`,
while `v-bind`, `v-bind:[dynamicArg]`, and `:[dynamicArg]` without a
value continue to be reported.
- [#​10775](https://redirect.github.com/biomejs/biome/pull/10775)
[`a918af0`](https://redirect.github.com/biomejs/biome/commit/a918af0ba827a7fd60a12c96b58daebc8af61db2)
Thanks
[@​WaterWhisperer](https://redirect.github.com/WaterWhisperer)! -
Fixed an issue reported in
[#​10708](https://redirect.github.com/biomejs/biome/issues/10708):
`biome rage` didn't detect running Biome daemon pipes on Windows.
- [#​10730](https://redirect.github.com/biomejs/biome/pull/10730)
[`5a2e65b`](https://redirect.github.com/biomejs/biome/commit/5a2e65b9929ef0f2294c20e028fd396d760d2b26)
Thanks [@​dinocosta](https://redirect.github.com/dinocosta)! -
Fixed an issue where Biome was resolving [the well-known Zed settings
file](https://biomejs.dev/guides/configure-biome/#well-known-files) from
the wrong location on macOS and Windows.
- [#​10807](https://redirect.github.com/biomejs/biome/pull/10807)
[`d97fffe`](https://redirect.github.com/biomejs/biome/commit/d97fffe0aba04cddec66943d6bff3e99d440b451)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where `.scss` files were incorrectly analyzed when
running `biome check`.
- [#​10672](https://redirect.github.com/biomejs/biome/pull/10672)
[`53c6efc`](https://redirect.github.com/biomejs/biome/commit/53c6efcd3e5e2769bf8edbe14b8c06ee9fda52d2)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed a bug where Biome incorrectly formatted snippets that have parsing
errors.
- [#​10719](https://redirect.github.com/biomejs/biome/pull/10719)
[`aa649b5`](https://redirect.github.com/biomejs/biome/commit/aa649b586a2221bf058af7ce80af6faa11faf846)
Thanks [@​minseong0324](https://redirect.github.com/minseong0324)!
- Fixed
[`useAwaitThenable`](https://biomejs.dev/linter/rules/use-await-thenable/)
false positive when awaiting a custom thenable that is not the global
`Promise`. A value with a callable `then` member is now recognized as
awaitable.
```ts
interface Thenable<T> {
then(onfulfilled: (value: T) => void): void;
}
declare const t: Thenable<number>;
async function f() {
await t;
}
```
- [#​10734](https://redirect.github.com/biomejs/biome/pull/10734)
[`4396496`](https://redirect.github.com/biomejs/biome/commit/43964961c88ca0f93ee83d10621844fa2dc7515c)
Thanks [@​BangDori](https://redirect.github.com/BangDori)! - Fixed
[#​10708](https://redirect.github.com/biomejs/biome/issues/10708):
`biome migrate` now preserves trivia when migrating the deprecated
`recommended` option to `preset`.
- [#​10683](https://redirect.github.com/biomejs/biome/pull/10683)
[`ae31a00`](https://redirect.github.com/biomejs/biome/commit/ae31a004a20ed33d6aa35d5ec8bb4c433273a517)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10657](https://redirect.github.com/biomejs/biome/issues/10657)
[#​10671](https://redirect.github.com/biomejs/biome/issues/10671)
[#​10661](https://redirect.github.com/biomejs/biome/issues/10661)
[#​10637](https://redirect.github.com/biomejs/biome/issues/10637)
[#​10718](https://redirect.github.com/biomejs/biome/issues/10718):
HTML rules now correctly handle dynamic attributes.
- [#​10746](https://redirect.github.com/biomejs/biome/pull/10746)
[`54e8239`](https://redirect.github.com/biomejs/biome/commit/54e8239bba3f598d7923ac1e446d658714ea7832)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where
[`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes)
didn't correctly detect styles defined inside the Astro directive
`is:global`.
- [#​10770](https://redirect.github.com/biomejs/biome/pull/10770)
[`dd1429c`](https://redirect.github.com/biomejs/biome/commit/dd1429c604f58b89524a3f5329e2920d198e8d9f)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Improved the Biome Language Server DX by orchestrating certain
operations, so that they won't block the editor during typing. This
improvement is more visible in large documents.
- [#​10473](https://redirect.github.com/biomejs/biome/pull/10473)
[`d9b5133`](https://redirect.github.com/biomejs/biome/commit/d9b5133de7e211b22f4531fe220070690a18c8d1)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Improved
[`noUnusedImports`](https://biomejs.dev/linter/rules/no-unused-imports/),
[`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/),
[`noUnusedFunctionParameters`](https://biomejs.dev/linter/rules/no-unused-function-parameters/),
and [`useImportType`](https://biomejs.dev/linter/rules/use-import-type/)
for Svelte, Vue, and Astro files (with
`html.experimentalFullSupportEnabled`). Bindings used only in the
template β including component tags, attribute interpolations,
directives, `bind:` shorthand, and snippet parameters β are no longer
reported as unused, while genuinely unused ones still are.
- [#​10796](https://redirect.github.com/biomejs/biome/pull/10796)
[`f1b3ab2`](https://redirect.github.com/biomejs/biome/commit/f1b3ab2c09522a52c93f669ce679675237b96813)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where the Biome Language Server didn't enable project or
type-aware lint rules, even when they were explicitly enabled.
- [#​10746](https://redirect.github.com/biomejs/biome/pull/10746)
[`54e8239`](https://redirect.github.com/biomejs/biome/commit/54e8239bba3f598d7923ac1e446d658714ea7832)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where
[`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes)
didn't detect styles declared inside HTML documents.
- [#​10774](https://redirect.github.com/biomejs/biome/pull/10774)
[`bde945b`](https://redirect.github.com/biomejs/biome/commit/bde945bee29cb566086828ad788153d9111a125a)
Thanks [@​pattrickrice](https://redirect.github.com/pattrickrice)!
- Fixed
[#​10268](https://redirect.github.com/biomejs/biome/issues/10268)
where a race condition resulted in internal errors such as: `The file
biome.json does not exist in the workspace`.
###
[`v2.5.1`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#251)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.5.0...@biomejs/biome@2.5.1)
##### Patch Changes
- [#​10722](https://redirect.github.com/biomejs/biome/pull/10722)
[`f8a303d`](https://redirect.github.com/biomejs/biome/commit/f8a303d08b6b22f56edb8ff5e7caa665532d613a)
Thanks [@​denbezrukov](https://redirect.github.com/denbezrukov)! -
Fixed CSS formatter output for comments between import media queries.
```diff
-@​import url("print.css") print,
-/* comment */
-screen;
+@​import url("print.css") print, /* comment */ screen;
```
- [#​10738](https://redirect.github.com/biomejs/biome/pull/10738)
[`9fdc560`](https://redirect.github.com/biomejs/biome/commit/9fdc5600997ef59ca7ed55ac212473de9bdb0b2a)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​9899](https://redirect.github.com/biomejs/biome/issues/9899):
the `json` and `json-pretty` reporters now escape backslashes in a
diagnostic's `location.path`. Previously, paths containing backslashes
(such as Windows-style paths) were emitted unescaped, producing invalid
JSON.
```diff
- "path": "src\account\setup-passkey.tsx",
+ "path": "src\\account\\setup-passkey.tsx",
```
- [#​10626](https://redirect.github.com/biomejs/biome/pull/10626)
[`5f837df`](https://redirect.github.com/biomejs/biome/commit/5f837df033afc34d43b398aeddc06c1d4fa491d9)
Thanks [@​tom-groves](https://redirect.github.com/tom-groves)! -
Fixed
[#​10625](https://redirect.github.com/biomejs/biome/issues/10625):
`biome migrate` no longer emits an invalid trailing comma when a renamed
rule (such as `noConsoleLog` β `noConsole`) is the last member of its
rule group. Previously this produced malformed output that aborted the
migration of a strict-JSON `biome.json` with a parsing error.
- [#​10535](https://redirect.github.com/biomejs/biome/pull/10535)
[`c245f9d`](https://redirect.github.com/biomejs/biome/commit/c245f9d9e239471d5437cd08f9cfa4601a85abd5)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Fixed a
false positive in
[`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/)
for Svelte files where variables referenced inside `{@​html expr}`
blocks were incorrectly reported as unused.
- [#​10668](https://redirect.github.com/biomejs/biome/pull/10668)
[`a0f197e`](https://redirect.github.com/biomejs/biome/commit/a0f197eb1a6974539927f105ff1dde1f51d07d74)
Thanks [@​Netail](https://redirect.github.com/Netail)! - The
`biome init` command has been updated to include a more up-to-date URL
to [the first-party extensions
page](https://biomejs.dev/editors/first-party-extensions/).
- [#​10667](https://redirect.github.com/biomejs/biome/pull/10667)
[`d8c3e87`](https://redirect.github.com/biomejs/biome/commit/d8c3e878d53515c02bd6c5cb899b2eaec046c542)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10664](https://redirect.github.com/biomejs/biome/issues/10664):
[useErrorCause](https://biomejs.dev/linter/rules/use-error-cause/) now
correctly detects a shorthand property.
- [#​10696](https://redirect.github.com/biomejs/biome/pull/10696)
[`ef2373f`](https://redirect.github.com/biomejs/biome/commit/ef2373f29be15673705884d345c9af189e30b581)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​9566](https://redirect.github.com/biomejs/biome/issues/9566).
Improved how the Biome Language Server loads multiple configuration
files inside a workspace.
- [#​10705](https://redirect.github.com/biomejs/biome/pull/10705)
[`4ccb410`](https://redirect.github.com/biomejs/biome/commit/4ccb410dc00a6fb243934dad2e8681a9d5d9529e)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10652](https://redirect.github.com/biomejs/biome/issues/10652).
Biome plugins are now properly filtered when using `--only` and `--skip`
flags.
- [#​10669](https://redirect.github.com/biomejs/biome/pull/10669)
[`aa0a6eb`](https://redirect.github.com/biomejs/biome/commit/aa0a6eb8007493961cd578f04201248c15fd809a)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10651](https://redirect.github.com/biomejs/biome/issues/10651):
[useInlineScriptId](https://biomejs.dev/linter/rules/use-inline-script-id/)
now correctly trims trivia to detect if an id attribute has been set.
- [#​10689](https://redirect.github.com/biomejs/biome/pull/10689)
[`844b1be`](https://redirect.github.com/biomejs/biome/commit/844b1be60ded28bf4c650d85806919ceb57bc402)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10658](https://redirect.github.com/biomejs/biome/issues/10658).
The issue was caused by the "Go-to definition" editor feature, which was
enabled by default. The feature is now **disabled by default**. To work,
the feature triggers the scanner to build the module graph. This caused
memory leak issues in cases where Biome starts in the home directory to
modify files.
If you relied on this new feature, you must now turn on using the
\[editor settings] of the extension e.g.
[Zed](https://biomejs.dev/reference/zed/#goto_definition) and
[VSCode](https://biomejs.dev/reference/vscode/#biomegotodefinition).
- [#​10695](https://redirect.github.com/biomejs/biome/pull/10695)
[`043fbb5`](https://redirect.github.com/biomejs/biome/commit/043fbb514f1b96c5b723cd86c8db4b9bc9f03631)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10674](https://redirect.github.com/biomejs/biome/issues/10674).
Biome now throws an error when the field `level` is missing from a rule
option.
- [#​10712](https://redirect.github.com/biomejs/biome/pull/10712)
[`5941df2`](https://redirect.github.com/biomejs/biome/commit/5941df2a0d6904e487e73d4dc7231dcaf7b3a2f0)
Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! -
Improved the diagnostic and the documentation of
[`useFlatMap`](https://biomejs.dev/linter/rules/use-flat-map/).
- [#​10615](https://redirect.github.com/biomejs/biome/pull/10615)
[`23814f1`](https://redirect.github.com/biomejs/biome/commit/23814f1ad8430df906a39323ee31d27d7b9ca17b)
Thanks [@​qwertycxz](https://redirect.github.com/qwertycxz)! -
Improved the DX the JSON schema when it's used by certain code editors
like VSCode.
- [#​10688](https://redirect.github.com/biomejs/biome/pull/10688)
[`ec69489`](https://redirect.github.com/biomejs/biome/commit/ec694896a0c75176aca040392e3309df1b2e963d)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed a bug where the Biome Daemon did not correctly shut down when the
editor was closed during an in-progress operation, especially while
scanning.
- [#​10701](https://redirect.github.com/biomejs/biome/pull/10701)
[`6c2e0d7`](https://redirect.github.com/biomejs/biome/commit/6c2e0d7bba1cbc457a42adf6c982a773bc7e4605)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10694](https://redirect.github.com/biomejs/biome/issues/10694).
The Biome Language Server no longer prints an error when the user hovers
a variable imported from node\_modules.
- [#​10681](https://redirect.github.com/biomejs/biome/pull/10681)
[`888515b`](https://redirect.github.com/biomejs/biome/commit/888515b088cde688a95680362a619221c023f9d0)
Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! - Fixed
[`useExportType`](https://biomejs.dev/linter/rules/use-export-type/)
that reported useless details in some diagnostics.
- [#​10220](https://redirect.github.com/biomejs/biome/pull/10220)
[`3694a13`](https://redirect.github.com/biomejs/biome/commit/3694a135a9976915889988c36d9eb40d679f06e6)
Thanks [@​theBGuy](https://redirect.github.com/theBGuy)! - Fixed
[`useAnchorContent`](https://biomejs.dev/linter/rules/use-anchor-content/)
false positive for `<a>` elements used as render prop values (e.g.
`render={<a href="..." />}`), a pattern where the receiving component
renders its children inside the anchor element.
- [#​10702](https://redirect.github.com/biomejs/biome/pull/10702)
[`98823fb`](https://redirect.github.com/biomejs/biome/commit/98823fb2e70095b09e1ca4bb9733850bbe8ff33f)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10612](https://redirect.github.com/biomejs/biome/issues/10612).
The Biome parser now correctly parses processing instructions. The
following SVG doesn't throw errors anymore:
```svg
<?xml version="1.0" encoding="UTF-8" ?>
<svg></svg>
```
###
[`v2.5.0`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#250)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.4.16...@biomejs/biome@2.5.0)
##### Minor Changes
- [#​9539](https://redirect.github.com/biomejs/biome/pull/9539)
[`f0615fd`](https://redirect.github.com/biomejs/biome/commit/f0615fdae80fa7257fc1d0448d2027cb1acff46e)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Added a new reporter called `concise`. When `--reporter=concise` is
passed the commands `format`, `lint`, `check` and `ci`, the diagnostics
are printed in a compact manner:
```
! index.ts:2:10: lint/correctness/noUnusedImports: Several of these
imports are unused.
! main.ts:9:7: lint/correctness/noUnusedVariables: This variable f is
unused.
Γ
> β **Note**
>
> PR body was truncated to here.
</details>
---
### Configuration
π
**Schedule**: (in timezone America/New_York)
- Branch creation
- "before 6am on monday"
- Automerge
- At any time (no schedule defined)
π¦ **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
β» **Rebasing**: Whenever PR is behind base branch, 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/CodesWhat/drydock).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNTkuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI3NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: scttbnsn <80784472+scttbnsn@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/) | |---|---|---|---| | [@fontsource/comic-mono](https://fontsource.org/fonts/comic-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/other/comic-mono)) | [`5.2.5` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fcomic-mono/5.2.5/5.3.0) |  |  | | [@fontsource/commit-mono](https://fontsource.org/fonts/commit-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/other/commit-mono)) | [`5.2.5` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fcommit-mono/5.2.5/5.3.0) |  |  | | [@fontsource/ibm-plex-mono](https://fontsource.org/fonts/ibm-plex-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/ibm-plex-mono)) | [`5.2.7` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fibm-plex-mono/5.2.7/5.3.0) |  |  | | [@fontsource/inconsolata](https://fontsource.org/fonts/inconsolata) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/inconsolata)) | [`5.2.8` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2finconsolata/5.2.8/5.3.0) |  |  | | [@fontsource/jetbrains-mono](https://fontsource.org/fonts/jetbrains-mono) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/jetbrains-mono)) | [`5.2.8` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fjetbrains-mono/5.2.8/5.3.0) |  |  | | [@fontsource/source-code-pro](https://fontsource.org/fonts/source-code-pro) ([source](https://redirect.github.com/fontsource/font-files/tree/HEAD/fonts/google/source-code-pro)) | [`5.2.7` β `5.3.0`](https://renovatebot.com/diffs/npm/@fontsource%2fsource-code-pro/5.2.7/5.3.0) |  |  | | [@iconify-json/lucide](https://icon-sets.iconify.design/lucide/) | [`1.2.116` β `1.2.118`](https://renovatebot.com/diffs/npm/@iconify-json%2flucide/1.2.116/1.2.118) |  |  | | [@iconify-json/tabler](https://icon-sets.iconify.design/tabler/) | [`1.2.35` β `1.2.37`](https://renovatebot.com/diffs/npm/@iconify-json%2ftabler/1.2.35/1.2.37) |  |  | | [@tailwindcss/vite](https://tailwindcss.com) ([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite)) | [`4.3.2` β `4.3.3`](https://renovatebot.com/diffs/npm/@tailwindcss%2fvite/4.3.2/4.3.3) |  |  | | [@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`25.9.4` β `25.9.5`](https://renovatebot.com/diffs/npm/@types%2fnode/25.9.4/25.9.5) |  |  | | [@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.7` β `6.0.8`](https://renovatebot.com/diffs/npm/@vitejs%2fplugin-vue/6.0.7/6.0.8) |  |  | | [msw](https://mswjs.io) ([source](https://redirect.github.com/mswjs/msw)) | [`2.14.6` β `2.15.0`](https://renovatebot.com/diffs/npm/msw/2.14.6/2.15.0) |  |  | | [postcss](https://postcss.org/) ([source](https://redirect.github.com/postcss/postcss)) | [`8.5.16` β `8.5.21`](https://renovatebot.com/diffs/npm/postcss/8.5.16/8.5.21) |  |  | | [tailwindcss](https://tailwindcss.com) ([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss)) | [`4.3.2` β `4.3.3`](https://renovatebot.com/diffs/npm/tailwindcss/4.3.2/4.3.3) |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.9` β `4.1.10`](https://renovatebot.com/diffs/npm/vitest/4.1.9/4.1.10) |  |  | | [vue](https://vuejs.org/) ([source](https://redirect.github.com/vuejs/core)) | [`3.5.39` β `3.5.40`](https://renovatebot.com/diffs/npm/vue/3.5.39/3.5.40) |  |  | | [vue-router](https://router.vuejs.org) ([source](https://redirect.github.com/vuejs/router)) | [`5.1.0` β `5.2.0`](https://renovatebot.com/diffs/npm/vue-router/5.1.0/5.2.0) |  |  | --- ### Release Notes <details> <summary>fontsource/font-files (@​fontsource/comic-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/commit-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/90f4206a30838317875479a13ee5046613af42f7...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/ibm-plex-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/inconsolata)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/jetbrains-mono)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/40ecb0c337fd649924783a87783dc2e6639bb6f2...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>fontsource/font-files (@​fontsource/source-code-pro)</summary> ### [`v5.3.0`](https://redirect.github.com/fontsource/font-files/compare/9c74cedc2a2c1989d2faf595c62c23f617144a30...02b28c06b126c852a5b966b44aef777ca923f6f6) [Compare Source](https://redirect.github.com/fontsource/font-files/compare/9c74cedc2a2c1989d2faf595c62c23f617144a30...02b28c06b126c852a5b966b44aef777ca923f6f6) </details> <details> <summary>tailwindlabs/tailwindcss (@​tailwindcss/vite)</summary> ### [`v4.3.3`](https://redirect.github.com/tailwindlabs/tailwindcss/blob/HEAD/CHANGELOG.md#433---2026-07-16) [Compare Source](https://redirect.github.com/tailwindlabs/tailwindcss/compare/v4.3.2...v4.3.3) ##### Fixed - Support `--watch --poll[=ms]` in `@tailwindcss/cli` when filesystem events are unreliable or unavailable ([#​20297](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20297)) - Canonicalization: match arbitrary hex colors against theme colors case-insensitively (e.g. `bg-[#fff]` and `bg-[#FFF]` β `bg-white`) ([#​20298](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20298)) - Prevent Preflight from overriding Firefox's native `iframe:focus-visible` outline styles ([#​20292](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20292)) - Ensure `theme('colors.foo')` in JS plugins resolves correctly when both `--color-foo` and `--color-foo-bar` exist ([#​20299](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20299)) - Ensure fractional opacity modifiers work with named shadow sizes like `shadow-sm/12.5`, `text-shadow-sm/12.5`, `drop-shadow-sm/12.5`, and `inset-shadow-sm/12.5` ([#​20302](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20302)) - Parse selectors like `[data-foo]div` as two selectors instead of one ([#​20303](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20303)) - Ensure `@tailwindcss/postcss` rebuilds when a preprocessor like Sass changes the input CSS without changing the input file on disk ([#​20310](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20310)) - Ensure CSS nesting is handled even when Lightning CSS isn't run, such as in `@tailwindcss/browser` and Tailwind Play ([#​20124](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20124)) - Prevent achromatic theme colors from shifting hue when mixed in polar color spaces like `oklch` ([#​20314](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20314)) - Ensure `--spacing(0)` is optimized to `0px` instead of `0` so it remains a `<length>` when used in `calc(β¦)` ([#​20319](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20319)) - Load `@parcel/watcher` only when needed in `@tailwindcss/cli --watch` mode, so one-off builds and `--watch --poll` work when `@parcel/watcher` can't be loaded ([#​20325](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20325)) - Use explicit platform fonts instead of `system-ui` and `ui-sans-serif` so CJK text respects the page's `lang` attribute on Windows ([#​20318](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20318)) - Prevent `@tailwindcss/upgrade` from rewriting ignored files when run from a subdirectory ([#​20329](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20329)) - Ensure earlier `@source` rules pointing to nested files are scanned when later `@source` rules point to files in parent folders ([#​20335](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20335)) - Prevent `@tailwindcss/vite` from triggering full page reloads when scanned files are processed by Vite but haven't been loaded as modules yet ([#​20336](https://redirect.github.com/tailwindlabs/tailwindcss/pull/20336)) </details> <details> <summary>vitejs/vite-plugin-vue (@​vitejs/plugin-vue)</summary> ### [`v6.0.8`](https://redirect.github.com/vitejs/vite-plugin-vue/blob/HEAD/packages/plugin-vue/CHANGELOG.md#small-608-2026-07-14-small) ##### Features - **plugin-vue:** add forced vapor mode option ([#​766](https://redirect.github.com/vitejs/vite-plugin-vue/issues/766)) ([d59c3c0](https://redirect.github.com/vitejs/vite-plugin-vue/commit/d59c3c04b0c5cd920bab5f0f6000bedfef901e1c)) ##### Bug Fixes - **deps:** update all non-major dependencies ([#​781](https://redirect.github.com/vitejs/vite-plugin-vue/issues/781)) ([d369e5a](https://redirect.github.com/vitejs/vite-plugin-vue/commit/d369e5a57592ed525c4da5ef0458cb89a6977ad2)) </details> <details> <summary>mswjs/msw (msw)</summary> ### [`v2.15.0`](https://redirect.github.com/mswjs/msw/releases/tag/v2.15.0) [Compare Source](https://redirect.github.com/mswjs/msw/compare/v2.14.7...v2.15.0) #### v2.15.0 (2026-07-08) ##### Features - **sse:** invoke `finalize` on response stream end ([#​2741](https://redirect.github.com/mswjs/msw/issues/2741)) ([`7fae0cc`](https://redirect.github.com/mswjs/msw/commit/7fae0cc0954b20c739ae8e95a24eefc8a78710e8)) [@​kettanaito](https://redirect.github.com/kettanaito) ### [`v2.14.7`](https://redirect.github.com/mswjs/msw/releases/tag/v2.14.7) [Compare Source](https://redirect.github.com/mswjs/msw/compare/v2.14.6...v2.14.7) #### v2.14.7 (2026-07-07) ##### Bug Fixes - **sse:** proper logging for concurrent requests ([#​2762](https://redirect.github.com/mswjs/msw/issues/2762)) ([`5c0ae1c`](https://redirect.github.com/mswjs/msw/commit/5c0ae1c334a0cbe52638bd2949540372be3d46ba)) [@​kettanaito](https://redirect.github.com/kettanaito) </details> <details> <summary>postcss/postcss (postcss)</summary> ### [`v8.5.21`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8521) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.20...8.5.21) - Fixed childless at-rule losing semicolon before comment (by [@​sarathfrancis90](https://redirect.github.com/sarathfrancis90)). - Fixed docs (by [@​isker](https://redirect.github.com/isker)). ### [`v8.5.20`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8520) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.19...8.5.20) - Fixed missing space if `AtRule#params` is set after (by [@​sarathfrancis90](https://redirect.github.com/sarathfrancis90)). - Fixed mixing AST error on warnings (by [@​MahinAnowar](https://redirect.github.com/MahinAnowar)). ### [`v8.5.19`](https://redirect.github.com/postcss/postcss/releases/tag/8.5.19) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.18...8.5.19) - Fixed cleaning `before` for new nodes inserted to `Root` (by [@​MahinAnowar](https://redirect.github.com/MahinAnowar)). ### [`v8.5.18`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8518) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.17...8.5.18) - Restricted loading previous source maps file to the `opts.from` folder for security reasons (use `unsafeMap: true` to disable the check). ### [`v8.5.17`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8517) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.16...8.5.17) - Fixed `Maximum call stack size exceeded` error. - Fixed Prototype hijacking for `postcss.fromJSON()`. - Fixed `Input#origin()` for unmapped end position (by [@​chatman-media](https://redirect.github.com/chatman-media)). </details> <details> <summary>vitest-dev/vitest (vitest)</summary> ### [`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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (claude-opus-4-8)** in [#​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 [@​SveLil](https://redirect.github.com/SveLil) and [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​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) </details> <details> <summary>vuejs/core (vue)</summary> ### [`v3.5.40`](https://redirect.github.com/vuejs/core/blob/HEAD/CHANGELOG.md#3540-2026-07-16) [Compare Source](https://redirect.github.com/vuejs/core/compare/v3.5.39...v3.5.40) ##### Bug Fixes - **compiler-core:** avoid leaking slot branch keys ([#​15051](https://redirect.github.com/vuejs/core/issues/15051)) ([20c9d26](https://redirect.github.com/vuejs/core/commit/20c9d263d3bfafdfbcc1921f259fd8f711e18659)), closes [#​15048](https://redirect.github.com/vuejs/core/issues/15048) - **hydration:** pass namespace when patching dynamic props ([#​15082](https://redirect.github.com/vuejs/core/issues/15082)) ([e0d2723](https://redirect.github.com/vuejs/core/commit/e0d27234ddd2061383cb5dcc475d6b9558ed8e4f)), closes [#​15081](https://redirect.github.com/vuejs/core/issues/15081) [#​15050](https://redirect.github.com/vuejs/core/issues/15050) - **reactivity:** handle effect removal during scope stop ([#​15084](https://redirect.github.com/vuejs/core/issues/15084)) ([378f978](https://redirect.github.com/vuejs/core/commit/378f9783248a4a4f20781d665d4f7089f39cae6e)), closes [#​15083](https://redirect.github.com/vuejs/core/issues/15083) - **runtime-core:** skip lazy hydration for detached roots ([#​15092](https://redirect.github.com/vuejs/core/issues/15092)) ([97f3525](https://redirect.github.com/vuejs/core/commit/97f3525551ad06103083eb2cbf9858c5e57cd58e)), closes [#​15091](https://redirect.github.com/vuejs/core/issues/15091) - **runtime-core:** unwind dangling blocks when slot content throws ([#​15071](https://redirect.github.com/vuejs/core/issues/15071)) ([ddc132d](https://redirect.github.com/vuejs/core/commit/ddc132d7c054ecd2029ddcc95bcba770cd44f022)), closes [#​15070](https://redirect.github.com/vuejs/core/issues/15070) - **runtime-dom:** respect current select model type ([#​15010](https://redirect.github.com/vuejs/core/issues/15010)) ([eb89e93](https://redirect.github.com/vuejs/core/commit/eb89e935a771ab7fc3f8e67a82bc8fc7ea28bdaa)), closes [#​15009](https://redirect.github.com/vuejs/core/issues/15009) - **server-renderer:** handle errors in optimized component renders ([#​12601](https://redirect.github.com/vuejs/core/issues/12601)) ([474907c](https://redirect.github.com/vuejs/core/commit/474907c0f01d021c564545137051a2b56eb4a769)), closes [#​12575](https://redirect.github.com/vuejs/core/issues/12575) - **server-renderer:** remove package dependency cycle ([#​15063](https://redirect.github.com/vuejs/core/issues/15063)) ([4d35eca](https://redirect.github.com/vuejs/core/commit/4d35ecadb6f625b0f7407ccee0e357c2dd8084c7)) - **shared:** prevent SSR comment escaping from creating closing delimiters ([#​15045](https://redirect.github.com/vuejs/core/issues/15045)) ([bd962bb](https://redirect.github.com/vuejs/core/commit/bd962bbaca746d8f65775a07723420406ebad0da)) - **types:** don't constrain component $el type to Element ([#​15040](https://redirect.github.com/vuejs/core/issues/15040)) ([164460a](https://redirect.github.com/vuejs/core/commit/164460a52988c44dc34a541219c88120078372a0)) </details> <details> <summary>vuejs/router (vue-router)</summary> ### [`v5.2.0`](https://redirect.github.com/vuejs/router/releases/tag/v5.2.0) [Compare Source](https://redirect.github.com/vuejs/router/compare/v5.1.0...v5.2.0) ##### Β Β Β π Features - Add helpful diagnostics Β -Β by [@​posva](https://redirect.github.com/posva) in [#​2737](https://redirect.github.com/vuejs/router/issues/2737) [<samp>(628fe)</samp>](https://redirect.github.com/vuejs/router/commit/628fe18a) ##### Β Β Β π Bug Fixes - Allow pinia 4 Β -Β by [@​posva](https://redirect.github.com/posva) [<samp>(16535)</samp>](https://redirect.github.com/vuejs/router/commit/16535337) - **scroll**: Ignore stale async scrollBehavior results Β -Β by [@​baozjj](https://redirect.github.com/baozjj) and [@​cursoragent](https://redirect.github.com/cursoragent) in [#​2730](https://redirect.github.com/vuejs/router/issues/2730) [<samp>(303df)</samp>](https://redirect.github.com/vuejs/router/commit/303dfe19) - **unplugin**: Reject invalid hex digits in \[x+hh] character codes Β -Β by [@​greymoth-jp](https://redirect.github.com/greymoth-jp) in [#​2744](https://redirect.github.com/vuejs/router/issues/2744) [<samp>(4d967)</samp>](https://redirect.github.com/vuejs/router/commit/4d967411) ##### Β Β Β Β [View changes on GitHub](https://redirect.github.com/vuejs/router/compare/v5.1.0...v5.2.0) </details> --- ### Configuration π **Schedule**: (in timezone America/New_York) - Branch creation - "before 6am on monday" - Automerge - At any time (no schedule defined) π¦ **Automerge**: Disabled by config. Please merge this manually once you are satisfied. β» **Rebasing**: Whenever PR is behind base branch, 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/CodesWhat/drydock). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDIuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI3NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
> βΉοΈ **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/) | |---|---|---|---| | [@aws-sdk/client-ecr](https://redirect.github.com/aws/aws-sdk-js-v3/tree/main/clients/client-ecr) ([source](https://redirect.github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-ecr)) | [`3.1079.0` β `3.1091.0`](https://renovatebot.com/diffs/npm/@aws-sdk%2fclient-ecr/3.1079.0/3.1091.0) |  |  | | [@slack/web-api](https://docs.slack.dev/tools/node-slack-sdk/web-api/) ([source](https://redirect.github.com/slackapi/node-slack-sdk)) | [`7.18.0` β `7.19.0`](https://renovatebot.com/diffs/npm/@slack%2fweb-api/7.18.0/7.19.0) |  |  | | [@smithy/node-http-handler](https://redirect.github.com/smithy-lang/smithy-typescript/tree/main/packages/node-http-handler) ([source](https://redirect.github.com/smithy-lang/smithy-typescript/tree/HEAD/packages/node-http-handler)) | [`4.9.3` β `4.9.8`](https://renovatebot.com/diffs/npm/@smithy%2fnode-http-handler/4.9.3/4.9.8) |  |  | | [@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`25.9.4` β `25.9.5`](https://renovatebot.com/diffs/npm/@types%2fnode/25.9.4/25.9.5) |  |  | | [@vitest/coverage-v8](https://vitest.dev/guide/coverage) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8)) | [`4.1.9` β `4.1.10`](https://renovatebot.com/diffs/npm/@vitest%2fcoverage-v8/4.1.9/4.1.10) |  |  | | [cron-parser](https://redirect.github.com/harrisiirak/cron-parser) | [`5.6.1` β `5.6.2`](https://renovatebot.com/diffs/npm/cron-parser/5.6.1/5.6.2) |  |  | | [express-rate-limit](https://redirect.github.com/express-rate-limit/express-rate-limit) | [`8.5.2` β `8.6.0`](https://renovatebot.com/diffs/npm/express-rate-limit/8.5.2/8.6.0) |  |  | | [fast-check](https://fast-check.dev/) ([source](https://redirect.github.com/dubzzz/fast-check/tree/HEAD/packages/fast-check)) | [`4.8.0` β `4.9.0`](https://renovatebot.com/diffs/npm/fast-check/4.8.0/4.9.0) |  |  | | [helmet](https://helmet.js.org/) ([source](https://redirect.github.com/helmetjs/helmet)) | [`8.2.0` β `8.3.0`](https://renovatebot.com/diffs/npm/helmet/8.2.0/8.3.0) |  |  | | [knip](https://knip.dev) ([source](https://redirect.github.com/webpro-nl/knip/tree/HEAD/packages/knip)) | [`6.24.0` β `6.27.0`](https://renovatebot.com/diffs/npm/knip/6.24.0/6.27.0) |  |  | | [mqtt](https://redirect.github.com/mqttjs/MQTT.js) | [`5.15.1` β `5.15.2`](https://renovatebot.com/diffs/npm/mqtt/5.15.1/5.15.2) |  |  | | [node-cron](https://nodecron.com) ([source](https://redirect.github.com/node-cron/node-cron)) | [`4.5.0` β `4.6.0`](https://renovatebot.com/diffs/npm/node-cron/4.5.0/4.6.0) |  |  | | [p-limit](https://redirect.github.com/sindresorhus/p-limit) | [`7.3.0` β `7.3.1`](https://renovatebot.com/diffs/npm/p-limit/7.3.0/7.3.1) |  |  | | [postcss](https://postcss.org/) ([source](https://redirect.github.com/postcss/postcss)) | [`8.5.16` β `8.5.21`](https://renovatebot.com/diffs/npm/postcss/8.5.16/8.5.21) |  |  | | [re2js](https://redirect.github.com/le0pard/re2js) | [`2.8.5` β `2.8.6`](https://renovatebot.com/diffs/npm/re2js/2.8.5/2.8.6) |  |  | | [undici](https://undici.nodejs.org) ([source](https://redirect.github.com/nodejs/undici)) | [`8.6.0` β `8.8.0`](https://renovatebot.com/diffs/npm/undici/8.6.0/8.8.0) |  |  | | [vite](https://vite.dev) ([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`8.1.3` β `8.1.5`](https://renovatebot.com/diffs/npm/vite/8.1.3/8.1.5) |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.9` β `4.1.10`](https://renovatebot.com/diffs/npm/vitest/4.1.9/4.1.10) |  |  | | [ws](https://redirect.github.com/websockets/ws) | [`8.21.0` β `8.21.1`](https://renovatebot.com/diffs/npm/ws/8.21.0/8.21.1) |  |  | --- ### Release Notes <details> <summary>aws/aws-sdk-js-v3 (@​aws-sdk/client-ecr)</summary> ### [`v3.1091.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310910-2026-07-20) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1090.0...v3.1091.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1090.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310900-2026-07-17) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1089.0...v3.1090.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1089.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310890-2026-07-16) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1088.0...v3.1089.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1088.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310880-2026-07-15) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1087.0...v3.1088.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1087.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310870-2026-07-14) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1086.0...v3.1087.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1086.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310860-2026-07-13) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1085.0...v3.1086.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1085.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310850-2026-07-10) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1084.0...v3.1085.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1084.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310840-2026-07-09) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1083.0...v3.1084.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1083.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310830-2026-07-08) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1082.0...v3.1083.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1082.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310820-2026-07-08) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1081.0...v3.1082.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1081.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310810-2026-07-07) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1080.0...v3.1081.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) ### [`v3.1080.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-ecr/CHANGELOG.md#310800-2026-07-06) [Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.1079.0...v3.1080.0) **Note:** Version bump only for package [@​aws-sdk/client-ecr](https://redirect.github.com/aws-sdk/client-ecr) </details> <details> <summary>slackapi/node-slack-sdk (@​slack/web-api)</summary> ### [`v7.19.0`](https://redirect.github.com/slackapi/node-slack-sdk/releases/tag/%40slack/web-api%407.19.0) [Compare Source](https://redirect.github.com/slackapi/node-slack-sdk/compare/@slack/web-api@7.18.0...@slack/web-api@7.19.0) ##### Minor Changes - [`a795b86`](https://redirect.github.com/slackapi/node-slack-sdk/commit/a795b86): feat: expand app manifest types β add `agent_view` and `assistant_view` features, recent agent events (`app_context_changed`, `assistant_thread_started`, `assistant_thread_context_changed`), optional OAuth scopes (`bot_optional`/`user_optional`), and event `metadata_subscriptions` </details> <details> <summary>smithy-lang/smithy-typescript (@​smithy/node-http-handler)</summary> ### [`v4.9.8`](https://redirect.github.com/smithy-lang/smithy-typescript/blob/HEAD/packages/node-http-handler/CHANGELOG.md#498) [Compare Source](https://redirect.github.com/smithy-lang/smithy-typescript/compare/@smithy/node-http-handler@4.9.7...@smithy/node-http-handler@4.9.8) ##### Patch Changes - Updated dependencies \[[`3248fbd`](https://redirect.github.com/smithy-lang/smithy-typescript/commit/3248fbd)] - [@​smithy/core](https://redirect.github.com/smithy/core)@​3.29.6 ### [`v4.9.7`](https://redirect.github.com/smithy-lang/smithy-typescript/blob/HEAD/packages/node-http-handler/CHANGELOG.md#497) [Compare Source](https://redirect.github.com/smithy-lang/smithy-typescript/compare/@smithy/node-http-handler@4.9.6...@smithy/node-http-handler@4.9.7) ##### Patch Changes - Updated dependencies \[[`b44cb0a`](https://redirect.github.com/smithy-lang/smithy-typescript/commit/b44cb0a)] - [@​smithy/core](https://redirect.github.com/smithy/core)@​3.29.5 ### [`v4.9.6`](https://redirect.github.com/smithy-lang/smithy-typescript/blob/HEAD/packages/node-http-handler/CHANGELOG.md#496) [Compare Source](https://redirect.github.com/smithy-lang/smithy-typescript/compare/@smithy/node-http-handler@4.9.5...@smithy/node-http-handler@4.9.6) ##### Patch Changes - Updated dependencies \[[`5fca3a0`](https://redirect.github.com/smithy-lang/smithy-typescript/commit/5fca3a0)] - [@​smithy/core](https://redirect.github.com/smithy/core)@​3.29.4 ### [`v4.9.5`](https://redirect.github.com/smithy-lang/smithy-typescript/blob/HEAD/packages/node-http-handler/CHANGELOG.md#495) [Compare Source](https://redirect.github.com/smithy-lang/smithy-typescript/compare/@smithy/node-http-handler@4.9.4...@smithy/node-http-handler@4.9.5) ##### Patch Changes - Updated dependencies \[[`a97abc3`](https://redirect.github.com/smithy-lang/smithy-typescript/commit/a97abc3)] - [@​smithy/types](https://redirect.github.com/smithy/types)@​4.16.1 - [@​smithy/core](https://redirect.github.com/smithy/core)@​3.29.3 ### [`v4.9.4`](https://redirect.github.com/smithy-lang/smithy-typescript/blob/HEAD/packages/node-http-handler/CHANGELOG.md#494) [Compare Source](https://redirect.github.com/smithy-lang/smithy-typescript/compare/@smithy/node-http-handler@4.9.3...@smithy/node-http-handler@4.9.4) ##### Patch Changes - [`273e480`](https://redirect.github.com/smithy-lang/smithy-typescript/commit/273e480): types updates for isolatedModules=true - Updated dependencies \[[`273e480`](https://redirect.github.com/smithy-lang/smithy-typescript/commit/273e480)] - Updated dependencies \[[`74b3d45`](https://redirect.github.com/smithy-lang/smithy-typescript/commit/74b3d45)] - [@​smithy/types](https://redirect.github.com/smithy/types)@​4.16.0 - [@​smithy/core](https://redirect.github.com/smithy/core)@​3.29.2 </details> <details> <summary>vitest-dev/vitest (@​vitest/coverage-v8)</summary> ### [`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 [@​hi-ogawa](https://redirect.github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (claude-opus-4-8)** in [#​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 [@​SveLil](https://redirect.github.com/SveLil) and [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​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) </details> <details> <summary>harrisiirak/cron-parser (cron-parser)</summary> ### [`v5.6.2`](https://redirect.github.com/harrisiirak/cron-parser/releases/tag/v5.6.2) [Compare Source](https://redirect.github.com/harrisiirak/cron-parser/compare/v5.6.1...v5.6.2) #### What's Changed - fix: enforce iteration loop limit so unsatisfiable expressions throw instead of returning a bogus date by [@​spokodev](https://redirect.github.com/spokodev) in [#​415](https://redirect.github.com/harrisiirak/cron-parser/pull/415) - fix: do not drop a matching day of month when the day of week uses an nth (#) occurrence by [@​spokodev](https://redirect.github.com/spokodev) in [#​414](https://redirect.github.com/harrisiirak/cron-parser/pull/414) **Full Changelog**: <https://github.com/harrisiirak/cron-parser/compare/v5.6.1...v5.6.2> </details> <details> <summary>express-rate-limit/express-rate-limit (express-rate-limit)</summary> ### [`v8.6.0`](https://redirect.github.com/express-rate-limit/express-rate-limit/releases/tag/v8.6.0) [Compare Source](https://redirect.github.com/express-rate-limit/express-rate-limit/compare/v8.5.2...v8.6.0) You can view the changelog [here](https://express-rate-limit.mintlify.app/reference/changelog). </details> <details> <summary>dubzzz/fast-check (fast-check)</summary> ### [`v4.9.0`](https://redirect.github.com/dubzzz/fast-check/blob/HEAD/packages/fast-check/CHANGELOG.md#490) [Compare Source](https://redirect.github.com/dubzzz/fast-check/compare/v4.8.0...v4.9.0) *Shrinkable `entityGraph` and few performance chips* \[[Code](https://redirect.github.com/dubzzz/fast-check/tree/v4.9.0)]\[[Diff](https://redirect.github.com/dubzzz/fast-check/compare/v4.8.0...v4.9.0)] #### Features - ([PR#7008](https://redirect.github.com/dubzzz/fast-check/pull/7008)) Towards shrinkable `entityGraph` thanks to `chainUntil` #### Fixes - ([PR#7010](https://redirect.github.com/dubzzz/fast-check/pull/7010)) Bug: Fix latent state-sharing bug in entityGraph - ([PR#7063](https://redirect.github.com/dubzzz/fast-check/pull/7063)) Bug: Equiprobable alternatives in `stringMatching` - ([PR#6973](https://redirect.github.com/dubzzz/fast-check/pull/6973)) CI: Drop caches on push for build package flow - ([PR#6971](https://redirect.github.com/dubzzz/fast-check/pull/6971)) CI: Only mark fast-check's releases as latest - ([PR#6974](https://redirect.github.com/dubzzz/fast-check/pull/6974)) CI: Drop pull\_request\_target flows - ([PR#6975](https://redirect.github.com/dubzzz/fast-check/pull/6975)) CI: Drop discussion creation on release publish - ([PR#6976](https://redirect.github.com/dubzzz/fast-check/pull/6976)) CI: Drop caches from publication steps - ([PR#6977](https://redirect.github.com/dubzzz/fast-check/pull/6977)) CI: Revert "Drop caches from publication steps" - ([PR#6978](https://redirect.github.com/dubzzz/fast-check/pull/6978)) CI: Make zizmor audit a required status check - ([PR#6991](https://redirect.github.com/dubzzz/fast-check/pull/6991)) CI: Remove Claude Code workflow - ([PR#6994](https://redirect.github.com/dubzzz/fast-check/pull/6994)) CI: Replace `pnpm dlx` with `pnpm exec` for `pkg-pr-new` - ([PR#6995](https://redirect.github.com/dubzzz/fast-check/pull/6995)) CI: Inline zizmor ignores in workflow - ([PR#6996](https://redirect.github.com/dubzzz/fast-check/pull/6996)) CI: Move to `devEngines.packageManager` - ([PR#7005](https://redirect.github.com/dubzzz/fast-check/pull/7005)) CI: Update PULL\_REQUEST\_TEMPLATE.md - ([PR#7011](https://redirect.github.com/dubzzz/fast-check/pull/7011)) CI: Drop OTP prompt from npm publish - ([PR#7013](https://redirect.github.com/dubzzz/fast-check/pull/7013)) CI: Switch release jobs to npm stage publish - ([PR#7027](https://redirect.github.com/dubzzz/fast-check/pull/7027)) CI: Run benchmarks against `main` - ([PR#7037](https://redirect.github.com/dubzzz/fast-check/pull/7037)) CI: Use comparison mode for `bench` - ([PR#7069](https://redirect.github.com/dubzzz/fast-check/pull/7069)) CI: Run pnpm dedupe to deduplicate lockfile - ([PR#6959](https://redirect.github.com/dubzzz/fast-check/pull/6959)) CI: Announce releases on Bluesky - ([PR#7105](https://redirect.github.com/dubzzz/fast-check/pull/7105)) CI: Switch to actions/attest for attestations - ([PR#7117](https://redirect.github.com/dubzzz/fast-check/pull/7117)) CI: Use pnpm version in changelog script - ([PR#7120](https://redirect.github.com/dubzzz/fast-check/pull/7120)) CI: Allow unclean tree in changelog generation - ([PR#7125](https://redirect.github.com/dubzzz/fast-check/pull/7125)) CI: Stage publish using `pnpm` in publish jobs - ([PR#7065](https://redirect.github.com/dubzzz/fast-check/pull/7065)) Clean: Delete skills directory - ([PR#6983](https://redirect.github.com/dubzzz/fast-check/pull/6983)) Doc: Tweak PR Template to hint AI agents into revealing themselves - ([PR#7092](https://redirect.github.com/dubzzz/fast-check/pull/7092)) Doc: Add back skills directory - ([PR#7095](https://redirect.github.com/dubzzz/fast-check/pull/7095)) Doc: Add release notes for fast-check 4.8.0 - ([PR#7104](https://redirect.github.com/dubzzz/fast-check/pull/7104)) Doc: Add makeeno as doc contributor - ([PR#7103](https://redirect.github.com/dubzzz/fast-check/pull/7103)) Doc: Fix info box in docs - ([PR#7108](https://redirect.github.com/dubzzz/fast-check/pull/7108)) Doc: Add jneidel as doc contributor - ([PR#7035](https://redirect.github.com/dubzzz/fast-check/pull/7035)) Performance: Faster `fc.integer` on `generate` - ([PR#7046](https://redirect.github.com/dubzzz/fast-check/pull/7046)) Performance: Faster fc.record on generate - ([PR#7047](https://redirect.github.com/dubzzz/fast-check/pull/7047)) Performance: Faster fc.dictionary on generate - ([PR#7048](https://redirect.github.com/dubzzz/fast-check/pull/7048)) Performance: Faster `fc.webPath`/`fc.webUrl` on `generate` - ([PR#7050](https://redirect.github.com/dubzzz/fast-check/pull/7050)) Performance: Faster `fc.stringMatching` for `\W` `\D` `\S` `.` - ([PR#7054](https://redirect.github.com/dubzzz/fast-check/pull/7054)) Performance: Faster `fc.stringMatching` on `generate` - ([PR#7049](https://redirect.github.com/dubzzz/fast-check/pull/7049)) Performance: Drop nested `tuple` on `generate` for `fc.record` - ([PR#7045](https://redirect.github.com/dubzzz/fast-check/pull/7045)) Performance: Faster `fc.entityGraph` on `generate` - ([PR#7071](https://redirect.github.com/dubzzz/fast-check/pull/7071)) Performance: Early exit on empty tuple in `fc.entityGraph` - ([PR#7004](https://redirect.github.com/dubzzz/fast-check/pull/7004)) Refactor: Extract code from `onTheFlyLinksForEntityGraph` - ([PR#7006](https://redirect.github.com/dubzzz/fast-check/pull/7006)) Refactor: Move `generate` logic to the `Arbitrary` for `entityGraph` - ([PR#7007](https://redirect.github.com/dubzzz/fast-check/pull/7007)) Refactor: Introduce `ProductionState` for `onTheFlyLinks...` - ([PR#6990](https://redirect.github.com/dubzzz/fast-check/pull/6990)) Script: Skip scripts during `pnpm i` in changelog generation - ([PR#7039](https://redirect.github.com/dubzzz/fast-check/pull/7039)) Script: More benchmark commands - ([PR#6972](https://redirect.github.com/dubzzz/fast-check/pull/6972)) Security: Pass `--ignore-scripts` to `pnpm i` calls - ([PR#7028](https://redirect.github.com/dubzzz/fast-check/pull/7028)) Test: Add benchmarks for key arbitraries - ([PR#7034](https://redirect.github.com/dubzzz/fast-check/pull/7034)) Test: Expand benchmark coverage across arbitrary families - ([PR#7041](https://redirect.github.com/dubzzz/fast-check/pull/7041)) Test: Add runners related benchs - ([PR#7064](https://redirect.github.com/dubzzz/fast-check/pull/7064)) Test: Clarify arbitrary benchmark names - ([PR#7068](https://redirect.github.com/dubzzz/fast-check/pull/7068)) Test: More reliable arbitraries.bench.ts - ([PR#7088](https://redirect.github.com/dubzzz/fast-check/pull/7088)) Typo: Typo in type `EntityGraphContraints` *** </details> <details> <summary>helmetjs/helmet (helmet)</summary> ### [`v8.3.0`](https://redirect.github.com/helmetjs/helmet/blob/HEAD/CHANGELOG.md#830---2026-07-11) [Compare Source](https://redirect.github.com/helmetjs/helmet/compare/v8.2.0...v8.3.0) ##### Changed - `Content-Security-Policy`: improved performance by \~7% when there are no dynamic directives - `Content-Security-Policy`: improved error handling for invalid directive names ##### Fixed - `Content-Security-Policy`: `useDefaults: false` with no directives is no longer valid, both at runtime and the type level - `Content-Security-Policy`: dynamically-computed directive values would `throw`, not call `next`, when invalid - `Content-Security-Policy`: dynamically-computed directive value entries would `throw`, not call `next`, when function threw </details> <details> <summary>webpro-nl/knip (knip)</summary> ### [`v6.27.0`](https://redirect.github.com/webpro-nl/knip/releases/tag/knip%406.27.0): Release 6.27.0 [Compare Source](https://redirect.github.com/webpro-nl/knip/compare/knip@6.26.0...knip@6.27.0) - Add Temporal plugin ([`98191a0`](https://redirect.github.com/webpro-nl/knip/commit/98191a04aad0572bead191b101bfecef75067b0c)) - Handle -d alias for react-email dir argument ([`53d1fec`](https://redirect.github.com/webpro-nl/knip/commit/53d1fec3213db8d6a84dfa7a82050b122782e065)) - Expand pnpm script references with forwarded arguments ([`33e9799`](https://redirect.github.com/webpro-nl/knip/commit/33e9799df39450033061b9c4c07daf22f5d15721)) - Treat path-shaped script tokens as file references, extend known global binaries ([`d9508c2`](https://redirect.github.com/webpro-nl/knip/commit/d9508c282ab81351beda4b2f859435b49f142c51)) - Mark tsdown neverBundle dependencies as referenced ([`5fd863b`](https://redirect.github.com/webpro-nl/knip/commit/5fd863ba12e68842f91ab1a94e7e30d1e571da92)) - Support TanStack Start in tanstack-router plugin ([`bd63cd8`](https://redirect.github.com/webpro-nl/knip/commit/bd63cd8af88dac03a98aa17f1add322f7bdf4a94)) - Mark vite ssr.external dependencies as referenced ([`91de938`](https://redirect.github.com/webpro-nl/knip/commit/91de938032062cb667bced0eadef9e67d1e20b1f)) - Expand bun, npm, and yarn script references with forwarded arguments ([`b5a3176`](https://redirect.github.com/webpro-nl/knip/commit/b5a31767a83e2cec3fb20c3b146d94c0412a4fd6)) - Add Latitude as sponsor ([`4267675`](https://redirect.github.com/webpro-nl/knip/commit/42676759cad5fb10ac96fd7c0457037e906f4b68)) - Regenerate plugin list in docs ([`1d2cdff`](https://redirect.github.com/webpro-nl/knip/commit/1d2cdffb4d4151f848c44e066eff43e9efbf44fe)) - Support Vue 2 template auto-imports (close [#​1881](https://redirect.github.com/webpro-nl/knip/issues/1881)) ([`2157f39`](https://redirect.github.com/webpro-nl/knip/commit/2157f3913f77216d268b2255899b6fc58609f9bb)) - Ignore block-commented stylesheet imports (resolve [#​1880](https://redirect.github.com/webpro-nl/knip/issues/1880), close [#​1882](https://redirect.github.com/webpro-nl/knip/issues/1882)) ([`a627f53`](https://redirect.github.com/webpro-nl/knip/commit/a627f53221547d5397d70722fcc2fd723889e579)) - Support TypeScript 5.0 narrowing for ssr.external ([`989292f`](https://redirect.github.com/webpro-nl/knip/commit/989292f79b9d19028bfc7ba988b74ba691041a45)) - Resolve local binaries from bun run ([`5e9a7f0`](https://redirect.github.com/webpro-nl/knip/commit/5e9a7f0286e2c2175bb299c514cc7b67a7cf24f1)) - Support Vitest inline project config extensions ([`f682327`](https://redirect.github.com/webpro-nl/knip/commit/f682327f6181f44e3924715efa7404aa39e532f0)) - Resolve package names from aliased node\_modules paths ([`c273d5f`](https://redirect.github.com/webpro-nl/knip/commit/c273d5fbc1b0d3eaf27b38c3f31d3a2a4b6b184a)) - Support Tailwind CSS URL imports ([`57a4770`](https://redirect.github.com/webpro-nl/knip/commit/57a4770447cc4c8f9ea4ffb9171c0c92eed4f255)) - Resolve unbuilt workspace package exports (close [#​1877](https://redirect.github.com/webpro-nl/knip/issues/1877)) ([`1b0a2c0`](https://redirect.github.com/webpro-nl/knip/commit/1b0a2c0ee784db165c7f92fe10397a6cb513c1cf)) - Skip unresolved imports of gitignored generated files ([`605c904`](https://redirect.github.com/webpro-nl/knip/commit/605c9049f73838beb1c6fee83c6a5421ae1a6d07)) - Attribute imports of aliased packages to the declared dependency ([`d05e775`](https://redirect.github.com/webpro-nl/knip/commit/d05e775c9a3a5676dc9eadcc1093f7d9983efd06)) - Flag unresolvable imports of transitive peer deps as unlisted (resolve [#​1883](https://redirect.github.com/webpro-nl/knip/issues/1883)) ([`18f0bff`](https://redirect.github.com/webpro-nl/knip/commit/18f0bff4ea683837f75ca744d3fbde52df49b297)) - Don't count ambient module declarations in script files as imports ([`e52aecf`](https://redirect.github.com/webpro-nl/knip/commit/e52aecfd7c022cbe72b1c11dde3f4968579ac409)) - Update rolldown snapshot ([`a63e927`](https://redirect.github.com/webpro-nl/knip/commit/a63e92788239062682603a5727ede371db7845c8)) - Remove obsolete workarounds from ecosystem tests ([`a521cf7`](https://redirect.github.com/webpro-nl/knip/commit/a521cf790d726c18e644e2e316cdc09eb654f607)) - Handle snapshotSerializers in Vitest plugin (resolve [#​1884](https://redirect.github.com/webpro-nl/knip/issues/1884)) ([`b597de9`](https://redirect.github.com/webpro-nl/knip/commit/b597de951f6f0e897afdbbbb8a7d0c06c8d2437d)) - Set the stage ([`c059c2b`](https://redirect.github.com/webpro-nl/knip/commit/c059c2be5803609924b852c2bf0cd90906a6a831)) ### [`v6.26.0`](https://redirect.github.com/webpro-nl/knip/releases/tag/knip%406.26.0): Release 6.26.0 [Compare Source](https://redirect.github.com/webpro-nl/knip/compare/knip@6.25.0...knip@6.26.0) - ci: add path filters ([#​1871](https://redirect.github.com/webpro-nl/knip/issues/1871)) ([`4249935`](https://redirect.github.com/webpro-nl/knip/commit/4249935adffe1b8eca9570fb325fa19cc8010584)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Add CodeRabbit as gold sponsor ([`1da09fd`](https://redirect.github.com/webpro-nl/knip/commit/1da09fdc8f4d851f3cad30659200018bfb47a5e0)) - Fix up docs a bit more ([`39125a7`](https://redirect.github.com/webpro-nl/knip/commit/39125a7f473e006f61629781bff1ac4a050ca460)) - Don't report ambient declaration files as unused ([`aed361c`](https://redirect.github.com/webpro-nl/knip/commit/aed361c00a82829c2fc80a65a2f7af174316782e)) - Register oclif command files as entries ([`3b4d58c`](https://redirect.github.com/webpro-nl/knip/commit/3b4d58c9da83d93b6821a2b24f57b919ba886756)) - Add electron-vite plugin ([`d92107e`](https://redirect.github.com/webpro-nl/knip/commit/d92107ea504833b3ee7ad2b695e22d40528b24c3)) - Add esbuild plugin ([`ef3b601`](https://redirect.github.com/webpro-nl/knip/commit/ef3b601d957546554de2cb1fbff859f5bdafb741)) - Ignore more globally available binaries ([`8292981`](https://redirect.github.com/webpro-nl/knip/commit/829298129fdfd1b41a1f8dff5022b9fbbe25f454)) - Resolve `#`-imports to source when node condition is unbuilt (resolve [#​1873](https://redirect.github.com/webpro-nl/knip/issues/1873)) ([`f2713ed`](https://redirect.github.com/webpro-nl/knip/commit/f2713ed1e499ab286b86615d4b8ec34f711d1bd2)) - Ignore gh as a globally available binary ([`a6f0772`](https://redirect.github.com/webpro-nl/knip/commit/a6f0772e5db03a8412a3ac036756779f22d1a27d)) - Resolve Vitest benchmark files as entries ([`5742913`](https://redirect.github.com/webpro-nl/knip/commit/57429139f7e93f2a4bee35a53d450c4f45dea9ff)) - Extract shared Vue auto-import machinery into plugins/\_vue ([`7301075`](https://redirect.github.com/webpro-nl/knip/commit/73010753d432ae58eb12c7eec9c5723036009749)) - Scope compiler extensions per workspace ([`5e6f82b`](https://redirect.github.com/webpro-nl/knip/commit/5e6f82b963a83e5801484efbc01a4b6a9ce39ea3)) - Resolve auto-imported components in the Vue SFC compiler ([`009aad8`](https://redirect.github.com/webpro-nl/knip/commit/009aad8f9dab589898e5dba4c85fa41ea57c1a49)) - Add plugins for the Vue auto-import ecosystem ([`f638c83`](https://redirect.github.com/webpro-nl/knip/commit/f638c8302cdd26a63e477344a7cf44ef60af7788)) - Enable Vue SFC compiler on unplugin-vue and [@​vitejs/plugin-vue](https://redirect.github.com/vitejs/plugin-vue) ([`9396ab1`](https://redirect.github.com/webpro-nl/knip/commit/9396ab159919147ef81dad16e365e531b32b4b12)) - Recognize vite-plugin-vue-meta-layouts (same layouts convention) ([`3ceee89`](https://redirect.github.com/webpro-nl/knip/commit/3ceee89228b0173eddc0466bf50e8181286ffebc)) - Add vite-plugin-pages and unplugin-icons plugins ([`9bc1754`](https://redirect.github.com/webpro-nl/knip/commit/9bc17540bcf8eb142474ed84837c1e2cebb7fe73)) - Add vite-plugin-pwa and [@​intlify/unplugin-vue-i18n](https://redirect.github.com/intlify/unplugin-vue-i18n) plugins ([`45dea0a`](https://redirect.github.com/webpro-nl/knip/commit/45dea0a397ed754c34617ed18deef4dc6f0ec0d4)) - Dog, food. ([`e1249ad`](https://redirect.github.com/webpro-nl/knip/commit/e1249ade2558d3801d85e2dc63349d884f3443d4)) - Update query snapshot ([`a45941d`](https://redirect.github.com/webpro-nl/knip/commit/a45941d2db381c04f8a38416533217ee84f77ca7)) - Don't misread Nitro route types as Vue component auto-imports ([`43aecd5`](https://redirect.github.com/webpro-nl/knip/commit/43aecd5414eb63bec3637f37ffac0c62a71e7e74)) - Read oxlint jsPlugins from vite-plus vite.config and .oxlintrc.json ([`589ffda`](https://redirect.github.com/webpro-nl/knip/commit/589ffda4e3a7d0c0d772191ad6f8d6e60dd298cf)) - Add vite-plus plugin for run.tasks and staged scripts ([`f041c19`](https://redirect.github.com/webpro-nl/knip/commit/f041c191e4e10dd181ad212b71079e3e10bcf341)) - Support [@​vite-pwa/nuxt](https://redirect.github.com/vite-pwa/nuxt) PWA config in nuxt.config ([`8fa7b11`](https://redirect.github.com/webpro-nl/knip/commit/8fa7b116690e37484798ad98eca002d26c0c80fe)) - Add [@​vite-pwa/assets-generator](https://redirect.github.com/vite-pwa/assets-generator) plugin ([`4254f7d`](https://redirect.github.com/webpro-nl/knip/commit/4254f7d53a284a4ea4612f650ae03495bcb0d582)) - Add [@​nuxtjs/i18n](https://redirect.github.com/nuxtjs/i18n) plugin ([`dfb9acb`](https://redirect.github.com/webpro-nl/knip/commit/dfb9acbe5a08ebc85562f59a04e7f4bedb4925f1)) - Read plugin entries from vite.config options and index.html ([`d533da8`](https://redirect.github.com/webpro-nl/knip/commit/d533da8cc2b431d206eb7c55323ea51846eca0bb)) - Fix false positives in VitePress, next-mdx and unplugin-vue-i18n plugins ([`b99702a`](https://redirect.github.com/webpro-nl/knip/commit/b99702a76e26b1943a16517f1633de3a0713c196)) - Respect optional peers in pnpm and Yarn packageExtensions ([`aab080b`](https://redirect.github.com/webpro-nl/knip/commit/aab080bbd436494316df045011ab22cbebca06b4)) - Detect babel plugins in the Storybook config ([`5dea975`](https://redirect.github.com/webpro-nl/knip/commit/5dea975adf9b88971ad56434132282a099c7d58c)) - Add shared AST helpers for imported calls and first property values ([`c84bb7a`](https://redirect.github.com/webpro-nl/knip/commit/c84bb7a87a17f1921c12bb02bcfd43f905cae595)) - Inline trivial resolveFromAST wrappers and normalize orval and sst ([`620079d`](https://redirect.github.com/webpro-nl/knip/commit/620079d1d07b69a69bbb67b6a6e68963b6c2fc21)) - Extract inline resolveFromAST implementations to dedicated files ([`b5231c1`](https://redirect.github.com/webpro-nl/knip/commit/b5231c12f915428067d790187d2dd4c44e2559d4)) - Normalize resolveFromAST files to a uniform contract ([`fc1ba0f`](https://redirect.github.com/webpro-nl/knip/commit/fc1ba0fb45aaf623de678a57bea3b5567ea04750)) - chore: migrate to Astro 7 and SΓ€tteri ([#​1875](https://redirect.github.com/webpro-nl/knip/issues/1875)) ([`f256a5b`](https://redirect.github.com/webpro-nl/knip/commit/f256a5b276c3d69dd5081c591bbb183aacebf766)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Show contributor count on docs homepage ([`6b8454a`](https://redirect.github.com/webpro-nl/knip/commit/6b8454a2841905ce7f08e1a23b54bc17a0854608)) - Exclude gitignored package entry points ([`606e5d0`](https://redirect.github.com/webpro-nl/knip/commit/606e5d051b4f0620c776aa23352153b8253bd75b)) - Add Tauri plugin ([`199180d`](https://redirect.github.com/webpro-nl/knip/commit/199180da79c71acc80865dc65ce89653a26d9579)) - Add Laravel plugin ([`1974533`](https://redirect.github.com/webpro-nl/knip/commit/197453378f2b60e5143a30ec78b438f02b37c53b)) - Add Quasar plugin ([`a220729`](https://redirect.github.com/webpro-nl/knip/commit/a220729074bfbb9e7d03ba329e89ad553c3a7799)) ### [`v6.25.0`](https://redirect.github.com/webpro-nl/knip/releases/tag/knip%406.25.0): Release 6.25.0 [Compare Source](https://redirect.github.com/webpro-nl/knip/compare/knip@6.24.0...knip@6.25.0) - fix: derive package name from package.json under Yarn `nodeLinker: pnpm` store ([#​1852](https://redirect.github.com/webpro-nl/knip/issues/1852)) ([`3764605`](https://redirect.github.com/webpro-nl/knip/commit/3764605ed150b975fb6c88c4c4aa47f5bf9ae149)) - thanks [@​blowery](https://redirect.github.com/blowery)! - Pick up types used in module augmentations via path aliases (resolve [#​1850](https://redirect.github.com/webpro-nl/knip/issues/1850)) ([`9cc5a41`](https://redirect.github.com/webpro-nl/knip/commit/9cc5a4132793990b5fcf9eae6f3db37426d979c0)) - feat: add support for `packageExtensions` in yarn and pnpm ([#​1847](https://redirect.github.com/webpro-nl/knip/issues/1847)) ([`61d3164`](https://redirect.github.com/webpro-nl/knip/commit/61d3164cdac6e9252b3c52ce3bb2909949b4690e)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - fix(ci): do not run integration on forks ([#​1855](https://redirect.github.com/webpro-nl/knip/issues/1855)) ([`d23c10d`](https://redirect.github.com/webpro-nl/knip/commit/d23c10d1ae764c0b70addaafc79f01c543cc5efa)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - chore(ci): improve security through specific permissions ([#​1856](https://redirect.github.com/webpro-nl/knip/issues/1856)) ([`1eb42e6`](https://redirect.github.com/webpro-nl/knip/commit/1eb42e639f9ec12d6d2ef88e1aaf07397b5bf226)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - chore(ci): add concurrency blocks ([#​1857](https://redirect.github.com/webpro-nl/knip/issues/1857)) ([`3bf3d11`](https://redirect.github.com/webpro-nl/knip/commit/3bf3d115cf677fadcfe8fa72ce0e68cfd435d399)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - fix(next): resolve src/ entry patterns like Next.js does ([#​1859](https://redirect.github.com/webpro-nl/knip/issues/1859)) ([`6e6a509`](https://redirect.github.com/webpro-nl/knip/commit/6e6a5094e924a5cd104867f3907dbbb378f871b3)) - thanks [@​dayongkr](https://redirect.github.com/dayongkr)! - Fix Bun test defaults ([#​1860](https://redirect.github.com/webpro-nl/knip/issues/1860)) ([`2ac4c04`](https://redirect.github.com/webpro-nl/knip/commit/2ac4c0427d2ac03939661f6dc236d15d11414fd5)) - thanks [@​jakeleventhal](https://redirect.github.com/jakeleventhal)! - Extend agentic guidelines re. plugins ([`da606eb`](https://redirect.github.com/webpro-nl/knip/commit/da606eb522f01187def8747d7ddb917c6735157d)) - Support rspack and path aliases in require.context ([`d231d67`](https://redirect.github.com/webpro-nl/knip/commit/d231d67a5e8713c2f48f9d695ae12a9dbfa0260e)) - Support path aliases in import.meta.glob (resolve [#​1821](https://redirect.github.com/webpro-nl/knip/issues/1821)) ([`fc7bb1e`](https://redirect.github.com/webpro-nl/knip/commit/fc7bb1ecc194e69f9f493bff5b33a4cc807fd788)) - Register MDX compiler in Storybook plugin ([`6f18138`](https://redirect.github.com/webpro-nl/knip/commit/6f1813809608cd36e44af22583805e686c51c5bd)) - Resolve TypeDoc customCss and customJs files ([`105687d`](https://redirect.github.com/webpro-nl/knip/commit/105687daf682884257a2d40f26967d80ea4abef8)) - Resolve inline Babel presets/plugins in Jest transform ([`38e4a4a`](https://redirect.github.com/webpro-nl/knip/commit/38e4a4a4a06d902cf55457155f666c3b91e05f28)) - Mark graphql-codegen generated outputs as entries ([`1255369`](https://redirect.github.com/webpro-nl/knip/commit/125536921f1845eeec1347091b238bb615f329e0)) - Add Fumadocs plugin ([`77c2142`](https://redirect.github.com/webpro-nl/knip/commit/77c2142fcc6ad6fdee651c5dc60a74c158cd8de3)) - Support next.config.mts in Next.js plugin ([`0f27e77`](https://redirect.github.com/webpro-nl/knip/commit/0f27e772935bba5eaeca73ee75ce028412c4a1cc)) - Add script command parser built on unbash ([`195510c`](https://redirect.github.com/webpro-nl/knip/commit/195510c6c912ade9cd7846302d2f9256ede9852c)) - Gate Bun test entries on an actual bun test invocation ([`92903ec`](https://redirect.github.com/webpro-nl/knip/commit/92903ec29bb8b86586e3d7e846236d8c38787ea9)) - Detect Node.js test runner via script command parser ([`a0bfe7b`](https://redirect.github.com/webpro-nl/knip/commit/a0bfe7ba2958a1270604764a9ebf09425ce857d4)) - Extract shared command walker for bash-parser and plugins ([`1301475`](https://redirect.github.com/webpro-nl/knip/commit/13014753d5031cf1de8081b3d148212a5894dde0)) - Normalize aliased glob patterns to posix for Win ([`23b4a74`](https://redirect.github.com/webpro-nl/knip/commit/23b4a744330d0dddd2b1517f2f2d72c9d373a0b9)) - Resolve inherited tsconfig paths from the extended config's directory (resolve [#​1866](https://redirect.github.com/webpro-nl/knip/issues/1866)) ([`e3f0e5c`](https://redirect.github.com/webpro-nl/knip/commit/e3f0e5c69641bb7dfab06585251c98e3b3def049)) - Handle var interpolations in shell cmd scripts (resolve [#​1867](https://redirect.github.com/webpro-nl/knip/issues/1867)) ([`9422d06`](https://redirect.github.com/webpro-nl/knip/commit/9422d06adb07fd29a3388ee6b037cda47fe28d1a)) - Update query snapshot ([`5e192e9`](https://redirect.github.com/webpro-nl/knip/commit/5e192e996fd680c41674c9503437ee148b0f1870)) - Add support for Prettier overrides ([#​1869](https://redirect.github.com/webpro-nl/knip/issues/1869)) ([`5dc7f12`](https://redirect.github.com/webpro-nl/knip/commit/5dc7f1235ff201c461a71f8a757c611441f1607a)) - thanks [@​remcohaszing](https://redirect.github.com/remcohaszing)! - Handle Serverless esbuild inject entries ([#​1865](https://redirect.github.com/webpro-nl/knip/issues/1865)) ([`46111ef`](https://redirect.github.com/webpro-nl/knip/commit/46111ef2f42c2ea89a43d8944b5efdcde7db2884)) - thanks [@​jakeleventhal](https://redirect.github.com/jakeleventhal)! - docs: add links to Discord and Contributing in issue templates ([#​1868](https://redirect.github.com/webpro-nl/knip/issues/1868)) ([`5ab3483`](https://redirect.github.com/webpro-nl/knip/commit/5ab3483e30733edc234e9913b3bf4bf05de45470)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Add eve (Vercel framework) plugin ([#​1864](https://redirect.github.com/webpro-nl/knip/issues/1864)) ([`20cd970`](https://redirect.github.com/webpro-nl/knip/commit/20cd970d2039835dd9bad79ee2e7f3a82cef1b6e)) - thanks [@​jakeleventhal](https://redirect.github.com/jakeleventhal)! - Add circular dependencies as opt-in `cycles` issue type (resolve [#​1734](https://redirect.github.com/webpro-nl/knip/issues/1734)) ([#​1812](https://redirect.github.com/webpro-nl/knip/issues/1812)) ([`1b0ed6b`](https://redirect.github.com/webpro-nl/knip/commit/1b0ed6b3906d726b37a89b495fb22331ec2a0fbb)) - chore(ci): remove redundant tag triggers ([#​1863](https://redirect.github.com/webpro-nl/knip/issues/1863)) ([`c61d008`](https://redirect.github.com/webpro-nl/knip/commit/c61d0086e4e669a8aeee230dc5ac3606832ea893)) - thanks [@​trueberryless](https://redirect.github.com/trueberryless)! - Fix up docs a bit ([`89a2d8d`](https://redirect.github.com/webpro-nl/knip/commit/89a2d8d6ac27ee866a15a8bcf5a49da3cba91b08)) </details> <details> <summary>mqttjs/MQTT.js (mqtt)</summary> ### [`v5.15.2`](https://redirect.github.com/mqttjs/MQTT.js/blob/HEAD/CHANGELOG.md#5152-2026-07-06) [Compare Source](https://redirect.github.com/mqttjs/MQTT.js/compare/v5.15.1...v5.15.2) ##### Bug Fixes - **connect/tls:** don't overwrite an explicit servername (SNI) ([#​2051](https://redirect.github.com/mqttjs/MQTT.js/issues/2051)) ([cd1d780](https://redirect.github.com/mqttjs/MQTT.js/commit/cd1d780f5742852e9bcf46dbd9732e0c5e20823a)) - support relative WebSocket URLs ([#​2049](https://redirect.github.com/mqttjs/MQTT.js/issues/2049)) ([c4be563](https://redirect.github.com/mqttjs/MQTT.js/commit/c4be5633594b5b839862440aa78125f22021f8e6)), closes [#​2035](https://redirect.github.com/mqttjs/MQTT.js/issues/2035) </details> <details> <summary>node-cron/node-cron (node-cron)</summary> ### [`v4.6.0`](https://redirect.github.com/node-cron/node-cron/blob/HEAD/CHANGELOG.md#460-2026-07-04) [Compare Source](https://redirect.github.com/node-cron/node-cron/compare/v4.5.0...v4.6.0) ##### Added - add cron.shutdown(timeout?) for graceful process teardown ([#​589](https://redirect.github.com/node-cron/node-cron/issues/589)) ([35f1a61](https://redirect.github.com/node-cron/node-cron/commit/35f1a61ba7cef987f7ed342489d8d0f0220553b8)) - add unref option for heartbeat timers ([#​588](https://redirect.github.com/node-cron/node-cron/issues/588)) ([35cb140](https://redirect.github.com/node-cron/node-cron/commit/35cb140d9c2d790ff295d54fbe82f6eec9b27e33)) - **day-of-month:** Quartz-style W, L-n and ? modifiers ([#​570](https://redirect.github.com/node-cron/node-cron/issues/570)) ([cbe379b](https://redirect.github.com/node-cron/node-cron/commit/cbe379bce9d770c84328399dca514bd92a467c18)) - emit task:failed when a background daemon exits unexpectedly ([7bd91d6](https://redirect.github.com/node-cron/node-cron/commit/7bd91d62d1472d52f9adbddfddc0c47458623080)) - support cron expression nicknames ([@​yearly](https://redirect.github.com/yearly), [@​daily](https://redirect.github.com/daily), etc.) ([#​579](https://redirect.github.com/node-cron/node-cron/issues/579)) ([6a6e14e](https://redirect.github.com/node-cron/node-cron/commit/6a6e14e43ab4ce5c21b52414a17e3e20311bd7bf)) ##### Fixed - background task state transition on stop/destroy without fork ([#​584](https://redirect.github.com/node-cron/node-cron/issues/584)) ([9dbc6de](https://redirect.github.com/node-cron/node-cron/commit/9dbc6de269cf5855b0afc037fb4446ef9791d761)) - clear jitter timeout on runner stop ([#​583](https://redirect.github.com/node-cron/node-cron/issues/583)) ([28b8146](https://redirect.github.com/node-cron/node-cron/commit/28b8146dd164ea992e1d5a649756b2bba4e062c4)) - CommonJS type resolution ([#​608](https://redirect.github.com/node-cron/node-cron/issues/608)) ([ee9d294](https://redirect.github.com/node-cron/node-cron/commit/ee9d294e71e526edffa2a2f902cad71e1f570d44)) - correct falied->failed typo in daemon task error log ([#​594](https://redirect.github.com/node-cron/node-cron/issues/594)) ([66c6961](https://redirect.github.com/node-cron/node-cron/commit/66c6961f2140d84cb71b101013abc170977297eb)) - correct shutdown listener typing that broke the build ([#​595](https://redirect.github.com/node-cron/node-cron/issues/595)) ([7aac3ad](https://redirect.github.com/node-cron/node-cron/commit/7aac3adc22516faad054f2b3ef7362edf62e20f3)) - correlate execute() by id, isolate event hooks, and stop counting manual runs toward maxExecutions ([#​607](https://redirect.github.com/node-cron/node-cron/issues/607)) ([0f039a9](https://redirect.github.com/node-cron/node-cron/commit/0f039a94dcaf6221ea406221b1e7c5eb34a47c4b)) - daemon serialized task state with wrong field name ([#​587](https://redirect.github.com/node-cron/node-cron/issues/587)) ([688d465](https://redirect.github.com/node-cron/node-cron/commit/688d465b82889f07f39dfef9170d808c1f40330e)) - expand inverted ranges with wrap-around instead of silently swapping ([#​602](https://redirect.github.com/node-cron/node-cron/issues/602)) ([a10ae53](https://redirect.github.com/node-cron/node-cron/commit/a10ae53626f1cc6e426e23266423f5e334a6871e)) - harden cron.shutdown() teardown ([#​598](https://redirect.github.com/node-cron/node-cron/issues/598)) ([a0b0d1f](https://redirect.github.com/node-cron/node-cron/commit/a0b0d1ff9313d0f8532130e5fcb873f29f48fd1f)) - kill orphan child process on background task stop/destroy timeout ([#​582](https://redirect.github.com/node-cron/node-cron/issues/582)) ([8179e10](https://redirect.github.com/node-cron/node-cron/commit/8179e105a02b91035bce441309c1cda12aaf4c4a)) - make concurrent background start() await the daemon and time out coordinator lookups ([#​605](https://redirect.github.com/node-cron/node-cron/issues/605)) ([446f03a](https://redirect.github.com/node-cron/node-cron/commit/446f03ae8f366683c43b186b93bcba5091a00042)) - make lifecycle calls on a destroyed task safe no-ops ([#​600](https://redirect.github.com/node-cron/node-cron/issues/600)) ([7fa9795](https://redirect.github.com/node-cron/node-cron/commit/7fa979514f9181aa63b0363cddb2acbf045b1f8c)) - prevent double destroy on registry remove ([#​585](https://redirect.github.com/node-cron/node-cron/issues/585)) ([8ae9f06](https://redirect.github.com/node-cron/node-cron/commit/8ae9f06463954754d4958f9eb478aed73e8adc4d)) - **release-please:** match existing v-prefixed tags ([#​575](https://redirect.github.com/node-cron/node-cron/issues/575)) ([e43c152](https://redirect.github.com/node-cron/node-cron/commit/e43c152188d993f59a12e3e9e258a695b44ca579)) - runner promise bugs that could hang scheduling or crash process ([#​581](https://redirect.github.com/node-cron/node-cron/issues/581)) ([0ae62be](https://redirect.github.com/node-cron/node-cron/commit/0ae62be8b3639762f1b09569cbb66503c940d8e5)) - unref the IPC channel so background tasks let the process exit ([#​599](https://redirect.github.com/node-cron/node-cron/issues/599)) ([534e593](https://redirect.github.com/node-cron/node-cron/commit/534e59344c019bc69869bc33e5cdcf1ff8ae1f1e)) - validate the cron expression when scheduling a task ([#​603](https://redirect.github.com/node-cron/node-cron/issues/603)) ([196e6cd](https://redirect.github.com/node-cron/node-cron/commit/196e6cd41ac32ab9df56668ac70e1b5232384bb8)) - validate() consistency and multi-asterisk expansion ([#​606](https://redirect.github.com/node-cron/node-cron/issues/606)) ([8cf41c4](https://redirect.github.com/node-cron/node-cron/commit/8cf41c436f5b544e32908d6e73b2679e973074e3)) - weekday 7-to-0 conversion corrupting ranges ([#​580](https://redirect.github.com/node-cron/node-cron/issues/580)) ([c8a3943](https://redirect.github.com/node-cron/node-cron/commit/c8a3943817cc1338d4f03dbc7ad52fa34d449134)) ##### Changed - replace chai and sinon with native vitest assertions ([#​590](https://redirect.github.com/node-cron/node-cron/issues/590)) ([d29d07a](https://redirect.github.com/node-cron/node-cron/commit/d29d07a005911b4ae19ce5a6bb55571018972e1f)) </details> <details> <summary>sindresorhus/p-limit (p-limit)</summary> ### [`v7.3.1`](https://redirect.github.com/sindresorhus/p-limit/releases/tag/v7.3.1) [Compare Source](https://redirect.github.com/sindresorhus/p-limit/compare/v7.3.0...v7.3.1) - Fix detached limit.map calls ([#​108](https://redirect.github.com/sindresorhus/p-limit/issues/108)) [`ef37eb2`](https://redirect.github.com/sindresorhus/p-limit/commit/ef37eb2) *** </details> <details> <summary>postcss/postcss (postcss)</summary> ### [`v8.5.21`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8521) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.20...8.5.21) - Fixed childless at-rule losing semicolon before comment (by [@​sarathfrancis90](https://redirect.github.com/sarathfrancis90)). - Fixed docs (by [@​isker](https://redirect.github.com/isker)). ### [`v8.5.20`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8520) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.19...8.5.20) - Fixed missing space if `AtRule#params` is set after (by [@​sarathfrancis90](https://redirect.github.com/sarathfrancis90)). - Fixed mixing AST error on warnings (by [@​MahinAnowar](https://redirect.github.com/MahinAnowar)). ### [`v8.5.19`](https://redirect.github.com/postcss/postcss/releases/tag/8.5.19) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.18...8.5.19) - Fixed cleaning `before` for new nodes inserted to `Root` (by [@​MahinAnowar](https://redirect.github.com/MahinAnowar)). ### [`v8.5.18`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8518) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.17...8.5.18) - Restricted loading previous source maps file to the `opts.from` folder for security reasons (use `unsafeMap: true` to disable the check). ### [`v8.5.17`](https://redirect.github.com/postcss/postcss/blob/HEAD/CHANGELOG.md#8517) [Compare Source](https://redirect.github.com/postcss/postcss/compare/8.5.16...8.5.17) - Fixed `Maximum call stack size exceeded` error. - Fixed Prototype hijacking for `postcss.fromJSON()`. - Fixed `Input#origin()` for unmapped end position (by [@​chatman-media](https://redirect.github.com/chatman-media)). </details> <details> <summary>le0pard/re2js (re2js)</summary> ### [`v2.8.6`](https://redirect.github.com/le0pard/re2js/releases/tag/2.8.6) [Compare Source](https://redirect.github.com/le0pard/re2js/compare/2.8.5...2.8.6) #### What's Changed - Replace Thread Pool with a Sparse Array in js env by [@​le0pard](https://redirect.github.com/le0pard) in [#​48](https://redirect.github.com/le0pard/re2js/pull/48) - Bump js-yaml from 3.14.2 to 3.15.0 in the npm\_and\_yarn group across 1 directory by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​49](https://redirect.github.com/le0pard/re2js/pull/49) - [remove AtomicReference](https://redirect.github.com/le0pard/re2js/commit/1b08c6ef176c86f06bee07cdb856b381a0907ba6) - [remove O(n) for array copying in UTF-8 encoding](https://redirect.github.com/le0pard/re2js/commit/37951e5d0027ce2d812e991116703925bdece5c5) - [bugfixes for split and replace](https://redirect.github.com/le0pard/re2js/commit/b2d72010ff1382c2fcd0e9c45b957c9b5f3f95ae) **Full Changelog**: <https://github.com/le0pard/re2js/compare/2.8.5...2.8.6> </details> <details> <summary>nodejs/undici (undici)</summary> ### [`v8.8.0`](https://redirect.github.com/nodejs/undici/compare/v8.7.0...1760faa557f5f29c6dbd33fcbe6b0422cee16856) [Compare Source](https://redirect.github.com/nodejs/undici/compare/v8.7.0...v8.8.0) ### [`v8.7.0`](https://redirect.github.com/nodejs/undici/releases/tag/v8.7.0) [Compare Source](https://redirect.github.com/nodejs/undici/compare/v8.6.0...v8.7.0) ##### What's Changed - test: guard balanced-pool error port lookup by [@​mcollina](https://redirect.github.com/mcollina) in [#​5463](https://redirect.github.com/nodejs/undici/pull/5463) - perf: optimize http/2 request hot path by [@​mcollina](https://redirect.github.com/mcollina) in [#​5483](https://redirect.github.com/nodejs/undici/pull/5483) - fix: do not reject open-ended Range values in simpleRangeHeaderValue by [@​spokodev](https://redirect.github.com/spokodev) in [#​5490](https://redirect.github.com/nodejs/undici/pull/5490) - fix(eventsource): set use-URL-credentials flag by [@​Ram-blip](https://redirect.github.com/Ram-blip) in [#​5489](https://redirect.github.com/nodejs/undici/pull/5489) - test: deflake connect-timeout watchdog by [@​mcollina](https://redirect.github.com/mcollina) in [#​5197](https://redirect.github.com/nodejs/undici/pull/5197) - docs: correct npm script name and JSON syntax in examples by [@​lenoxfernando](https://redirect.github.com/lenoxfernando) in [#​5496](https://redirect.github.com/nodejs/undici/pull/5496) - fix: reject non-ascii octets in validateCookiePath by [@​spokodev](https://redirect.github.com/spokodev) in [#​5452](https://redirect.github.com/nodejs/undici/pu > β **Note** > > PR body was truncated to here. </details> --- ### Configuration π **Schedule**: (in timezone America/New_York) - Branch creation - "before 6am on monday" - Automerge - At any time (no schedule defined) π¦ **Automerge**: Disabled by config. Please merge this manually once you are satisfied. β» **Rebasing**: Whenever PR is behind base branch, 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/CodesWhat/drydock). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDIuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI3NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
> βΉοΈ **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/) |
|---|---|---|---|
| [@biomejs/biome](https://biomejs.dev)
([source](https://redirect.github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome))
| [`2.4.16` β
`2.5.2`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.4.16/2.5.2)
|

|

|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`25.7.0` β
`25.9.4`](https://renovatebot.com/diffs/npm/@types%2fnode/25.7.0/25.9.4)
|

|

|
| [lefthook](https://redirect.github.com/evilmartians/lefthook) |
[`2.1.6` β
`2.1.9`](https://renovatebot.com/diffs/npm/lefthook/2.1.6/2.1.9) |

|

|
| [vite](https://vite.dev)
([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite))
| [`8.0.16` β
`8.1.3`](https://renovatebot.com/diffs/npm/vite/8.0.16/8.1.3) |

|

|
| [vitest](https://vitest.dev)
([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest))
| [`4.1.7` β
`4.1.9`](https://renovatebot.com/diffs/npm/vitest/4.1.7/4.1.9) |

|

|
---
### Release Notes
<details>
<summary>biomejs/biome (@​biomejs/biome)</summary>
###
[`v2.5.2`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#252)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.5.1...@biomejs/biome@2.5.2)
##### Patch Changes
- [#​10595](https://redirect.github.com/biomejs/biome/pull/10595)
[`f458028`](https://redirect.github.com/biomejs/biome/commit/f4580289094a8fe5c85252adc3399c060bab811e)
Thanks [@​pkallos](https://redirect.github.com/pkallos)! - Added
the option `ignoreBooleanCoercion` to
[useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/).
When enabled, Biome ignores `||` and `||=` used inside a `Boolean()`
call, where coalescing on falsy values is intentional.
- [#​10798](https://redirect.github.com/biomejs/biome/pull/10798)
[`4a32b63`](https://redirect.github.com/biomejs/biome/commit/4a32b63eb41f144dc8faf6b5cdb05e1de5dbcb63)
Thanks [@​pkallos](https://redirect.github.com/pkallos)! - Added
the option `ignorePrimitives` to
[useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/).
When enabled, Biome ignores `||`, `||=`, and ternary expressions whose
non-nullish operands are all primitives the option opts out of. Use
`true` to ignore all primitives, or an object selecting `string`,
`number`, `boolean`, or `bigint`.
- [#​10545](https://redirect.github.com/biomejs/biome/pull/10545)
[`f3d4c00`](https://redirect.github.com/biomejs/biome/commit/f3d4c0082676c5188e9a6aa516318c7e3d59bda6)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Added the
new nursery rule
[`noSvelteUnnecessaryStateWrap`](https://biomejs.dev/linter/rules/no-svelte-unnecessary-state-wrap/),
which reports unnecessary `$state()` wrapping of classes from
`svelte/reactivity` that are already reactive.
```svelte
<script>
import { SvelteMap } from "svelte/reactivity";
const map = $state(new SvelteMap()); // redundant
</script>
```
- [#​10752](https://redirect.github.com/biomejs/biome/pull/10752)
[`f62fb8b`](https://redirect.github.com/biomejs/biome/commit/f62fb8b53092fe85e16f9d4ea0e584fee7031ab5)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10739](https://redirect.github.com/biomejs/biome/issues/10739).
Now the rule
[`useValidAutocomplete`](https://biomejs.dev/linter/rules/use-valid-autocomplete/)
correctly flags the `autoComplete` attribute.
- [#​10796](https://redirect.github.com/biomejs/biome/pull/10796)
[`f1b3ab2`](https://redirect.github.com/biomejs/biome/commit/f1b3ab2c09522a52c93f669ce679675237b96813)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10768](https://redirect.github.com/biomejs/biome/issues/10768).
Improved the performance of the Biome Language Server by cancelling
certain in-flight operations when there are fast updates.
- [#​10719](https://redirect.github.com/biomejs/biome/pull/10719)
[`aa649b5`](https://redirect.github.com/biomejs/biome/commit/aa649b586a2221bf058af7ce80af6faa11faf846)
Thanks [@​minseong0324](https://redirect.github.com/minseong0324)!
- Fixed
[`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/)
false positive on returns that use a widening type assertion: `"a" as
string` is no longer reported as misleading. The rule now also reports a
literal-pinning assertion such as `false as false`, matching the
existing `as const` behavior.
```ts
// No longer flagged (returns are `string`):
function getValue(b: boolean): string {
if (b) return "a" as string;
return "b" as string;
}
// Now also reported, like `as const` (returns `false`):
function isReady(): boolean {
return false as false;
}
```
- [#​10678](https://redirect.github.com/biomejs/biome/pull/10678)
[`8f073a7`](https://redirect.github.com/biomejs/biome/commit/8f073a7cd72b4cf46c2ebf2bc08f4068fc4b5e34)
Thanks
[@​PranavAchar01](https://redirect.github.com/PranavAchar01)! -
Fixed
[#​7718](https://redirect.github.com/biomejs/biome/issues/7718):
Biome now correctly parses CSS nesting selectors when `&` appears as a
trailing sub-selector after a type selector, e.g. `h1& { color: red; }`.
- [#​10756](https://redirect.github.com/biomejs/biome/pull/10756)
[`5ec965a`](https://redirect.github.com/biomejs/biome/commit/5ec965a2620dec7cb40aa4946ba1d41408b11fd9)
Thanks [@​denbezrukov](https://redirect.github.com/denbezrukov)! -
Fixed CSS formatter output for selector lists with
`allowWrongLineComments` and `//` comments after a selector comma. Biome
now keeps the selector before the line comment inline instead of
breaking it across descendant combinators.
```diff
-.powerPathNavigator
- .helm
- button.pressedButton, // pressed
+.powerPathNavigator .helm button.pressedButton, // pressed
.powerPathNavigator .helm button:active:not(.disabledButton) {
}
```
- [#​10757](https://redirect.github.com/biomejs/biome/pull/10757)
[`6232fcd`](https://redirect.github.com/biomejs/biome/commit/6232fcdef77471e6a6a74bcc33ff7b2b2a9f85a2)
Thanks
[@​PranavAchar01](https://redirect.github.com/PranavAchar01)! -
Fixed
[#​8269](https://redirect.github.com/biomejs/biome/issues/8269):
the CSS parser now accepts Tailwind `@variant` and `@utility` names that
start with a digit, such as the `2xl` breakpoint.
```css
@​utility container {
@​variant 2xl {
max-width: 1400px;
}
}
```
- [#​10777](https://redirect.github.com/biomejs/biome/pull/10777)
[`575ced6`](https://redirect.github.com/biomejs/biome/commit/575ced6fd7fe3597fdec36e572763e4a5d590244)
Thanks
[@​WaterWhisperer](https://redirect.github.com/WaterWhisperer)! -
Fixed an issue reported in
[#​10708](https://redirect.github.com/biomejs/biome/issues/10708):
the GitLab reporter now handles `--verbose` diagnostics filtering
correctly.
- [#​10281](https://redirect.github.com/biomejs/biome/pull/10281)
[`0efe244`](https://redirect.github.com/biomejs/biome/commit/0efe2442e9b81d83f7332fd792ad6096678f8b2c)
Thanks [@​Zelys-DFKH](https://redirect.github.com/Zelys-DFKH)! -
Fixed a bug where GritQL patterns rejected positional (unkeyed)
arguments.
- [#​10758](https://redirect.github.com/biomejs/biome/pull/10758)
[`e36fd8a`](https://redirect.github.com/biomejs/biome/commit/e36fd8a9f1314744276df515a1137f21802d3aa5)
Thanks
[@​henrybrewer00-dotcom](https://redirect.github.com/henrybrewer00-dotcom)!
- Fixed
[#​10697](https://redirect.github.com/biomejs/biome/issues/10697):
The formatter no longer removes the parentheses around an `await` or
`yield` expression used as the target of a TypeScript instantiation
expression. For example, `(await makeFactory)<Value>` is no longer
reformatted to `await makeFactory<Value>`, which would change the
meaning of the code.
- [#​10586](https://redirect.github.com/biomejs/biome/pull/10586)
[`3617094`](https://redirect.github.com/biomejs/biome/commit/3617094f00e90f7167ff20baf3c12b5014188b35)
Thanks [@​IxxyDev](https://redirect.github.com/IxxyDev)! - Fixed
[#​9568](https://redirect.github.com/biomejs/biome/issues/9568):
[`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/)
no longer reports a false positive when calling an overloaded function
and the selected overload does not return a promise.
```ts
function bestEffort(cb: () => Promise<number>): Promise<number>;
function bestEffort(cb: () => number): number;
function bestEffort(
cb: () => number | Promise<number>,
): Promise<number> | number {
return cb() as Promise<number> | number;
}
// This resolves to the second overload, which returns `number`, so it
is no
// longer flagged as a floating promise.
bestEffort(() => 42);
```
- [#​10766](https://redirect.github.com/biomejs/biome/pull/10766)
[`7aff4c1`](https://redirect.github.com/biomejs/biome/commit/7aff4c11900579a62dc27ef4e02a4c4760fbbff4)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​2862](https://redirect.github.com/biomejs/biome/issues/2862):
[`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/)
no longer reports custom elements (a tag name containing a dash, e.g.
`<my-button role="img" />`). Per the [W3C HTML-ARIA
specification](https://www.w3.org/TR/html-aria/#el-autonomous-custom-element),
a custom element may be given any role or none.
- [#​10680](https://redirect.github.com/biomejs/biome/pull/10680)
[`771daa4`](https://redirect.github.com/biomejs/biome/commit/771daa4f7d229a8754f47923f03b899dc0fc5630)
Thanks
[@​WaterWhisperer](https://redirect.github.com/WaterWhisperer)! -
Fixed
[#​10635](https://redirect.github.com/biomejs/biome/issues/10635):
Biome now recognizes chained
table tests such as `test.concurrent.each()` and `it.concurrent.each()`
as test calls, fixing
`noMisplacedAssertion` false positives and improving formatting for
those test declarations.
- [#​10759](https://redirect.github.com/biomejs/biome/pull/10759)
[`34570b5`](https://redirect.github.com/biomejs/biome/commit/34570b5b793c44e978b12589dafcfda22dba7df1)
Thanks
[@​henrybrewer00-dotcom](https://redirect.github.com/henrybrewer00-dotcom)!
- Fixed
[#​10636](https://redirect.github.com/biomejs/biome/issues/10636):
[noStaticElementInteractions](https://biomejs.dev/linter/rules/no-static-element-interactions/)
no longer reports a false positive for event handlers on Svelte special
elements such as `<svelte:window>`, `<svelte:document>`, and
`<svelte:body>`. These are not real DOM elements, so they are now
ignored by the rule.
- [#​10741](https://redirect.github.com/biomejs/biome/pull/10741)
[`bd2364e`](https://redirect.github.com/biomejs/biome/commit/bd2364e3d077e3a77addcab6dbe127db38654e4a)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​6686](https://redirect.github.com/biomejs/biome/issues/6686):
the `rage` command now respects the `--config-path` option and the
`BIOME_CONFIG_PATH` environment variable when loading the Biome
configuration. Previously it always used the default configuration
resolution and reported the configuration as `Not set` when no
`biome.json` existed in the working directory.
- [#​10763](https://redirect.github.com/biomejs/biome/pull/10763)
[`2c3e82d`](https://redirect.github.com/biomejs/biome/commit/2c3e82d0235ad2f8331744aefc708d1b71f7177c)
Thanks [@​Aqu1bp](https://redirect.github.com/Aqu1bp)! - Fixed
[#​10742](https://redirect.github.com/biomejs/biome/issues/10742):
[`noSolidDestructuredProps`](https://biomejs.dev/linter/rules/no-solid-destructured-props)
now reports destructured props in Solid function components and JSX
children.
- [#​10606](https://redirect.github.com/biomejs/biome/pull/10606)
[`a4cc4ab`](https://redirect.github.com/biomejs/biome/commit/a4cc4ab0b01a8ef1731d37cb44bccc5522876f2e)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Fixed false
positives in `noUnusedImports`, `noUnusedVariables`, and `useImportType`
for Svelte components that use both a `<script module>` and a `<script>`
block. The two blocks compile to a single module and share a top-level
scope, so a binding (import, function, or variable) declared in one
block and used only in the other is no longer reported as unused.
- [#​10767](https://redirect.github.com/biomejs/biome/pull/10767)
[`36d5aa7`](https://redirect.github.com/biomejs/biome/commit/36d5aa77d751bf33485cd2c92d89e4c5764e1e50)
Thanks [@​otkrickey](https://redirect.github.com/otkrickey)! -
Fixed
[#​10754](https://redirect.github.com/biomejs/biome/issues/10754):
[`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/)
no longer reports the Vue 3.4+ same-name shorthand as missing a value.
`:foo` and `v-bind:foo` are now accepted as equivalent to `:foo="foo"`,
while `v-bind`, `v-bind:[dynamicArg]`, and `:[dynamicArg]` without a
value continue to be reported.
- [#​10775](https://redirect.github.com/biomejs/biome/pull/10775)
[`a918af0`](https://redirect.github.com/biomejs/biome/commit/a918af0ba827a7fd60a12c96b58daebc8af61db2)
Thanks
[@​WaterWhisperer](https://redirect.github.com/WaterWhisperer)! -
Fixed an issue reported in
[#​10708](https://redirect.github.com/biomejs/biome/issues/10708):
`biome rage` didn't detect running Biome daemon pipes on Windows.
- [#​10730](https://redirect.github.com/biomejs/biome/pull/10730)
[`5a2e65b`](https://redirect.github.com/biomejs/biome/commit/5a2e65b9929ef0f2294c20e028fd396d760d2b26)
Thanks [@​dinocosta](https://redirect.github.com/dinocosta)! -
Fixed an issue where Biome was resolving [the well-known Zed settings
file](https://biomejs.dev/guides/configure-biome/#well-known-files) from
the wrong location on macOS and Windows.
- [#​10807](https://redirect.github.com/biomejs/biome/pull/10807)
[`d97fffe`](https://redirect.github.com/biomejs/biome/commit/d97fffe0aba04cddec66943d6bff3e99d440b451)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where `.scss` files were incorrectly analyzed when
running `biome check`.
- [#​10672](https://redirect.github.com/biomejs/biome/pull/10672)
[`53c6efc`](https://redirect.github.com/biomejs/biome/commit/53c6efcd3e5e2769bf8edbe14b8c06ee9fda52d2)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed a bug where Biome incorrectly formatted snippets that have parsing
errors.
- [#​10719](https://redirect.github.com/biomejs/biome/pull/10719)
[`aa649b5`](https://redirect.github.com/biomejs/biome/commit/aa649b586a2221bf058af7ce80af6faa11faf846)
Thanks [@​minseong0324](https://redirect.github.com/minseong0324)!
- Fixed
[`useAwaitThenable`](https://biomejs.dev/linter/rules/use-await-thenable/)
false positive when awaiting a custom thenable that is not the global
`Promise`. A value with a callable `then` member is now recognized as
awaitable.
```ts
interface Thenable<T> {
then(onfulfilled: (value: T) => void): void;
}
declare const t: Thenable<number>;
async function f() {
await t;
}
```
- [#​10734](https://redirect.github.com/biomejs/biome/pull/10734)
[`4396496`](https://redirect.github.com/biomejs/biome/commit/43964961c88ca0f93ee83d10621844fa2dc7515c)
Thanks [@​BangDori](https://redirect.github.com/BangDori)! - Fixed
[#​10708](https://redirect.github.com/biomejs/biome/issues/10708):
`biome migrate` now preserves trivia when migrating the deprecated
`recommended` option to `preset`.
- [#​10683](https://redirect.github.com/biomejs/biome/pull/10683)
[`ae31a00`](https://redirect.github.com/biomejs/biome/commit/ae31a004a20ed33d6aa35d5ec8bb4c433273a517)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10657](https://redirect.github.com/biomejs/biome/issues/10657)
[#​10671](https://redirect.github.com/biomejs/biome/issues/10671)
[#​10661](https://redirect.github.com/biomejs/biome/issues/10661)
[#​10637](https://redirect.github.com/biomejs/biome/issues/10637)
[#​10718](https://redirect.github.com/biomejs/biome/issues/10718):
HTML rules now correctly handle dynamic attributes.
- [#​10746](https://redirect.github.com/biomejs/biome/pull/10746)
[`54e8239`](https://redirect.github.com/biomejs/biome/commit/54e8239bba3f598d7923ac1e446d658714ea7832)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where
[`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes)
didn't correctly detect styles defined inside the Astro directive
`is:global`.
- [#​10770](https://redirect.github.com/biomejs/biome/pull/10770)
[`dd1429c`](https://redirect.github.com/biomejs/biome/commit/dd1429c604f58b89524a3f5329e2920d198e8d9f)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Improved the Biome Language Server DX by orchestrating certain
operations, so that they won't block the editor during typing. This
improvement is more visible in large documents.
- [#​10473](https://redirect.github.com/biomejs/biome/pull/10473)
[`d9b5133`](https://redirect.github.com/biomejs/biome/commit/d9b5133de7e211b22f4531fe220070690a18c8d1)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Improved
[`noUnusedImports`](https://biomejs.dev/linter/rules/no-unused-imports/),
[`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/),
[`noUnusedFunctionParameters`](https://biomejs.dev/linter/rules/no-unused-function-parameters/),
and [`useImportType`](https://biomejs.dev/linter/rules/use-import-type/)
for Svelte, Vue, and Astro files (with
`html.experimentalFullSupportEnabled`). Bindings used only in the
template β including component tags, attribute interpolations,
directives, `bind:` shorthand, and snippet parameters β are no longer
reported as unused, while genuinely unused ones still are.
- [#​10796](https://redirect.github.com/biomejs/biome/pull/10796)
[`f1b3ab2`](https://redirect.github.com/biomejs/biome/commit/f1b3ab2c09522a52c93f669ce679675237b96813)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where the Biome Language Server didn't enable project or
type-aware lint rules, even when they were explicitly enabled.
- [#​10746](https://redirect.github.com/biomejs/biome/pull/10746)
[`54e8239`](https://redirect.github.com/biomejs/biome/commit/54e8239bba3f598d7923ac1e446d658714ea7832)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed an issue where
[`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes)
didn't detect styles declared inside HTML documents.
- [#​10774](https://redirect.github.com/biomejs/biome/pull/10774)
[`bde945b`](https://redirect.github.com/biomejs/biome/commit/bde945bee29cb566086828ad788153d9111a125a)
Thanks [@​pattrickrice](https://redirect.github.com/pattrickrice)!
- Fixed
[#​10268](https://redirect.github.com/biomejs/biome/issues/10268)
where a race condition resulted in internal errors such as: `The file
biome.json does not exist in the workspace`.
###
[`v2.5.1`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#251)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.5.0...@biomejs/biome@2.5.1)
##### Patch Changes
- [#​10722](https://redirect.github.com/biomejs/biome/pull/10722)
[`f8a303d`](https://redirect.github.com/biomejs/biome/commit/f8a303d08b6b22f56edb8ff5e7caa665532d613a)
Thanks [@​denbezrukov](https://redirect.github.com/denbezrukov)! -
Fixed CSS formatter output for comments between import media queries.
```diff
-@​import url("print.css") print,
-/* comment */
-screen;
+@​import url("print.css") print, /* comment */ screen;
```
- [#​10738](https://redirect.github.com/biomejs/biome/pull/10738)
[`9fdc560`](https://redirect.github.com/biomejs/biome/commit/9fdc5600997ef59ca7ed55ac212473de9bdb0b2a)
Thanks
[@​JamBalaya56562](https://redirect.github.com/JamBalaya56562)! -
Fixed
[#​9899](https://redirect.github.com/biomejs/biome/issues/9899):
the `json` and `json-pretty` reporters now escape backslashes in a
diagnostic's `location.path`. Previously, paths containing backslashes
(such as Windows-style paths) were emitted unescaped, producing invalid
JSON.
```diff
- "path": "src\account\setup-passkey.tsx",
+ "path": "src\\account\\setup-passkey.tsx",
```
- [#​10626](https://redirect.github.com/biomejs/biome/pull/10626)
[`5f837df`](https://redirect.github.com/biomejs/biome/commit/5f837df033afc34d43b398aeddc06c1d4fa491d9)
Thanks [@​tom-groves](https://redirect.github.com/tom-groves)! -
Fixed
[#​10625](https://redirect.github.com/biomejs/biome/issues/10625):
`biome migrate` no longer emits an invalid trailing comma when a renamed
rule (such as `noConsoleLog` β `noConsole`) is the last member of its
rule group. Previously this produced malformed output that aborted the
migration of a strict-JSON `biome.json` with a parsing error.
- [#​10535](https://redirect.github.com/biomejs/biome/pull/10535)
[`c245f9d`](https://redirect.github.com/biomejs/biome/commit/c245f9d9e239471d5437cd08f9cfa4601a85abd5)
Thanks [@​Mokto](https://redirect.github.com/Mokto)! - Fixed a
false positive in
[`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/)
for Svelte files where variables referenced inside `{@​html expr}`
blocks were incorrectly reported as unused.
- [#​10668](https://redirect.github.com/biomejs/biome/pull/10668)
[`a0f197e`](https://redirect.github.com/biomejs/biome/commit/a0f197eb1a6974539927f105ff1dde1f51d07d74)
Thanks [@​Netail](https://redirect.github.com/Netail)! - The
`biome init` command has been updated to include a more up-to-date URL
to [the first-party extensions
page](https://biomejs.dev/editors/first-party-extensions/).
- [#​10667](https://redirect.github.com/biomejs/biome/pull/10667)
[`d8c3e87`](https://redirect.github.com/biomejs/biome/commit/d8c3e878d53515c02bd6c5cb899b2eaec046c542)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10664](https://redirect.github.com/biomejs/biome/issues/10664):
[useErrorCause](https://biomejs.dev/linter/rules/use-error-cause/) now
correctly detects a shorthand property.
- [#​10696](https://redirect.github.com/biomejs/biome/pull/10696)
[`ef2373f`](https://redirect.github.com/biomejs/biome/commit/ef2373f29be15673705884d345c9af189e30b581)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​9566](https://redirect.github.com/biomejs/biome/issues/9566).
Improved how the Biome Language Server loads multiple configuration
files inside a workspace.
- [#​10705](https://redirect.github.com/biomejs/biome/pull/10705)
[`4ccb410`](https://redirect.github.com/biomejs/biome/commit/4ccb410dc00a6fb243934dad2e8681a9d5d9529e)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10652](https://redirect.github.com/biomejs/biome/issues/10652).
Biome plugins are now properly filtered when using `--only` and `--skip`
flags.
- [#​10669](https://redirect.github.com/biomejs/biome/pull/10669)
[`aa0a6eb`](https://redirect.github.com/biomejs/biome/commit/aa0a6eb8007493961cd578f04201248c15fd809a)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Fixed
[#​10651](https://redirect.github.com/biomejs/biome/issues/10651):
[useInlineScriptId](https://biomejs.dev/linter/rules/use-inline-script-id/)
now correctly trims trivia to detect if an id attribute has been set.
- [#​10689](https://redirect.github.com/biomejs/biome/pull/10689)
[`844b1be`](https://redirect.github.com/biomejs/biome/commit/844b1be60ded28bf4c650d85806919ceb57bc402)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10658](https://redirect.github.com/biomejs/biome/issues/10658).
The issue was caused by the "Go-to definition" editor feature, which was
enabled by default. The feature is now **disabled by default**. To work,
the feature triggers the scanner to build the module graph. This caused
memory leak issues in cases where Biome starts in the home directory to
modify files.
If you relied on this new feature, you must now turn on using the
\[editor settings] of the extension e.g.
[Zed](https://biomejs.dev/reference/zed/#goto_definition) and
[VSCode](https://biomejs.dev/reference/vscode/#biomegotodefinition).
- [#​10695](https://redirect.github.com/biomejs/biome/pull/10695)
[`043fbb5`](https://redirect.github.com/biomejs/biome/commit/043fbb514f1b96c5b723cd86c8db4b9bc9f03631)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10674](https://redirect.github.com/biomejs/biome/issues/10674).
Biome now throws an error when the field `level` is missing from a rule
option.
- [#​10712](https://redirect.github.com/biomejs/biome/pull/10712)
[`5941df2`](https://redirect.github.com/biomejs/biome/commit/5941df2a0d6904e487e73d4dc7231dcaf7b3a2f0)
Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! -
Improved the diagnostic and the documentation of
[`useFlatMap`](https://biomejs.dev/linter/rules/use-flat-map/).
- [#​10615](https://redirect.github.com/biomejs/biome/pull/10615)
[`23814f1`](https://redirect.github.com/biomejs/biome/commit/23814f1ad8430df906a39323ee31d27d7b9ca17b)
Thanks [@​qwertycxz](https://redirect.github.com/qwertycxz)! -
Improved the DX the JSON schema when it's used by certain code editors
like VSCode.
- [#​10688](https://redirect.github.com/biomejs/biome/pull/10688)
[`ec69489`](https://redirect.github.com/biomejs/biome/commit/ec694896a0c75176aca040392e3309df1b2e963d)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed a bug where the Biome Daemon did not correctly shut down when the
editor was closed during an in-progress operation, especially while
scanning.
- [#​10701](https://redirect.github.com/biomejs/biome/pull/10701)
[`6c2e0d7`](https://redirect.github.com/biomejs/biome/commit/6c2e0d7bba1cbc457a42adf6c982a773bc7e4605)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10694](https://redirect.github.com/biomejs/biome/issues/10694).
The Biome Language Server no longer prints an error when the user hovers
a variable imported from node\_modules.
- [#​10681](https://redirect.github.com/biomejs/biome/pull/10681)
[`888515b`](https://redirect.github.com/biomejs/biome/commit/888515b088cde688a95680362a619221c023f9d0)
Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! - Fixed
[`useExportType`](https://biomejs.dev/linter/rules/use-export-type/)
that reported useless details in some diagnostics.
- [#​10220](https://redirect.github.com/biomejs/biome/pull/10220)
[`3694a13`](https://redirect.github.com/biomejs/biome/commit/3694a135a9976915889988c36d9eb40d679f06e6)
Thanks [@​theBGuy](https://redirect.github.com/theBGuy)! - Fixed
[`useAnchorContent`](https://biomejs.dev/linter/rules/use-anchor-content/)
false positive for `<a>` elements used as render prop values (e.g.
`render={<a href="..." />}`), a pattern where the receiving component
renders its children inside the anchor element.
- [#​10702](https://redirect.github.com/biomejs/biome/pull/10702)
[`98823fb`](https://redirect.github.com/biomejs/biome/commit/98823fb2e70095b09e1ca4bb9733850bbe8ff33f)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Fixed
[#​10612](https://redirect.github.com/biomejs/biome/issues/10612).
The Biome parser now correctly parses processing instructions. The
following SVG doesn't throw errors anymore:
```svg
<?xml version="1.0" encoding="UTF-8" ?>
<svg></svg>
```
###
[`v2.5.0`](https://redirect.github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#250)
[Compare
Source](https://redirect.github.com/biomejs/biome/compare/@biomejs/biome@2.4.16...@biomejs/biome@2.5.0)
##### Minor Changes
- [#​9539](https://redirect.github.com/biomejs/biome/pull/9539)
[`f0615fd`](https://redirect.github.com/biomejs/biome/commit/f0615fdae80fa7257fc1d0448d2027cb1acff46e)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Added a new reporter called `concise`. When `--reporter=concise` is
passed the commands `format`, `lint`, `check` and `ci`, the diagnostics
are printed in a compact manner:
```
! index.ts:2:10: lint/correctness/noUnusedImports: Several of these
imports are unused.
! main.ts:9:7: lint/correctness/noUnusedVariables: This variable f is
unused.
Γ index.ts:8:5: lint/suspicious/noImplicitAnyLet: This variable
implicitly has the any type.
Γ main.ts:2:10: lint/suspicious/noRedeclare: Shouldn't redeclare 'z'.
Consider to delete it or rename it.
```
- [#​9495](https://redirect.github.com/biomejs/biome/pull/9495)
[`2056b23`](https://redirect.github.com/biomejs/biome/commit/2056b23812a17f9c9a9015e5b725faecb04647b5)
Thanks [@​aviraldua93](https://redirect.github.com/aviraldua93)! -
Added the
[`useKeyWithClickEvents`](https://biomejs.dev/linter/rules/use-key-with-click-events/)
a11y lint rule for HTML files (`.html`, `.vue`, `.svelte`, `.astro`).
This is a port of the existing JSX rule. The rule enforces that elements
with an `onclick` handler also have at least one keyboard event handler
(`onkeydown`, `onkeyup`, or `onkeypress`) to ensure keyboard
accessibility.
Inherently keyboard-accessible elements (`<a>`, `<button>`, `<input>`,
`<select>`, `<textarea>`, `<option>`) are excluded, as are elements
hidden from assistive technologies (`aria-hidden`) or with
`role="presentation"` / `role="none"`.
```html
<!-- Invalid: no keyboard handler -->
<div onclick="handleClick()">Click me</div>
<!-- Valid: has keyboard handler -->
<div onclick="handleClick()" onkeydown="handleKeyDown()">Click me</div>
<!-- Valid: inherently keyboard-accessible -->
<button onclick="handleClick()">Submit</button>
```
- [#​9152](https://redirect.github.com/biomejs/biome/pull/9152)
[`9ec8500`](https://redirect.github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Added new nursery lint rule
[`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes/)
for HTML, JSX, and SFC files (Vue, Astro, Svelte). The rule detects CSS
class names used in `class="..."` (or `className`) attributes that are
not defined in any `<style>` block or linked stylesheet reachable from
the file.
```html
<!-- .typo is used but never defined -->
<html>
<head>
<style>
.button {
color: blue;
}
</style>
</head>
<body>
<div class="button typo"></div>
</body>
</html>
```
- [#​9152](https://redirect.github.com/biomejs/biome/pull/9152)
[`9ec8500`](https://redirect.github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Added new nursery lint rule
[`noUnusedClasses`](https://biomejs.dev/linter/rules/no-unused-classes/)
for CSS. The rule detects CSS class selectors that are never referenced
in any HTML or JSX file that imports the stylesheet. This is a
project-domain rule that requires the module graph.
```css
/* styles.css β .ghost is never used in any importing file */
.button {
color: blue;
}
.ghost {
color: red;
}
```
```jsx
/* App.jsx */
import "./styles.css";
export default () => <div className="button" />;
```
- [#​9546](https://redirect.github.com/biomejs/biome/pull/9546)
[`6567efa`](https://redirect.github.com/biomejs/biome/commit/6567efa51ba074436b017e49b1d2d369e7252e74)
Thanks [@​nhedger](https://redirect.github.com/nhedger)! - Added a
`biome upgrade` command for standalone installations. It upgrades
Homebrew installs with `brew upgrade biome`, updates manually installed
binaries from the latest GitHub release, and tells npm users to upgrade
with their package manager instead.
- [#​9716](https://redirect.github.com/biomejs/biome/pull/9716)
[`701767a`](https://redirect.github.com/biomejs/biome/commit/701767a3c4de8bce032933588ef2b6e5e252919f)
Thanks [@​faizkhairi](https://redirect.github.com/faizkhairi)! -
Added the HTML version of the
[`useHeadingContent`](https://biomejs.dev/linter/rules/use-heading-content/)
rule. The rule now enforces that heading elements (`h1`-`h6`) have
content accessible to screen readers in HTML, Vue, Svelte, and Astro
files.
```html
<!-- Invalid: empty heading -->
<h1></h1>
<!-- Invalid: heading hidden from screen readers -->
<h1 aria-hidden="true">invisible content</h1>
<!-- Valid: heading with text content -->
<h1>heading</h1>
<!-- Valid: heading with accessible name -->
<h1 aria-label="Screen reader content"></h1>
```
- [#​9582](https://redirect.github.com/biomejs/biome/pull/9582)
[`f437ef8`](https://redirect.github.com/biomejs/biome/commit/f437ef8b6b0eb8f909d523950cf2c543042083d5)
Thanks [@​rahuld109](https://redirect.github.com/rahuld109)! -
Added the HTML version of the
[`useKeyWithMouseEvents`](https://biomejs.dev/linter/rules/use-key-with-mouse-events/)
rule. The rule now enforces that `onmouseover` is accompanied by
`onfocus` and `onmouseout` is accompanied by `onblur` in HTML, Vue,
Svelte, and Astro files.
```html
<!-- Invalid: onmouseover without onfocus -->
<div onmouseover="handleMouseOver()"></div>
<!-- Valid: onmouseover paired with onfocus -->
<div onmouseover="handleMouseOver()" onfocus="handleFocus()"></div>
```
- [#​9275](https://redirect.github.com/biomejs/biome/pull/9275)
[`1fdbcee`](https://redirect.github.com/biomejs/biome/commit/1fdbceea62d373f24da9c1e5cc0cdd169b573e84)
Thanks [@​ff1451](https://redirect.github.com/ff1451)! - Added the
new assist action
[`useSortedTypeFields`](https://biomejs.dev/assist/actions/use-sorted-type-fields/),
which sorts the fields of GraphQL object types, interface types and
input object types alphabetically, e.g. `name, age, id` becomes `age,
id, name`.
- [#​10561](https://redirect.github.com/biomejs/biome/pull/10561)
[`78075b7`](https://redirect.github.com/biomejs/biome/commit/78075b7c7cb7490c730a96f4ee9776c9e77826e7)
Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! - Added
a new `style` option to
[useExportType](https://biomejs.dev/linter/rules/use-export-type/),
which enforces a style for exporting types.
This is the same option as the one provided by `useImportType`.
- [#​8987](https://redirect.github.com/biomejs/biome/pull/8987)
[`d16e32b`](https://redirect.github.com/biomejs/biome/commit/d16e32b5b971a4ed9cd3bf5098782c8b752af69a)
Thanks [@​DerTimonius](https://redirect.github.com/DerTimonius)! -
Ported the
[`useValidAnchor`](https://biomejs.dev/linter/rules/use-valid-anchor/)
rule to HTML. This rule enforces that all anchors are valid and that
they are navigable elements.
- [#​9533](https://redirect.github.com/biomejs/biome/pull/9533)
[`4d251d4`](https://redirect.github.com/biomejs/biome/commit/4d251d489cfd33a83e42d425476f8d6c66b72d9b)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! - The
`init` command now prints the Biome logo.
- [#​10069](https://redirect.github.com/biomejs/biome/pull/10069)
[`0eb9310`](https://redirect.github.com/biomejs/biome/commit/0eb93109e1f9bfbb20744961681b4f0b9b781ad5)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the
HTML lint rule
[`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/),
which enforces that static, visible elements (such as `<div>`) that have
click handlers use the valid role attribute.
**Invalid**:
```html
<div onclick="myFunction()"></div>
```
- [#​9134](https://redirect.github.com/biomejs/biome/pull/9134)
[`2a43488`](https://redirect.github.com/biomejs/biome/commit/2a434882746d31e1bd3c8e0d711372a539ce88f8)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Added the assist action
[`useSortedPackageJson`](https://biomejs.dev/assist/actions/use-sorted-package-json).
This action organizes package.json fields according to the same
conventions as the popular
[sort-package-json](https://redirect.github.com/keithamus/sort-package-json)
tool.
- [#​9309](https://redirect.github.com/biomejs/biome/pull/9309)
[`7daa18b`](https://redirect.github.com/biomejs/biome/commit/7daa18b07f7ab348942f4cb83b475e6a4b3d1125)
Thanks [@​Bertie690](https://redirect.github.com/Bertie690)! - The
`allowDoubleNegation` option has been added to
[`noImplicitCoercions`](https://biomejs.dev/linter/rules/no-implicit-coercions)
to allow ignoring double negations inside code.
With the option enabled, the following example is considered valid and
is ignored by the rule:
```js
const truthy = !!value;
```
- [#​9700](https://redirect.github.com/biomejs/biome/pull/9700)
[`894f3fb`](https://redirect.github.com/biomejs/biome/commit/894f3fb4c664b12ff9abd1527b535621fe4e22f6)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! - The
Biome Language server now supports the "go-to definition" feature.
When the cursor of the mouse is hovering an entity (variable, CSS class,
type, etc.), and the command <kbd>CTRL</kbd> + click is triggered, the
editor jumps to where this entity is defined, if the language server can
find it.
Here's what Biome is able to resolve:
- Variables and types used in JavaScript modules, defined in the same
file or imported from another module.
- JSX Components used in JavaScript modules, defined in the same file or
imported from another module.
- CSS classes used in JSX and HTML-ish files (Vue, Svelte and Astro),
and defined in CSS files.
- Components used in HTML-ish files and defined in other HTML-ish.
- Variables used in HTML-ish files and defined in the same file or
imported from another module (JavaScript or HTML-ish).
- [#​10070](https://redirect.github.com/biomejs/biome/pull/10070)
[`bae0710`](https://redirect.github.com/biomejs/biome/commit/bae071050f5a9c335b4483ee384f21ac1e6f0b4d)
Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! - Added
the `:STYLE:` group matcher for
[`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/)
that matches style imports.
For example, the following configuration...
```json
{
"assist": {
"actions": {
"source": {
"organizeImports": {
"level": "on",
"options": {
"groups": ["**", "!:STYLE:"],
"sortBareImports": true
}
}
}
}
}
}
```
...places style imports last:
```diff
- import "./style.css"
import A from "./a.js"
+ import "./style.css"
```
- [#​9170](https://redirect.github.com/biomejs/biome/pull/9170)
[`e3107de`](https://redirect.github.com/biomejs/biome/commit/e3107deedcff0f02b61702c6645d89e8d8635b49)
Thanks [@​mdrobny](https://redirect.github.com/mdrobny)! - Added
`bundleDependencies` option to
[NoUndeclaredDependencies](https://biomejs.dev/linter/rules/no-undeclared-dependencies)
rule.
This rule now supports imports of packages that are defined only in
`bundleDependencies` and `bundledDependencies` arrays.
- [#​9547](https://redirect.github.com/biomejs/biome/pull/9547)
[`01f8473`](https://redirect.github.com/biomejs/biome/commit/01f847317820f805698e1b8ba9eaa8fa6c26205c)
Thanks [@​mujpao](https://redirect.github.com/mujpao)! - Added new
assist rule
[`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/)
for HTML, porting the existing JSX rule. This rule enforces sorted HTML
attributes.
**Invalid**
```html
<input type="text" id="name" name="name" />
```
- [#​9366](https://redirect.github.com/biomejs/biome/pull/9366)
[`2ca1117`](https://redirect.github.com/biomejs/biome/commit/2ca1117f1e63f6cd99c0ce8d4b82475625838e2e)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the
`html.parser.vue` configuration option. When enabled, it adds support
for the parsing of Vue in `.html` files. Most Vue users don't need to
enable this option since Vue files typically use the `.vue` extension,
but it can be useful for projects that embed Vue syntax in regular HTML
files.
- [#​9073](https://redirect.github.com/biomejs/biome/pull/9073)
[`74b20ee`](https://redirect.github.com/biomejs/biome/commit/74b20eee556c9acc72ad5ea335b1bf0983d2eb2e)
Thanks [@​chocky335](https://redirect.github.com/chocky335)! -
Added support for applying GritQL plugin rewrites as code actions.
GritQL plugins that use the rewrite operator (`=>`) now produce fixable
diagnostics for JavaScript, CSS, and JSON files. By default, plugin
rewrites are treated as unsafe fixes and require `--write --unsafe` to
apply. Plugin authors can pass `fix_kind = "safe"` to
`register_diagnostic()` to mark a fix as safe, allowing it to be applied
with just `--write`.
**Example plugin** (`useConsoleInfo.grit`):
```grit
language js
`console.log($msg)` as $call where {
register_diagnostic(span = $call, message = "Use console.info instead of
console.log.", severity = "warn", fix_kind = "safe"),
$call => `console.info($msg)`
}
```
Running `biome check --write` applies safe rewrites. Unsafe rewrites
(the default, or `fix_kind = "unsafe"`) still require `--write
--unsafe`.
- [#​9384](https://redirect.github.com/biomejs/biome/pull/9384)
[`f4c9edc`](https://redirect.github.com/biomejs/biome/commit/f4c9edca8f8772a1e65d9e6701fdc3f604a9f3fe)
Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! - Added
the `sortBareImports` option to
[`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/),
which allows bare imports to be sorted within other imports when set to
`false`.
```json
{
"assist": {
"actions": {
"source": {
"organizeImports": {
"level": "on",
"options": { "sortBareImports": true }
}
}
}
}
}
```
```diff
- import "b";
import "a";
+ import "b";
import { A } from "a";
+ import "./file";
import { Local } from "./file";
- import "./file";
```
- [#​8731](https://redirect.github.com/biomejs/biome/pull/8731)
[`e7872bf`](https://redirect.github.com/biomejs/biome/commit/e7872bffba88f60d6c3cb6d0c2dd7a25452a0205)
Thanks [@​siketyan](https://redirect.github.com/siketyan)! - Added
the watch mode (`--watch`) to the CLI for `check`/`format`/`lint`
commands. By enabling this option, Biome will re-run the check
automatically when any file in the workspace has changed after the first
run.
- [#​10106](https://redirect.github.com/biomejs/biome/pull/10106)
[`9b35f78`](https://redirect.github.com/biomejs/biome/commit/9b35f78e183edf44a3d8b7077ebb0c548a7e92f5)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Biome can now format and lint `.svg` files.
- [#​9967](https://redirect.github.com/biomejs/biome/pull/9967)
[`e9b6c17`](https://redirect.github.com/biomejs/biome/commit/e9b6c17cd6f7e870aea68da3b6c6474aa1a9b4f6)
Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added HTML
support for
[`noExcessiveLinesPerFile`](https://biomejs.dev/linter/rules/no-excessive-lines-per-file/).
Biome now reports HTML files that exceed the configured line limit,
including when `skipBlankLines` is enabled.
- [#​9491](https://redirect.github.com/biomejs/biome/pull/9491)
[`b3eb63c`](https://redirect.github.com/biomejs/biome/commit/b3eb63c7e19e6ebd41e463289de098bb003686e1)
Thanks [@​IxxyDev](https://redirect.github.com/IxxyDev)! - Added
the HTML lint rule
[`noAriaUnsupportedElements`](https://biomejs.dev/linter/rules/no-aria-unsupported-elements/).
This rule enforces that elements that do not support ARIA roles, states,
and properties (`meta`, `html`, `script`, `style`) do not have `role` or
`aria-*` attributes.
```html
<!-- Invalid: meta does not support aria attributes -->
<meta charset="UTF-8" role="meta" />
```
- [#​9306](https://redirect.github.com/biomejs/biome/pull/9306)
[`afd57a6`](https://redirect.github.com/biomejs/biome/commit/afd57a634bdb6b0b161dc8a2522ac460503569b1)
Thanks [@​viraxslot](https://redirect.github.com/viraxslot)! -
Added the
[`noNoninteractiveTabindex`](https://biomejs.dev/linter/rules/no-noninteractive-tabindex/)
lint rule for HTML. This rule enforces that `tabindex` is not used on
non-interactive elements, as it can cause usability issues for keyboard
users.
```html
<div tabindex="0">Invalid: non-interactive element</div>
`
```
- [#​9276](https://redirect.github.com/biomejs/biome/pull/9276)
[`6d041d9`](https://redirect.github.com/biomejs/biome/commit/6d041d919e06595553093e084e6aad0d39fb8109)
Thanks [@​IxxyDev](https://redirect.github.com/IxxyDev)! - Added
the HTML lint rule
[`noRedundantRoles`](https://biomejs.dev/linter/rules/no-redundant-roles/).
This rule enforces that explicit `role` attributes are not the same as
the implicit/default role of an HTML element. It supports HTML, Vue,
Svelte, and Astro files.
```html
<!-- Invalid: role="button" is redundant on <button> -->
<button role="button"></button>
```
- [#​9813](https://redirect.github.com/biomejs/biome/pull/9813)
[`69aadc2`](https://redirect.github.com/biomejs/biome/commit/69aadc27741bb8a74c926e14a2a9777064cb1e03)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Added a new linter configuration called `preset`. With the new option,
users can enable different kinds of rules at once.
The following presets are available:
- `"recommended"`: it enables all Biome-recommended rules, or
recommended rules of a group;
- `"all"`: it enables all Biome rules, or enables all rules of a group;
- `"none"`: it disables all Biome rules, or disable all rules of a
group.
You can enable recommended rules:
```json
{
"linter": {
"rules": {
"preset": "recommended"
}
}
}
```
You can enable **all rules** at once:
```json5
{
linter: {
rules: {
preset: "all", // enables all rules
},
},
}
```
Or enable all rules for a group:
```json5
{
linter: {
rules: {
style: {
preset: "all", // enables all rules in the style group
},
},
},
}
```
This new option, however, doesn't affect how nursery rules work. Nursery
rules must be enabled singularly, due to their nature.
This new option is meant to replace `recommended`, so make sure to run
the `migrate` command.
- [#​10022](https://redirect.github.com/biomejs/biome/pull/10022)
[`3422d71`](https://redirect.github.com/biomejs/biome/commit/3422d71bc5e9d7f07fd4e7509566427e1591d760)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the
HTML lint rule
[`noNoninteractiveElementToInteractiveRole`](https://biomejs.dev/linter/rules/no-noninteractive-element-to-interactive-role/),
which enforces that interactive ARIA roles are not assigned to
non-interactive HTML elements.
**Invalid**:
```html
<h1 role="checkbox"></h1>
```
- [#​8396](https://redirect.github.com/biomejs/biome/pull/8396)
[`13785fc`](https://redirect.github.com/biomejs/biome/commit/13785fc8f4be068eccff84a8ad90ac8530d5c992)
Thanks [@​apple-yagi](https://redirect.github.com/apple-yagi)! -
Biome now supports pnpm catalogs (default and named) when resolving
dependencies for linting. This behavior is opt-in and requires setting
`javascript.resolver.experimentalPnpmCatalogs` to `true`.
- [#​10028](https://redirect.github.com/biomejs/biome/pull/10028)
[`1009414`](https://redirect.github.com/biomejs/biome/commit/100941409f3ec5e6653e92b2cfbb4100df1becb0)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the
HTML lint rule
[`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/),
which enforces that non-interactive ARIA roles are not assigned to
interactive HTML elements.
**Invalid**:
```html
<input role="img" />
```
- [#​9853](https://redirect.github.com/biomejs/biome/pull/9853)
[`816302f`](https://redirect.github.com/biomejs/biome/commit/816302f8c8c9862585c283fce22ffd1817dedf9f)
Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the
new assist action
[`useSortedSelectionSet`](https://biomejs.dev/assist/actions/use-sorted-selection-set/),
which sorts GraphQL selection sets alphabetically, e.g. `name, age, id`
becomes `age, id, name`.
**Invalid**:
```graphql
query {
name
age
id
}
```
- [#​10074](https://redirect.github.com/biomejs/biome/pull/10074)
[`9c7c6eb`](https://redirect.github.com/biomejs/biome/commit/9c7c6eb99f6880aa87ae0e7aff357e978361c4a3)
Thanks
[@​georgephillips](https://redirect.github.com/georgephillips)! -
Added a `kind` field to the `ImportMatcher` used by the
[`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/)
assist action. The new field selects imports by their syntactic kind and
currently supports `bare` (matching side-effect imports such as `import
"polyfill"`) with optional `!` negation (`!bare`). The matcher composes
with the existing `type` and `source` fields, so users can express
patterns such as "only bare imports that import a CSS file" (`{ "kind":
"bare", "source": "**/*.css" }`).
For example, with the following configuration:
```json
{
"assist": {
"actions": {
"source": {
"organizeImports": {
"level": "on",
"options": {
"sortBareImports": true,
"groups": [
{ "kind": "!bare" },
":BLANK_LINE:",
{ "kind": "bare" }
]
}
}
}
}
}
}
```
...the following code:
```ts
import "./register-my-component";
import { render } from "react-dom";
import "./polyfill";
import { Button } from "@​/components/Button";
```
...is organized as:
```ts
import { render } from "react-dom";
import { Button } from "@​/components/Button";
import "./polyfill";
import "./register-my-component";
```
- [#​9171](https://redirect.github.com/biomejs/biome/pull/9171)
[`ce65710`](https://redirect.github.com/biomejs/biome/commit/ce65710f591eb2676df6833e9cd00e310981692b)
Thanks [@​chocky335](https://redirect.github.com/chocky335)! -
Added `includes` option for plugin file scoping. Plugins can now be
configured with glob patterns to restrict which files they run on. Use
negated globs for exclusions.
```json
{
"plugins": [
"global-plugin.grit",
{
"path": "scoped-plugin.grit",
"includes": ["src/**/*.ts", "!**/*.test.ts"]
}
]
}
```
- [#​9617](https://redirect.github.com/biomejs/biome/pull/9617)
[`dcb99ef`](https://redirect.github.com/biomejs/biome/commit/dcb99ef0305d8431af40b526c449316bb8a70efa)
Thanks [@​faizkhairi](https://redirect.github.com/faizkhairi)! -
Ported
[`useAriaActivedescendantWithTabindex`](https://biomejs.dev/linter/rules/use-aria-activedescendant-with-tabindex/)
a11y rule to HTML.
- [#​9496](https://redirect.github.com/biomejs/biome/pull/9496)
[`1dfb829`](https://redirect.github.com/biomejs/biome/commit/1dfb8291a0a2340e7c9220f9126317a7490ec466)
Thanks [@​aviraldua93](https://redirect.github.com/aviraldua93)! -
Added HTML support for the
[`noAriaHiddenOnFocusable`](https://biomejs.dev/linter/rules/no-aria-hidden-on-focusable/)
accessibility lint rule, which enforces that `aria-hidden="true"` is not
set on focusable elements. Focusable elements include native interactive
elements (`<button>`, `<input>`, `<select>`, `<textarea>`), elements
with `href` (`<a>`, `<area>`), elements with `tabindex >= 0`, and
editing hosts (`contenteditable`). Includes an unsafe fix to remove the
`aria-hidden` attribute.
```html
<!-- Invalid: aria-hidden on a focusable element -->
<button aria-hidden="true">Submit</button>
<!-- Valid: aria-hidden on a non-focusable element -->
<div aria-hidden="true">decorative content</div>
```
- [#​9792](https://redirect.github.com/biomejs/biome/pull/9792)
[`f516854`](https://redirect.github.com/biomejs/biome/commit/f51685404f015a5c6f0fc87b9070ac5d9f0a7b6b)
Thanks
[@​Maximiliano-Zeballos](https://redirect.github.com/Maximiliano-Zeballos)!
- Added the
[`useSemanticElements`](https://biomejs.dev/linter/rules/use-semantic-elements/)
lint rule for HTML. The rule now detects the use of `role` attributes in
HTML elements and suggests using semantic elements instead.
For example, the following code is now flagged:
```html
<div role="navigation"></div>
```
The rule suggests using `<nav>` instead.
- [#​9761](https://redirect.github.com/biomejs/biome/pull/9761)
[`cbbb7d5`](https://redirect.github.com/biomejs/biome/commit/cbbb7d5bf21d8fb6db275da7adcc03c034538635)
Thanks
[@​Maximiliano-Zeballos](https://redirect.github.com/Maximiliano-Zeballos)!
- Ported the
[`useValidAriaProps`](https://biomejs.dev/linter/rules/use-valid-aria-props/)
lint rule to HTML. This rule checks that all `aria-*` attributes used in
HTML elements are valid ARIA attributes as defined by the WAI-ARIA
specification.
- [#​9928](https://redirect.github.com/biomejs/biome/pull/9928)
[`aa82576`](https://redirect.github.com/biomejs/biome/commit/aa82576ff66e03924e07729051ac9bfc59cd5aa1)
Thanks [@​aviraldua93](https://redirect.github.com/aviraldua93)! -
Ported
[`useValidAriaValues`](https://biomejs.dev/linter/rules/use-valid-aria-values/)
to HTML. Biome now validates static `aria-*` attribute values in HTML
elements against WAI-ARIA types, catching invalid values such as
`aria-hidden="yes"`.
- [#​10562](https://redirect.github.com/biomejs/biome/pull/10562)
[`6642895`](https://redirect.github.com/biomejs/biome/commit/66428957e6ca393a802f365b8e643438f19a3039)
Thanks [@​ematipico](https://redirect.github.com/ematipico)! -
Promoted 73 nursery rules to stable groups.
Four rules were renamed as part of the promotion:
- `noFloatingClasses` is now
[`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/),
because the rule checks any discarded `new` expression, not only
classes.
- `noMultiStr` is now
[`noMultilineString`](https://biomejs.dev/linter/rules/no-multiline-string/).
- `useFind` is now
[`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/).
- `useSpread` is now
[`useSpreadOverApply`](https://biomejs.dev/linter/rules/use-spread-over-apply/),
because the rule enforces spread call arguments over `Function.apply()`,
not array or object spread.
##### Correctness
Promoted the following rules to the `correctness` group:
-
[`noBeforeInteractiveScriptOutsideDocument`](https://biomejs.dev/linter/rules/no-before-interactive-script-outside-document/)
-
[`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/)
-
[`useInlineScriptId`](https://biomejs.dev/linter/rules/use-inline-script-id/)
(recommended, Next.js domain)
- [`noVueVIfWithVFor`](https://biomejs.
> β **Note**
>
> PR body was truncated to here.
</details>
---
### Configuration
π
**Schedule**: (in timezone America/New_York)
- Branch creation
- "before 6am on monday"
- Automerge
- At any time (no schedule defined)
π¦ **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
β» **Rebasing**: Whenever PR is behind base branch, 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/CodesWhat/drydock).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDIuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI0Mi4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
π§ Changed
- Bumped `@biomejs/biome` from `2.4.16` to `2.5.2`
- Bumped `@types/node` from `25.7.0` to `25.9.4`
- Bumped `lefthook` from `2.1.6` to `2.1.9`
- Bumped `vitest` from `4.1.7` to `4.1.9`
- Updated `vite` override from `8.0.16` to `8.1.3`
- Updated `biome.json` `$schema` URL to `2.5.2`
- Expanded `biome.json` `files.includes` from a compact form into a
multi-line include list with additional explicit negated entries for
docs/public/logo-related assets
- Verify Biome 2.5.2 doesnβt cause unexpected formatter/linter churn in
CI
- Confirm the updated Biome `files.includes` exclusions still target
only the intended assets (avoids accidentally linting/formatting new
files)
- Validate the `vite` override bump to `8.1.3` remains compatible with
the repoβs build/test/dev scripts
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: scttbnsn <80784472+scttbnsn@users.noreply.github.com>
`.planning/` is in `.gitignore` and CLAUDE.md describes it as local-only canonical detail, but three files under it were force-added at some point and have been publishing on every push to both `main` and `dev/v1.6`: - `.planning/ROADMAP.md` (1825 lines) - `.planning/roadmap/current-tracker.md` - `.planning/v1.6.0-MILESTONE-AUDIT.md` The published copies were stale on top of that, so anyone reading the roadmap off GitHub got an out-of-date one. Nothing depends on them being committed. `release-precut-check.mjs` already treats the tracker as optional (ENOENT prints a warning and returns), and `release-cut.yml` documents it as "gitignored β invisible to this runner, which is why it is a local gate, not a job here". The tooling was written for the untracked state all along. `git rm --cached` leaves every local copy in place. ## The guard `git add -f` on an ignored path is silent after the fact β the file stops appearing as untracked, `git status` goes quiet, and it ships from then on. That's how this happened and there was nothing to catch it. `scripts/tracked-ignored-files.test.mjs` asserts the set of tracked-but-gitignored files equals a known allowlist. The eight self-signed test certificates are on it with a note on why they're committed; anything else that becomes tracked-and-ignored fails the `scripts-test` step with the command to fix it. Verified failing on a re-added `.planning/ROADMAP.md` and passing once removed. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Changelog - ποΈ Removed three stale `.planning/` documents from Git tracking (`.planning/ROADMAP.md`, `.planning/roadmap/current-tracker.md`, `.planning/v1.6.0-MILESTONE-AUDIT.md`) while retaining them locally. - β¨ Added `scripts/tracked-ignored-files.test.mjs` to make `scripts-test` fail when the repo tracks any files that are gitignored. - π§ Refined the tracked-ignored guard to evaluate only repository-committed `.gitignore` rules (excluding clone-local and global Git exclude config) and allowlisted eight committed test certificates. - π Securityβ οΈ Updated `postcss` overrides to `8.5.22` across the root and four workspaces (`package.json`, `app/package.json`, `apps/demo/package.json`, `ui/package.json`) to address a reported path-traversal vulnerability and satisfy the `osv-scanner` check. ## Concerns - Ensure any newly introduced tracked-but-gitignored files are resolved via index removal and/or repo ignore/tracking updates (not by expanding the allowlist). <!-- end of auto-generated comment: release notes by coderabbit.ai -->
β¦ckfile (#594) ## What was happening Renovate bumped `ui/package.json` and `apps/web/package.json` and never wrote either lockfile, so `npm ci` rejected both branches: ``` npm error code EUSAGE `npm ci` can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. ``` Every workflow that installs those workspaces died at its own install step β Test & Coverage, Playwright, Cucumber, and the site build β so **one bad lockfile read as four unrelated CI failures**, each minutes into a job, with an error that never names Renovate. A census of the last 200 runs: 46 failures, **40 of them on `renovate/*` branches**, and 24 of the 46 were this single bug. `app/`, `e2e/` and `apps/demo/` were updated correctly in the same sweep, which is why it read as flake. ``` renovate/npm-minor-patch-ui ui/package.json β no lockfile renovate/npm-minor-patch-appsweb apps/web/package.json β no lockfile renovate/npm-minor-patch-e2e e2e/package.json e2e/package-lock.json β fine renovate/npm-minor-patch-app app/package.json app/package-lock.json β fine ``` ## `skipInstalls: false` `skipInstalls` is Renovate's fast path: patch the lockfile directly and skip the install when it believes it can. That is what silently no-opped. Turning it off costs a real npm install per update and is correct every time. **This diagnosis is inferred.** Renovate reported no artifact-update problem in either PR body or on the dependency dashboard, and its run logs are behind the Mend portal. Config validated against the live `renovate-schema.json` β `skipInstalls` accepts `boolean|null`, no unknown keys. ## The guard, which does not depend on that being right `scripts/lockfile-sync.test.mjs` reimplements the comparison `npm ci` makes β lockfile `packages[""]` against `package.json` β across every committed lockfile. It runs in the pre-push hook and as the first CI step after the root install, **before any workspace install**, and names the drifted packages: ``` npm ci will fail with EUSAGE in these workspaces: ui dependencies.vue: package.json=3.5.40 lockfile=3.5.39 Regenerate each one with `npm install --package-lock-only` in that directory and commit the result. ``` Roots come from `git ls-files -- '*package-lock.json'`, so a seventh workspace is covered the day its lockfile lands β no list to keep current. Verified in both directions, and all six current roots are checked. ## Already unblocked I regenerated both lockfiles and pushed them to the bot branches. #485 and #510 are green for the first time in days β `npm ci` in `apps/web` now succeeds and pulls `lefthook@2.1.10`, the bumped version. Those hand-fixes would be overwritten on Renovate's next run; this PR is what makes it stop happening. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Changelog - β¨ Added `scripts/lockfile-sync.test.mjs` to detect dependency drift between tracked `package.json` and `package-lock.json` files. - π§ Changed Renovate to disable `skipInstalls`, ensuring dependency updates regenerate lockfiles. - π§ Changed pre-push and CI checks to run lockfile consistency validation. - π§ Regenerated the `ui` and `apps/web` lockfiles. ## Concerns - Verify all contributors have Node.js and Git available when running the new check. - Confirm lockfile discovery and dependency comparisons support every workspace layout. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Automated sync from Crowdin. Review wording, then merge.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
β¨ Added
- Added locale strings for **Global update mode**
(title/description/options + failure errors) in `configView` across
multiple languages.
- Added locale strings for **Sync Across Devices**
(title/label/description + failure errors) in `configView.appearance`.
- Added/expanded container update workflow i18n: preview-only/dry-run
labels/tooltips/conditions, overridden/revert/revert-all and
skipped-entry messaging, `noSkippedEntries`, `updateInsight`, and a full
structured `updateStatus` (title/buttons/summary/conditions/actions).
- Added new list-view UI strings for audit, notifications, security,
registries, servers, triggers, and watchers (including
`rules.container-unhealthy`, notification bell/template controls,
scanner runtime tool messaging, and various `card` label groups).
- Added `dashboardView.resizeWidget`.
- Added shared UI strings for column picker + data table sorting labels
(`sortBy`, ascending/descending).
- Added localized `appShell.banners.legacyApiPathTitle` banner text
variants using the `{total}` placeholder across supported locales.
π§ Changed
- Restructured locale JSON shapes where required (e.g., `registryLink`
moved to an object form; `containerComponents.updateStatus`
expanded/replaced from the prior smaller structure).
- Improved/standardized copy in shared components and several view
locales (e.g., sorting labels, βfailedβ/other remaining English ->
localized text in some languages).
ποΈ Removed
- Removed duplicated legacy `updateStatus.summary.pinned` entries after
migrating to the larger `updateStatus` structure in multiple locale
files.
β οΈ Concerns
- Many newly added strings are still in Englishβreview and ensure proper
translations per locale.
- Verify JSON key structure matches the consuming code (especially
`containerComponents.updateStatus`, `dashboardView.resizeWidget`, and
nested objects like `registryLink`).
- Confirm interpolation placeholders remain intact and consistent (e.g.,
`{total}`, `{count}`) after restructuring.
- Check for any accidental duplication/missing keys in large
`updateStatus`/`updateInsight` blocks after the pinned-entry removal.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: Scott Benson <80784472+scttbnsn@users.noreply.github.com>
) Implements [discussion #587](#587): fire a notification the moment an update previously withheld by the maturity gate (`maturityMode: mature`) becomes applicable. ## What was happening While an update soaks, `updateAvailable` is suppressed and every notification stays silent. When the window passes, the generic `update-available` notification fires β but only at the next watcher cron tick (default 6-hourly), indistinguishable from a fresh detection, and the whole transition had zero test coverage. ## What this adds - **`maturityGatePendingSince` marker** persisted while an update soaks: reset on candidate-identity change, survives container recreation via the update lifecycle cache, cleared exactly once when the gate opens. - **Detection helper** (`app/maturity/gate-watch.ts`) with clear-flag-first exactly-once semantics; emits for any reason the gate opens (clock elapsed, policy change, override, snooze expiry). - **Sweep scheduler** (`app/maturity/scheduler.ts`): store-only walk (no registry traffic) every 5 minutes by default, `DD_MATURITY_SWEEP_CRON` to tune, empty string disables. Same check also runs inline at every watch cycle and agent report, before report emission. - **`maturity-cleared` notification kind** with its own default templates. Dispatch mirrors `update-available` exactly: respects `THRESHOLD`, `AUTO`, include/exclude, agent scoping, and `once`. Symmetric dedup against `update-available` (both directions, recorded only on confirmed delivery) so one update is never announced twice. Action triggers are unaffected and keep applying updates on their normal scan cadence. - **Audit trail row** (dedupe-windowed) + in-app bell support + en locale labels (other locales via Crowdin). - **Docs** (triggers, update-eligibility, watchers, API) + CHANGELOG entry. ## Tests - App: 394 files / 12,371 tests, 100% coverage on all four metrics; UI: 213 files / 4,303 tests, 100%. - Includes a regression for the previously-untested suppressedβmatured transition (exactly one notification across the maturity-cleared event and the subsequent generic report cycle). Also carries `π security(deps)`: brace-expansion 5.0.7β5.0.8 (CVE-2026-14257) in app/ui/e2e lockfiles β surfaced by the osv-scanner pre-push gate on this branch. ## Follow-ups deliberately not in scope - No dedicated SSE broadcast for the bell (it refreshes on the existing debounced events); can be added later if near-instant bell updates matter. - `AuditView` filter dropdown doesn't list `container-unhealthy`/`agent-reconnect` today either β pre-existing gap, left consistent. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Changelog - β¨ Added persisted `maturityGatePendingSince` container marker with lifecycle-aware stamping, carry-forward, and clearing - β¨ Added `maybeEmitMaturityGateCleared` exactly-once detection that clears the pending marker and emits `maturity-cleared` when the gate opens - β¨ Added cron-driven βmaturity gate sweepβ with configurable, validated `DD_MATURITY_SWEEP_CRON` (`getMaturitySweepConfiguration`) - β¨ Added `maturity-cleared` ordered event plumbing (`emitMaturityGateCleared` / `registerMaturityGateCleared`) - β¨ Added notification rule + templates + dispatch semantics for `maturity-cleared`, including updated delivery-success bookkeeping and once/dedup behavior against `update-available` - β¨ Added audit trail support for `maturity-cleared` with 5-minute deduplication keyed by container identity (fallback to container name) and incorporating `pendingSince` - β¨ Added in-app bell support, English labels, and UI/audit filtering updates for `maturity-cleared` - π§ Updated container/watch/agent processing to run maturity-cleared detection before container report emission (with regression coverage) - π§ Improved notification dispatch/error handling for maturity-cleared emission (isolation and test determinism tweaks) - π Security: Updated `brace-expansion` from 5.0.7 to 5.0.8 across app, UI, and E2E lockfiles (CVE-2026-14257) - π Added extensive regression + full-coverage tests for suppressed-to-matured transition, scheduler behavior, and audit/notification dedup edges ## Concerns - Validate production correctness of exactly-once behavior under concurrent watch cycles and scheduler sweeps (marker clearing vs emit failures) - Confirm dedup key strategy (identity vs container name) and `pendingSince` handling matches intended business semantics - Ensure scheduler enablement/cron validation and overlapping-sweep protection behave as expected in all runtime configurations - Verify `maturity-cleared` notification delivery interactions with existing `update-available` history, retries, and batch flush semantics - Double-check UI bell/audit filtering paths for consistent action-id usage (`maturity-cleared`) and audit query behavior - Confirm all workspace lockfiles for `brace-expansion` are updated consistently and installed dependencies resolve cleanly <!-- end of auto-generated comment: release notes by coderabbit.ai -->
) The Crowdin sync failed on main on 2026-07-24 with a bare `exit 1` and no message. Root cause turned out to be a bug class rather than a one-off, so this fixes both instances of it and adds coverage. ## The pattern Inside a `set -e`/`pipefail` region, a command that exits non-zero on an *empty* result aborts the step before an explicitly written fallback can run. The fallback is dead code. The tell: someone wrote handling for the empty case, and the empty case can't reach it. ## 1. Crowdin base-branch resolution `i18n-crowdin.yml` resolves the highest `dev/vX.Y` on origin and falls back to the default branch when there is none, so translations always have somewhere to land between a GA and the next dev branch being cut. Under `set -euo pipefail` a no-match `grep` exits 1, which fails the pipeline, which fails the assignment, which aborts the step. The `if [ -z ]` fallback below it could never run. It fired for real: merging sync PR #596 briefly deleted `dev/v1.6` via auto-delete-head-branches, the push-to-main sync run found no `dev/v*`, and the job died. Guards the grep only, so a failing `ls-remote` (network, auth) still propagates and fails loudly instead of silently retargeting translations at main. That distinction matters more than the fix itself. ## 2. Load-test report resolution Sweeping the other workflows for the same pattern turned up 8 more sites in `ci-verify.yml`: ``` report="$(find artifacts/load-test/<mode> ... | sort -rn | head -n1 | cut -d' ' -f2-)" ``` `find` exits 0 on a directory that exists but is empty β the case the downstream scripts handle. It exits 1 when the directory is *missing*, and GitHub runs these steps under the default `bash -eo pipefail`, so that aborts the step. `summarize-load-test-report.sh` and `check-load-test-correctness.sh` both open with an `if [ -z "${REPORT}" ]` block written for exactly this, and neither gets to run. Reachable, not theoretical: these steps are `if: always()`, and `run-load-test.sh` only does `mkdir -p` on the artifact dir at line 168 β after the docker build, compose up, and the health-check wait that exits 1 at line 136. A load test that fails the way load tests usually fail leaves the directory absent, and the step meant to explain that dies with a bare exit 1. ## Coverage `crowdin-base-branch-resolver.test.ts` executes the real `id: base` run block extracted from the workflow against a stubbed git, rather than asserting on workflow text, so it tracks the actual logic instead of a copy that can drift. Three cases: no dev branches falls back and exits 0; several picks `dev/v1.10` over `v1.9` (lexical sort gets this wrong); failing `ls-remote` still exits non-zero. That last one guards against "fixing" the bug by swallowing all errors, which would be worse than the bug. Verified it fails against the pre-fix snippet with `expected 1 to be +0`, and that the other two still pass β the bug only affects the one path. `ci-verify-find-pipefail-guard.test.ts` discovers the find sites by walking the parsed workflow rather than pinning line numbers, so it also catches a new unguarded `find` added later. Carries a sanity assertion so it can't pass vacuously if the shape stops matching. Verified it catches a revert by naming the exact offending step. Executing the load-test steps for real would need docker plus Artillery artifacts, so that one is a static assertion by design β noted in a comment in the file. ## Notes - Full pre-push gate green locally, including the 100% coverage gate and zizmor. - Related but separate: `main` is currently failing its scheduled CI Verify on `brace-expansion@5.0.7` (CVE-2026-14257). That is already fixed on `dev/v1.6` at 5.0.8 β it just needs the next dev β main sync, no code change. - Also closed #598 and deleted `l10n_crowdin`; it was cut before #545 landed and had gone conflicting. It regenerates from the dev tip on the next push here. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Changelog - π Fixed Crowdin base-branch resolver so βno matching dev/vX.Yβ correctly falls back to `DEFAULT_BRANCH` under `set -euo pipefail`, while `git ls-remote` failures still propagate. - π Fixed CI load-test report discovery by guarding each `find artifacts/load-test/<site>/...*.json ...` command-substitution pipeline so missing artifact directories donβt abort later empty-report handling under `pipefail`. - π§ Changed `test/cpu-bench.sh` to guard the per-container `grep "^$c "` used to compute stats so missing samples donβt stop the script under `set -euo pipefail`. - β¨ Added Jest coverage for Crowdin fallback behavior, highest `dev/vX.Y` selection, and `ls-remote` error propagation. - β¨ Added static workflow analysis coverage to ensure every load-test report lookup assignment site uses a fully pipefail-safe `find` guard (including later pipeline stages). ## Concerns - Ensure the workflow-scan regex continues to correctly identify the intended `find`-into-variable command-substitution assignments and doesnβt miss new sites. - Verify the static βexpected eight-site countβ remains in sync with the number of load-test report lookup assignments across CI (ci/behavior/stress, summarize/correctness/regression). <!-- end of auto-generated comment: release notes by coderabbit.ai -->
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
π WalkthroughWalkthroughAdds maturity-gate lifecycle tracking through container persistence, gate-clearing events, audit logging, notification delivery, UI support, and a cron-based sweep scheduler. Startup and shutdown now manage the scheduler. Workflow shell commands are guarded against empty results, with static and runtime tests covering the updated behavior. Documentation and notification configuration describe the new Possibly related PRs
π₯ Pre-merge checks | β 2β Passed checks (2 passed)
β¨ Finishing Touchesπ Generate docstrings
π§ͺ Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
biggest-littlest
left a comment
There was a problem hiding this comment.
Routine dev β main sync. Verified the brace-expansion 5.0.8 bump is present in all three lockfiles and the tree matches dev/v1.6.
ALARGECOMPANY
left a comment
There was a problem hiding this comment.
Sync looks right. Throwaway head branch this time, so dev/v1.6 survives the merge.
main and dev both carry a version of the Crowdin base-branch resolver that neither had at their merge base (e4f4be2), because the repo squash-merges and main picked the step up via the #596 squash. A three-way merge reads that as both sides adding the same block and conflicts on it. main is purely behind here: no file exists only on main, and every line it has that dev lacks is the superseded version of something dev changed on purpose (brace-expansion 5.0.7 vs 5.0.8, the unguarded find/grep pipelines, older docs prose). So dev's content wins wholesale, which is what the branch model says a sync is. Resolved with -s ours to keep the tree exactly equal to dev/v1.6.
The merge-base changed after approval.
biggest-littlest
left a comment
There was a problem hiding this comment.
Re-approving after the conflict resolution. Tree matches dev/v1.6 exactly.
ALARGECOMPANY
left a comment
There was a problem hiding this comment.
Re-approving after the -s ours resolution.
There was a problem hiding this comment.
Actionable comments posted: 3
π§Ή Nitpick comments (3)
.github/tests/ci-verify-find-pipefail-guard.test.ts (1)
38-38: π Maintainability & Code Quality | π΅ Trivial | β‘ Quick winCover unquoted command substitutions.
report=$(find ...)is valid shell but bypasses both assertions. Make assignment quotes optional.Proposed fix
-const FIND_ASSIGNMENT_LINE = /^\s*\w+="\$\((.*)\)"\s*$/; +const FIND_ASSIGNMENT_LINE = /^\s*\w+=(?:"\$\((.*)\)"|\$\((.*)\))\s*$/; ... - const inner = match[1].trim(); + const inner = (match[1] ?? match[2]).trim();π€ Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/tests/ci-verify-find-pipefail-guard.test.ts at line 38, Update the FIND_ASSIGNMENT_LINE regex to accept both quoted and unquoted command substitutions in assignments such as report=$(find ...), while preserving the existing matching behavior and assertions for quoted forms.app/triggers/providers/Trigger.test.ts (1)
4373-4377: π Maintainability & Code Quality | π΅ Trivial | β‘ Quick winTriple
await Promise.resolve()hard-codes the microtask depth of the dispatch chain.Repeated four times (Lines 4375, 4447, 4489, 4573). Adding one
awaitinsidedispatchToTriggerOptimisticallysilently breaks all of them. Prefervi.waitForon the assertion, or extract a singleflushMicrotasks()helper so the depth lives in one place.β»οΈ Example
- await Promise.resolve(); - await Promise.resolve(); - await Promise.resolve(); - expect( - notificationHistoryStore.getLastNotifiedHash(trigger.getId(), 'mat-1', 'maturity-cleared'), - ).toBeDefined(); + await vi.waitFor(() => + expect( + notificationHistoryStore.getLastNotifiedHash(trigger.getId(), 'mat-1', 'maturity-cleared'), + ).toBeDefined(), + );π€ Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/triggers/providers/Trigger.test.ts` around lines 4373 - 4377, Replace the repeated Promise.resolve awaits in the affected Trigger tests with vi.waitFor around the dedup-hash assertions, or centralize the microtask flushing in a reusable flushMicrotasks helper. Apply the same change to all four occurrences so tests no longer depend on the dispatchToTriggerOptimistically microtask depth.app/maturity/gate-watch.ts (1)
12-17: π Maintainability & Code Quality | π΅ Trivial | β‘ Quick winDuplicate
hasMaturityGatePendingSincepredicate. Same body copy-pasted in both files; export one copy and import it instead of maintaining two.
app/maturity/gate-watch.ts#L12-L17: export this helper (or relocate it next tohasRawUpdateinmodel/container.ts) and import it fromscheduler.ts.app/maturity/scheduler.ts#L14-L21: drop this local copy and import the shared helper.π€ Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/maturity/gate-watch.ts` around lines 12 - 17, The hasMaturityGatePendingSince predicate is duplicated across maturity modules. In app/maturity/gate-watch.ts lines 12-17, export the existing hasMaturityGatePendingSince helper or relocate it beside hasRawUpdate in model/container.ts; in app/maturity/scheduler.ts lines 14-21, remove the local duplicate and import the shared helper.
π€ Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/store/container.ts`:
- Around line 1441-1459: Update clearMaturityGatePendingSince to clear
maturityGatePendingSince in place on the existing container data object instead
of replacing it with a spread copy. Preserve the derived
updateAvailable/updateKind getters and resultChanged behavior while keeping the
direct update and cache invalidation flow unchanged.
In `@app/triggers/providers/Trigger.ts`:
- Around line 1140-1159: Update the outbox retry delivery path in
dispatchOutboxEntry to call recordEventDeliverySuccess with the retried eventβs
ruleId and container after successful delivery, including maturity-cleared
entries. Preserve the existing failure/requeue behavior and ensure the success
callback records the dedup hashes before the worker completes.
In `@content/docs/current/configuration/watchers/index.mdx`:
- Line 1249: Update the maturityGatePendingSince description to state that
clearing occurs when maybeEmitMaturityGateCleared observes the opened gate
during a subsequent watch cycle or scheduled sweep, rather than immediately when
the gate opens; preserve the existing description of the maturity-cleared
notification and other clearing behavior.
---
Nitpick comments:
In @.github/tests/ci-verify-find-pipefail-guard.test.ts:
- Line 38: Update the FIND_ASSIGNMENT_LINE regex to accept both quoted and
unquoted command substitutions in assignments such as report=$(find ...), while
preserving the existing matching behavior and assertions for quoted forms.
In `@app/maturity/gate-watch.ts`:
- Around line 12-17: The hasMaturityGatePendingSince predicate is duplicated
across maturity modules. In app/maturity/gate-watch.ts lines 12-17, export the
existing hasMaturityGatePendingSince helper or relocate it beside hasRawUpdate
in model/container.ts; in app/maturity/scheduler.ts lines 14-21, remove the
local duplicate and import the shared helper.
In `@app/triggers/providers/Trigger.test.ts`:
- Around line 4373-4377: Replace the repeated Promise.resolve awaits in the
affected Trigger tests with vi.waitFor around the dedup-hash assertions, or
centralize the microtask flushing in a reusable flushMicrotasks helper. Apply
the same change to all four occurrences so tests no longer depend on the
dispatchToTriggerOptimistically microtask depth.
πͺ Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
βΉοΈ Review info
βοΈ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 0e114d54-866c-4312-bbca-42bac0dfe3e7
β Files ignored due to path filters (4)
CHANGELOG.mdis excluded by!CHANGELOG.mdapp/package-lock.jsonis excluded by!**/package-lock.json,!**/package-lock.jsone2e/package-lock.jsonis excluded by!**/package-lock.json,!**/package-lock.jsonui/package-lock.jsonis excluded by!**/package-lock.json,!**/package-lock.json
π Files selected for processing (44)
.github/tests/ci-verify-find-pipefail-guard.test.ts.github/tests/crowdin-base-branch-resolver.test.ts.github/workflows/ci-verify.yml.github/workflows/i18n-crowdin.ymlapp/agent/AgentClient.test.tsapp/agent/AgentClient.tsapp/configuration/index.test.tsapp/configuration/index.tsapp/event/audit-subscriptions.test.tsapp/event/audit-subscriptions.tsapp/event/index.test.tsapp/event/index.tsapp/index.test.tsapp/index.tsapp/maturity/gate-watch.test.tsapp/maturity/gate-watch.tsapp/maturity/scheduler.test.tsapp/maturity/scheduler.tsapp/model/audit.d.tsapp/model/container.test.tsapp/model/container.tsapp/model/maturity-policy.test.tsapp/model/maturity-policy.tsapp/registry/index.test.tsapp/registry/index.tsapp/store/container.test.tsapp/store/container.tsapp/store/notification-history.tsapp/store/notification.tsapp/triggers/providers/Trigger.test.tsapp/triggers/providers/Trigger.tsapp/watchers/providers/docker/container-processing.test.tsapp/watchers/providers/docker/container-processing.tscontent/docs/current/api/index.mdxcontent/docs/current/configuration/actions/update-eligibility.mdxcontent/docs/current/configuration/triggers/index.mdxcontent/docs/current/configuration/watchers/index.mdxe2e/package.jsontest/cpu-bench.shui/src/locales/en/listViews.jsonui/src/stores/notifications.tsui/src/types/container.d.tsui/tests/components/NotificationBell.spec.tsui/tests/stores/notificationStore.spec.ts
| export function clearMaturityGatePendingSince(id: string): boolean { | ||
| const containerDoc = containers.findOne({ | ||
| 'data.id': id, | ||
| }); | ||
| if ( | ||
| !containerDoc || | ||
| !( | ||
| typeof containerDoc.data.maturityGatePendingSince === 'string' && | ||
| containerDoc.data.maturityGatePendingSince.length > 0 | ||
| ) | ||
| ) { | ||
| return false; | ||
| } | ||
| const containerBefore = containerDoc.data; | ||
| containerDoc.data = { ...containerBefore, maturityGatePendingSince: undefined }; | ||
| containers.update(containerDoc); | ||
| invalidateContainersCacheForMutation(containerBefore, containerDoc.data); | ||
| return true; | ||
| } |
There was a problem hiding this comment.
ποΈ Data Integrity & Integration | π Major | β‘ Quick win
π§© Analysis chain
π Script executed:
#!/bin/bash
ast-grep run --pattern 'export function getContainerRaw($$$) { $$$ }' --lang typescript app/store/container.ts
ast-grep run --pattern 'export function getContainer($$$) { $$$ }' --lang typescript app/store/container.ts
rg -nP -C3 'addUpdateAvailableProperty|Object\.defineProperty' app/model/container.tsRepository: CodesWhat/drydock
Length of output: 3615
π Script executed:
#!/bin/bash
set -euo pipefail
echo "== container store relevant sections =="
sed -n '1380,1465p' app/store/container.ts
echo
echo "== validateContainer and property decorators =="
sed -n '920,1020p' app/model/container.ts
echo
echo "== search invalidateContainersCacheForMutation usages and update paths =="
rg -n "invalidateContainersCacheForMutation|validateContainer\\(|containerDoc\\.data =|update\\(|containers\\." app/store/container.ts -A 3 -B 3
echo
echo "== direct JS semantics probe =="
node - <<'JS'
class C {}
const obj = Object.defineProperties(Object.create(C.prototype), {
updateAvailable: { get() { return 'derived'; }, enumerable: true },
resultChanged: { value: () => 'changed', enumerable: false },
maturityGatePendingSince: { value: 'since', enumerable: true },
});
const spread = { ...obj, maturityGatePendingSince: undefined };
console.log(JSON.stringify({
spreadOwnKeys: Object.keys(spread),
spreadUpdateAvailable: spread.updateAvailable,
spreadHasOwnUpdateAvailable: Object.prototype.hasOwnProperty.call(spread, 'updateAvailable'),
spreadHasOwnPropertyResultChanged: Object.prototype.hasOwnProperty.call(spread, 'resultChanged'),
}, null, 2));
JSRepository: CodesWhat/drydock
Length of output: 12394
Use an in-place marker clear.
This helper intentionally bypasses updateContainer()βs revalidation, but the current spread turns derived updateAvailable/updateKind getters into plain own properties and drops resultChanged, so the stored doc becomes a stale snapshot.
Proposed fix
- const containerBefore = containerDoc.data;
- containerDoc.data = { ...containerBefore, maturityGatePendingSince: undefined };
+ const containerBefore = { ...containerDoc.data };
+ containerDoc.data.maturityGatePendingSince = undefined;
containers.update(containerDoc);
- invalidateContainersCacheForMutation(containerBefore, containerDoc.data);
+ invalidateContainersCacheForMutation(containerBefore, containerDoc.data);π Committable suggestion
βΌοΈ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export function clearMaturityGatePendingSince(id: string): boolean { | |
| const containerDoc = containers.findOne({ | |
| 'data.id': id, | |
| }); | |
| if ( | |
| !containerDoc || | |
| !( | |
| typeof containerDoc.data.maturityGatePendingSince === 'string' && | |
| containerDoc.data.maturityGatePendingSince.length > 0 | |
| ) | |
| ) { | |
| return false; | |
| } | |
| const containerBefore = containerDoc.data; | |
| containerDoc.data = { ...containerBefore, maturityGatePendingSince: undefined }; | |
| containers.update(containerDoc); | |
| invalidateContainersCacheForMutation(containerBefore, containerDoc.data); | |
| return true; | |
| } | |
| export function clearMaturityGatePendingSince(id: string): boolean { | |
| const containerDoc = containers.findOne({ | |
| 'data.id': id, | |
| }); | |
| if ( | |
| !containerDoc || | |
| !( | |
| typeof containerDoc.data.maturityGatePendingSince === 'string' && | |
| containerDoc.data.maturityGatePendingSince.length > 0 | |
| ) | |
| ) { | |
| return false; | |
| } | |
| const containerBefore = { ...containerDoc.data }; | |
| containerDoc.data.maturityGatePendingSince = undefined; | |
| containers.update(containerDoc); | |
| invalidateContainersCacheForMutation(containerBefore, containerDoc.data); | |
| return true; | |
| } |
π€ Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/store/container.ts` around lines 1441 - 1459, Update
clearMaturityGatePendingSince to clear maturityGatePendingSince in place on the
existing container data object instead of replacing it with a spread copy.
Preserve the derived updateAvailable/updateKind getters and resultChanged
behavior while keeping the direct update and cache invalidation flow unchanged.
| .then( | ||
| () => { | ||
| this.recordEventDeliverySuccess(ruleId, container); | ||
| }, | ||
| (err: unknown) => { | ||
| const errorMessage = Trigger.getErrorMessage(err); | ||
| if (this.shouldSuppressAutoTriggerError(ruleId, container, errorMessage)) { | ||
| this.log.debug(`Suppressed repeated error handling ${ruleId} event (${errorMessage})`); | ||
| } else { | ||
| this.log.warn(`Error handling ${ruleId} event (${errorMessage})`); | ||
| } | ||
| this.log.debug(err); | ||
| enqueueOutboxEntry({ | ||
| eventName: ruleId, | ||
| payload: { container }, | ||
| triggerId, | ||
| containerId: container.id, | ||
| }); | ||
| }, | ||
| ); |
There was a problem hiding this comment.
π― Functional Correctness | π Major | β‘ Quick win
Outbox retry success never records the maturity-cleared dedup hashes.
When trigger() fails here, the entry is queued with eventName: 'maturity-cleared'. If the outbox worker later delivers it via dispatchOutboxEntry (Line 1167), recordEventDeliverySuccess is never called β so the next scan's generic update-available dispatch fires a second notification for the same result hash, which is the exact double-notify the symmetric dedup is there to prevent.
β»οΈ Record on successful outbox delivery
async dispatchOutboxEntry(entry: NotificationOutboxEntry): Promise<void> {
const payload = entry.payload as { container?: Container };
const container = payload?.container;
if (!container) {
throw new Error(`Outbox entry ${entry.id} missing container payload`);
}
await this.trigger(container);
+ this.recordEventDeliverySuccess(entry.eventName as NotificationRuleId, container);
}π Committable suggestion
βΌοΈ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| .then( | |
| () => { | |
| this.recordEventDeliverySuccess(ruleId, container); | |
| }, | |
| (err: unknown) => { | |
| const errorMessage = Trigger.getErrorMessage(err); | |
| if (this.shouldSuppressAutoTriggerError(ruleId, container, errorMessage)) { | |
| this.log.debug(`Suppressed repeated error handling ${ruleId} event (${errorMessage})`); | |
| } else { | |
| this.log.warn(`Error handling ${ruleId} event (${errorMessage})`); | |
| } | |
| this.log.debug(err); | |
| enqueueOutboxEntry({ | |
| eventName: ruleId, | |
| payload: { container }, | |
| triggerId, | |
| containerId: container.id, | |
| }); | |
| }, | |
| ); | |
| async dispatchOutboxEntry(entry: NotificationOutboxEntry): Promise<void> { | |
| const payload = entry.payload as { container?: Container }; | |
| const container = payload?.container; | |
| if (!container) { | |
| throw new Error(`Outbox entry ${entry.id} missing container payload`); | |
| } | |
| await this.trigger(container); | |
| this.recordEventDeliverySuccess(entry.eventName as NotificationRuleId, container); | |
| } |
π€ Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/triggers/providers/Trigger.ts` around lines 1140 - 1159, Update the
outbox retry delivery path in dispatchOutboxEntry to call
recordEventDeliverySuccess with the retried eventβs ruleId and container after
successful delivery, including maturity-cleared entries. Preserve the existing
failure/requeue behavior and ensure the success callback records the dedup
hashes before the worker completes.
| | --- | --- | --- | | ||
| | `result.noUpdateReason` | `string` | When no update is available, explains why (e.g. tag filtering, no newer version found) | | ||
| | `updateDetectedAt` | `string (ISO 8601)` | Drydock's own wall-clock timestamp recorded when it **first** stored a pending update for this container. This is not the image build date or the registry push date. The value is preserved across polls and across container recreation β if a container is redeployed (e.g. via a Portainer stack redeploy or `docker compose down && up`) with the same stable identity and the same update still pending, the original timestamp is carried forward. When no trusted registry publish date is available, the maturity gate uses `updateDetectedAt` as its fallback clock to measure how long an update has been known. | | ||
| | `maturityGatePendingSince` | `string (ISO 8601)` | Set at the moment an update starts being withheld by the [maturity gate](/docs/configuration/actions/update-eligibility) (`maturityMode: mature` and the soak window not yet elapsed); absent otherwise. Preserved across polls and container recreation like `updateDetectedAt`. Cleared silently if the pending update disappears, and cleared the moment the gate opens, which is also what triggers the `maturity-cleared` [notification](/docs/configuration/triggers#event-types). Internal bookkeeping β not something you set directly. | |
There was a problem hiding this comment.
π Maintainability & Code Quality | π‘ Minor | β‘ Quick win
"Cleared the moment the gate opens" overstates the timing.
The store write path deliberately never clears on gate-open (getMaturityGatePendingSince in app/store/container.ts preserves the marker; see the explicit test "write path never auto-clears on gate-open"). Clearing happens when maybeEmitMaturityGateCleared observes it β on the container's next watch cycle or the scheduled sweep.
Proposed wording fix
-Cleared silently if the pending update disappears, and cleared the moment the gate opens, which is also what triggers the `maturity-cleared` [notification](/docs/configuration/triggers#event-types).
+Cleared silently if the pending update disappears, and cleared once the gate opens β detected on the container's next watch cycle or on the scheduled maturity sweep, which is also what triggers the `maturity-cleared` [notification](/docs/configuration/triggers#event-types).As per path instructions, "Documentation content. Review for accuracy against the code, not prose style."
π Committable suggestion
βΌοΈ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| | `maturityGatePendingSince` | `string (ISO 8601)` | Set at the moment an update starts being withheld by the [maturity gate](/docs/configuration/actions/update-eligibility) (`maturityMode: mature` and the soak window not yet elapsed); absent otherwise. Preserved across polls and container recreation like `updateDetectedAt`. Cleared silently if the pending update disappears, and cleared the moment the gate opens, which is also what triggers the `maturity-cleared` [notification](/docs/configuration/triggers#event-types). Internal bookkeeping β not something you set directly. | | |
| | `maturityGatePendingSince` | `string (ISO 8601)` | Set at the moment an update starts being withheld by the [maturity gate](/docs/configuration/actions/update-eligibility) (`maturityMode: mature` and the soak window not yet elapsed); absent otherwise. Preserved across polls and container recreation like `updateDetectedAt`. Cleared silently if the pending update disappears, and cleared once the gate opens β detected on the container's next watch cycle or on the scheduled maturity sweep, which is also what triggers the `maturity-cleared` [notification](/docs/configuration/triggers#event-types). Internal bookkeeping β not something you set directly. | |
π€ Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@content/docs/current/configuration/watchers/index.mdx` at line 1249, Update
the maturityGatePendingSince description to state that clearing occurs when
maybeEmitMaturityGateCleared observes the opened gate during a subsequent watch
cycle or scheduled sweep, rather than immediately when the gate opens; preserve
the existing description of the maturity-cleared notification and other clearing
behavior.
Source: Path instructions
Routine dev β main sync, per the branch model: main only advances by merging from
dev/v1.6, never by taking independent commits.Opened from a throwaway
sync/main-20260726branch rather than fromdev/v1.6directly. Last time (#596) the head wasdev/v1.6itself, and auto-delete-head-branches deleted it on merge β which is what broke the Crowdin sync, since its base resolver then found nodev/v*on origin.What this carries
48 files. Two things worth calling out:
Clears the CVE failing main's scheduled scan.
brace-expansiongoes 5.0.7 β 5.0.8 inapp/,ui/, ande2e/lockfiles, fixing CVE-2026-14257 / GHSA-mh99-v99m-4gvg (medium, DoS via unbounded expansion). 5.0.8 is the fixed version per OSV. This is the sole cause of the "π¬ CI Verify β main" failures on the twice-weekly schedule; the--allqlty gate flags it in all three lockfiles. No code change was needed, dev already had the bump.The pipefail dead-fallback fixes (#599). The Crowdin base-branch resolver and 8 load-test
findpipelines inci-verify.yml, where a command exiting non-zero on an empty result aborted the step before its explicit fallback could run. Both covered by new tests in.github/tests/.Plus the #587 maturity-cleared notification feature and its store/trigger plumbing.
Notes
renovate.jsonstill targetsdev/v1.6, which matches the active dev branch, so the drift guard's bot-target assertion passes.release-cut.ymlasserts.β¨ Added
maturityGatePendingSincelifecycle tracking across containers and persistence.maturity-clearedevents, audit entries, notification rules, templates, deduplication, UI support, and documentation.π§ Changed
find/branch results.brace-expansionupgraded to5.0.8across lockfiles.π Security
Dependency update addresses CVE-2026-14257 / GHSA-mh99-v99m-4gvg.
Verify the synchronized tree matches
dev/v1.6exactly.Confirm
renovate.jsoncontinues targetingdev/v1.6.Ensure no release tag is created by this synchronization.
Validate maturity-cleared notification behavior across watch cycles, scheduled sweeps, deduplication, and failed deliveries.