This PR contains the following updates: | Package | Update | Change | |---|---|---| | [biome](https://redirect.github.com/biomejs/biome) | patch | `2.4.7` → `2.4.9` | | [just](https://redirect.github.com/casey/just) | minor | `1.47.0` → `1.48.0` | | [uv](https://redirect.github.com/astral-sh/uv) | minor | `0.10.10` → `0.11.1` | --- ### Release Notes <details> <summary>biomejs/biome (biome)</summary> ### [`v2.4.9`](https://redirect.github.com/biomejs/biome/releases/tag/%40biomejs/biome%402.4.9): Biome CLI v2.4.9 ##### 2.4.9 ##### Patch Changes - [#​9315](https://redirect.github.com/biomejs/biome/pull/9315) [`085d324`](085d324b96) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Added a new nursery CSS rule [`noDuplicateSelectors`](https://biomejs.dev/linter/rules/no-duplicate-selectors/), that disallows duplicate selector lists within the same at-rule context. For example, the following snippet triggers the rule because the second selector and the first selector are the same: ```css /* First selector */ .x .y .z { } /* Second selector */ .x { .y { .z { } } } ``` - [#​9567](https://redirect.github.com/biomejs/biome/pull/9567) [`b7ab931`](b7ab931be1) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​7211](https://redirect.github.com/biomejs/biome/issues/7211): [`useOptionalChain`](https://biomejs.dev/linter/rules/use-optional-chain/) now detects negated logical OR chains. The following code is now considered invalid: ```js !foo || !foo.bar; ``` - [#​8670](https://redirect.github.com/biomejs/biome/pull/8670) [`607ebf9`](607ebf9eac) Thanks [@​tt-a1i](https://redirect.github.com/tt-a1i)! - Fixed [#​8345](https://redirect.github.com/biomejs/biome/issues/8345): [`useAdjacentOverloadSignatures`](https://biomejs.dev/linter/rules/use-adjacent-overload-signatures/) no longer reports false positives for static and instance methods with the same name. Static methods and instance methods are now treated as separate overload groups. ```ts class Kek { static kek(): number { return 0; } another(): string { return ""; } kek(): number { return 1; } // no longer reported as non-adjacent } ``` - [#​9476](https://redirect.github.com/biomejs/biome/pull/9476) [`97b80a8`](97b80a8b01) Thanks [@​masterkain](https://redirect.github.com/masterkain)! - Fixed [`#9475`](https://redirect.github.com/biomejs/biome/issues/9475): Fixed a panic when Biome analyzed ambient TypeScript modules containing class constructor, getter, or setter signatures that reference local type aliases. Biome now handles these declarations without crashing during semantic analysis. - [#​9553](https://redirect.github.com/biomejs/biome/pull/9553) [`0cd5298`](0cd5298fec) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed a bug where enabling the rules of a whole group, would enable rules that belonged to a domain under the same group. For example, `linter.rules.correctness = "error"` no longer enables React- or Qwik-specific correctness rules unless `linter.domains.react`, `linter.domains.qwik`, or an explicit rule config also enables them, or their relative dependencies are installed. - [#​9586](https://redirect.github.com/biomejs/biome/pull/9586) [`4cafb71`](4cafb71b99) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed [#​8828](https://redirect.github.com/biomejs/biome/issues/8828): Grit patterns using `export { $foo } from $source` now match named re-exports in JavaScript and TypeScript files. - [#​9550](https://redirect.github.com/biomejs/biome/pull/9550) [`d4e3d6e`](d4e3d6e924) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed [#​9548](https://redirect.github.com/biomejs/biome/issues/9548): Biome now parses conditional expressions whose consequent is an arrow function returning a parenthesized object expression. - [#​8696](https://redirect.github.com/biomejs/biome/pull/8696) [`a7c19cc`](a7c19ccfeb) Thanks [@​Faizanq](https://redirect.github.com/Faizanq)! - Fixed [#​8685](https://redirect.github.com/biomejs/biome/issues/8685) where `noUselessLoneBlockStatements` would remove empty blocks containing comments. The rule now preserves these blocks since comments may contain important information like TODOs or commented-out code. - [#​9557](https://redirect.github.com/biomejs/biome/pull/9557) [`6671ac5`](6671ac5b4d) Thanks [@​datalek](https://redirect.github.com/datalek)! - Fixed [#​9557](https://redirect.github.com/biomejs/biome/pull/9557): Biome's LSP server no longer crashes on startup when used with editors that don't send `workspaceFolders` during initialization. This affected any LSP client that only sends `rootUri`, which is valid per the LSP specification. - [#​9455](https://redirect.github.com/biomejs/biome/pull/9455) [`1710cf1`](1710cf1f0e) Thanks [@​omar-y-abdi](https://redirect.github.com/omar-y-abdi)! - Fixed [#​9174](https://redirect.github.com/biomejs/biome/issues/9174): [`useExpect`](https://biomejs.dev/linter/rules/use-expect/) now correctly rejects [asymmetric matchers](https://vitest.dev/api/expect.html#expect-stringcontaining) in Vitest or Jest like `expect.stringContaining()`, `expect.objectContaining()`, and utilities like `expect.extend()` that are not valid assertions. Previously these constructs caused false negatives, allowing tests without real assertions to pass the lint rule. - [#​9584](https://redirect.github.com/biomejs/biome/pull/9584) [`956e367`](956e367814) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed a bug where Vue directive attribute values like `v-bind:class="{'dynamic': true}"` were incorrectly parsed as JavaScript statements instead of expressions. Object literals inside directive values like `:class`, `v-if`, and `v-html` are now correctly parsed as expressions, preventing spurious parse errors. - [#​9474](https://redirect.github.com/biomejs/biome/pull/9474) [`e168494`](e1684948ce) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Added the new nursery rule [`noUntrustedLicenses`](https://biomejs.dev/linter/rules/no-untrusted-licenses/). This rule disallows dependencies that ship with invalid licenses or licenses that don't meet the criteria of your project/organisation. The rule has the following options: - `allow`: a list of licenses that can be allowed. Useful to bypass possible invalid licenses from downstream dependencies. - `deny`: a list of licenses that should trigger the rule. Useful to deny licenses that don't fit your project/organisation. When both `deny` and `allow` are provided, `deny` takes precedence. - `requireOsiApproved`: whether the licenses need to be approved by the [Open Source Initiative](https://opensource.org/). - `requireFsfLibre`: whether the licenses need to be approved by the [Free Software Foundation](https://www.gnu.org/licenses/license-list.html). - [#​9544](https://redirect.github.com/biomejs/biome/pull/9544) [`723798b`](723798b7cd) Thanks [@​ViniciusDev26](https://redirect.github.com/ViniciusDev26)! - Added an unsafe fix to [`useConsistentMethodSignatures`](https://biomejs.dev/linter/rules/use-consistent-method-signatures/) that automatically converts between method-style and property-style signatures. - [#​9555](https://redirect.github.com/biomejs/biome/pull/9555) [`8a3647b`](8a3647b52d) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [`#188`](https://redirect.github.com/biomejs/biome-zed/issues/188): the Biome Language Server no longer panics when open files change abruptly, such as during git branch checkouts. - [#​9605](https://redirect.github.com/biomejs/biome/pull/9605) [`f65c637`](f65c637b32) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9589](https://redirect.github.com/biomejs/biome/issues/9589). Now Biome correctly parses object expressions inside props and directives. The following code doesn't emit errors anymore: ```astro <style is:global define:vars={{ bgLight: light }}> <Component name={{ first, name }} /> ``` - [#​9565](https://redirect.github.com/biomejs/biome/pull/9565) [`ccb249e`](ccb249e681) Thanks [@​eyupcanakman](https://redirect.github.com/eyupcanakman)! - Fixed [#​9505](https://redirect.github.com/biomejs/biome/issues/9505): [`noUselessStringConcat`](https://biomejs.dev/linter/rules/no-useless-string-concat/) no longer reports tagged template literals as useless string concatenations. Tagged templates invoke a function and can return non-string values, so combining them with `+` is not equivalent to a single template literal. - [#​9534](https://redirect.github.com/biomejs/biome/pull/9534) [`4d050df`](4d050df5e3) Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the nursery rule [`noInlineStyles`](https://biomejs.dev/linter/rules/no-inline-styles/). The rule disallows the use of inline `style` attributes in HTML and the `style` prop in JSX, including `React.createElement` calls. Inline styles make code harder to maintain and can interfere with Content Security Policy. - [#​9611](https://redirect.github.com/biomejs/biome/pull/9611) [`cddaa44`](cddaa44d3c) Thanks [@​gaauwe](https://redirect.github.com/gaauwe)! - Fixed a regression where Biome LSP could misread editor settings sent through `workspace/didChangeConfiguration` when the payload was wrapped in a top-level `biome` key. This caused `requireConfiguration` and related settings to be ignored in some editors. ##### What's Changed - fix(linter): differentiate static/instance methods in useAdjacentOverloadSignatures by [@​tt-a1i](https://redirect.github.com/tt-a1i) in [#​8670](https://redirect.github.com/biomejs/biome/pull/8670) - fix(parse/js): fix a case where valid js was being interpretted as ts by [@​dyc3](https://redirect.github.com/dyc3) in [#​9550](https://redirect.github.com/biomejs/biome/pull/9550) - fix(lsp): gracefully handle panics by [@​ematipico](https://redirect.github.com/ematipico) in [#​9555](https://redirect.github.com/biomejs/biome/pull/9555) - fix(linter): don't remove empty blocks containing comments by [@​Faizanq](https://redirect.github.com/Faizanq) in [#​8696](https://redirect.github.com/biomejs/biome/pull/8696) - fix(config): don't enable rules with domains when categories are enabled by [@​dyc3](https://redirect.github.com/dyc3) in [#​9553](https://redirect.github.com/biomejs/biome/pull/9553) - fix(lint/useExpect): reject asymmetric matchers and utilities as assertions by [@​omar-y-abdi](https://redirect.github.com/omar-y-abdi) in [#​9455](https://redirect.github.com/biomejs/biome/pull/9455) - chore(deps): update rust crate bpaf to 0.9.24 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9500](https://redirect.github.com/biomejs/biome/pull/9500) - refactor(markdown-parser): decompose `is_inline_html` into predicate-per-construct by [@​jfmcdowell](https://redirect.github.com/jfmcdowell) in [#​9467](https://redirect.github.com/biomejs/biome/pull/9467) - refactor(markdown-parser): decompose `inline_list_source_len` into scan helpers by [@​jfmcdowell](https://redirect.github.com/jfmcdowell) in [#​9468](https://redirect.github.com/biomejs/biome/pull/9468) - fix(deps): update [@​biomejs](https://redirect.github.com/biomejs) packages by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9501](https://redirect.github.com/biomejs/biome/pull/9501) - fix(js-semantic): register ambient signature scopes by [@​masterkain](https://redirect.github.com/masterkain) in [#​9476](https://redirect.github.com/biomejs/biome/pull/9476) - fix(useOptionalChain): fix negated expressions by [@​ematipico](https://redirect.github.com/ematipico) in [#​9567](https://redirect.github.com/biomejs/biome/pull/9567) - docs: fix CONTRIBUTING.md codeblock by [@​Netail](https://redirect.github.com/Netail) in [#​9573](https://redirect.github.com/biomejs/biome/pull/9573) - chore: fix vulnerabilities in dependencies by [@​ematipico](https://redirect.github.com/ematipico) in [#​9576](https://redirect.github.com/biomejs/biome/pull/9576) - fix(lint): skip noUselessStringConcat for tagged templates by [@​eyupcanakman](https://redirect.github.com/eyupcanakman) in [#​9565](https://redirect.github.com/biomejs/biome/pull/9565) - chore(bench/html): add real test fixtures to biome\_html\_analyze benches by [@​dyc3](https://redirect.github.com/dyc3) in [#​9578](https://redirect.github.com/biomejs/biome/pull/9578) - fix(core): correctly parse vue directives as expressions by [@​ematipico](https://redirect.github.com/ematipico) in [#​9584](https://redirect.github.com/biomejs/biome/pull/9584) - feat: apply fix to use consistent method signatures by [@​ViniciusDev26](https://redirect.github.com/ViniciusDev26) in [#​9544](https://redirect.github.com/biomejs/biome/pull/9544) - chore: add eslint-migrate-options skill by [@​dyc3](https://redirect.github.com/dyc3) in [#​9575](https://redirect.github.com/biomejs/biome/pull/9575) - test: refactor formatter testing infra by [@​ematipico](https://redirect.github.com/ematipico) in [#​9588](https://redirect.github.com/biomejs/biome/pull/9588) - feat(analyze): implement noInlineStyles by [@​Netail](https://redirect.github.com/Netail) in [#​9534](https://redirect.github.com/biomejs/biome/pull/9534) - chore(deps): update docker/dockerfile:1 docker digest to [`4a43a54`](https://redirect.github.com/biomejs/biome/commit/4a43a54) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9590](https://redirect.github.com/biomejs/biome/pull/9590) - chore(deps): update rust:1.94.0-bullseye docker digest to [`1695019`](https://redirect.github.com/biomejs/biome/commit/1695019) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9591](https://redirect.github.com/biomejs/biome/pull/9591) - chore(deps): update rust:1.94.0-trixie docker digest to [`f17e723`](https://redirect.github.com/biomejs/biome/commit/f17e723) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9593](https://redirect.github.com/biomejs/biome/pull/9593) - fix(deps): update dependency tailwindcss to ^4.2.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9594](https://redirect.github.com/biomejs/biome/pull/9594) - chore(deps): update dependency eslint to v9.39.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9497](https://redirect.github.com/biomejs/biome/pull/9497) - chore(deps): update dependency [@​types/node](https://redirect.github.com/types/node) to v24.12.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9595](https://redirect.github.com/biomejs/biome/pull/9595) - chore(deps): update dependency dprint to v0.53.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9596](https://redirect.github.com/biomejs/biome/pull/9596) - chore(deps): update github-actions by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9598](https://redirect.github.com/biomejs/biome/pull/9598) - chore(deps): update pnpm to v10.32.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9599](https://redirect.github.com/biomejs/biome/pull/9599) - ci: fix failure by [@​ematipico](https://redirect.github.com/ematipico) in [#​9603](https://redirect.github.com/biomejs/biome/pull/9603) - fix(lsp): crash when client does not send workspaceFolders in InitializeParams by [@​datalek](https://redirect.github.com/datalek) in [#​9557](https://redirect.github.com/biomejs/biome/pull/9557) - fix(core): astro embedding detection by [@​ematipico](https://redirect.github.com/ematipico) in [#​9605](https://redirect.github.com/biomejs/biome/pull/9605) - chore(deps): update dependency tombi to v0.9.7 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9597](https://redirect.github.com/biomejs/biome/pull/9597) - feat(css): add `noDuplicateSelectors` by [@​ematipico](https://redirect.github.com/ematipico) in [#​9315](https://redirect.github.com/biomejs/biome/pull/9315) - chore: convince robots into self identifying by [@​dyc3](https://redirect.github.com/dyc3) in [#​9610](https://redirect.github.com/biomejs/biome/pull/9610) - fix(lsp): handle wrapped settings in didChangeConfiguration by [@​gaauwe](https://redirect.github.com/gaauwe) in [#​9611](https://redirect.github.com/biomejs/biome/pull/9611) - feat(linter): add rule `noUntrustedLicenses` by [@​ematipico](https://redirect.github.com/ematipico) in [#​9474](https://redirect.github.com/biomejs/biome/pull/9474) - chore: use npmx.dev badge by [@​ematipico](https://redirect.github.com/ematipico) in [#​9614](https://redirect.github.com/biomejs/biome/pull/9614) - docs: break down skills, improve existing ones by [@​ematipico](https://redirect.github.com/ematipico) in [#​9613](https://redirect.github.com/biomejs/biome/pull/9613) - chore(deps): update rust crate quickcheck to 1.1.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9600](https://redirect.github.com/biomejs/biome/pull/9600) - perf(html): inline parse functions by [@​ematipico](https://redirect.github.com/ematipico) in [#​9609](https://redirect.github.com/biomejs/biome/pull/9609) - fix(grit): fix queries for `export { $foo } ...` by [@​dyc3](https://redirect.github.com/dyc3) in [#​9586](https://redirect.github.com/biomejs/biome/pull/9586) - ci: release by [@​github-actions](https://redirect.github.com/github-actions)\[bot] in [#​9620](https://redirect.github.com/biomejs/biome/pull/9620) ##### New Contributors - [@​omar-y-abdi](https://redirect.github.com/omar-y-abdi) made their first contribution in [#​9455](https://redirect.github.com/biomejs/biome/pull/9455) - [@​masterkain](https://redirect.github.com/masterkain) made their first contribution in [#​9476](https://redirect.github.com/biomejs/biome/pull/9476) - [@​eyupcanakman](https://redirect.github.com/eyupcanakman) made their first contribution in [#​9565](https://redirect.github.com/biomejs/biome/pull/9565) - [@​datalek](https://redirect.github.com/datalek) made their first contribution in [#​9557](https://redirect.github.com/biomejs/biome/pull/9557) **Full Changelog**: <https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.8...@​biomejs/biome@2.4.9> ### [`v2.4.8`](https://redirect.github.com/biomejs/biome/releases/tag/%40biomejs/biome%402.4.8): Biome CLI v2.4.8 #### 2.4.8 ##### Patch Changes - [#​9488](https://redirect.github.com/biomejs/biome/pull/9488) [`bc709f6`](bc709f6e45) Thanks [@​mvanhorn](https://redirect.github.com/mvanhorn)! - Fixed [#​9463](https://redirect.github.com/biomejs/biome/issues/9463): the "Biome found a configuration file outside of the current working directory" diagnostic now includes the configuration file path and the working directory, giving users actionable information to debug the issue. - [#​9527](https://redirect.github.com/biomejs/biome/pull/9527) [`2f8bf80`](2f8bf80d7f) Thanks [@​mdm317](https://redirect.github.com/mdm317)! - Fixed [#​8959](https://redirect.github.com/biomejs/biome/issues/8959): Fixed TypeScript arrow function formatting when a comment appears after `=>`. - [#​9525](https://redirect.github.com/biomejs/biome/pull/9525) [`e7b3b10`](e7b3b10459) Thanks [@​ViniciusDev26](https://redirect.github.com/ViniciusDev26)! - Added the rule [`noDrizzleUpdateWithoutWhere`](https://biomejs.dev/linter/rules/no-drizzle-update-without-where/) to prevent accidental full-table updates when using Drizzle ORM without a `.where()` clause. - [#​9531](https://redirect.github.com/biomejs/biome/pull/9531) [`1302740`](1302740643) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9187](https://redirect.github.com/biomejs/biome/issues/9187): Astro frontmatter containing regex literals with quotes (`/'/`, `/"/`) or dashes (`/---/`) no longer causes parse errors. - [#​9535](https://redirect.github.com/biomejs/biome/pull/9535) [`b630d93`](b630d93690) Thanks [@​leno23](https://redirect.github.com/leno23)! - Fixed [#​9524](https://redirect.github.com/biomejs/biome/issues/9524): remove extra space before `>` when `bracketSameLine` is true and the self-closing slash is absent in HTML formatter. - [#​9537](https://redirect.github.com/biomejs/biome/pull/9537) [`81e6306`](81e630683c) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9238](https://redirect.github.com/biomejs/biome/issues/9238): The HTML parser no longer incorrectly reports `---` inside element content (e.g. `<td>---</td>`) as an "Unexpected value or character" error. - [#​9532](https://redirect.github.com/biomejs/biome/pull/9532) [`4b64145`](4b641457bb) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9117](https://redirect.github.com/biomejs/biome/issues/9117): `biome check --write` no longer falsely reports Svelte and Vue files as changed when `html.formatter.indentScriptAndStyle` is enabled and the files are already correctly formatted. - [#​9528](https://redirect.github.com/biomejs/biome/pull/9528) [`61451ef`](61451ef11e) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9341](https://redirect.github.com/biomejs/biome/issues/9341): Fixed an LSP crash that could corrupt file content when saving with format-on-save enabled. - [#​9538](https://redirect.github.com/biomejs/biome/pull/9538) [`794f79c`](794f79c3d6) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9279](https://redirect.github.com/biomejs/biome/issues/9279): The rule [`noSubstr`](https://biomejs.dev/linter/rules/no-substr/) now detects `.substr()` and `.substring()` calls in all expression contexts, including variable declarations, function arguments, return statements, and arrow function bodies. - [#​9462](https://redirect.github.com/biomejs/biome/pull/9462) [`c23272c`](c23272c9be) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9370](https://redirect.github.com/biomejs/biome/issues/9370): The resolver now correctly prioritizes more specific `exports` patterns over less specific ones. Previously, a pattern like `"./*"` could match before `"./features/*"`, causing resolution failures for packages with overlapping subpath patterns. - [#​9515](https://redirect.github.com/biomejs/biome/pull/9515) [`f85c069`](f85c069acd) Thanks [@​shivamtiwari3](https://redirect.github.com/shivamtiwari3)! - Fixed [#​9506](https://redirect.github.com/biomejs/biome/issues/9506) and [#​9479](https://redirect.github.com/biomejs/biome/issues/9479): Biome no longer reports false parse errors on `<script type="speculationrules">` and `<script type="application/ld+json">` tags. These script types contain non-JavaScript content and are now correctly skipped by the embedded language detector. - [#​9514](https://redirect.github.com/biomejs/biome/pull/9514) [`7fe43c8`](7fe43c8e89) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​6964](https://redirect.github.com/biomejs/biome/issues/6964): Biome now correctly resolves the `.gitignore` file relative to `vcs.root` when configured. Previously, the `vcs.root` setting was ignored and Biome always looked for the ignore file in the workspace directory. - [#​9521](https://redirect.github.com/biomejs/biome/pull/9521) [`af39936`](af3993681b) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9483](https://redirect.github.com/biomejs/biome/issues/9483). Now the rule `noRedeclare` doesn't panic when it encounters constructor overloads. - [#​9490](https://redirect.github.com/biomejs/biome/pull/9490) [`60cf024`](60cf024822) Thanks [@​willfarrell](https://redirect.github.com/willfarrell)! - Added support for modern CSS properties, pseudo-classes, and pseudo-elements. New known properties: `dynamic-range-limit`, `overlay`, `reading-flow`, `reading-order`, `scroll-marker-group`, `scroll-target-group`. New pseudo-elements: `::checkmark`, `::column`, `::picker`, `::picker-icon`, `::scroll-button`, `::scroll-marker`, `::scroll-marker-group`. New pseudo-classes: `:active-view-transition-type`, `:has-slotted`, `:target-after`, `:target-before`, `:target-current`. - [#​9526](https://redirect.github.com/biomejs/biome/pull/9526) [`4d42823`](4d42823aa6) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9358](https://redirect.github.com/biomejs/biome/issues/9358) and [#​9375](https://redirect.github.com/biomejs/biome/issues/9375). Now attributes that have text expressions such as `class={buttonClass()}` are correctly tracked in Svelte files. - [#​9520](https://redirect.github.com/biomejs/biome/pull/9520) [`61f53ee`](61f53ee073) Thanks [@​ematipico](https://redirect.github.com/ematipico)! - Fixed [#​9519](https://redirect.github.com/biomejs/biome/issues/9519). Now `noUnusedVariables` doesn't flag variables that are used as `typeof` type. - [#​9487](https://redirect.github.com/biomejs/biome/pull/9487) [`331dc0d`](331dc0d53b) Thanks [@​mvanhorn](https://redirect.github.com/mvanhorn)! - Fixed [#​9477](https://redirect.github.com/biomejs/biome/issues/9477): `source.fixAll.biome` no longer sorts imports when `source.organizeImports.biome` is disabled in editor settings. The organize imports action is now excluded from the fix-all pass unless explicitly requested. - [#​9525](https://redirect.github.com/biomejs/biome/pull/9525) [`e7b3b10`](e7b3b10459) Thanks [@​ViniciusDev26](https://redirect.github.com/ViniciusDev26)! - Added the rule [`noDrizzleDeleteWithoutWhere`](https://biomejs.dev/linter/rules/no-drizzle-delete-without-where/) to prevent accidental full-table deletes when using Drizzle ORM without a `.where()` clause. #### What's Changed - fix(formatter/md): fix formatting for MdHardLine by [@​tidefield](https://redirect.github.com/tidefield) in [#​9480](https://redirect.github.com/biomejs/biome/pull/9480) - chore(deps): update rust:1.94.0-bookworm docker digest to [`6a544e5`](https://redirect.github.com/biomejs/biome/commit/6a544e5) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9493](https://redirect.github.com/biomejs/biome/pull/9493) - chore(deps): update rust:1.94.0-bullseye docker digest to [`9d1864f`](https://redirect.github.com/biomejs/biome/commit/9d1864f) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9494](https://redirect.github.com/biomejs/biome/pull/9494) - chore(deps): update rust crate tracing-subscriber to 0.3.23 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​9498](https://redirect.github.com/biomejs/biome/pull/9498) - chore(benchmark): upgrade to Debian 13 Trixie, Node.js 24 by [@​siketyan](https://redirect.github.com/siketyan) in [#​9499](https://redirect.github.com/biomejs/biome/pull/9499) - fix: missing rule source reference by [@​Netail](https://redirect.github.com/Netail) in [#​9504](https://redirect.github.com/biomejs/biome/pull/9504) - chore: manually import dev dependencies by [@​ematipico](https://redirect.github.com/ematipico) in [#​9512](https://redirect.github.com/biomejs/biome/pull/9512) - test: infrastructure for embedded langauges by [@​ematipico](https://redirect.github.com/ematipico) in [#​9509](https://redirect.github.com/biomejs/biome/pull/9509) - feat(css): parse scss interpolated selector names by [@​denbezrukov](https://redirect.github.com/denbezrukov) in [#​9486](https://redirect.github.com/biomejs/biome/pull/9486) - feat(css): add support for modern CSS properties, pseudo-classes, and pseudo-elements by [@​willfarrell](https://redirect.github.com/willfarrell) in [#​9490](https://redirect.github.com/biomejs/biome/pull/9490) - fix(html): skip unsupported <script> types instead of treating as JS (fixes [#​9506](https://redirect.github.com/biomejs/biome/issues/9506), [#​9479](https://redirect.github.com/biomejs/biome/issues/9479)) by [@​shivamtiwari3](https://redirect.github.com/shivamtiwari3) in [#​9515](https://redirect.github.com/biomejs/biome/pull/9515) - fix(semantic): regression in tracking scopes by [@​ematipico](https://redirect.github.com/ematipico) in [#​9521](https://redirect.github.com/biomejs/biome/pull/9521) - fix(noUnusedVariables): regression in previous refactor by [@​ematipico](https://redirect.github.com/ematipico) in [#​9520](https://redirect.github.com/biomejs/biome/pull/9520) - fix(diagnostic): include config path and CWD in ConfigurationOutsideProject by [@​mvanhorn](https://redirect.github.com/mvanhorn) in [#​9488](https://redirect.github.com/biomejs/biome/pull/9488) - fix(lsp): changes file corruption by [@​ematipico](https://redirect.github.com/ematipico) in [#​9528](https://redirect.github.com/biomejs/biome/pull/9528) - fix(embeds): track attributes text expressions by [@​ematipico](https://redirect.github.com/ematipico) in [#​9526](https://redirect.github.com/biomejs/biome/pull/9526) - fix(core): idempotence formatting html-ish files by [@​ematipico](https://redirect.github.com/ematipico) in [#​9532](https://redirect.github.com/biomejs/biome/pull/9532) - fix(ts/formatter): format comment after => in arrow functions by [@​mdm317](https://redirect.github.com/mdm317) in [#​9527](https://redirect.github.com/biomejs/biome/pull/9527) - feat(lint): add noDrizzleDeleteWithoutWhere and noDrizzleUpdateWithoutWhere rules by [@​ViniciusDev26](https://redirect.github.com/ViniciusDev26) in [#​9525](https://redirect.github.com/biomejs/biome/pull/9525) - fix(lsp): filter organizeImports from fixAll code action by [@​mvanhorn](https://redirect.github.com/mvanhorn) in [#​9487](https://redirect.github.com/biomejs/biome/pull/9487) - fix(parser/html): regex literals in frontmatter by [@​ematipico](https://redirect.github.com/ematipico) in [#​9531](https://redirect.github.com/biomejs/biome/pull/9531) - fix(core): vcs root resolution by [@​ematipico](https://redirect.github.com/ematipico) in [#​9514](https://redirect.github.com/biomejs/biome/pull/9514) - fix(resolver): patterns resolution by [@​ematipico](https://redirect.github.com/ematipico) in [#​9462](https://redirect.github.com/biomejs/biome/pull/9462) - feat(css): parse scss interpolation for selectors and declaration names by [@​denbezrukov](https://redirect.github.com/denbezrukov) in [#​9529](https://redirect.github.com/biomejs/biome/pull/9529) - fix(noSubstr): query more nodes by [@​ematipico](https://redirect.github.com/ematipico) in [#​9538](https://redirect.github.com/biomejs/biome/pull/9538) - fix(html-formatter): remove extra space before > when bracketSameLine… by [@​leno23](https://redirect.github.com/leno23) in [#​9535](https://redirect.github.com/biomejs/biome/pull/9535) - fix(html/parser): fence in html files by [@​ematipico](https://redirect.github.com/ematipico) in [#​9537](https://redirect.github.com/biomejs/biome/pull/9537) - ci: release by [@​github-actions](https://redirect.github.com/github-actions)\[bot] in [#​9517](https://redirect.github.com/biomejs/biome/pull/9517) #### New Contributors - [@​willfarrell](https://redirect.github.com/willfarrell) made their first contribution in [#​9490](https://redirect.github.com/biomejs/biome/pull/9490) - [@​shivamtiwari3](https://redirect.github.com/shivamtiwari3) made their first contribution in [#​9515](https://redirect.github.com/biomejs/biome/pull/9515) - [@​mvanhorn](https://redirect.github.com/mvanhorn) made their first contribution in [#​9488](https://redirect.github.com/biomejs/biome/pull/9488) - [@​ViniciusDev26](https://redirect.github.com/ViniciusDev26) made their first contribution in [#​9525](https://redirect.github.com/biomejs/biome/pull/9525) - [@​leno23](https://redirect.github.com/leno23) made their first contribution in [#​9535](https://redirect.github.com/biomejs/biome/pull/9535) **Full Changelog**: <https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.7...@​biomejs/biome@2.4.8> </details> <details> <summary>casey/just (just)</summary> ### [`v1.48.0`](https://redirect.github.com/casey/just/blob/HEAD/CHANGELOG.md#1480---2026-03-23) [Compare Source](https://redirect.github.com/casey/just/compare/1.47.1...1.48.0) ##### Added - Build docker images ([#​3174](https://redirect.github.com/casey/just/pull/3174) by [casey](https://redirect.github.com/casey)) - Dynamically complete recipes for `--usage` ([#​3172](https://redirect.github.com/casey/just/pull/3172) by [casey](https://redirect.github.com/casey)) - Dynamically complete groups ([#​3171](https://redirect.github.com/casey/just/pull/3171) by [casey](https://redirect.github.com/casey)) - Dynamically complete recipes and variables ([#​3169](https://redirect.github.com/casey/just/pull/3169) by [casey](https://redirect.github.com/casey)) - Complete appropriate filetypes ([#​3168](https://redirect.github.com/casey/just/pull/3168) by [casey](https://redirect.github.com/casey)) - Allow overriding variables in submodules ([#​3151](https://redirect.github.com/casey/just/pull/3151) by [casey](https://redirect.github.com/casey)) - Add `--json` as synonym for `--dump --dump-format json` ([#​3143](https://redirect.github.com/casey/just/pull/3143) by [casey](https://redirect.github.com/casey)) ##### Changed - Stabilize lazy evaluation ([#​3180](https://redirect.github.com/casey/just/pull/3180) by [casey](https://redirect.github.com/casey)) - Switch to dynamic completion engine ([#​3167](https://redirect.github.com/casey/just/pull/3167) by [casey](https://redirect.github.com/casey)) - Respect PATH and PATHEXT when running commands on Windows ([#​3160](https://redirect.github.com/casey/just/pull/3160) by [casey](https://redirect.github.com/casey)) - Make `which()` and `require()` respect PATHEXT on Windows ([#​3144](https://redirect.github.com/casey/just/pull/3144) by [casey](https://redirect.github.com/casey)) ##### Misc - Add completion script installation instructions ([#​3178](https://redirect.github.com/casey/just/pull/3178) by [casey](https://redirect.github.com/casey)) - Fix readme typo ([#​3176](https://redirect.github.com/casey/just/pull/3176) by [Rohan5commit](https://redirect.github.com/Rohan5commit)) - Remove Vagrantfile ([#​3173](https://redirect.github.com/casey/just/pull/3173) by [casey](https://redirect.github.com/casey)) - Fix signal handling typo ([#​3170](https://redirect.github.com/casey/just/pull/3170) by [Rohan5commit](https://redirect.github.com/Rohan5commit)) - Add cargo-binstall installation instructions ([#​3165](https://redirect.github.com/casey/just/pull/3165) by [casey](https://redirect.github.com/casey)) - Fix typos ([#​3162](https://redirect.github.com/casey/just/pull/3162) by [casey](https://redirect.github.com/casey)) - Readme typo: forground ([#​3161](https://redirect.github.com/casey/just/pull/3161) by [Rohan5commit](https://redirect.github.com/Rohan5commit)) - Use clap derive to parse arguments ([#​3158](https://redirect.github.com/casey/just/pull/3158) by [casey](https://redirect.github.com/casey)) - Fix readme typo ([#​3156](https://redirect.github.com/casey/just/pull/3156) by [teee32](https://redirect.github.com/teee32)) - Document that path\_exists() returns strings ([#​2946](https://redirect.github.com/casey/just/pull/2946) by [cspotcode](https://redirect.github.com/cspotcode)) - Remove version references from readme headings ([#​3153](https://redirect.github.com/casey/just/pull/3153) by [casey](https://redirect.github.com/casey)) - Fix readme typo ([#​3152](https://redirect.github.com/casey/just/pull/3152) by [Rohan5commit](https://redirect.github.com/Rohan5commit)) - Fix variadic parameter typo in readme ([#​3150](https://redirect.github.com/casey/just/pull/3150) by [casey](https://redirect.github.com/casey)) - Fix readme typo ([#​3148](https://redirect.github.com/casey/just/pull/3148) by [Rohan5commit](https://redirect.github.com/Rohan5commit)) - Avoid conditional compilation ([#​3145](https://redirect.github.com/casey/just/pull/3145) by [casey](https://redirect.github.com/casey)) - Update VS Code extension in Chinese readme ([#​2984](https://redirect.github.com/casey/just/pull/2984) by [A-moment096](https://redirect.github.com/A-moment096)) - Change replace wording in readme ([#​3137](https://redirect.github.com/casey/just/pull/3137) by [Rohan5commit](https://redirect.github.com/Rohan5commit)) - Document recipe metadata ([#​3142](https://redirect.github.com/casey/just/pull/3142) by [casey](https://redirect.github.com/casey)) ### [`v1.47.1`](https://redirect.github.com/casey/just/blob/HEAD/CHANGELOG.md#1471---2026-03-16) [Compare Source](https://redirect.github.com/casey/just/compare/1.47.0...1.47.1) ##### Fixed - Block on running parallel dependencies ([#​3139](https://redirect.github.com/casey/just/pull/3139) by [casey](https://redirect.github.com/casey)) - Fix setting-exported assignment visibility in child modules ([#​3128](https://redirect.github.com/casey/just/pull/3128) by [casey](https://redirect.github.com/casey)) ##### Added - Add `eager` keyword to force evaluation of unused assignments ([#​3131](https://redirect.github.com/casey/just/pull/3131) by [casey](https://redirect.github.com/casey)) ##### Changed - Only evaluate used variables in --evaluate and --command ([#​3130](https://redirect.github.com/casey/just/pull/3130) by [casey](https://redirect.github.com/casey)) ##### Misc - Make eager assignments unstable ([#​3140](https://redirect.github.com/casey/just/pull/3140) by [casey](https://redirect.github.com/casey)) - Include path to .env file in error messages ([#​3135](https://redirect.github.com/casey/just/pull/3135) by [casey](https://redirect.github.com/casey)) - Consolidate override checking ([#​3127](https://redirect.github.com/casey/just/pull/3127) by [casey](https://redirect.github.com/casey)) - Update readme version references ([#​3126](https://redirect.github.com/casey/just/pull/3126) by [casey](https://redirect.github.com/casey)) </details> <details> <summary>astral-sh/uv (uv)</summary> ### [`v0.11.1`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0111) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.11.0...0.11.1) Released on 2026-03-24. ##### Bug fixes - Add missing hash verification for `riscv64gc-unknown-linux-musl` ([#​18686](https://redirect.github.com/astral-sh/uv/pull/18686)) - Fallback to direct download when direct URL streaming is unsupported ([#​18688](https://redirect.github.com/astral-sh/uv/pull/18688)) - Revert treating 'Dynamic' values as case-insensitive ([#​18692](https://redirect.github.com/astral-sh/uv/pull/18692)) - Remove torchdata from list of packages to source from the PyTorch index ([#​18703](https://redirect.github.com/astral-sh/uv/pull/18703)) - Special-case `==` Python version request ranges ([#​9697](https://redirect.github.com/astral-sh/uv/pull/9697)) ##### Documentation - Cover `--python <dir>` in "Using arbitrary Python environments" ([#​6457](https://redirect.github.com/astral-sh/uv/pull/6457)) - Fix version annotations for `PS_MODULE_PATH` and `UV_WORKING_DIR` ([#​18691](https://redirect.github.com/astral-sh/uv/pull/18691)) ### [`v0.11.0`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0110) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.10.12...0.11.0) Released on 2026-03-23. ##### Breaking changes This release includes changes to the networking stack used by uv. While we think that breakage will be rare, it is possible that these changes will result in the rejection of certificates previously trusted by uv so we have marked the change as breaking out of an abundance of caution. The changes are largely driven by the upgrade of reqwest, which powers uv's HTTP clients, to [v0.13](https://seanmonstar.com/blog/reqwest-v013-rustls-default/) which included some breaking changes to TLS certificate verification. The following changes are included: - [`rustls-platform-verifier`](https://redirect.github.com/rustls/rustls-platform-verifier) is used instead of [`rustls-native-certs`](https://redirect.github.com/rustls/rustls-native-certs) and [`webpki`](https://redirect.github.com/rustls/webpki) for certificate verification **This change should have no effect unless you are using the `native-tls` option to enable reading system certificates.** `rustls-platform-verifier` delegates to the system for certificate validation (e.g., `Security.framework` on macOS) instead of eagerly loading certificates from the system and verifying them via `webpki`. The effects of this change will vary based on the operating system. In general, uv's certificate validation should now be more consistent with browsers and other native applications. However, this is the most likely cause of breaking changes in this release. Some previously failing certificate chains may succeed, and some previously accepted certificate chains may fail. In either case, we expect the validation to be more correct and welcome reports of regressions. In particular, because more responsibility for validating the certificate is transferred to your system's security library, some features like [CA constraints](https://support.apple.com/en-us/103255) or [revocation of certificates](https://en.wikipedia.org/wiki/Certificate_revocation) via OCSP and CRLs may now be used. This change should improve performance when using system certificate on macOS, as uv no longer needs to load all certificates from the keychain at startup. - [`aws-lc`](https://redirect.github.com/aws/aws-lc) is used instead of `ring` for a cryptography backend There should not be breaking changes from this change. We expect this to expand support for certificate signature algorithms. - `--native-tls` is deprecated in favor of a new `--system-certs` flag The `--native-tls` flag is still usable and has identical behavior to `--system-certs.` This change was made to reduce confusion about the TLS implementation uv uses. uv always uses `rustls` not `native-tls`. - Building uv on x86-64 and i686 Windows requires NASM NASM is required by `aws-lc`. If not found on the system, a prebuilt blob provided by `aws-lc-sys` will be used. If you are not building uv from source, this change has no effect. See the [CONTRIBUTING](b6854d77bf/CONTRIBUTING.md (setup)) guide for details. - Empty `SSL_CERT_FILE` values are ignored (for consistency with `SSL_CERT_DIR`) See [#​18550](https://redirect.github.com/astral-sh/uv/pull/18550) for details. ##### Python - Enable frame pointers for improved profiling on Linux x86-64 and aarch64 See the [python-build-standalone release notes](https://redirect.github.com/astral-sh/python-build-standalone/releases/20260320) for details. ##### Enhancements - Treat 'Dynamic' values as case-insensitive ([#​18669](https://redirect.github.com/astral-sh/uv/pull/18669)) - Use a dedicated error for invalid cache control headers ([#​18657](https://redirect.github.com/astral-sh/uv/pull/18657)) - Enable checksum verification in the generated installer script ([#​18625](https://redirect.github.com/astral-sh/uv/pull/18625)) ##### Preview features - Add `--service-format` and `--service-url` to `uv audit` ([#​18571](https://redirect.github.com/astral-sh/uv/pull/18571)) ##### Performance - Avoid holding flat index lock across indexes ([#​18659](https://redirect.github.com/astral-sh/uv/pull/18659)) ##### Bug fixes - Find the dynamic linker on the file system when sniffing binaries fails ([#​18457](https://redirect.github.com/astral-sh/uv/pull/18457)) - Fix export of conflicting workspace members with dependencies ([#​18666](https://redirect.github.com/astral-sh/uv/pull/18666)) - Respect installed settings in `uv tool list --outdated` ([#​18586](https://redirect.github.com/astral-sh/uv/pull/18586)) - Treat paths originating as PEP 508 URLs which contain expanded variables as relative ([#​18680](https://redirect.github.com/astral-sh/uv/pull/18680)) - Fix `uv export` for workspace member packages with conflicts ([#​18635](https://redirect.github.com/astral-sh/uv/pull/18635)) - Continue to alternative authentication providers when the pyx store has no token ([#​18425](https://redirect.github.com/astral-sh/uv/pull/18425)) - Use redacted URLs for log messages in cached client ([#​18599](https://redirect.github.com/astral-sh/uv/pull/18599)) ##### Documentation - Add details on Linux versions to the platform policy ([#​18574](https://redirect.github.com/astral-sh/uv/pull/18574)) - Clarify `FLASH_ATTENTION_SKIP_CUDA_BUILD` guidance for `flash-attn` installs ([#​18473](https://redirect.github.com/astral-sh/uv/pull/18473)) - Split the dependency bots page into two separate pages ([#​18597](https://redirect.github.com/astral-sh/uv/pull/18597)) - Split the alternative indexes page into separate pages ([#​18607](https://redirect.github.com/astral-sh/uv/pull/18607)) ### [`v0.10.12`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#01012) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.10.11...0.10.12) Released on 2026-03-19. ##### Python - Add pypy 3.11.15 ([#​18468](https://redirect.github.com/astral-sh/uv/pull/18468)) - Add support for using Python 3.6 interpreters ([#​18454](https://redirect.github.com/astral-sh/uv/pull/18454)) ##### Enhancements - Include uv's target triple in version report ([#​18520](https://redirect.github.com/astral-sh/uv/pull/18520)) - Allow comma separated values in `--no-emit-package` ([#​18565](https://redirect.github.com/astral-sh/uv/pull/18565)) ##### Preview features - Show `uv audit` in the CLI help ([#​18540](https://redirect.github.com/astral-sh/uv/pull/18540)) ##### Bug fixes - Improve reporting of managed interpreter symlinks in `uv python list` ([#​18459](https://redirect.github.com/astral-sh/uv/pull/18459)) - Preserve end-of-line comments on previous entries when removing dependencies ([#​18557](https://redirect.github.com/astral-sh/uv/pull/18557)) - Treat abi3 wheel Python version as a lower bound ([#​18536](https://redirect.github.com/astral-sh/uv/pull/18536)) - Detect hard-float support on aarch64 kernels running armv7 userspace ([#​18530](https://redirect.github.com/astral-sh/uv/pull/18530)) ##### Documentation - Add Python 3.15 to supported versions ([#​18552](https://redirect.github.com/astral-sh/uv/pull/18552)) - Adjust the PyPy note ([#​18548](https://redirect.github.com/astral-sh/uv/pull/18548)) - Move Pyodide to Tier 2 in the Python support policy ([#​18561](https://redirect.github.com/astral-sh/uv/pull/18561)) - Move Rust and Python version support out of the Platform support policy ([#​18535](https://redirect.github.com/astral-sh/uv/pull/18535)) - Update Docker guide with changes from `uv-docker-example` ([#​18558](https://redirect.github.com/astral-sh/uv/pull/18558)) - Update the Python version policy ([#​18559](https://redirect.github.com/astral-sh/uv/pull/18559)) ### [`v0.10.11`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#01011) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.10.10...0.10.11) Released on 2026-03-16. ##### Enhancements - Fetch Ruff release metadata from an Astral mirror ([#​18358](https://redirect.github.com/astral-sh/uv/pull/18358)) - Use PEP 639 license metadata for uv itself ([#​16477](https://redirect.github.com/astral-sh/uv/pull/16477)) ##### Performance - Improve distribution id performance ([#​18486](https://redirect.github.com/astral-sh/uv/pull/18486)) ##### Bug fixes - Allow `--project` to refer to a `pyproject.toml` directly and reduce to a warning on other files ([#​18513](https://redirect.github.com/astral-sh/uv/pull/18513)) - Disable `SYSTEM_VERSION_COMPAT` when querying interpreters on macOS ([#​18452](https://redirect.github.com/astral-sh/uv/pull/18452)) - Enforce available distributions for supported environments ([#​18451](https://redirect.github.com/astral-sh/uv/pull/18451)) - Fix `uv sync --active` recreating active environments when `UV_PYTHON_INSTALL_DIR` is relative ([#​18398](https://redirect.github.com/astral-sh/uv/pull/18398)) ##### Documentation - Add missing `-o requirements.txt` in `uv pip compile` example ([#​12308](https://redirect.github.com/astral-sh/uv/pull/12308)) - Link to organization security policy ([#​18449](https://redirect.github.com/astral-sh/uv/pull/18449)) - Link to the AI policy in the contributing guide ([#​18448](https://redirect.github.com/astral-sh/uv/pull/18448)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/alecthomas/chroma). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1hc3RlciIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
A general purpose syntax highlighter in pure Go
Chroma takes source code and other structured text and converts it into syntax highlighted HTML, ANSI-coloured text, etc.
Chroma is based heavily on Pygments, and includes translators for Pygments lexers and styles.
Table of Contents
- Supported languages
- Try it
- Using the library
- More detail
- Command-line interface
- Testing lexers
- What's missing compared to Pygments?
Supported languages
| Prefix | Language |
|---|---|
| A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Agda, AL, Alloy, AMPL, Angular2, ANTLR, ApacheConf, APL, AppleScript, ArangoDB AQL, Arduino, ArmAsm, ATL, AutoHotkey, AutoIt, Awk |
| B | Ballerina, Bash, Bash Session, Batchfile, Beef, BibTeX, Bicep, BlitzBasic, BNF, BQN, Brainfuck |
| C | C, C#, C++, C3, Caddyfile, Caddyfile Directives, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Chapel, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Core, Crystal, CSS, CSV, CUE, Cython |
| D | D, Dart, Dax, Desktop file, Diff, Django/Jinja, dns, Docker, DTD, Dylan |
| E | EBNF, Elixir, Elm, EmacsLisp, Erlang |
| F | Factor, Fennel, Fish, Forth, Fortran, FortranFixed, FSharp |
| G | GAS, GDScript, GDScript3, Gemtext, Genshi, Genshi HTML, Genshi Text, Gettext, Gherkin, Gleam, GLSL, Gnuplot, Go, Go HTML Template, Go Template, Go Text Template, GraphQL, Groff, Groovy |
| H | Handlebars, Hare, Haskell, Haxe, HCL, Hexdump, HLB, HLSL, HolyC, HTML, HTTP, Hy |
| I | Idris, Igor, INI, Io, ISCdhcpd |
| J | J, Janet, Java, JavaScript, JSON, JSONata, Jsonnet, Julia, Jungle |
| K | Kakoune, Kotlin |
| L | Lean4, Lighttpd configuration file, LLVM, lox, Lua, Luau |
| M | Makefile, Mako, markdown, Markless, Mason, Materialize SQL dialect, Mathematica, Matlab, MCFunction, Meson, Metal, MiniZinc, MLIR, Modelica, Modula-2, Mojo, MonkeyC, MoonScript, MorrowindScript, Myghty, MySQL |
| N | NASM, Natural, NDISASM, Newspeak, Nginx configuration file, Nim, Nix, NSIS, Nu |
| O | Objective-C, ObjectPascal, OCaml, Octave, Odin, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode |
| P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Plutus Core, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerQuery, PowerShell, Prolog, Promela, PromQL, properties, Protocol Buffer, Protocol Buffer Text Format, PRQL, PSL, Puppet, Python, Python 2 |
| Q | QBasic, QML |
| R | R, Racket, Ragel, Raku, react, ReasonML, reg, Rego, reStructuredText, Rexx, RGBDS Assembly, Ring, RPGLE, RPMSpec, Ruby, Rust |
| S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Sed, Sieve, Smali, Smalltalk, Smarty, SNBT, Snobol, Solidity, SourcePawn, Spade, SPARQL, SQL, SquidConf, Standard ML, stas, Stylus, Svelte, Swift, SYSTEMD, systemverilog |
| T | TableGen, Tal, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData, Typst |
| U | ucode |
| V | V, V shell, Vala, VB.net, verilog, VHDL, VHS, VimL, vue |
| W | WDTE, WebAssembly Text Format, WebGPU Shading Language, WebVTT, Whiley |
| X | XML, Xorg |
| Y | YAML, YANG |
| Z | Z80 Assembly, Zed, Zig |
I will attempt to keep this section up to date, but an authoritative list can be
displayed with chroma --list.
Try it
Try out various languages and styles on the Chroma Playground.
Using the library
This is version 2 of Chroma, use the import path:
import "github.com/alecthomas/chroma/v2"
Chroma, like Pygments, has the concepts of lexers, formatters and styles.
Lexers convert source text into a stream of tokens, styles specify how token types are mapped to colours, and formatters convert tokens and styles into formatted output.
A package exists for each of these, containing a global Registry variable
with all of the registered implementations. There are also helper functions
for using the registry in each package, such as looking up lexers by name or
matching filenames, etc.
In all cases, if a lexer, formatter or style can not be determined, nil will
be returned. In this situation you may want to default to the Fallback
value in each respective package, which provides sane defaults.
Quick start
A convenience function exists that can be used to simply format some source text, without any effort:
err := quick.Highlight(os.Stdout, someSourceCode, "go", "html", "monokai")
Identifying the language
To highlight code, you'll first have to identify what language the code is written in. There are three primary ways to do that:
-
Detect the language from its filename.
lexer := lexers.Match("foo.go") -
Explicitly specify the language by its Chroma syntax ID (a full list is available from
lexers.Names()).lexer := lexers.Get("go") -
Detect the language from its content.
lexer := lexers.Analyse("package main\n\nfunc main()\n{\n}\n")
In all cases, nil will be returned if the language can not be identified.
if lexer == nil {
lexer = lexers.Fallback
}
At this point, it should be noted that some lexers can be extremely chatty. To mitigate this, you can use the coalescing lexer to coalesce runs of identical token types into a single token:
lexer = chroma.Coalesce(lexer)
Formatting the output
Once a language is identified you will need to pick a formatter and a style (theme).
style := styles.Get("swapoff")
if style == nil {
style = styles.Fallback
}
formatter := formatters.Get("html")
if formatter == nil {
formatter = formatters.Fallback
}
Then obtain an iterator over the tokens:
contents, err := ioutil.ReadAll(r)
iterator, err := lexer.Tokenise(nil, string(contents))
And finally, format the tokens from the iterator:
err := formatter.Format(w, style, iterator)
The HTML formatter
By default the html registered formatter generates standalone HTML with
embedded CSS. More flexibility is available through the formatters/html package.
Firstly, the output generated by the formatter can be customised with the following constructor options:
Standalone()- generate standalone HTML with embedded CSS.WithClasses()- use classes rather than inlined style attributes.ClassPrefix(prefix)- prefix each generated CSS class.TabWidth(width)- Set the rendered tab width, in characters.WithLineNumbers()- Render line numbers (style withLineNumbers).WithLinkableLineNumbers()- Make the line numbers linkable and be a link to themselves.HighlightLines(ranges)- Highlight lines in these ranges (style withLineHighlight).LineNumbersInTable()- Use a table for formatting line numbers and code, rather than spans.
If WithClasses() is used, the corresponding CSS can be obtained from the formatter with:
formatter := html.New(html.WithClasses(true))
err := formatter.WriteCSS(w, style)
More detail
Lexers
See the Pygments documentation for details on implementing lexers. Most concepts apply directly to Chroma, but see existing lexer implementations for real examples.
In many cases lexers can be automatically converted directly from Pygments by
using the included Python 3 script pygments2chroma_xml.py. I use something like
the following:
uv run --script _tools/pygments2chroma_xml.py \
pygments.lexers.jvm.KotlinLexer \
> lexers/embedded/kotlin.xml
A list of all lexers available in Pygments can be found in pygments-lexers.txt.
Formatters
Chroma supports HTML output, as well as terminal output in 8 colour, 256 colour, and true-colour.
A noop formatter is included that outputs the token text only, and a tokens
formatter outputs raw tokens. The latter is useful for debugging lexers.
Styles
Chroma styles are defined in XML. The style entries use the
same syntax as Pygments. All Pygments styles have been converted to Chroma using the _tools/style.py
script.
Style names are case-insensitive. For example, monokai and Monokai are treated as the same style.
When you work with one of Chroma's styles,
know that the Background token type provides the default style for tokens. It does so
by defining a foreground color and background color.
For example, this gives each token name not defined in the style a default color
of #f8f8f8 and uses #000000 for the highlighted code block's background:
<entry type="Background" style="#f8f8f2 bg:#000000"/>
Also, token types in a style file are hierarchical. For instance, when CommentSpecial is not defined, Chroma uses the token style from Comment. So when several comment tokens use the same color, you'll only need to define Comment and override the one that has a different color.
For a quick overview of the available styles and how they look, check out the Chroma Style Gallery.
Command-line interface
A command-line interface to Chroma is included.
Binaries are available to install from the releases page.
The CLI can be used as a preprocessor to colorise output of less(1),
see documentation for the LESSOPEN environment variable.
The --fail flag can be used to suppress output and return with exit status
1 to facilitate falling back to some other preprocessor in case chroma
does not resolve a specific lexer to use for the given file. For example:
export LESSOPEN='| p() { chroma --fail "$1" || cat "$1"; }; p "%s"'
Replace cat with your favourite fallback preprocessor.
When invoked as .lessfilter, the --fail flag is automatically turned
on under the hood for easy integration with lesspipe shipping with
Debian and derivatives;
for that setup the chroma executable can be just symlinked to ~/.lessfilter.
Projects using Chroma
mooris a full-blown pager that colorizes its input using Chroma- Hugo is a static site generator that uses Chroma for syntax highlighting code examples
Testing lexers
If you edit some lexers and want to try it, open a shell in cmd/chromad and run:
go run . --csrf-key=securekey
A Link will be printed. Open it in your Browser. Now you can test on the Playground with your local changes.
If you want to run the tests and the lexers, open a shell in the root directory and run:
go test ./lexers
When updating or adding a lexer, please add tests. See lexers/README.md for more.
What's missing compared to Pygments?
- Quite a few lexers, for various reasons (pull-requests welcome):
- Pygments lexers for complex languages often include custom code to handle certain aspects, such as Raku's ability to nest code inside regular expressions. These require time and effort to convert.
- I mostly only converted languages I had heard of, to reduce the porting cost.
- Some more esoteric features of Pygments are omitted for simplicity.
- Though the Chroma API supports content detection, very few languages support them. I have plans to implement a statistical analyser at some point, but not enough time.
