This PR contains the following updates: | Package | Type | Update | Change | Age | Confidence | |---|---|---|---|---|---| | [biome](https://redirect.github.com/biomejs/biome) | | patch | `2.3.0` -> `2.3.6` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [esbuild](https://redirect.github.com/evanw/esbuild) | | minor | `0.25.11` -> `0.27.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [github.com/alecthomas/kong](https://redirect.github.com/alecthomas/kong) | require | minor | `v1.12.1` -> `v1.13.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [go](https://redirect.github.com/golang/go) | | patch | `1.25.3` -> `1.25.4` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [go](https://go.dev/) ([source](https://redirect.github.com/golang/go)) | toolchain | patch | `1.25.3` -> `1.25.4` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [hyperfine](https://redirect.github.com/sharkdp/hyperfine) | | minor | `1.19.0` -> `1.20.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [svu](https://redirect.github.com/caarlos0/svu) | | minor | `3.2.4` -> `3.3.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [uv](https://redirect.github.com/astral-sh/uv) | | patch | `0.9.5` -> `0.9.10` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>biomejs/biome (biome)</summary> ### [`v2.3.6`](https://redirect.github.com/biomejs/biome/releases/tag/%40biomejs/biome%402.3.6): Biome CLI v2.3.6 #### 2.3.6 ##### Patch Changes - [#​8100](https://redirect.github.com/biomejs/biome/pull/8100) [`82b9a8e`](82b9a8eb3d) Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the nursery rule [`useFind`](https://biomejs.dev/linter/rules/use-find/). Enforce the use of Array.prototype.find() over Array.prototype.filter() followed by \[0] when looking for a single result. **Invalid:** ```js [1, 2, 3].filter((x) => x > 1)[0]; [1, 2, 3].filter((x) => x > 1).at(0); ``` - [#​8118](https://redirect.github.com/biomejs/biome/pull/8118) [`dbc7021`](dbc7021016) Thanks [@​hirokiokada77](https://redirect.github.com/hirokiokada77)! - Fixed [#​8117](https://redirect.github.com/biomejs/biome/issues/8117): [`useValidLang`](https://biomejs.dev/linter/rules/use-valid-lang/) now accepts valid [BCP 47 language tags](https://developer.mozilla.org/en-US/docs/Glossary/BCP_47_language_tag) with script subtags. **Valid:** ```html <html lang="zh-Hans-CN"></html> ``` - [#​7672](https://redirect.github.com/biomejs/biome/pull/7672) [`f1d5725`](f1d5725d06) Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the nursery rule [`useConsistentGraphqlDescriptions`](https://biomejs.dev/linter/rules/use-consistent-graphql-descriptions/), requiring all descriptions to follow the same style (either block or inline) inside GraphQL files. **Invalid:** ```graphql enum EnumValue { "this is a description" DEFAULT } ``` **Valid:** ```graphql enum EnumValue { """ this is a description """ DEFAULT } ``` - [#​8026](https://redirect.github.com/biomejs/biome/pull/8026) [`f102661`](f10266193d) Thanks [@​matanshavit](https://redirect.github.com/matanshavit)! - Fixed [#​8004](https://redirect.github.com/biomejs/biome/issues/8004): [`noParametersOnlyUsedInRecursion`](https://biomejs.dev/linter/rules/no-parameters-only-used-in-recursion/) now correctly detects recursion by comparing function bindings instead of just names. Previously, the rule incorrectly flagged parameters when a method had the same name as an outer function but called the outer function (not itself): ```js function notRecursive(arg) { return arg; } const obj = { notRecursive(arg) { return notRecursive(arg); // This calls the outer function, not the method itself }, }; ``` Biome now properly distinguishes between these cases and will not report false positives. - [#​8097](https://redirect.github.com/biomejs/biome/pull/8097) [`5fc5416`](5fc5416ae1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the nursery rule [`noVueVIfWithVFor`](https://biomejs.dev/linter/rules/no-vue-v-if-with-v-for/). This rule disallows `v-for` and `v-if` on the same element. ```vue <!-- Invalid --> <div v-for="item in items" v-if="item.isActive"> {{ item.name }} </div> ``` - [#​8085](https://redirect.github.com/biomejs/biome/pull/8085) [`7983940`](798394072b) Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the nursery rule [`noForIn`](https://biomejs.dev/linter/rules/no-for-in/). Disallow iterating using a for-in loop. **Invalid:** ```js for (const i in array) { console.log(i, array[i]); } ``` - [#​8086](https://redirect.github.com/biomejs/biome/pull/8086) [`2b41e82`](2b41e82de4) Thanks [@​matanshavit](https://redirect.github.com/matanshavit)! - Fixed [#​8045](https://redirect.github.com/biomejs/biome/issues/8045): The [`noNestedTernary`](https://biomejs.dev/linter/rules/no-nested-ternary/) rule now correctly detects nested ternary expressions even when they are wrapped in parentheses (e.g. `foo ? (bar ? 1 : 2) : 3`). Previously, the rule would not flag nested ternaries like `foo ? (bar ? 1 : 2) : 3` because the parentheses prevented detection. The rule now looks through parentheses to identify nested conditionals. **Previously not detected (now flagged):** ```js const result = foo ? (bar ? 1 : 2) : 3; ``` **Still valid (non-nested with parentheses):** ```js const result = foo ? bar : baz; ``` - [#​8075](https://redirect.github.com/biomejs/biome/pull/8075) [`e403868`](e403868e22) Thanks [@​YTomm](https://redirect.github.com/YTomm)! - Fixed [#​7948](https://redirect.github.com/biomejs/biome/issues/7948): The `useReadonlyClassProperties` code fix when `checkAllProperties` is enabled will no longer insert a newline after `readonly` and the class property. - [#​8102](https://redirect.github.com/biomejs/biome/pull/8102) [`47d940e`](47d940e30c) Thanks [@​lucasweng](https://redirect.github.com/lucasweng)! - Fixed [#​8027](https://redirect.github.com/biomejs/biome/issues/8027). [`useReactFunctionComponents`](https://biomejs.dev/linter/rules/use-react-function-components/) no longer reports class components that implement `componentDidCatch` using class expressions. The rule now correctly recognizes error boundaries defined as class expressions: ```jsx const ErrorBoundary = class extends Component { componentDidCatch(error, info) {} render() { return this.props.children; } }; ``` - [#​8097](https://redirect.github.com/biomejs/biome/pull/8097) [`5fc5416`](5fc5416ae1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the nursery rule [`useVueHyphenatedAttributes`](https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes/), which encourages using kebab case for attribute names, per the Vue style guide's recommendations. ```vue <!-- Invalid --> <MyComponent myProp="value" /> <!-- Valid --> <MyComponent my-prop="value" /> ``` - [#​8108](https://redirect.github.com/biomejs/biome/pull/8108) [`0f0a658`](0f0a65884b) Thanks [@​Netail](https://redirect.github.com/Netail)! - Added the nursery rule [`noSyncScripts`](https://biomejs.dev/linter/rules/no-sync-scripts/). Prevent the usage of synchronous scripts. **Invalid:** ```jsx <script src="https://third-party-script.js" /> ``` **Valid:** ```jsx <script src="https://third-party-script.js" async /> <script src="https://third-party-script.js" defer /> ``` - [#​8098](https://redirect.github.com/biomejs/biome/pull/8098) [`1fdcaf0`](1fdcaf0336) Thanks [@​Jayllyz](https://redirect.github.com/Jayllyz)! - Added documentation URLs to rule descriptions in the JSON schema. - [#​8097](https://redirect.github.com/biomejs/biome/pull/8097) [`5fc5416`](5fc5416ae1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed an issue with the HTML parser where it would treat Vue directives with dynamic arguments as static arguments instead. - [#​7684](https://redirect.github.com/biomejs/biome/pull/7684) [`f4433b3`](f4433b34e3) Thanks [@​vladimir-ivanov](https://redirect.github.com/vladimir-ivanov)! - Changed [`noUnusedPrivateClassMembers`](https://biomejs.dev/linter/rules/no-unused-private-class-members/) to align more fully with meaningful reads. This rule now distinguishes more carefully between writes and reads of private class members. - A *meaningful read* is any access that affects program behavior. - For example, `this.#x += 1` both reads and writes `#x`, so it counts as usage. - Pure writes without a read (e.g. `this.#x = 1` with no getter) are no longer treated as usage. This change ensures that private members are only considered “used” when they are actually read in a way that influences execution. ***Invalid examples (previously valid)*** ```ts class UsedMember { set #x(value) { doSomething(value); } foo() { // This assignment does not actually read #x, because there is no getter. // Previously, this was considered a usage, but now it’s correctly flagged. this.#x = 1; } } ``` ***Valid example (Previously invalid)*** ```js class Foo { #usedOnlyInWriteStatement = 5; method() { // This counts as a meaningful read because we both read and write the value. this.#usedOnlyInWriteStatement += 42; } } ``` - [#​7684](https://redirect.github.com/biomejs/biome/pull/7684) [`f4433b3`](f4433b34e3) Thanks [@​vladimir-ivanov](https://redirect.github.com/vladimir-ivanov)! - **Improved detection of used private class members** The analysis for private class members has been improved: now the tool only considers a private member “used” if it is actually referenced in the code. - Previously, some private members might have been reported as used even if they weren’t actually accessed. - With this change, only members that are truly read or called in the code are counted as used. - Members that are never accessed will now be correctly reported as unused. This makes reports about unused private members more accurate and helps you clean up truly unused code. ***Example (previously valid)*** ```ts type YesNo = "yes" | "no"; export class SampleYesNo { private yes: () => void; private no: () => void; private dontKnow: () => void; // <- will now report as unused on(action: YesNo): void { this[action](); } } ``` - [#​7681](https://redirect.github.com/biomejs/biome/pull/7681) [`b406db6`](b406db667f) Thanks [@​kedevked](https://redirect.github.com/kedevked)! - Added the new lint rule, [`useSpread`](https://biomejs.dev/linter/rules/use-spread/), ported from the ESLint rule [`prefer-spread`](https://eslint.org/docs/latest/rules/prefer-spread). This rule enforces the use of the **spread syntax** (`...`) over `Function.prototype.apply()` when calling variadic functions, as spread syntax is generally more concise and idiomatic in modern JavaScript (ES2015+). The rule provides a safe fix. ##### Invalid ```js Math.max.apply(Math, args); foo.apply(undefined, args); obj.method.apply(obj, args); ``` ##### Valid ```js Math.max(...args); foo(...args); obj.method(...args); // Allowed: cases where the `this` binding is intentionally changed foo.apply(otherObj, args); ``` - [#​7287](https://redirect.github.com/biomejs/biome/pull/7287) [`aa55c8d`](aa55c8d572) Thanks [@​ToBinio](https://redirect.github.com/ToBinio)! - Fixed [#​7205](https://redirect.github.com/biomejs/biome/issues/7205): The [`noDuplicateTestHooks`](https://biomejs.dev/linter/rules/no-duplicate-test-hooks/) rule now treats chained describe variants (e.g., describe.each/for/todo) as proper describe scopes, eliminating false positives. The following code will no longer be a false positive: ```js describe("foo", () => { describe.for([])("baz", () => { beforeEach(() => {}); }); describe.todo("qux", () => { beforeEach(() => {}); }); describe.todo.each([])("baz", () => { beforeEach(() => {}); }); }); ``` - [#​8013](https://redirect.github.com/biomejs/biome/pull/8013) [`0c0edd4`](0c0edd4311) Thanks [@​Jayllyz](https://redirect.github.com/Jayllyz)! - Added the GraphQL nursery rule [`useUniqueGraphqlOperationName`](https://biomejs.dev/linter/rules/use-unique-graphql-operation-name). This rule ensures that all GraphQL operations within a document have unique names. **Invalid:** ```graphql query user { user { id } } query user { user { id email } } ``` **Valid:** ```graphql query user { user { id } } query userWithEmail { user { id email } } ``` - [#​8084](https://redirect.github.com/biomejs/biome/pull/8084) [`c2983f9`](c2983f9776) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Fixed [#​8080](https://redirect.github.com/biomejs/biome/issues/8080): The HTML parser, when parsing Vue, can now properly handle Vue directives with no argument, modifiers, or initializer (e.g. `v-else`). It will no longer treat subsequent valid attributes as bogus. ```vue <p v-else class="flex">World</p> <!-- Fixed: class now gets parsed as it's own attribute --> ``` - [#​8104](https://redirect.github.com/biomejs/biome/pull/8104) [`041196b`](041196bc2a) Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! - Fixed [`noInvalidUseBeforeDeclaration`](https://biomejs.dev/linter/rules/no-invalid-use-before-declaration/). The rule no longer reports a use of an ambient variable before its declarations. The rule also completely ignores TypeScript declaration files. The following code is no longer reported as invalid: ```ts CONSTANT; declare const CONSTANT: number; ``` - [#​8060](https://redirect.github.com/biomejs/biome/pull/8060) [`ba7b076`](ba7b076589) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the nursery rule [`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/), which enforces the validity of `v-bind` directives in Vue files. Invalid `v-bind` usages include: ```vue <Foo v-bind /> <!-- Missing argument --> <Foo v-bind:foo /> <!-- Missing value --> <Foo v-bind:foo.bar="baz" /> <!-- Invalid modifier --> ``` - [#​8113](https://redirect.github.com/biomejs/biome/pull/8113) [`fb8e3e7`](fb8e3e7677) Thanks [@​Conaclos](https://redirect.github.com/Conaclos)! - Fixed [`noInvalidUseBeforeDeclaration`](https://biomejs.dev/linter/rules/no-invalid-use-before-declaration/). The rule now reports invalid use of classes, enums, and TypeScript's import-equals before their declarations. The following code is now reported as invalid: ```js new C(); class C {} ``` - [#​8077](https://redirect.github.com/biomejs/biome/pull/8077) [`0170dcb`](0170dcb1f1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the rule [`useVueValidVElseIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-else-if/) to enforce valid `v-else-if` directives in Vue templates. This rule reports invalid `v-else-if` directives with missing conditional expressions or when not preceded by a `v-if` or `v-else-if` directive. - [#​8077](https://redirect.github.com/biomejs/biome/pull/8077) [`0170dcb`](0170dcb1f1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the rule [`useVueValidVElse`](https://biomejs.dev/linter/rules/use-vue-valid-v-else/) to enforce valid `v-else` directives in Vue templates. This rule reports `v-else` directives that are not preceded by a `v-if` or `v-else-if` directive. - [#​8077](https://redirect.github.com/biomejs/biome/pull/8077) [`0170dcb`](0170dcb1f1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the rule [`useVueValidVHtml`](https://biomejs.dev/linter/rules/use-vue-valid-v-html/) to enforce valid usage of the `v-html` directive in Vue templates. This rule reports `v-html` directives with missing expressions, unexpected arguments, or unexpected modifiers. - [#​8077](https://redirect.github.com/biomejs/biome/pull/8077) [`0170dcb`](0170dcb1f1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the rule [`useVueValidVIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-if/) to enforce valid `v-if` directives in Vue templates. It disallows arguments and modifiers, and ensures a value is provided. - [#​8077](https://redirect.github.com/biomejs/biome/pull/8077) [`0170dcb`](0170dcb1f1) Thanks [@​dyc3](https://redirect.github.com/dyc3)! - Added the rule [`useVueValidVOn`](https://biomejs.dev/linter/rules/use-vue-valid-v-on/) to enforce valid `v-on` directives in Vue templates. This rule reports invalid `v-on` / shorthand `@` directives with missing event names, invalid modifiers, or missing handler expressions. #### What's Changed - refactor(cli/logging): removed duplication in setup\_cli\_subscriber(...) by [@​JadKHaddad](https://redirect.github.com/JadKHaddad) in [#​7531](https://redirect.github.com/biomejs/biome/pull/7531) - perf(parse/tailwind): use compact trie for lexing base names instead of linear search by [@​dyc3](https://redirect.github.com/dyc3) in [#​7977](https://redirect.github.com/biomejs/biome/pull/7977) - feat(biome\_graphql\_analyze): implement `useConsistentGraphqlDescriptions` by [@​Netail](https://redirect.github.com/Netail) in [#​7672](https://redirect.github.com/biomejs/biome/pull/7672) - fix: remove unexpected new line when adding a readonly class property by [@​YTomm](https://redirect.github.com/YTomm) in [#​8075](https://redirect.github.com/biomejs/biome/pull/8075) - feat(html/analyze): add useVueValidVBind by [@​dyc3](https://redirect.github.com/dyc3) in [#​8060](https://redirect.github.com/biomejs/biome/pull/8060) - fix(noDuplicateTestHook): detect more test function defintions by [@​ToBinio](https://redirect.github.com/ToBinio) in [#​7287](https://redirect.github.com/biomejs/biome/pull/7287) - fix(noParametersOnlyUsedInRecursion): compare bindings for recursion detection by [@​matanshavit](https://redirect.github.com/matanshavit) in [#​8026](https://redirect.github.com/biomejs/biome/pull/8026) - feat(html/analyze): add `useVueValidVIf`, `useVueValidVElseIf`, `useVueValidVElse`, `useVueValidVOn` and `useVueValidVHtml` by [@​dyc3](https://redirect.github.com/dyc3) in [#​8077](https://redirect.github.com/biomejs/biome/pull/8077) - refactor(lint): refactor NoParametersOnlyUsedInRecursion by [@​matanshavit](https://redirect.github.com/matanshavit) in [#​7970](https://redirect.github.com/biomejs/biome/pull/7970) - fix(parse/html/vue): fix modifier list parser aggressively parsing tokens it shouldn't by [@​dyc3](https://redirect.github.com/dyc3) in [#​8084](https://redirect.github.com/biomejs/biome/pull/8084) - feat(js\_analyze): implement noForIn by [@​Netail](https://redirect.github.com/Netail) in [#​8085](https://redirect.github.com/biomejs/biome/pull/8085) - fix(noNestedTernary): detect nested ternaries wrapped in parentheses by [@​matanshavit](https://redirect.github.com/matanshavit) in [#​8086](https://redirect.github.com/biomejs/biome/pull/8086) - refactor: migrate to schemars v1 by [@​ematipico](https://redirect.github.com/ematipico) in [#​8087](https://redirect.github.com/biomejs/biome/pull/8087) - feat(graphql\_analyze): add `useUniqueGraphqlOperationName` by [@​Jayllyz](https://redirect.github.com/Jayllyz) in [#​8013](https://redirect.github.com/biomejs/biome/pull/8013) - chore: regression schemars v1 by [@​ematipico](https://redirect.github.com/ematipico) in [#​8092](https://redirect.github.com/biomejs/biome/pull/8092) - refactor(core): actions and pull diagnostics by [@​ematipico](https://redirect.github.com/ematipico) in [#​8082](https://redirect.github.com/biomejs/biome/pull/8082) - chore: enable oidc publishing by [@​ematipico](https://redirect.github.com/ematipico) in [#​8074](https://redirect.github.com/biomejs/biome/pull/8074) - chore: expose schema generation function by [@​ematipico](https://redirect.github.com/ematipico) in [#​8093](https://redirect.github.com/biomejs/biome/pull/8093) - feat: add useSpread rule by [@​kedevked](https://redirect.github.com/kedevked) in [#​7681](https://redirect.github.com/biomejs/biome/pull/7681) - chore(core): add CSS variant information to the source file by [@​ematipico](https://redirect.github.com/ematipico) in [#​8095](https://redirect.github.com/biomejs/biome/pull/8095) - feat(schema): add docs URLs to rule description by [@​Jayllyz](https://redirect.github.com/Jayllyz) in [#​8098](https://redirect.github.com/biomejs/biome/pull/8098) - feat(js\_analyze): implement useFind by [@​Netail](https://redirect.github.com/Netail) in [#​8100](https://redirect.github.com/biomejs/biome/pull/8100) - feat(biome\_js\_analyze): align no\_unused\_private\_class\_members\_with\_semantic\_class and dynamic prop access by [@​vladimir-ivanov](https://redirect.github.com/vladimir-ivanov) in [#​7684](https://redirect.github.com/biomejs/biome/pull/7684) - feat(analyze): implement `noSyncScripts` by [@​Netail](https://redirect.github.com/Netail) in [#​8108](https://redirect.github.com/biomejs/biome/pull/8108) - fix(noInvalidUseBeforeDeclaration): don't report use before ambient var declaration by [@​Conaclos](https://redirect.github.com/Conaclos) in [#​8104](https://redirect.github.com/biomejs/biome/pull/8104) - fix(noInvalidUseBeforeDeclaration): handle class, enum, import-equals by [@​Conaclos](https://redirect.github.com/Conaclos) in [#​8113](https://redirect.github.com/biomejs/biome/pull/8113) - fix(useReactFunctionComponents): handle class expressions with componentDidCatch by [@​lucasweng](https://redirect.github.com/lucasweng) in [#​8102](https://redirect.github.com/biomejs/biome/pull/8102) - feat(lint/vue): add `noVueVIfWithVFor`, `useVueHyphenatedAttributes` by [@​dyc3](https://redirect.github.com/dyc3) in [#​8097](https://redirect.github.com/biomejs/biome/pull/8097) - chore(deps): update github-actions by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8121](https://redirect.github.com/biomejs/biome/pull/8121) - chore(deps): update dependency [@​types/node](https://redirect.github.com/types/node) to v22.19.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8122](https://redirect.github.com/biomejs/biome/pull/8122) - chore(deps): update dependency rust to v1.91.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8123](https://redirect.github.com/biomejs/biome/pull/8123) - chore(deps): update taiki-e/install-action action to v2.62.52 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8126](https://redirect.github.com/biomejs/biome/pull/8126) - chore(deps): update typescript-eslint monorepo to v8.46.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8127](https://redirect.github.com/biomejs/biome/pull/8127) - fix(biome\_js\_analyze): fix useValidLang rejecting BCP 47 language tags with script subtags by [@​hirokiokada77](https://redirect.github.com/hirokiokada77) in [#​8118](https://redirect.github.com/biomejs/biome/pull/8118) - fix(deps): update [@​biomejs](https://redirect.github.com/biomejs) packages by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8129](https://redirect.github.com/biomejs/biome/pull/8129) - fix(deps): update rust crates by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8130](https://redirect.github.com/biomejs/biome/pull/8130) - chore(deps): update rust crate schemars to 1.1.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8124](https://redirect.github.com/biomejs/biome/pull/8124) - chore(deps): update rust crate windows to 0.62.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8053](https://redirect.github.com/biomejs/biome/pull/8053) - chore(deps): update [@​biomejs](https://redirect.github.com/biomejs) packages (major) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8131](https://redirect.github.com/biomejs/biome/pull/8131) - chore(deps): update dependency [@​types/node](https://redirect.github.com/types/node) to v24 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​8132](https://redirect.github.com/biomejs/biome/pull/8132) - chore: schema regression rule domains by [@​ematipico](https://redirect.github.com/ematipico) in [#​8133](https://redirect.github.com/biomejs/biome/pull/8133) - chore: disable docstrings in coderabbit by [@​ematipico](https://redirect.github.com/ematipico) in [#​8134](https://redirect.github.com/biomejs/biome/pull/8134) - ci: release by [@​github-actions](https://redirect.github.com/github-actions)\[bot] in [#​8076](https://redirect.github.com/biomejs/biome/pull/8076) #### New Contributors - [@​JadKHaddad](https://redirect.github.com/JadKHaddad) made their first contribution in [#​7531](https://redirect.github.com/biomejs/biome/pull/7531) - [@​YTomm](https://redirect.github.com/YTomm) made their first contribution in [#​8075](https://redirect.github.com/biomejs/biome/pull/8075) - [@​ToBinio](https://redirect.github.com/ToBinio) made their first contribution in [#​7287](https://redirect.github.com/biomejs/biome/pull/7287) - [@​hirokiokada77](https://redirect.github.com/hirokiokada77) made their first contribution in [#​8118](https://redirect.github.com/biomejs/biome/pull/8118) **Full Changelog**: <https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.5...@​biomejs/biome@2.3.6> ### [`v2.3.5`](e8b67537fb...0a2f6173be) ### [`v2.3.4`](fd282fc5f4...e8b67537fb) ### [`v2.3.3`](6d95a67d7a...fd282fc5f4) ### [`v2.3.2`](be79a6b41b...6d95a67d7a) ### [`v2.3.1`](53ffa8bf30...be79a6b41b) </details> <details> <summary>evanw/esbuild (esbuild)</summary> ### [`v0.27.0`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0270) **This release deliberately contains backwards-incompatible changes.** To avoid automatically picking up releases like this, you should either be pinning the exact version of `esbuild` in your `package.json` file (recommended) or be using a version range syntax that only accepts patch upgrades such as `^0.26.0` or `~0.26.0`. See npm's documentation about [semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more information. - Use `Uint8Array.fromBase64` if available ([#​4286](https://redirect.github.com/evanw/esbuild/issues/4286)) With this release, esbuild's `binary` loader will now use the new [`Uint8Array.fromBase64`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/fromBase64) function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specify `target` when using this feature with Node (for example `--target=node22`) unless you're using Node v25+. - Update the Go compiler from v1.23.12 to v1.25.4 ([#​4208](https://redirect.github.com/evanw/esbuild/issues/4208), [#​4311](https://redirect.github.com/evanw/esbuild/pull/4311)) This raises the operating system requirements for running esbuild: - Linux: now requires a kernel version of 3.2 or later - macOS: now requires macOS 12 (Monterey) or later ### [`v0.25.12`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#02512) [Compare Source](https://redirect.github.com/evanw/esbuild/compare/v0.25.11...v0.25.12) - Fix a minification regression with CSS media queries ([#​4315](https://redirect.github.com/evanw/esbuild/issues/4315)) The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for `@media <media-type> and <media-condition-without-or> { ... }` was missing an equality check for the `<media-condition-without-or>` part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression. - Update the list of known JavaScript globals ([#​4310](https://redirect.github.com/evanw/esbuild/issues/4310)) This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global `Array` property is considered to be side-effect free but accessing the global `scrollY` property can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties: From [ES2017](https://tc39.es/ecma262/2017/): - `Atomics` - `SharedArrayBuffer` From [ES2020](https://tc39.es/ecma262/2020/): - `BigInt64Array` - `BigUint64Array` From [ES2021](https://tc39.es/ecma262/2021/): - `FinalizationRegistry` - `WeakRef` From [ES2025](https://tc39.es/ecma262/2025/): - `Float16Array` - `Iterator` Note that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from `Iterator`: ```js // This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {} ``` - Add support for the new `@view-transition` CSS rule ([#​4313](https://redirect.github.com/evanw/esbuild/pull/4313)) With this release, esbuild now has improved support for pretty-printing and minifying the new `@view-transition` rule (which esbuild was previously unaware of): ```css /* Original code */ @​view-transition { navigation: auto; types: check; } /* Old output */ @​view-transition { navigation: auto; types: check; } /* New output */ @​view-transition { navigation: auto; types: check; } ``` The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules [here](https://developer.mozilla.org/en-US/docs/Web/CSS/@​view-transition). This change was contributed by [@​yisibl](https://redirect.github.com/yisibl). - Trim CSS rules that will never match The CSS minifier will now remove rules whose selectors contain `:is()` and `:where()` as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following: ```css /* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green} ``` This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as `:before`. Currently esbuild generates a rule containing `:is()` in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out. </details> <details> <summary>alecthomas/kong (github.com/alecthomas/kong)</summary> ### [`v1.13.0`](https://redirect.github.com/alecthomas/kong/compare/v1.12.1...v1.13.0) [Compare Source](https://redirect.github.com/alecthomas/kong/compare/v1.12.1...v1.13.0) </details> <details> <summary>golang/go (go)</summary> ### [`v1.25.4`](https://redirect.github.com/golang/go/compare/go1.25.3...go1.25.4) </details> <details> <summary>sharkdp/hyperfine (hyperfine)</summary> ### [`v1.20.0`](https://redirect.github.com/sharkdp/hyperfine/blob/HEAD/CHANGELOG.md#v1200) #### Features - Add `--reference-name` option to give a meaningful name to the reference command, see [#​808](https://redirect.github.com/sharkdp/hyperfine/issues/808) ([@​niklasdewally](https://redirect.github.com/niklasdewally)) - The `--ignore-failure` option now supports a comma-separated list of exit codes to ignore (e.g., `--ignore-failure=1,2`), see [#​836](https://redirect.github.com/sharkdp/hyperfine/issues/836) ([@​sharkdp](https://redirect.github.com/sharkdp)) - Python scripts: Add `--time-unit` option to `advanced_statistics.py` ([@​sharkdp](https://redirect.github.com/sharkdp)) - Python scripts: Add new `plot_benchmarks.py` script for plotting collections of benchmarks, see [#​806](https://redirect.github.com/sharkdp/hyperfine/issues/806) ([@​marxin](https://redirect.github.com/marxin)) #### Bugfixes - Fix bug where naming individual commands with parameter scan was not working correctly, see [#​794](https://redirect.github.com/sharkdp/hyperfine/issues/794) ([@​teofr](https://redirect.github.com/teofr)) #### Other - Restrict `cat` tests to Unix environments, see [#​776](https://redirect.github.com/sharkdp/hyperfine/issues/776) and [#​777](https://redirect.github.com/sharkdp/hyperfine/issues/777) ([@​ritvikos](https://redirect.github.com/ritvikos)) </details> <details> <summary>caarlos0/svu (svu)</summary> ### [`v3.3.0`](https://redirect.github.com/caarlos0/svu/releases/tag/v3.3.0) #### Changelog ##### New Features - [`0d2aa97`](0d2aa97062): feat: add `--json` flag ([#​261](https://redirect.github.com/caarlos0/svu/issues/261)) ([@​Nadim147c](https://redirect.github.com/Nadim147c)) - [`b359291`](b359291f58): feat: beautiful --help with fang ([@​caarlos0](https://redirect.github.com/caarlos0)) ##### Bug fixes - [`28f88fc`](28f88fca94): fix: gitignore ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`3bf9b66`](3bf9b66033): fix: lint issues ([@​caarlos0](https://redirect.github.com/caarlos0)) ##### Other work - [`c669d8f`](c669d8f20c): build: go 1.25 ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`0dfc805`](0dfc805fa0): ci(deps): bump anchore/scan-action in the actions group ([#​266](https://redirect.github.com/caarlos0/svu/issues/266)) ([@​dependabot](https://redirect.github.com/dependabot)\[bot]) - [`752527b`](752527b8ce): ci: add golangici-lint config ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`7a5f75e`](7a5f75ee0b): ci: consolidated security jobs ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`7ae0db3`](7ae0db3fc6): ci: dependabot update ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`d9cfe53`](d9cfe533c6): ci: update goreleaser ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`97e3dcf`](97e3dcfd23): ci: update goreleaser ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`04a8379`](04a83790cc): ci: update goreleaser config ([@​caarlos0](https://redirect.github.com/caarlos0)) **Full Changelog**: <https://github.com/caarlos0/svu/compare/v3.2.4...v3.3.0> *** *Released with [GoReleaser Pro](https://goreleaser.com/pro)!* </details> <details> <summary>astral-sh/uv (uv)</summary> ### [`v0.9.10`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0910) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.9.9...0.9.10) Released on 2025-11-17. ##### Enhancements - Add support for `SSL_CERT_DIR` ([#​16473](https://redirect.github.com/astral-sh/uv/pull/16473)) - Enforce UTF‑8-encoded license files during `uv build` ([#​16699](https://redirect.github.com/astral-sh/uv/pull/16699)) - Error when a `project.license-files` glob matches nothing ([#​16697](https://redirect.github.com/astral-sh/uv/pull/16697)) - `pip install --target` (and `sync`) install Python if necessary ([#​16694](https://redirect.github.com/astral-sh/uv/pull/16694)) - Account for `python_downloads_json_url` in pre-release Python version warnings ([#​16737](https://redirect.github.com/astral-sh/uv/pull/16737)) - Support HTTP/HTTPS URLs in `uv python --python-downloads-json-url` ([#​16542](https://redirect.github.com/astral-sh/uv/pull/16542)) ##### Preview features - Add support for `--upgrade` in `uv python install` ([#​16676](https://redirect.github.com/astral-sh/uv/pull/16676)) - Fix handling of `python install --default` for pre-release Python versions ([#​16706](https://redirect.github.com/astral-sh/uv/pull/16706)) - Add `uv workspace list` to list workspace members ([#​16691](https://redirect.github.com/astral-sh/uv/pull/16691)) ##### Bug fixes - Don't check file URLs for ambiguously parsed credentials ([#​16759](https://redirect.github.com/astral-sh/uv/pull/16759)) ##### Documentation - Add a "storage" reference document ([#​15954](https://redirect.github.com/astral-sh/uv/pull/15954)) ### [`v0.9.9`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#099) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.9.8...0.9.9) Released on 2025-11-12. ##### Deprecations - Deprecate use of `--project` in `uv init` ([#​16674](https://redirect.github.com/astral-sh/uv/pull/16674)) ##### Enhancements - Add iOS support to Python interpreter discovery ([#​16686](https://redirect.github.com/astral-sh/uv/pull/16686)) - Reject ambiguously parsed URLs ([#​16622](https://redirect.github.com/astral-sh/uv/pull/16622)) - Allow explicit values in `uv version --bump` ([#​16555](https://redirect.github.com/astral-sh/uv/pull/16555)) - Warn on use of managed pre-release Python versions when a stable version is available ([#​16619](https://redirect.github.com/astral-sh/uv/pull/16619)) - Allow signing trampolines on Windows by using `.rcdata` to store metadata ([#​15068](https://redirect.github.com/astral-sh/uv/pull/15068)) - Add `--only-emit-workspace` and similar variants to `uv export` ([#​16681](https://redirect.github.com/astral-sh/uv/pull/16681)) ##### Preview features - Add `uv workspace dir` command ([#​16678](https://redirect.github.com/astral-sh/uv/pull/16678)) - Add `uv workspace metadata` command ([#​16516](https://redirect.github.com/astral-sh/uv/pull/16516)) ##### Configuration - Add `UV_NO_DEFAULT_GROUPS` environment variable ([#​16645](https://redirect.github.com/astral-sh/uv/pull/16645)) ##### Bug fixes - Remove `torch-model-archiver` and `torch-tb-profiler` from PyTorch backend ([#​16655](https://redirect.github.com/astral-sh/uv/pull/16655)) - Fix Pixi environment detection ([#​16585](https://redirect.github.com/astral-sh/uv/pull/16585)) ##### Documentation - Fix `CMD` path in FastAPI Dockerfile ([#​16701](https://redirect.github.com/astral-sh/uv/pull/16701)) ### [`v0.9.8`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#098) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.9.7...0.9.8) Released on 2025-11-07. ##### Enhancements - Accept multiple packages in `uv export` ([#​16603](https://redirect.github.com/astral-sh/uv/pull/16603)) - Accept multiple packages in `uv sync` ([#​16543](https://redirect.github.com/astral-sh/uv/pull/16543)) - Add a `uv cache size` command ([#​16032](https://redirect.github.com/astral-sh/uv/pull/16032)) - Add prerelease guidance for build-system resolution failures ([#​16550](https://redirect.github.com/astral-sh/uv/pull/16550)) - Allow Python requests to include `+gil` to require a GIL-enabled interpreter ([#​16537](https://redirect.github.com/astral-sh/uv/pull/16537)) - Avoid pluralizing 'retry' for single value ([#​16535](https://redirect.github.com/astral-sh/uv/pull/16535)) - Enable first-class dependency exclusions ([#​16528](https://redirect.github.com/astral-sh/uv/pull/16528)) - Fix inclusive constraints on available package versions in resolver errors ([#​16629](https://redirect.github.com/astral-sh/uv/pull/16629)) - Improve `uv init` error for invalid directory names ([#​16554](https://redirect.github.com/astral-sh/uv/pull/16554)) - Show help on `uv build -h` ([#​16632](https://redirect.github.com/astral-sh/uv/pull/16632)) - Include the Python variant suffix in "Using Python ..." messages ([#​16536](https://redirect.github.com/astral-sh/uv/pull/16536)) - Log most recently modified file for cache-keys ([#​16338](https://redirect.github.com/astral-sh/uv/pull/16338)) - Update Docker builds to use nightly Rust toolchain with musl v1.2.5 ([#​16584](https://redirect.github.com/astral-sh/uv/pull/16584)) ##### Configuration - Expose `UV_NO_GROUP` as an environment variable ([#​16529](https://redirect.github.com/astral-sh/uv/pull/16529)) - Add `UV_NO_SOURCES` as an environment variable ([#​15883](https://redirect.github.com/astral-sh/uv/pull/15883)) ##### Bug fixes - Allow `--check` and `--locked` to be used together in `uv lock` ([#​16538](https://redirect.github.com/astral-sh/uv/pull/16538)) - Allow for unnormalized names in the METADATA file ([#​16547](https://redirect.github.com/astral-sh/uv/issues/16547)) ([#​16548](https://redirect.github.com/astral-sh/uv/pull/16548)) - Fix missing value\_type for `default-groups` in schema ([#​16575](https://redirect.github.com/astral-sh/uv/pull/16575)) - Respect multi-GPU outputs in `nvidia-smi` ([#​15460](https://redirect.github.com/astral-sh/uv/pull/15460)) - Fix DNS lookup errors in Docker containers ([#​8450](https://redirect.github.com/astral-sh/uv/issues/8450)) ##### Documentation - Fix typo in uv tool list doc ([#​16625](https://redirect.github.com/astral-sh/uv/pull/16625)) - Note `uv pip list` name normalization in docs ([#​13210](https://redirect.github.com/astral-sh/uv/pull/13210)) ##### Other changes - Update Rust toolchain to 1.91 and MSRV to 1.89 ([#​16531](https://redirect.github.com/astral-sh/uv/pull/16531)) ### [`v0.9.7`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#097) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.9.6...0.9.7) Released on 2025-10-30. ##### Enhancements - Add Windows x86-32 emulation support to interpreter architecture checks ([#​13475](https://redirect.github.com/astral-sh/uv/pull/13475)) - Improve readability of progress bars ([#​16509](https://redirect.github.com/astral-sh/uv/pull/16509)) - Add GitHub attestations for uv release artifacts ([#​11357](https://redirect.github.com/astral-sh/uv/pull/11357)) ##### Bug fixes - Drop terminal coloring from `uv auth token` output ([#​16504](https://redirect.github.com/astral-sh/uv/pull/16504)) - Don't use UV\_LOCKED to enable `--check` flag ([#​16521](https://redirect.github.com/astral-sh/uv/pull/16521)) ### [`v0.9.6`](https://redirect.github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#096) [Compare Source](https://redirect.github.com/astral-sh/uv/compare/0.9.5...0.9.6) Released on 2025-10-29. This release contains an upgrade to Astral's fork of `async_zip`, which addresses potential sources of ZIP parsing differentials between uv and other Python packaging tooling. See [GHSA-pqhf-p39g-3x64](https://redirect.github.com/astral-sh/uv/security/advisories/GHSA-pqhf-p39g-3x64) for additional details. ##### Security - Address ZIP parsing differentials ([GHSA-pqhf-p39g-3x64](https://redirect.github.com/astral-sh/uv/security/advisories/GHSA-pqhf-p39g-3x64)) ##### Python - Upgrade GraalPy to 25.0.1 ([#​16401](https://redirect.github.com/astral-sh/uv/pull/16401)) ##### Enhancements - Add `--clear` to `uv build` to remove old build artifacts ([#​16371](https://redirect.github.com/astral-sh/uv/pull/16371)) - Add `--no-create-gitignore` to `uv build` ([#​16369](https://redirect.github.com/astral-sh/uv/pull/16369)) - Do not error when a virtual environment directory cannot be removed due to a busy error ([#​16394](https://redirect.github.com/astral-sh/uv/pull/16394)) - Improve hint on `pip install --system` when externally managed ([#​16392](https://redirect.github.com/astral-sh/uv/pull/16392)) - Running `uv lock --check` with outdated lockfile will print that `--check` was passed, instead of `--locked` ([#​16322](https://redirect.github.com/astral-sh/uv/pull/16322)) - Update `uv init` template for Maturin ([#​16449](https://redirect.github.com/astral-sh/uv/pull/16449)) - Improve ordering of Python sources in logs ([#​16463](https://redirect.github.com/astral-sh/uv/pull/16463)) - Restore DockerHub release images and annotations ([#​16441](https://redirect.github.com/astral-sh/uv/pull/16441)) ##### Bug fixes - Check for matching Python implementation during `uv python upgrade` ([#​16420](https://redirect.github.com/astral-sh/uv/pull/16420)) - Deterministically order `--find-links` distributions ([#​16446](https://redirect.github.com/astral-sh/uv/pull/16446)) - Don't panic in `uv export --frozen` when the lockfile is outdated ([#​16407](https://redirect.github.com/astral-sh/uv/pull/16407)) - Fix root of `uv tree` when `--package` is used with circular dependencies ([#​15908](https://redirect.github.com/astral-sh/uv/pull/15908)) - Show package list with `pip freeze --quiet` ([#​16491](https://redirect.github.com/astral-sh/uv/pull/16491)) - Limit `uv auth login pyx.dev` retries to 60s ([#​16498](https://redirect.github.com/astral-sh/uv/pull/16498)) - Add an empty group with `uv add --group ... -r ...` ([#​16490](https://redirect.github.com/astral-sh/uv/pull/16490)) ##### Documentation - Update docs for maturin build backend init template ([#​16469](https://redirect.github.com/astral-sh/uv/pull/16469)) - Update docs to reflect previous changes to signal forwarding semantics ([#​16430](https://redirect.github.com/astral-sh/uv/pull/16430)) - Add instructions for installing via MacPorts ([#​16039](https://redirect.github.com/astral-sh/uv/pull/16039)) </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:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNTkuNCIsInVwZGF0ZWRJblZlciI6IjQyLjE2LjEiLCJ0YXJnZXRCcmFuY2giOiJtYXN0ZXIiLCJsYWJlbHMiOltdfQ==--> 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, 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++, 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, 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 | Kotlin |
| L | Lean4, Lighttpd configuration file, LLVM, lox, Lua |
| M | Makefile, Mako, markdown, Mason, Materialize SQL dialect, Mathematica, Matlab, MCFunction, Meson, Metal, MiniZinc, MLIR, 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, PRQL, PSL, Puppet, Python, Python 2 |
| Q | QBasic, QML |
| R | R, Racket, Ragel, Raku, react, ReasonML, reg, Rego, reStructuredText, Rexx, RPGLE, RPMSpec, Ruby, Rust |
| S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Sed, Sieve, Smali, Smalltalk, Smarty, SNBT, Snobol, Solidity, SourcePawn, 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, 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.
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.
