Commit bc2a29d
chore(deps): update dependency ultracite to v7.9.0 (#67)
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.5.2` →
`2.5.3`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.2/2.5.3)
|

|

|
|
[@opentelemetry/semantic-conventions](https://redirect.github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js))
| [`^1.41.1` →
`^1.42.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2fsemantic-conventions/1.41.1/1.42.0)
|

|

|
| [@radix-ui/react-avatar](https://radix-ui.com/primitives)
([source](https://redirect.github.com/radix-ui/primitives/tree/HEAD/packages/react/avatar))
| [`^1.2.1` →
`^1.2.2`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-avatar/1.2.1/1.2.2)
|

|

|
| [@radix-ui/react-dialog](https://radix-ui.com/primitives)
([source](https://redirect.github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog))
| [`^1.1.18` →
`^1.1.19`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-dialog/1.1.18/1.1.19)
|

|

|
| [@radix-ui/react-dropdown-menu](https://radix-ui.com/primitives)
([source](https://redirect.github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu))
| [`^2.1.19` →
`^2.1.20`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-dropdown-menu/2.1.19/2.1.20)
|

|

|
| [@radix-ui/react-select](https://radix-ui.com/primitives)
([source](https://redirect.github.com/radix-ui/primitives/tree/HEAD/packages/react/select))
| [`^2.3.2` →
`^2.3.3`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-select/2.3.2/2.3.3)
|

|

|
| [@radix-ui/react-tabs](https://radix-ui.com/primitives)
([source](https://redirect.github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs))
| [`^1.1.16` →
`^1.1.17`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-tabs/1.1.16/1.1.17)
|

|

|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`^26.1.0` →
`^26.1.1`](https://renovatebot.com/diffs/npm/@types%2fnode/26.1.0/26.1.1)
|

|

|
| [typescript](https://www.typescriptlang.org/)
([source](https://redirect.github.com/microsoft/TypeScript)) | [`^6.0.3`
→ `^7.0.2`](https://renovatebot.com/diffs/npm/typescript/6.0.3/7.0.2) |

|

|
| [ultracite](https://www.ultracite.ai/)
([source](https://redirect.github.com/haydenbleasel/ultracite)) |
[`7.8.4` →
`7.9.3`](https://renovatebot.com/diffs/npm/ultracite/7.8.4/7.9.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) |

|

|
---
### Release Notes
<details>
<summary>biomejs/biome (@​biomejs/biome)</summary>
###
[`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>`.
</details>
<details>
<summary>open-telemetry/opentelemetry-js
(@​opentelemetry/semantic-conventions)</summary>
###
[`v1.42.0`](https://redirect.github.com/open-telemetry/opentelemetry-js/compare/013c60085b84351a4c1e4e4f79e3dd67c56661cd...f7c090cf5ede9ce81bd8c96a092a0b549ad13c31)
[Compare
Source](https://redirect.github.com/open-telemetry/opentelemetry-js/compare/013c60085b84351a4c1e4e4f79e3dd67c56661cd...f7c090cf5ede9ce81bd8c96a092a0b549ad13c31)
</details>
<details>
<summary>radix-ui/primitives (@​radix-ui/react-avatar)</summary>
###
[`v1.2.2`](https://redirect.github.com/radix-ui/primitives/blob/HEAD/packages/react/avatar/CHANGELOG.md#122)
- Updated dependencies: `@radix-ui/react-context@1.2.0`
</details>
<details>
<summary>radix-ui/primitives (@​radix-ui/react-dialog)</summary>
###
[`v1.1.19`](https://redirect.github.com/radix-ui/primitives/blob/HEAD/packages/react/dialog/CHANGELOG.md#1119)
- Updated dependencies: `@radix-ui/react-dismissable-layer@1.1.15`,
`@radix-ui/primitive@1.1.5`, `@radix-ui/react-context@1.2.0`,
`@radix-ui/react-focus-scope@1.1.12`, `@radix-ui/react-presence@1.1.7`
</details>
<details>
<summary>radix-ui/primitives
(@​radix-ui/react-dropdown-menu)</summary>
###
[`v2.1.20`](https://redirect.github.com/radix-ui/primitives/blob/HEAD/packages/react/dropdown-menu/CHANGELOG.md#2120)
- Fixed menu items, tab triggers, toolbar links, and select items
intercepting `Space`/`Enter` keys that originate from focusable
descendants.
- Updated dependencies: `@radix-ui/primitive@1.1.5`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-menu@2.1.20`
</details>
<details>
<summary>radix-ui/primitives (@​radix-ui/react-select)</summary>
###
[`v2.3.3`](https://redirect.github.com/radix-ui/primitives/blob/HEAD/packages/react/select/CHANGELOG.md#233)
- Fixed a bug in form control components to ensure their values are
updated when their associated form's is reset. This affects
`RadioGroup`, `Slider`, `Select`, and `Switch`.
- Fixed menu items, tab triggers, toolbar links, and select items
intercepting `Space`/`Enter` keys that originate from focusable
descendants.
- Updated dependencies: `@radix-ui/react-dismissable-layer@1.1.15`,
`@radix-ui/primitive@1.1.5`, `@radix-ui/react-context@1.2.0`,
`@radix-ui/react-focus-scope@1.1.12`, `@radix-ui/react-presence@1.1.7`,
`@radix-ui/react-collection@1.1.12`, `@radix-ui/react-popper@1.3.3`
</details>
<details>
<summary>radix-ui/primitives (@​radix-ui/react-tabs)</summary>
###
[`v1.1.17`](https://redirect.github.com/radix-ui/primitives/blob/HEAD/packages/react/tabs/CHANGELOG.md#1117)
- Fixed menu items, tab triggers, toolbar links, and select items
intercepting `Space`/`Enter` keys that originate from focusable
descendants.
- Updated dependencies: `@radix-ui/primitive@1.1.5`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-roving-focus@1.1.15`,
`@radix-ui/react-presence@1.1.7`
</details>
<details>
<summary>microsoft/TypeScript (typescript)</summary>
###
[`v7.0.2`](https://redirect.github.com/microsoft/TypeScript/compare/v6.0.3...2bd066d87f5bafd315be9f40889d0a60b9e58e0b)
[Compare
Source](https://redirect.github.com/microsoft/TypeScript/compare/v6.0.3...2bd066d87f5bafd315be9f40889d0a60b9e58e0b)
</details>
<details>
<summary>haydenbleasel/ultracite (ultracite)</summary>
###
[`v7.9.3`](https://redirect.github.com/haydenbleasel/ultracite/releases/tag/ultracite%407.9.3)
[Compare
Source](https://redirect.github.com/haydenbleasel/ultracite/compare/ultracite@7.9.2...ultracite@7.9.3)
##### Patch Changes
-
[`dc6d760`](https://redirect.github.com/haydenbleasel/ultracite/commit/dc6d760):
Disable the `n/no-unpublished-import` rule in the ESLint core config.
This rule flags imports of packages that aren't listed as published
dependencies, but it produces a lot of false positives in practice, so
it's now turned off.
-
[`15ecfba`](https://redirect.github.com/haydenbleasel/ultracite/commit/15ecfba):
Fix `ultracite init --linter eslint` installing an unusable toolchain.
The generated ESLint config imports `eslint-plugin-storybook`
unconditionally (which requires the `storybook` peer) and the generated
Stylelint config extends `stylelint-config-standard` /
`stylelint-config-idiomatic-order` / `stylelint-prettier`, but none of
those packages were installed — so a fresh ESLint setup failed to load
with "Cannot find package 'storybook'" or "Could not find
stylelint-config-standard". These four packages are now installed with
the ESLint linter.
-
[`2f73a41`](https://redirect.github.com/haydenbleasel/ultracite/commit/2f73a41):
Upgrade to oxlint 1.73.0 and oxfmt 0.58.0, and enable the new lint rules
they introduce: `no-unreachable-loop`, `unicorn/explicit-timer-delay`,
and `unicorn/no-confusing-array-with`.
-
[`83b2783`](https://redirect.github.com/haydenbleasel/ultracite/commit/83b2783):
Add an `[astro]` formatter mapping (`astro-build.astro-vscode`) to the
oxlint VS Code editor settings generated by `ultracite init`, since
oxfmt doesn't format `.astro` files.
-
[`d186c53`](https://redirect.github.com/haydenbleasel/ultracite/commit/d186c53):
Move every JS-plugin-based rule set out of the Oxlint core and framework
presets and into a single opt-in `ultracite/oxlint/js-plugins` preset.
This covers `eslint-plugin-github` and `eslint-plugin-sonarjs`
(previously in core) as well as `oxlint-plugin-react-doctor` (previously
bundled into the `react`, `next`, and `tanstack` presets). The core,
`react`, `next`, and `tanstack` presets now run entirely on Oxlint's
native Rust rules, so new setups no longer install those dependencies
and no longer pay the slower JS-plugin lint pass. To keep the extra
ESLint-parity and React Doctor rules, install `eslint-plugin-github`,
`eslint-plugin-sonarjs`, and `oxlint-plugin-react-doctor` and extend
`ultracite/oxlint/js-plugins` alongside `core` (and your framework
preset).
-
[`057753e`](https://redirect.github.com/haydenbleasel/ultracite/commit/057753e):
Add performance benchmarks for `ultracite check` / `ultracite fix`
across all three providers (oxlint, biome, eslint). A new CI job builds
the PR and its base branch on the same runner, benchmarks them
interleaved, and fails on a statistically significant regression (median
ratio > 1.25x with Mann-Whitney U p < 0.05) so config changes can't
silently slow the linters down again.
###
[`v7.9.2`](https://redirect.github.com/haydenbleasel/ultracite/releases/tag/ultracite%407.9.2)
[Compare
Source](https://redirect.github.com/haydenbleasel/ultracite/compare/ultracite@7.9.1...ultracite@7.9.2)
##### Patch Changes
-
[`c335a1f`](https://redirect.github.com/haydenbleasel/ultracite/commit/c335a1f):
Add `**/node_modules` and `**/.git` to the shared ignore patterns.
oxlint only skips `node_modules` when a `.gitignore` lists it, so in
projects without one, `ultracite fix` would lint and autofix files
inside `node_modules` — corrupting installed packages (e.g. rewriting
`var` enum wrappers in `typescript/lib/typescript.js` to
self-referencing `const`, causing "Cannot access 'Comparison' before
initialization" when oxlint loads eslint-plugin-sonarjs). Fixes
[#​737](https://redirect.github.com/haydenbleasel/ultracite/issues/737).
###
[`v7.9.1`](https://redirect.github.com/haydenbleasel/ultracite/releases/tag/ultracite%407.9.1)
[Compare
Source](https://redirect.github.com/haydenbleasel/ultracite/compare/ultracite@7.9.0...ultracite@7.9.1)
##### Patch Changes
-
[`ecd10cc`](https://redirect.github.com/haydenbleasel/ultracite/commit/ecd10cc):
Disable `sonarjs/no-implicit-dependencies` and
`github/no-implicit-buggy-globals` in the oxlint and ESLint presets.
Both produce false positives through oxlint's JS plugin bridge:
`no-implicit-dependencies` has no dependency-manifest resolution so it
flags builtin (`bun:test`) and workspace imports as missing
dependencies, and `no-implicit-buggy-globals` misreads module-scoped
declarations such as Astro frontmatter as implicit globals.
-
[`c76f59d`](https://redirect.github.com/haydenbleasel/ultracite/commit/c76f59d):
Disable `sonarjs/file-name-differ-from-class` in the oxlint and ESLint
presets. It fires on any file whose name differs from an exported class,
which is noise for the many config and module files that export objects
rather than classes.
-
[`29e30ce`](https://redirect.github.com/haydenbleasel/ultracite/commit/29e30ce):
Fold the github and sonarjs rules into the oxlint core preset. The
standalone `ultracite/oxlint/github` and `ultracite/oxlint/sonarjs`
presets are removed — ultracite ships framework presets, not individual
plugins. Their rules now live in `ultracite/oxlint/core`, so every
oxlint setup gets eslint-plugin-github and eslint-plugin-sonarjs through
oxlint's JS plugin bridge, matching how the ESLint preset already
bundles them into core.
This is a breaking change to generated configs:
`ultracite/oxlint/github` and `ultracite/oxlint/sonarjs` no longer
exist. Re-run `ultracite init` to regenerate `oxlint.config.ts`.
Also fixed: nine sonarjs rules (`async-test-assertions`,
`hooks-before-test-cases`, `no-duplicate-test-title`,
`no-empty-test-title`, `no-floating-point-equality`,
`no-forced-browser-interaction`, `no-trivial-assertions`,
`prefer-specific-assertions`, `super-linear-regex`) that exist in
eslint-plugin-sonarjs but that oxlint's JS plugin bridge does not
register. Naming them made oxlint hard-fail config parsing, which broke
`ultracite fix`/`check` for oxlint projects using the sonarjs preset.
They are omitted from oxlint core (still enabled in the ESLint preset),
and a test now runs oxlint against core to catch this class of
regression.
The React Doctor, github, and sonarjs plugins are installed into your
project's devDependencies at init (as the ESLint plugins already were),
rather than bundled as dependencies of ultracite — oxlint resolves JS
plugin specifiers from the project root, so they must be installed there
directly.
-
[`8a4291f`](https://redirect.github.com/haydenbleasel/ultracite/commit/8a4291f):
Upgrade to Oxlint 1.72.0 and Oxfmt 0.57.0. Oxfmt 0.57 adds native CSS
and GraphQL formatters. The five new non-nursery Oxlint rules from the
1.71/1.72 releases are already covered by the presets (`node/no-sync`,
`node/no-mixed-requires`, `unicorn/prefer-number-coercion`,
`unicorn/max-nested-calls`, `vue/no-async-in-computed-properties`). The
markdown `:::` container-directive fence patch (which keeps `proseWrap:
"never"` from folding fences into prose) was regenerated against the
0.57 bundle.
###
[`v7.9.0`](https://redirect.github.com/haydenbleasel/ultracite/releases/tag/ultracite%407.9.0)
[Compare
Source](https://redirect.github.com/haydenbleasel/ultracite/compare/ultracite@7.8.4...ultracite@7.9.0)
##### Minor Changes
-
[`aea7fc0`](https://redirect.github.com/haydenbleasel/ultracite/commit/aea7fc0):
Update Biome to 2.5.2 and enable the newly-stabilized rules. This adds
coverage for the rules promoted out of nursery in Biome 2.5.0, including
`noShadow`, `noUnnecessaryConditions`, `noUnusedInstantiation` (formerly
`noFloatingClasses`), `useArrayFind`, `useDestructuring`,
`useGlobalThis`, `useErrorCause`, `noNestedPromises`, GraphQL validation
rules, and the recommended Vue/Next.js domain rules.
-
[`2687cf9`](https://redirect.github.com/haydenbleasel/ultracite/commit/2687cf9):
Align the ESLint and Biome presets with the oxlint preset, which is now
the benchmark for rule decisions across linters. ESLint: rules that
oxlint deliberately disables are now off (`no-console`, `no-continue`,
`id-length`, `new-cap`, `max-depth`, `no-implicit-coercion`,
`no-underscore-dangle`, `init-declarations`, `n/no-sync`,
`promise/always-return`, `promise/catch-or-return`,
`import-x/no-commonjs`, `import-x/no-dynamic-require`,
`import-x/no-nodejs-modules`, `import-x/unambiguous`,
`import-x/no-anonymous-default-export`,
`@typescript-eslint/explicit-member-accessibility`,
`@typescript-eslint/explicit-module-boundary-types`,
`@typescript-eslint/no-require-imports`, and the `unicorn` rules
`explicit-length-check`, `max-nested-calls`, `no-process-exit`,
`prefer-global-this`, `prefer-string-raw`, `prefer-top-level-await`);
`consistent-type-definitions` now enforces `interface` instead of
`type`, matching oxlint and Biome; `no-void` allows statement position
to coexist with `no-floating-promises`; `import-x/no-named-as-default`
is enabled; and `curly` and `no-unexpected-multiline` are re-enabled
past `eslint-config-prettier`. Biome: `noAwaitInLoops` and
`noIncrementDecrement` are now errors and the `useSortedKeys` assist is
on (matching `no-await-in-loop`, `no-plusplus`, and `sort-keys` in the
other presets), while `useGlobalThis` is off (matching
`unicorn/prefer-global-this`).
-
[`73c1993`](https://redirect.github.com/haydenbleasel/ultracite/commit/73c1993):
Require ESLint 10 for ESLint setups. The plugin suite upgrade (notably
`eslint-plugin-unicorn` 70 and `eslint-plugin-astro` 2) requires ESLint
10, but `ultracite init` still installed `eslint@^9.0.0`, which crashed
at config load time. Init now installs `eslint@^10.0.0` and
`@eslint/js@^10.0.0`, and the presets are fixed for ESLint 10
compatibility: `settings.react.version` is pinned to `19.0.0` instead of
`"detect"` (detection uses an API removed in ESLint 10),
`react/jsx-filename-extension` and `react/forward-ref-uses-ref` are
disabled (their implementations use removed APIs; the former is already
off in the oxlint preset and the latter is covered by
`react-doctor/no-react19-deprecated-apis`), the react config re-applies
`eslint-config-prettier` so JSX formatting rules stay off (several crash
under ESLint 10), and `import-x/no-unused-modules` is disabled (it is a
warning-emitting no-op under ESLint 10). Note that some plugins
(`eslint-plugin-github`, `eslint-plugin-react`,
`eslint-plugin-jsx-a11y`, `eslint-plugin-solid`,
`@tanstack/eslint-plugin-start`) have not yet updated their declared
peer ranges to include ESLint 10 even though they work at runtime, so
strict package managers may report peer dependency warnings.
-
[`4cfdf3d`](https://redirect.github.com/haydenbleasel/ultracite/commit/4cfdf3d):
Add `eslint-plugin-jsdoc` to the ESLint preset. The oxlint preset
already enforces a set of jsdoc rules, but the ESLint preset had no
jsdoc coverage at all. The plugin is now installed by `ultracite init`
for ESLint setups and enables the same rule selection the oxlint preset
enforces (`check-access`, `check-property-names`, `check-tag-names`,
`empty-tags`, `implements-on-classes`, `no-defaults`, and the
`require-*` description/name/type rules), keeping the two presets in
lockstep.
-
[`0b8fc12`](https://redirect.github.com/haydenbleasel/ultracite/commit/0b8fc12):
Upgrade the ESLint plugin suite and enable the new rules that ship with
it. Notable bumps: `eslint-plugin-unicorn` 64 → 70 (adds a large batch
of new correctness and quality rules), `eslint-plugin-astro` 1 → 2 (adds
`no-omitted-end-tags`, now requires ESLint 10), `eslint-plugin-sonarjs`
4.0 → 4.1 (adds test-assertion and ReDoS rules like
`super-linear-regex`), `eslint-plugin-svelte` 3.19 → 3.20 (adds
`no-at-const-tags`), plus `@typescript-eslint`,
`eslint-plugin-import-x`, `eslint-plugin-n`, `@vitest/eslint-plugin`,
and others. Two Unicorn rules that were renamed are re-mapped in the
config (`prefer-dom-node-dataset` → `dom-node-dataset`,
`prevent-abbreviations` → `name-replacements`). Two new Unicorn rules
are disabled: `prefer-temporal` (since `Temporal` still lacks broad
runtime support) and `no-asterisk-prefix-in-documentation-comments` (it
fights the conventional JSDoc comment style).
-
[`4440393`](https://redirect.github.com/haydenbleasel/ultracite/commit/4440393):
Bring the oxlint preset closer to ESLint parity with two new presets
that run ESLint plugins through oxlint's JS plugin support:
`ultracite/oxlint/github` (eslint-plugin-github) and
`ultracite/oxlint/sonarjs` (eslint-plugin-sonarjs, 187 rules —
type-aware rules are excluded since the JS plugin bridge provides no
type information, and `no-reference-error` is off because the bridge
provides no globals). `ultracite init` now adds both presets to
generated oxlint configs and installs the two plugins; existing configs
are untouched until the next `init`, and either preset can be dropped
from `extends` to opt out (the plugins add roughly 1–3s to a lint run
for the JS runtime bridge). Rule decisions mirror the oxlint benchmark
in both directions: the ESLint preset now disables `sonarjs/file-header`
(it errored on every file), `sonarjs/arrow-function-convention` (fights
the formatter), `sonarjs/cyclomatic-complexity`, `sonarjs/max-lines`,
`sonarjs/max-lines-per-function`, `sonarjs/nested-control-flow`
(duplicates of core rules the preset disables),
`sonarjs/shorthand-property-grouping` (conflicts with `sort-keys`), and
`github/no-dataset` (conflicts with `unicorn/prefer-dom-node-dataset`),
and sets `sonarjs/cognitive-complexity` to 20 to match Biome's
`noExcessiveCognitiveComplexity`. Switching linters with `init` no
longer removes dependencies that the newly selected linter still needs.
-
[`f7025b1`](https://redirect.github.com/haydenbleasel/ultracite/commit/f7025b1):
Extend cross-linter parity to the framework presets and add an automated
parity check. The oxlint react preset now explicitly lists all 102
non-nursery react/react-perf/jsx-a11y rules (previously only \~20 were
configured, so most a11y and correctness rules silently never ran) and
the next preset lists all 21 nextjs rules, with decisions matching the
ESLint presets. The revived exhaustiveness test (the `oxlint --rules`
markdown output it parsed is empty as of oxlint 1.72, so it was passing
vacuously) also caught five newly stabilized rules which are now
enabled: `getter-return`, `no-unreachable`, `oxc/branches-sharing-code`,
`unicorn/prefer-export-from`, and `unicorn/prefer-single-call`. ESLint
preset fixes that fell out of the audit: `no-loss-of-precision` and
`no-duplicate-imports` are re-enabled for TypeScript files (their
`@typescript-eslint` twins were removed in v8, leaving TS uncovered),
`no-duplicate-imports` gets `allowSeparateTypeImports` to match oxlint,
the react/vue configs now only re-apply the `react/`-`vue/`-prefixed
entries of `eslint-config-prettier` so they can't clobber unrelated
rules, the svelte preset keeps the formatting rules disabled that
`eslint-plugin-svelte`'s own prettier preset lists, and `astro/semi` is
off (Prettier owns formatting). A new `compare-rule-parity` script runs
as part of `validate:configs`: it resolves the effective ESLint rule
sets with ESLint's own config resolution, normalizes names to oxlint's,
and fails on any divergence not recorded in an explicit allowlist —
currently just two entries (`sonarjs/no-reference-error`,
`unicorn/number-literal-case`), both with documented reasons.
-
[`223233f`](https://redirect.github.com/haydenbleasel/ultracite/commit/223233f):
Add [React Doctor](https://www.react.doctor) rules to the ESLint and
Oxlint React, Next.js, and TanStack presets. This enables React Doctor's
own rules — the "You Might Not Need an Effect" family
(`no-fetch-in-effect`, `no-derived-state`, `no-mirror-prop-effect`,
etc.) plus its render-performance, hydration, server-component,
security, and framework-specific rules — via
`eslint-plugin-react-doctor` and the `oxlint-plugin-react-doctor` JS
plugin. Rules that React Doctor ports from `eslint-plugin-react`,
`eslint-plugin-react-hooks`, and `eslint-plugin-jsx-a11y` are
intentionally left off to avoid duplicate diagnostics with the plugins
Ultracite already ships.
##### Patch Changes
-
[`d247ff2`](https://redirect.github.com/haydenbleasel/ultracite/commit/d247ff2):
Migrate stale linter and formatter configuration when switching
toolchains during init. Running `ultracite init` now removes config
files and dependencies for unselected Biome, ESLint/Prettier/Stylelint,
or Oxlint/Oxfmt setups before writing the selected toolchain config.
-
[`e24068b`](https://redirect.github.com/haydenbleasel/ultracite/commit/e24068b):
Sort `package.json` keys when using Biome
</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>
---
### Configuration
📅 **Schedule**: (UTC)
- Branch creation
- Only on Sunday and Saturday (`* * * * 0,6`)
- Automerge
- At any time (no schedule defined)
🚦 **Automerge**: Enabled.
♻ **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/giacomoguidotto/blueprint).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDIuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI0Mi4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBzIl19-->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Giacomo Guidotto <giacomo.guidotto@gmail.com>1 parent 0129396 commit bc2a29d
3 files changed
Lines changed: 236 additions & 57 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
11 | 19 | | |
12 | 20 | | |
13 | 21 | | |
| |||
18 | 26 | | |
19 | 27 | | |
20 | 28 | | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
21 | 37 | | |
| 38 | + | |
| 39 | + | |
22 | 40 | | |
23 | 41 | | |
24 | 42 | | |
| |||
30 | 48 | | |
31 | 49 | | |
32 | 50 | | |
33 | | - | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
34 | 57 | | |
35 | 58 | | |
36 | 59 | | |
| |||
0 commit comments