Files
oxc/crates/oxc_formatter_core/CHANGELOG.md
T
oxc-guard f3fcdcc61b release(apps): oxlint v1.91.0 && oxfmt v0.76.0 (#28718)
# Oxlint
### 🚀 Features

- 004647a track_memory_allocs: Add allocation tracking for linter rules (#28470) (Cam McHenry)
- 419c1b0 linter: Add allow and allowPattern options to react/capitalized-calls (Christian Vuerings)

### 🐛 Bug Fixes

- a205cd3 linter/eslint/no-control-regex: Detect raw control characters (#28548) (camc314)
- 7c65777 linter/unicorn/prefer-global-this: Align typeof and worker API handling (#28549) (camc314)
- 987d5f1 linter/unicorn/no-invalid-fetch-options: Avoid treating unknown methods as GET (#28547) (camc314)
- e234dc8 linter/unicorn/no-useless-error-capture-stack-trace: Move to suspicious category (#28545) (camc314)
- b3dc411 linter/typescript/no-non-null-asserted-nullish-coalescing: Move to suspicious category (#28546) (camc314)
- cb64638 regular_expression: Reject incomplete Unicode atom escapes (#28448) (Boshen)
- c67167e linter: Only run React Compiler rules on files with top-level components or hooks (Boshen)
- 4c9d5aa linter: Treat Reanimated shared values as ref-like in React Compiler rules (Boshen)
- 61fe2af linter/react: Ignore impure calls in async components in react/purity (Rahul Kashyap)
- ed7df7d ast/estree: Include comments in TS Program span (#28326) (camc314)
- 31cbe37 linter: Make gitlab fingerprints unique per diagnostic (#28307) (camc314)

### ⚡ Performance

- bb947dc linter: Skip numeric separator formatting for short integers (#28485) (Cam McHenry)
- 1043dfa linter: Avoid collecting prefer-const binding identifiers (#28484) (Cam McHenry)
- 7c93eef linter: Reduce branches-sharing-code scratch allocations (#28483) (Cam McHenry)
- c0065fd linter: Allocate escape-case replacements only when needed (#28482) (Cam McHenry)
- d837414 linter: Lazily normalize capitalized-comments text (#28481) (Cam McHenry)
- 6baaad6 linter: Avoid no-var binding identifier allocations (#28480) (Cam McHenry)
- 882053b linter: Skip read-only parameters in no-param-reassign (#28479) (Cam McHenry)
- 92deebf linter: Reduce no-unmodified-loop-condition allocations (#28478) (Cam McHenry)
- f01d52d linter: Reduce no-duplicate-case allocations (#28477) (Cam McHenry)
- 6a72d84 linter: Reduce no-dupe-class-members allocations (#28476) (Cam McHenry)
- 77599ef linter: Reduce no-this-before-super allocations (#28475) (Cam McHenry)
- 2ea9f58 linter/no-dupe-else-if: Use smallvec to reduce allocs (#28474) (Cam McHenry)
- 69f0204 linter/react/rules-of-hooks: Reduce allocs (#28473) (Cam McHenry)
- b138c20 linter: Reduce allocs in no-dupe-keys (#28472) (Cam McHenry)
- 6f3e982 linter: Avoid operator allocations in no-useless-length-check (#28471) (Cam McHenry)
- fd68928 react-compiler: Skip passes lint does not need (Yagiz Nizipli)
- 224f4dd linter/eslint/sort-keys: Reserve initial capacity for string (#27624) (Cam McHenry)
- e4e01a3 linter/import/no-cycle: Compare visited modules by absolute resolved path (#27517) (Cam McHenry)
- 741b29b linter/import/no-cycle: Cache sorted module record snapshots (#27516) (Cam McHenry)
- 20022bb linter/import/no-cycle: Reuse traversal buffers between imports (#27481) (Cam McHenry)
- fd5edb7 linter/import/no-cycle: Reuse module records in diagnostic stack (#27480) (Cam McHenry)
- 73e877c linter/import/no-cycle: Don't allocate paths already seen (#27478) (Cam McHenry)
- 1515d53 linter/react/forward-ref-uses-ref: Narrow forward-ref-uses-ref dispatch (#28367) (Cam McHenry)
- ee51c01 linter/react/no-string-refs: Narrow AST dispatch (#28366) (Cam McHenry)
- bbfd692 linter/react/no-children-pop: Narrow AST dispatch (#28365) (Cam McHenry)
- a86158b linter/unicorn/prefer-set-size: Narrow AST dispatch (#28364) (Cam McHenry)
- a777fa6 linter/eslint/no-iterator: Narrow member dispatch (#28363) (Cam McHenry)
- bc5e94d linter/eslint/no-extra-boolean-cast: Narrow AST dispatch (#28362) (Cam McHenry)
- 93c6e6d linter/unicorn/no-useless-fallback-in-spread: Narrow AST dispatch (#28361) (Cam McHenry)
- 1a1f66e linter/typescript/no-this-alias: Narrow AST dispatch (#28360) (Cam McHenry)
- b102a91 linter/typescript/no-wrapper-object-types: Index references (#28359) (Cam McHenry)
- dbd8a0b linter/eslint/no-unassigned-vars: Batch by declaration (#28358) (Cam McHenry)
- 1108352 linter/typescript/prefer-as-const: Narrow AST dispatch (#28357) (Cam McHenry)
- d65531f linter/eslint/no-const-assign: Batch by declaration (#28356) (Cam McHenry)
- 1ec9991 linter/oxc/number-arg-out-of-range: Narrow AST dispatch (#28355) (Cam McHenry)
- 7a1243e linter/unicorn/no-invalid-fetch-options: Narrow AST dispatch (#28354) (Cam McHenry)
- 2ab73cc linter/unicorn/no-single-promise-in-promise-methods: Narrow AST dispatch (#28353) (Cam McHenry)
- 483c4c9 linter/eslint/no-compare-neg-zero: Narrow no-compare-neg-zero dispatch (#28352) (Cam McHenry)
- 56c99c6 linter/eslint/no-unsafe-negation: Narrow AST dispatch (#28351) (Cam McHenry)
- 84d974b linter/unicorn/prefer-string-starts-ends-with: Narrow AST dispatch (#28350) (Cam McHenry)
- 142ef4f unicorn: Narrow no-await-in-promise-methods dispatch (#28349) (Cam McHenry)
- a3dc7a2 linter/unicorn/no-await-expression-member: Optimize AST dispatch (#28348) (Cam McHenry)
- 481b638 linter/plugins: Create AST nodes with `Object.create` instead of `__proto__` literals (#27816) (Charles Wang)
# Oxfmt
### 💥 BREAKING CHANGES

- 296623d oxfmt: [**BREAKING**] Format `parser:html` files by `oxc_formatter_htmlish` (#28273) (Yuji Sugiura)

### 🚀 Features

- 336b2c1 oxfmt: Support html-in-js templates closing a dynamic tag name (#28389) (Yuji Sugiura)
- 0a42af6 formatter_htmlish: Format end tags of omitted `html`, `head` and `body` (#28388) (Yuji Sugiura)
- 44d8c2b formatter_htmlish: Implement HTML-ish formatter `Html` variant (#28272) (Yuji Sugiura)
- 36e5ddb oxfmt: Add debug span for reading files (#28204) (leaysgur)

### 🐛 Bug Fixes

- dbcc358 formatter: Keep arrow conditional body parens before a leading `function`/`class` (#28710) (Yuji Sugiura)
- fef809a formatter_htmlish: Handle XHTML (#28703) (leaysgur)
- f3dd201 formatter_htmlish: Keep SVG text under `xml:space="preserve"` as written (#28382) (Yuji Sugiura)
- fb3aefa formatter: Keep source parens around html-in-js placeholders past comments (#28381) (Yuji Sugiura)
- e738dae formatter: Quote keys added in an HTML event handler with single quotes (#28380) (Yuji Sugiura)
- 2e7a629 oxfmt: Format HTML in a `<script>` body as an embedded part (#28379) (Yuji Sugiura)
- f00862b formatter: Keep parens around a generic function type in a type assertion (#28173) (vidigoat)
- 9ead5c4 formatter: Handle `this.b` and `super.b` like `foo.b` (#28200) (leaysgur)
- 72a54cf formatter: Break parens of `(a + b)[c]` like `(a + b).c` (#28199) (leaysgur)
- b8f4f34 formatter: Print `x.b` and `x.#b` samely (#28193) (leaysgur)
- 9ddccb7 formatter: Keep parens for private field (#28188) (leaysgur)

### ⚡ Performance

- b6f1ac9 formatter_markdown: Bump parser to 0.0.4 and skip unread work (#28713) (leaysgur)
- 633ee96 formatter_css: Use `u32` spans (#28708) (leaysgur)
- f680ee1 formatter_yaml: Use `multiline` flag for flow scalars (#28707) (leaysgur)
- ff7c203 formatter_css: Avoid repeated scans and allocations in values (#28706) (leaysgur)
- 7cd46cb formatter_htmlish: Search script end tags by `<` in embedded (#28704) (leaysgur)
- 46f8efd formatter_graphql: Print block string lines borrowed from the source (#28701) (leaysgur)
- dce1485 formatter_htmlish: Skip escaping attr values without the chosen quote (#28700) (leaysgur)
- e9392c8 formatter_core: Search line terminators with memchr (#28699) (leaysgur)
- ceb26be formatter_htmlish: Use `char` to escape attr quotes (#28697) (leaysgur)
- 8239dac parser: Replace dragonbox_ecma with zmij_ecma (#28282) (Boshen)

### 📚 Documentation

- 303d9e8 formatter: Strengthen `start-token-no-double-parens` rationale (#28711) (Yuji Sugiura)
- a82ce83 oxfmt: Update unclassified divergence (#28685) (Yuji Sugiura)
- 7f18c20 formatter_htmlish: Note `class` and `srcset` are formatted with `embeddedLanguageFormatting: off` (#28465) (Yuji Sugiura)
- 01ed68a oxfmt,formatter_htmlish,formatter: Clean up behavior comments (#28384) (Yuji Sugiura)
- a363c27 formatter_css,formatter_yaml: Point parser citations at AGENTS.md (#28466) (Yuji Sugiura)
- 6586050 formatter_core: Document tab width in text width policy (#28393) (leaysgur)
- 49fbffb formatter_core: Tighten FORMATTER_POLICY (#28206) (leaysgur)
2026-11-02 19:47:18 +00:00

7.6 KiB

Changelog

All notable changes to this package will be documented in this file.

The format is based on Keep a Changelog.

[0.76.0] - 2026-11-02

💥 BREAKING CHANGES

  • 296623d oxfmt: [BREAKING] Format parser:html files by oxc_formatter_htmlish (#28273) (Yuji Sugiura)

⚡ Performance

  • e9392c8 formatter_core: Search line terminators with memchr (#28699) (leaysgur)

📚 Documentation

  • 6586050 formatter_core: Document tab width in text width policy (#28393) (leaysgur)
  • 49fbffb formatter_core: Tighten FORMATTER_POLICY (#28206) (leaysgur)

[0.75.0] - 2026-10-27

🐛 Bug Fixes

  • 5f1fd3d formatter: Measure width heuristics by display width (#28098) (leaysgur)
  • 999496e formatter: Measure a short key by its display width (#28026) (vidigoat)
  • eb1d9f9 formatter_core: Count a flat line space in fits only when text follows (#27987) (leaysgur)

⚡ Performance

  • 1ed93af data_structures: Copy short strings without a memcpy call (#27953) (leaysgur)
  • 7948f0b formatter_core: Shrink FormatElement to 16B (#28012) (leaysgur)

📚 Documentation

  • db55461 formatter_core: Document text width divergence (#28095) (leaysgur)

[0.74.0] - 2026-10-19

🐛 Bug Fixes

  • 529b057 formatter_core: Keep front matter verbatim when body starts with indented delimiter (#27946) (leaysgur)
  • a64677e formatter: Print JSDoc embedded snippets with LF (#27821) (leaysgur)
  • 5b2acb0 formatter_core: Report error position releative to CRLF source (#27777) (leaysgur)
  • c78e80e formatter_core: Report parse error positions relative to the BOM-headed source (#27776) (leaysgur)
  • d2bea21 formatter: Glue comments to an opener in empty for-head slots and array holes (#27737) (leaysgur)

⚡ Performance

  • e5fdc9c formatter_core: Write into one element stack through a concrete Formatter (#27559) (leaysgur)
  • 1c393c0 formatter_core: Skip scanning texts with nothing to rewrite (#27561) (leaysgur)
  • 1d3ef10 formatter_core: Keep the embedded IR when nothing in it is rewritten (#27673) (leaysgur)

[0.73.0] - 2026-10-13

🐛 Bug Fixes

  • 372849e formatter: Fix crash on css-in-js comment containing interpolation (#27638) (leaysgur)
  • d730fdd formatter_core: Leave blank frontmatter without dispatcher (#27359) (leaysgur)

[0.72.0] - 2026-10-05

💥 BREAKING CHANGES

  • e2c68b1 oxfmt: [BREAKING] Format parser:markdown files by oxc_formatter_markdown (#27256) (leaysgur)

🐛 Bug Fixes

  • dd72fbf formatter_markdown: Keep container columns as spaces under useTabs (#27277) (leaysgur)
  • c2de02b formatter: Decide embedded template layout from AST, not source shape (#27218) (leaysgur)
  • 36e14df formatter: Keep comments between callee and its opener on the callee side (#27172) (leaysgur)

⚡ Performance

  • cea47e3 formatter_core: Avoid exponential will_break check on nested interned (#27211) (leaysgur)

[0.69.0] - 2026-09-21

🚀 Features

  • 7717813 formatter_markdown: Implement markdown formatter (#26434) (leaysgur)

📚 Documentation

  • e012542 formatter_core: Add note for blanked front matter (#26786) (leaysgur)
  • 11ff089 formatter_markdown: Follow updated DIVERGENCES policy (#26776) (leaysgur)
  • 0c16983 formatter_core: Clean up FORMATTER_POLICY (#26745) (leaysgur)

[0.68.0] - 2026-09-14

🚀 Features

  • 586f27a formatter_core: Add prefix_align builder and Tag::(Start|End)Prefix (#26520) (leaysgur)

🐛 Bug Fixes

  • dea2ba0 formatter_core: Do not panic with align(0) (#26468) (leaysgur)

📚 Documentation

  • 66fda4f formatter: Update AGENTS.md comment handling (#26551) (leaysgur)

[0.67.0] - 2026-09-07

💥 BREAKING CHANGES

  • 2c9a947 parser: [BREAKING] Reduce MAX_LEN to 256 bytes below u32::MAX (#26352) (overlookmotel)

🐛 Bug Fixes

  • 104061b formatter: Keep JSDoc cast parens with a comment inside them (#26374) (leaysgur)
  • 172ddb6 formatter_css: Keep a same-line line comment on its line (#26321) (leaysgur)
  • 534a0fe formatter_css: Keep a line comment on its comma's line (#26319) (leaysgur)
  • 2028896 formatter_css: Preserve comments around SCSS/Less variable values (#26276) (leaysgur)
  • 3b054de formatter_graphql: Align comment printing after open { (#26271) (leaysgur)

📚 Documentation

  • 32084d4 formatter_core: Clarify printer hard_line compression (#26312) (leaysgur)
  • 26a1fa4 formatter_core: Refine FORMATTER_POLICY (#26266) (leaysgur)

[0.66.0] - 2026-08-31

📚 Documentation

  • 181953b oxfmt,formatter_core,formatter,formatter_yaml,formatter_css,formatter_graphql: Extract DIVERGENCES.md out from AGENTS.md (#26121) (leaysgur)
  • a67cb9d formatter,formatter_core: Document comment moving policy (#26075) (leaysgur)
  • fc175b0 formatter_core: Clarify idempotency test infra (#26069) (leaysgur)

[0.63.0] - 2026-08-10

🚀 Features

  • fd02a89 oxfmt: Dispatch yaml-in-css(frontmatter) to oxc_formatter_yaml (#25336) (leaysgur)
  • ab12665 formatter_core: Add hardlineWithoutBreakParent equivalent IR (#25273) (leaysgur)

🐛 Bug Fixes

  • ab52a59 formatter: Format xxx-in-js inside JSDoc js fence (#25414) (leaysgur)
  • 1a2c64a formatter,oxfmt: Apply effective print width for JSDoc fence (#25413) (leaysgur)
  • 2eaede9 formatter_core: Unify leading-BOM handlings (#25340) (leaysgur)
  • c29b587 formatter_core: Measure decided-flat fill separator as flat during group re-measure (#25276) (leaysgur)

📚 Documentation

  • 6eae5c9 formatter,oxfmt: Record embed-layer decisions in place (#25422) (leaysgur)

[0.62.0] - 2026-08-03

🐛 Bug Fixes

  • f56009a oxfmt: Correct prose about comment width in fits measurement (#25054) (leaysgur)

📚 Documentation

  • eaa7c69 formatter_core: Extract FORMATTER_POLICY (#25233) (leaysgur)

[0.61.0] - 2026-07-27

⚡ Performance

  • bb73b23 formatter_core: Bound the thread-local scratch cache (#24793) (leaysgur)
  • a5f7b15 formatter: Stage assignment-like left hand side on the heap (#24613) (leaysgur)
  • 94de05f formatter: Accumulate JSX child-list builders on the heap (#24585) (leaysgur)
  • 7810e8a formatter_core: Share one thread-cached scratch vector across staging buffers (#24583) (leaysgur)
  • c191f51 formatter_core: Stage IR buffers on the heap to reduce arena memory (#24582) (leaysgur)

[0.59.0] - 2026-07-13

🚀 Features

  • a9a5cd6 formatter_core: Expose SourceText::as_str() (#24281) (leaysgur)

⚡ Performance

  • eeb1913 formatter_core: Avoid per-call Vec work-stack in soft-line removal (#23775) (Marius Schulz)

[0.58.0] - 2026-07-06

🚀 Features

  • 89ec3d9 formatter_core: Add literal line and root indention primitives (#24051) (leaysgur)
  • 213a96b formatter_core: Add no-expand-parent for multiline text (#24050) (leaysgur)

⚡ Performance

  • 468e1e3 formatter_core: Make printer queues cursor-based (#24098) (Boshen)
  • c59f2fe rust: Return impl ExactSizeIterator from slice-backed accessors (#24144) (Boshen)
  • c292fb2 formatter: Inline fits element dispatcher (#23982) (camc314)

[0.57.0] - 2026-06-29

⚡ Performance

  • 4ddcba0 formatter_core: Add printable-ASCII fast path to TextWidth (#23913) (Lawrence Lin)

📚 Documentation

  • b4d0dc9 oxfmt,formatter,formatter_css,formatter_core: Update AGENTS.md (#23814) (leaysgur)

[0.56.0] - 2026-06-22

💥 BREAKING CHANGES

  • 36009dd allocator: [BREAKING] GetAllocator::allocator take &self (#23676) (overlookmotel)

[0.54.0] - 2026-06-08

🚀 Features

  • 27a6db8 formatter_json: Implement jsonc variant (#22912) (leaysgur)

🐛 Bug Fixes

  • 01e0871 formatter,formatter_json: Handle PS/LS as line terminator (#22978) (leaysgur)

[0.53.0] - 2026-06-01

📚 Documentation

  • 845f393 oxfmt,formatter,formatter_json,formatter_core: Add/update AGENTS.md (#22873) (leaysgur)