Commit Graph
1680 Commits
Author SHA1 Message Date
Cam McHenry 004647a4fa feat(track_memory_allocs): add allocation tracking for linter rules (#28470)
As an alternative to https://github.com/oxc-project/oxc/pull/27477, this
requires minimal changes in the linter in order to add allocation
tracking for individual rules. We run each rule individually and then
compare the diff in heap size before and after as well as the number of
system and arena allocations.

Additionally, this runs as a local-only opt-in feature so that we don't
check this in CI automatically, since linter allocations are likely
quite noisy.
2026-10-30 12:26:30 -04:00
Yuji Sugiura 211126a771 test(formatter_tests): own options parsing in the harness (#28532)
Cleaned up the code now that Prettier conformance is gone and each
formatter crate just runs fixture tests.
2026-10-30 22:15:36 +09:00
Yuji Sugiura b6f6f3fd20 test(formatter_tests): remove each crate's prettier conformance (#28530)
Remove each crate side Prettier conformance, already tested by Oxfmt
side.
2026-10-30 22:15:36 +09:00
Yuji Sugiura c8cfcc9ab8 refactor(formatter_htmlish): simplify attribute, sibling and sensitivity printing (#28378)
Update HTML attributes list and simplify printing.
2026-10-30 07:37:56 +00:00
Yuji Sugiura 296623d868 feat(oxfmt)!: format parser:html files by oxc_formatter_htmlish (#28273)
Fixes #28263 

- Before this PR: `.html` and also html-in-{js,md,etc} are formatted by
Prettier.
  - Because of that, we had to run JS, which became an overhead.
- After this PR: All of them are formatted natively by
`oxc_formatter_htmlish`.
  - No overhead.

At the same time, since we are fixing Prettier bugs and inconsistent
behavior, please refer to DIVERGENCES.md for the differences.
2026-10-30 16:29:13 +09:00
Yuji Sugiura 44d8c2b824 feat(formatter_htmlish): Implement HTML-ish formatter Html variant (#28272)
Part of #28263
2026-10-30 16:00:59 +09:00
renovate[bot] c62fbbb088 chore(deps): update napi to v3.16.0 (#28519)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [napi](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | minor | `3.15.0` → `3.16.0` |
| [napi-derive](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | minor | `3.6.13` → `3.7.0` |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (napi)</summary>

###
[`v3.16.0`](https://redirect.github.com/napi-rs/napi-rs/releases/tag/napi-v3.16.0)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/napi-v3.15.0...napi-v3.16.0)

##### Added

- *(napi)* support well-known symbol keys for class members
([#&#8203;3665](https://redirect.github.com/napi-rs/napi-rs/pull/3665))
- *(napi)* support symbol_for keys for class members
([#&#8203;3661](https://redirect.github.com/napi-rs/napi-rs/pull/3661))

##### Fixed

- *(napi)* compact class identity metadata
([#&#8203;3667](https://redirect.github.com/napi-rs/napi-rs/pull/3667))
- *(napi)* keep the registered classes when a later load fails
([#&#8203;3666](https://redirect.github.com/napi-rs/napi-rs/pull/3666))
- *(napi)* free define_class closures, honour static flags, avoid TS1016
in constructors
([#&#8203;3662](https://redirect.github.com/napi-rs/napi-rs/pull/3662))
- *(napi)* free threadsafe function call data when the call fails
([#&#8203;3656](https://redirect.github.com/napi-rs/napi-rs/pull/3656))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- 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/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODguMiIsInVwZGF0ZWRJblZlciI6IjQ0LjE4OC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-30 06:55:04 +00:00
Christian Vuerings 419c1b0fd0 feat(linter): add allow and allowPattern options to react/capitalized-calls
Original PR: #25960
2026-10-29 15:21:32 +08:00
Boshen 8239daca6e perf(parser): replace dragonbox_ecma with zmij_ecma (#28282)
Use `zmij_ecma` to reduce float-formatting time while preserving
ECMAScript output. Local Apple M4 Pro measurements showed 21–66% less
conversion time and about 18% less time generating synthetic
numeric-heavy JavaScript; real-world bundles were roughly unchanged.

AI-assisted with Codex.
2026-10-28 21:34:45 +08:00
oxc-guard[bot]andDunqing 9b6fff42fa release(apps): oxlint v1.90.0 && oxfmt v0.75.0 (#28191)
# Oxlint
### 🚀 Features

- cf34678 oxlint: Export `Oxlintrc` type (#28132) (Sysix)
- 831cdf1 oxlint: Require mininum oxlint-tsgolint version v7.0.2005
(#28118) (camc314)
- d1b00f4 linter/typescript: Implement no-unsafe-enum-assignment rule
(#28117) (camc314)
- 165c91f linter/typescript/await-thenable: Support
`allowMixedPromiseArrays` option (#28116) (camc314)

### 🐛 Bug Fixes

- 7f3c908 linter/eslint/array-callback-return: Check callbacks passed
with extra arguments (#28133) (sarankumar)
- 53be530 linter: Filter by type aware rules when looking up tsgolint
rule severity (#28138) (NavpreetSSidhu)
- e0f8937 react-compiler: Compile a `try` whose `catch` is unreachable
instead of panicking (#28066) (Dunqing)
- f5b625f linter/eslint/no-useless-concat: See through parenthesized
expressions (#27984) (Rahul Kashyap)
- 4629bb2 linter/jest/no-conditional-expect: Check function expression
callbacks (#28055) (camc314)
- 5c84098 semantic,linter: Report names with lone surrogates in enum and
lint checks (#27991) (Dunqing)
- f3705a9 linter/eslint/prefer-const: Skip fixers if any declarator is
reassigned (#28008) (Prince Jain)
- 4c0fa90 minifier,linter: Keep `delete` of constant members and later
JSX keys (#27990) (Dunqing)
- 0298062 linter/arrow-body-style: Keep type assertions when adding a
block body (#27978) (Yan Almeida)
# Oxfmt
### 🐛 Bug Fixes

- 5042019 formatter: Keep fill layout for array with comment after [
(#28170) (leaysgur)
- 9d37ff6 formatter: Use position-based comment checks for concise
arrays (#28169) (leaysgur)
- 016c4a2 formatter: Keep a comment before `}` inside a JSX spread child
(#28103) (vidigoat)
- 190bb1e formatter: Keep parens around an instantiation expression
ending an operand through any tight parent (#28168) (leaysgur)
- a5314a1 formatter: Keep `;` before `in` and `instanceof` class members
(#28166) (leaysgur)
- 3a56e7c formatter: Keep closing HTML comments at the start of a line
(#28064) (Cameron)
- 23d23d6 formatter_markdown: Honor range ignore inside directives
(#28164) (leaysgur)
- 5f1fd3d formatter: Measure width heuristics by display width (#28098)
(leaysgur)
- a5a52cf formatter: Keep parens around private `in` expressions
(#28096) (leaysgur)
- 999496e formatter: Measure a short key by its display width (#28026)
(vidigoat)
- 7e9aa44 formatter: Keep parens around a looser operand of an
instantiation expression (#28025) (vidigoat)
- 6912d1f formatter: Keep an arrow signature that exactly fills the line
for any body (#27989) (leaysgur)
- 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)
- 788af22 formatter: Keep `AstNode`s on the stack, and only chain links
in the arena (#27963) (leaysgur)

### 📚 Documentation

- 068a8ea formatter: Fix up wording (#28167) (leaysgur)
- db55461 formatter_core: Document text width divergence (#28095)
(leaysgur)
- 880d229 formatter: Add vitest-test-call to known divergences (#28006)
(leaysgur)

Co-authored-by: Dunqing <29533304+Dunqing@users.noreply.github.com>
2026-10-27 11:24:57 +08:00
oxc-guard[bot]andDunqing 75efdca474 release(crates): oxc v0.156.0 (#28190)
### 💥 BREAKING CHANGES

- cf8296f ecmascript: [**BREAKING**] Fold surrogate strings with JSStr
constants (#27098) (Dunqing)

### 🚀 Features

- dd6cb2b minifier: Fold out-of-bounds string indices to `void 0`
(#28004) (Dunqing)

### 🐛 Bug Fixes

- f4dac9e semantic: Separate hoisted vars from block type bindings
(#27936) (limadog9)
- 9ec6617 minifier: Keep brackets on negative and non-finite numeric
keys (#27855) (Yunus Ozen)
- 520a26e minifier: Keep the default in shorthand assignment targets
(#28183) (waltu)
- def47b8 react-compiler: Keep manual memoization as written when its
dependencies can't be honoured (#28101) (Dunqing)
- 704d8cf transformer_plugins: Keep the bare inject when references to
it remain (#26965) (Bharadwaj Pendyala)
- 6d7b372 minifier: Handle sequence exprs when folding if to expr
statement (#27939) (Armano)
- e3eca41 runtime: Align async iterator throw with Babel (#28059)
(camc314)
- af0258d parser: Parse source imports named type (#28062) (camc314)
- 83633a7 parser: Parse escaped class field names after initializers
(#28061) (camc314)
- 90c58ac parser: Parse postfix updates of sloppy `let` identifiers
(#28060) (camc314)
- 0e2934f codegen: Preserve default import names in source maps (#28058)
(camc314)
- 09bdb80 minifier: Allow argument rewrite with with leading var
assignments (#28056) (Armano)
- ebcdcd9 minifier: Preserve rest destructuring side effects (#27981)
(camc314)
- 5c84098 semantic,linter: Report names with lone surrogates in enum and
lint checks (#27991) (Dunqing)
- bd70a9b ecmascript: Use ECMAScript whitespace when folding
`parseFloat`/`parseInt`/`trim` (#27719) (Dunqing)
- 4c0fa90 minifier,linter: Keep `delete` of constant members and later
JSX keys (#27990) (Dunqing)

### ⚡ Performance

- 3493ce3 minifier: Reuse is_error_constructor and simplify
substitute_global_new_expression (#28149) (Armano)
- a22c9f2 parser: Move annotation comment handling out of hot paths
(#28139) (camc314)
- 1ed93af data_structures: Copy short strings without a memcpy call
(#27953) (leaysgur)

### 🛡️ Security

- b93e169 deps: Bump .node-version to 26.12.1 (#28090) (leaysgur)

Co-authored-by: Dunqing <29533304+Dunqing@users.noreply.github.com>
2026-10-27 11:19:24 +08:00
leaysgur 2b5a3fd678 chore(formatter_css): bump oxc-css-parser to 0.0.18 (#28161)
Fixes #28102
2026-10-26 03:52:43 +00:00
Yuji Sugiura 014e3d2676 chore(deps): bump tokio to 1.54.1 (#28163)
This fixes RUSTSEC-2026-0386 which makes `cargo deny` fail.

[v1.53.3](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.53.3)
seems enough to fix, but for sure.
2026-10-26 02:26:28 +00:00
renovate[bot] 8d6923b921 chore(deps): update napi to v3.15.0 (#28092)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [napi](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | minor | `3.14.2` → `3.15.0` |
| [napi-derive](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | patch | `3.6.12` → `3.6.13` |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (napi)</summary>

###
[`v3.15.0`](https://redirect.github.com/napi-rs/napi-rs/releases/tag/napi-v3.15.0)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/napi-v3.14.2...napi-v3.15.0)

##### Added

- *(napi)* cancel a ReadableStream through its Reader, and fix
ReadableStream::cancel
([#&#8203;3623](https://redirect.github.com/napi-rs/napi-rs/pull/3623))

##### Fixed

- *(napi)* set the custom GC aborted flag before Node closes its tsfn
([#&#8203;3626](https://redirect.github.com/napi-rs/napi-rs/pull/3626))
- *(napi)* TypedArray input leaks and compat buffer copies on wasm
([#&#8203;3612](https://redirect.github.com/napi-rs/napi-rs/pull/3612))
- *(napi)* copy managed array inputs
([#&#8203;3607](https://redirect.github.com/napi-rs/napi-rs/pull/3607))
- *(napi)* reject a value of another class on builds without type tags
([#&#8203;3610](https://redirect.github.com/napi-rs/napi-rs/pull/3610))
- *(napi)* drop unadopted class value and reset factory flag on failed
conversion
([#&#8203;3603](https://redirect.github.com/napi-rs/napi-rs/pull/3603))
- *(napi)* join the Tokio runtime threads at env teardown
([#&#8203;3592](https://redirect.github.com/napi-rs/napi-rs/pull/3592))
- *(napi)* keep borrowed class args alive across AsyncTask/AsyncBlock
([#&#8203;3584](https://redirect.github.com/napi-rs/napi-rs/pull/3584))

##### Other

- *(cli)* cover FreeBSD arm64
([#&#8203;3620](https://redirect.github.com/napi-rs/napi-rs/pull/3620))
- *(cli)* record the design behind the threaded WASI heap sync
([#&#8203;3581](https://redirect.github.com/napi-rs/napi-rs/pull/3581))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- 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/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNzEuMiIsInVwZGF0ZWRJblZlciI6IjQ0LjE3MS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-22 23:28:55 +00:00
camc314 9ce5ee4556 chore(deps): update rustls webpki crates for security advisories (#28112)
Updates `webpki-roots` 1.0.8 -> 1.0.10, `webpki-root-certs` 1.0.8 -> 1.0.10, and `rustls-webpki` 0.103.15 -> 0.103.16 to resolve RUSTSEC-2026-0381, RUSTSEC-2026-0382, and RUSTSEC-2026-0383.
2026-10-22 22:57:36 +00:00
Dunqing cf8296fb8e feat(ecmascript)!: fold surrogate strings with JSStr constants (#27098)
String constant evaluation used `Cow<str>`, so folds stopped at any string with a lone surrogate. `ConstantValue::String` now holds a `JSStr`, so these strings fold too, and results are built with `JSStrBuilder`, which joins surrogate halves the way the runtime does.

`indexOf`, `lastIndexOf`, `substring` and `slice` now share one UTF-16 code-unit implementation for every string. This also fixes miscompiles on main: `'éx'.indexOf('x')` folded to 2, `'abc'.indexOf('a', 4294967296)` to 0, `'abab'.lastIndexOf('b', NaN)` to -1, and `'abc'.substring(1, void 0)` to `''`. It includes #27097, which is closed.

String `concat` calls and chains fold into a template only when no argument with side effects follows one that may be an object, so `''.concat(a, (a.push(1), 'x'))` no longer becomes `` `${a}${(a.push(1), 'x')}` ``.

## Breaking changes

- `ConstantValue::String` holds `JSStr<'a>`, and `ConstantValue::into_string`, `evaluate_value_to_string` and `get_side_free_string_value` return `JSStr<'a>`.
- `StringIndexOf` and `StringLastIndexOf` take the search value as `JSStr` and use UTF-16 code unit positions.
- `StringSubstring` is removed.

Closes #15524. Closes #25158. Closes #26053. Based on #27096. Part of #26242. Continues #26759.

Implemented with AI assistance.
2026-10-20 01:09:59 +00:00
oxc-guard 07ed78f4ab release(apps): oxlint v1.89.0 && oxfmt v0.74.0 (#27961)
# Oxlint
### 💥 BREAKING CHANGES

- e3c1b11 ast: [**BREAKING**] Preserve lone surrogates in static property names (#27095) (Dunqing)
- a0a987c ast: [**BREAKING**] Preserve lone surrogates in static member names (#26677) (Dunqing)

### 🚀 Features

- 770ada4 linter: Mark vue 3 rules as recommended (#27717) (Cam McHenry)
- ba38c1d linter: Mark react/react-hooks rules as recommended (#27701) (Cam McHenry)
- d85a3ba linter: Mark promise rules as recommended (#27693) (Cam McHenry)
- e71c88a linter: Mark node rule as recommended (#27692) (Cam McHenry)
- 7213f61 linter: Mark nextjs rules as recommended (#27691) (Cam McHenry)
- d7c6b26 linter: Mark jsx-a11y rules as recommended (#27690) (Cam McHenry)
- 199dfdc linter: Mark jsdoc rules as recommended (#27689) (Cam McHenry)
- 780bff3 linter: Mark jest/vitest rules as recommended (#27672) (Cam McHenry)
- 6ae6859 linter: Mark import rules as recommended (#27671) (Cam McHenry)
- b7a1df3 linter: Mark unicorn rules as recommended (#27670) (Cam McHenry)
- c44a355 linter: Mark typescript rules as recommended from upstream (#27634) (Cam McHenry)
- 6b49dba linter: Mark eslint rules as recommended from upstream (#27632) (Cam McHenry)

### 🐛 Bug Fixes

- 7c47246 linter: Check module specifiers and string values that contain lone surrogates (#26717) (Dunqing)
- 782ab6e linter: Search string values without UTF-8 conversion (#26716) (Dunqing)
- 326904f linter/unicorn/no-useless-undefined: Allow `undefined` in `React.useRef` (#25027) (Chris Dokurno)
- f9cf165 linter/unicorn/prefer-spread: Ignore super method calls (#27868) (camc314)
- 00484e1 linter/eslint/prefer-const: Report destructuring assignments inside blocks (#27856) (camc314)
- 9c35461 linter/eslint/sort-vars: Report every out-of-order declaration (#27767) (camc314)
- 01e1c5e linter/unicorn/prefer-string-replace-all: Resolve regex variables (#27769) (camc314)
- 7f474d5 linter/eslint/no-loop-func: Detect writes after the loop (#27754) (camc314)
- 4b7fea6 linter/eslint/block-scoped-var: Ignore declarations without writes (#27760) (camc314)
- 2947917 linter/eslint/no-lonely-if: Check final else blocks in else-if chains (#27759) (camc314)
- fc039b5 linter/eslint/sort-imports: Check imports after other statements (#27749) (camc314)
- 1acba97 linter/unicorn/prefer-at: Report slice index reads once (#27762) (camc314)
- 6190e26 linter/eslint/prefer-arrow-callback: Ignore functions used as conditional tests (#27533) (Anzal Husain Abidi)
- b3cdaaf linter/eslint/sort-keys: Check computed identifier names (#27748) (camc314)
- 170e608 linter/unicorn/prefer-native-coercion-functions: Check object methods and function properties (#27750) (camc314)
- 9261df7 linter/unicorn/prefer-string-raw: Check object property values (#27758) (camc314)
- ddea86b linter/eslint/prefer-template: Report separate nested concatenations (#27764) (camc314)
- 2c67197 linter/eslint/no-unused-vars: Count conditional calls in sequences as uses (#27755) (camc314)
- 7f22fa0 linter/unicorn/prefer-regexp-test: Check logical operands in boolean contexts (#27761) (camc314)
- 3c44398 linter/eslint/class-methods-use-this: Count this in parameter defaults (#27756) (camc314)
- d85923f linter/eslint/no-param-reassign: Report rest parameter writes (#27765) (camc314)
- 8ea47bb linter/unicorn/prefer-type-error: Handle parenthesized type checks (#27766) (camc314)
- e96856c linter/unicorn/catch-error-name: Check unused underscore-prefixed names (#27751) (camc314)
- d8ca399 linter/unicorn/no-array-callback-reference: Ignore callback factory calls (#27763) (camc314)
- 1267ab8 linter/eslint/max-params: Count rest parameters (#27757) (camc314)
- 9ff25c3 linter/eslint/no-useless-assignment: Report dead stores to function parameters (#27735) (camc314)
- ee5e730 linter/eslint/no-setter-return: Check setters in property descriptors (#27731) (camc314)
- edbb5ed linter/eslint/id-length: Check destructuring assignment targets (#27724) (Yunus Ozen)
- 0e40acb linter/eslint/no-magic-numbers: Restrict unary exemptions to numeric signs (#27723) (Yunus Ozen)
- ae7e44b linter/eslint/no-div-regex: Report quantified leading equals (#27722) (Yunus Ozen)
- eb461f8 linter/unicorn/consistent-function-scoping: Count self-referencing variables as captures (#27726) (camc314)
- 5c8e731 linter/unicorn/catch-error-name: Avoid fix symbol name collisions (#27702) (camc314)
- 9a424c2 oxlint,oxfmt: Correct Node.js TypeScript support range (#27699) (camc314)
- 5dc0152 linter/eslint/no-var: Avoid fixes for redeclared bindings (#27697) (camc314)

### ⚡ Performance

- 4944cba linter/react/jsx-key: Avoid redundant key clones (#27915) (camc314)

### 📚 Documentation

- 0aa41ac linter: Fix invalid code example in rule docs (#27645) (leaysgur)
# Oxfmt
### 🐛 Bug Fixes

- e236de0 formatter_tests: Skip conformance spec calls with non-literal options (#27957) (leaysgur)
- 782ab6e linter: Search string values without UTF-8 conversion (#26716) (Dunqing)
- a5d8184 jsdoc: Parse code spans after quotes in descriptions (#27955) (leaysgur)
- 2645d2c formatter_markdown: Treat link destinations and footnote references as opaque to code span fences (#27948) (leaysgur)
- 4d8195c formatter_yaml: Keep a root plain scalar starting with a document marker verbatim (#27947) (leaysgur)
- 529b057 formatter_core: Keep front matter verbatim when body starts with indented delimiter (#27946) (leaysgur)
- c22a9b2 formatter: Treat static block with only empty statements as empty (#27945) (leaysgur)
- d3ff3f6 formatter/jsdoc: Write descriptions as written to not close the comment (#27823) (leaysgur)
- c4c1727 formatter/sort_imports: Keep comments after the last import (#27822) (leaysgur)
- a64677e formatter: Print JSDoc embedded snippets with LF (#27821) (leaysgur)
- 2c1cc20 formatter: Keep comment only Vue bindings as-is (#27820) (leaysgur)
- 1bf236d formatter/sort_imports: Do not use comments as import source (#27819) (leaysgur)
- 52ee29d formatter_yaml: Never start col-0 line with document marker or BOM (#27818) (leaysgur)
- 81c75e7 formatter/css: Keep glued css-in-js statement placeholders glued (#27814) (leaysgur)
- a1ef7f4 formatter: Keep typecast parens in same-operator binary and arrow chain (#27812) (leaysgur)
- de110ce formatter: Keep more parens around `TSInstantiationExpression` (#27811) (leaysgur)
- 8b02e90 formatter_json: Reject invalid JSON instead of dropping them (#27785) (leaysgur)
- 6fe4c1b formatter: Treat lone CR in JSX text and argument blank lines (#27780) (leaysgur)
- 5605362 oxfmt: Validate editorconfig as like oxfmtrc (#27778) (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)
- 3a980c9 formatter_toml: Handle BOM like other languages (#27775) (leaysgur)
- 97c9fc4 oxfmt: Handle BOM in config JSON (#27774) (leaysgur)
- 28eb4a7 oxfmt: Print trailing newline for `--list-different` (#27773) (leaysgur)
- d2bea21 formatter: Glue comments to an opener in empty for-head slots and array holes (#27737) (leaysgur)
- 6a95ec1 formatter: Keep comment position on holey array (#27730) (leaysgur)
- 54769da formatter: Break after dangling line comment in holey array (#27729) (leaysgur)
- 99077ef formatter_json: Reject unary expressions other than signed numbers (#27728) (leaysgur)
- 22cd4cd formatter_json: Handle holey array and comments (#27727) (leaysgur)
- 644ca1c formatter: Do not indent logical chains whose right sides all inline (#27667) (leaysgur)
- a07a0fb formatter: Wrap comment-only JSX expression container in a group (#27666) (leaysgur)

### ⚡ Performance

- e220293 formatter: Check only the operator suppression mark in `is_quiet` (#27952) (leaysgur)
- e5fdc9c formatter_core: Write into one element stack through a concrete `Formatter` (#27559) (leaysgur)
- a342f7e formatter: Skip comment handling for nodes with no comment near them (#27557) (leaysgur)
- d8ce750 formatter: Write string literals with swapped quotes into the arena (#27558) (Yuji Sugiura)
- 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)

### 📚 Documentation

- 1325225 oxfmt: Update useless comment prefix (#27956) (leaysgur)
- d0dd140 formatter: Note lossy cooked round-trip in template embeds (#27944) (leaysgur)
- 8a3a6c8 oxfmt: Update stale notes on the JSDoc string-out channel and fixture origins (#27824) (leaysgur)
2026-10-19 16:33:52 +00:00
oxc-guard 73e6b56473 release(crates): oxc v0.155.0 (#27962)
### 💥 BREAKING CHANGES

- c7d229b transformer: [**BREAKING**] Decode JSX entities to lone surrogates (#26712) (Dunqing)
- e3c1b11 ast: [**BREAKING**] Preserve lone surrogates in static property names (#27095) (Dunqing)
- a0a987c ast: [**BREAKING**] Preserve lone surrogates in static member names (#26677) (Dunqing)

### 🚀 Features

- 7bb2697 minifier: Minimize array join expression (#27905) (Armano)
- 5d91db8 ast: Generate node ID setters for enums (#27500) (camc314)
- 6b5057b minifier: Add de morgan optimization for void expressions (#27375) (Armano)

### 🐛 Bug Fixes

- ce6a088 minifier: Fold string indices by UTF-16 code unit (#27096) (Dunqing)
- 7c47246 linter: Check module specifiers and string values that contain lone surrogates (#26717) (Dunqing)
- 782ab6e linter: Search string values without UTF-8 conversion (#26716) (Dunqing)
- a5d8184 jsdoc: Parse code spans after quotes in descriptions (#27955) (leaysgur)
- bd37e78 ecmascript: Look through sequence expressions in `to_primitive` (#27837) (baltasarblanco)
- d92789d minifier: Drop debugger statements in unbraced bodies (#27867) (camc314)
- 863b359 ecmascript: Correct parseFloat decimal prefix scanning (#27695) (camc314)
- a2534c6 minifier: Preserve lexical initializers in dead for loops (#27676) (camc314)
- 3543672 ecmascript: Do not fold Number.isInteger / isSafeInteger of tiny non-integers to true (#27622) (Baltasar Blanco)
- 6987a61 ecmascript: BigInt loose equality folding (unknown operands and `StringToBigInt`) (#27656) (Baltasar Blanco)
- 40e5644 minifier: Preserve indirect access when folding into call targets (#27082) (waltu)
- 022306f ecmascript: Do not fold `Math.cbrt` of a negative number to `NaN` (#27621) (Baltasar Blanco)

### ⚡ Performance

- faa75d8 transformer: Remove redundant scratch vectors (#27922) (camc314)
- 88b5c35 minifier: Reduce code branches when evaluating roots (#27906) (Armano)
- fe1d367 codegen: Remove branches from loops printing arrays (#27840) (overlookmotel)
- 7bb6b62 codegen: Reduce hashmap lookups in `print_annotation_comment` (#27845) (overlookmotel)
- 31ffd08 codegen: Avoid unnecessary comment clone (#27843) (overlookmotel)
- a6456b7 codegen: Remove branch from `print_space_before_identifier` (#27842) (overlookmotel)
- eeff416 codegen: Simplify `print_space_before_identifier` (#27841) (overlookmotel)
- 5d877b8 diagnostics: Speed up zero-context span lookups (#27770) (camc314)
- 2ab6b63 packages/codegen: Remove redundant `printSpaceBeforeIdentifier` and `last` updates in `printParams` (#27652) (overlookmotel)
- e533278 codegen: Reduce writes in `printDecorators` (#27651) (overlookmotel)

### 📚 Documentation

- 29caafd codegen: Format table in doc comment (#27839) (overlookmotel)
- 3de03c1 packages/codegen: Correct outdated comments (#27838) (overlookmotel)
2026-10-19 14:20:38 +00:00
Dunqing 782ab6e2cd fix(linter): search string values without UTF-8 conversion (#26716)
A lone surrogate anywhere in a string made `as_str()` return `None`, so rules skipped checks on ordinary text elsewhere in the value. For example, `test(" \uD800 my title ", () => {})` got no leading/trailing-space diagnostic.

This adds `contains`, `starts_with`, `ends_with`, `find` and `rfind` to `JSStr`. They take a `&str`, a `char` or a predicate, search the WTF-8 bytes without converting or allocating, and never match a lone surrogate with a character pattern. Seven linter rules and the formatter's JSX attribute checks use them. Lowercase-title fixes now check the source spelling, so an escaped first letter is reported without a fix.

Based on #26712. Part of #26242.

Implemented with AI assistance.
2026-10-19 07:41:35 +00:00
YT 03d6f656d9 perf(linter): disable papaya's fast-barrier to avoid a membarrier wait on Linux (#27954)
## Summary

On Linux, every `oxlint` run waits 20–40 ms when it creates its first
papaya map. This PR removes the wait for both the CLI and the npm
package by disabling `fast-barrier` feature of the papaya crate. It also
adds a `cargo deny` rule that fails if any crate enables the feature
again so we can notice it.

## Why it waits

With `fast-barrier`, `seize::Collector::new()` calls
`membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED)`. If the process
already has more than one thread, the kernel waits for an RCU grace
period before it returns
([kernel/sched/membarrier.c](https://github.com/torvalds/linux/blob/v6.12/kernel/sched/membarrier.c#L442-L470)).

`oxc_linter` has one papaya map:
[`modules_by_path`](https://github.com/oxc-project/oxc/blob/faa75d8a8dff299eb9607ae65d04dfb163c28a8c/crates/oxc_linter/src/service/runtime.rs#L59-L66),
the module graph that the import plugin uses for rules across files,
such as `import/no-cycle`. The map is a field of
[`Runtime`](https://github.com/oxc-project/oxc/blob/faa75d8a8dff299eb9607ae65d04dfb163c28a8c/crates/oxc_linter/src/service/runtime.rs#L45),
which holds the state of one lint run.
[`LintService::new()`](https://github.com/oxc-project/oxc/blob/faa75d8a8dff299eb9607ae65d04dfb163c28a8c/crates/oxc_linter/src/service/mod.rs#L68-L71)
creates the `Runtime` once per run.
[`Runtime::new()`](https://github.com/oxc-project/oxc/blob/faa75d8a8dff299eb9607ae65d04dfb163c28a8c/crates/oxc_linter/src/service/runtime.rs#L208)
first starts the rayon thread pool
([#L227](https://github.com/oxc-project/oxc/blob/faa75d8a8dff299eb9607ae65d04dfb163c28a8c/crates/oxc_linter/src/service/runtime.rs#L227)),
and then it creates the map
([#L268](https://github.com/oxc-project/oxc/blob/faa75d8a8dff299eb9607ae65d04dfb163c28a8c/crates/oxc_linter/src/service/runtime.rs#L268)).
So the main thread waits on every run. This happens even with the
default config, which does not use the import plugin.

The npm package waits too. Creating the map earlier would not fix it:
the binding does not run `main()`, and Node.js already runs several
threads when it loads the binding.

## Results

I measured `oxlint` with its default rules on three inputs:

- 3 files: a project with three files of 1–4 lines each, so a run is
almost only fixed cost.
- excalidraw: 590 files from
[excalidraw](https://github.com/excalidraw/excalidraw/tree/f6d85bc80fe328e8f472636eb0d541f7bb891aa0)
(`excalidraw-app` and `packages`).
- vscode `src`: 4,662 files from [vscode
1.100.0](https://github.com/microsoft/vscode/tree/19e0f9e681ecb8e5c09d8784acaa601316ca4571).

Each input ran with 1 and 8 threads, with the CLI and with the npm
package, so there are 12 cases. The machine is Linux x86_64 (AMD Zen 4,
8 vCPUs), and each bar is the mean of 30 runs.

<img width="2300" height="1520" alt="image"
src="https://github.com/user-attachments/assets/943b9ac4-9335-4ea2-b94d-498373042fae"
/>


## Is anything slower?

With `fast-barrier`, the registration at startup lets every `pin()` (one
per map call) use a `Relaxed` store. This is the fast path. Without
`fast-barrier`, seize uses its portable barriers, which `oxlint` already
uses on macOS: each pin does a `SeqCst` store (`xchg` on x86_64), and
nothing has to register at startup.

To find how much time the fast path saves, I ran three builds on vscode
`src` with 8 threads (mean of 30 runs per build, in turn):

| Build | `fast-barrier` | Waits at startup | Wall time |
|---|---|---|---|
| Before this PR | on | yes | 219.6 ms |
| Early registration\* | on | no | 191.8 ms |
| This PR | off | no | 191.9 ms |

\* Before this PR, plus one map created at the start of `main()`, so the
registration happens before the thread pool starts.

- Before this PR → Early registration: the startup wait, 27.9 ms.
- Early registration → This PR: the time that the fast path saves, 0.2
ms, too small to measure.
- With `--import-plugin` (9,317 map calls per run), the same difference
is 1.8 ms.

Windows also loses its fast path, but Windows has no startup wait to
remove. I did not measure Windows.

---

AI disclosure: I used an AI coding assistant to run the measurements and
to draft this description. I reviewed the change, the data, and this
text.
2026-10-19 07:30:22 +00:00
renovate[bot]andautofix-ci[bot] acf8eb0487 chore(deps): update rust crates (#27928)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [bitflags](https://redirect.github.com/bitflags/bitflags) |
workspace.dependencies | patch | `2.13.1` → `2.13.2` |
| [bpaf](https://redirect.github.com/pacak/bpaf) |
workspace.dependencies | patch | `0.9.27` → `0.9.28` |
| [console](https://redirect.github.com/console-rs/console) |
workspace.dependencies | patch | `0.16.4` → `0.16.6` |
| [encoding_rs](https://docs.rs/encoding_rs/)
([source](https://redirect.github.com/hsivonen/encoding_rs)) |
workspace.dependencies | patch | `0.8.35` → `0.8.42` |
| [fast-glob](https://redirect.github.com/oxc-project/fast-glob) |
workspace.dependencies | patch | `1.1.1` → `1.1.2` |
|
[hmac-sha1-compact](https://redirect.github.com/jedisct1/rust-hmac-sha1)
| workspace.dependencies | patch | `1.1.7` → `1.1.8` |
| [insta](https://insta.rs/)
([source](https://redirect.github.com/mitsuhiko/insta)) |
workspace.dependencies | minor | `1.48.0` → `1.49.0` |
| [lazy-regex](https://redirect.github.com/Canop/lazy-regex) |
workspace.dependencies | patch | `3.6.1` → `3.6.2` |
| [mimalloc-safe](https://redirect.github.com/napi-rs/mimalloc-safe) |
workspace.dependencies | patch | `0.1.66` → `0.1.67` |
| [rand](https://rust-random.github.io/book)
([source](https://redirect.github.com/rust-random/rand)) |
workspace.dependencies | patch | `0.10.2` → `0.10.3` |
| [saphyr](https://redirect.github.com/saphyr-rs/saphyr) |
workspace.dependencies | minor | `0.1.0` → `0.2.0` |
| [serde_json](https://redirect.github.com/serde-rs/json) |
workspace.dependencies | patch | `1.0.151` → `1.0.154` |
| [smallvec](https://redirect.github.com/servo/rust-smallvec) |
workspace.dependencies | patch | `1.16.0` → `1.16.3` |
| [syn](https://redirect.github.com/dtolnay/syn) |
workspace.dependencies | patch | `3.0.5` → `3.0.9` |
| [textwrap](https://redirect.github.com/mgeisler/textwrap) |
workspace.dependencies | patch | `0.16.2` → `0.16.4` |
| [tokio](https://tokio.rs)
([source](https://redirect.github.com/tokio-rs/tokio)) |
workspace.dependencies | patch | `1.53.1` → `1.53.3` |
| [toml](https://redirect.github.com/toml-rs/toml) |
workspace.dependencies | patch | `1.1.5+spec-1.1.0` → `1.1.8` |
|
[unicode-id-start](https://redirect.github.com/Boshen/unicode-id-start)
| workspace.dependencies | minor | `1.4.0` → `1.5.0` |
| [ureq](https://redirect.github.com/algesten/ureq) |
workspace.dependencies | patch | `3.4.1` → `3.4.2` |

---

### Release Notes

<details>
<summary>bitflags/bitflags (bitflags)</summary>

###
[`v2.13.2`](https://redirect.github.com/bitflags/bitflags/blob/HEAD/CHANGELOG.md#2132)

[Compare
Source](https://redirect.github.com/bitflags/bitflags/compare/2.13.1...2.13.2)

#### What's Changed

- Flags: adjust order of elements in manual implementation example by
[@&#8203;DanielEScherzer](https://redirect.github.com/DanielEScherzer)
in [#&#8203;494](https://redirect.github.com/bitflags/bitflags/pull/494)
- Re-pull const declarations outside of nested const by
[@&#8203;KodrAus](https://redirect.github.com/KodrAus) in
[#&#8203;496](https://redirect.github.com/bitflags/bitflags/pull/496)

**Full Changelog**:
<https://github.com/bitflags/bitflags/compare/2.13.1...2.13.2>

</details>

<details>
<summary>pacak/bpaf (bpaf)</summary>

###
[`v0.9.28`](https://redirect.github.com/pacak/bpaf/blob/HEAD/Changelog.md#bpaf-0928---2026-09-17)

[Compare
Source](https://redirect.github.com/pacak/bpaf/compare/v0.9.27...v0.9.28)

- more consistent formatting for .adjacent() items
([#&#8203;461](https://redirect.github.com/pacak/bpaf/issues/461))
- try harder not to corrupt completion output with very long help

</details>

<details>
<summary>console-rs/console (console)</summary>

###
[`v0.16.6`](https://redirect.github.com/console-rs/console/releases/tag/0.16.6)

[Compare
Source](https://redirect.github.com/console-rs/console/compare/0.16.4...0.16.6)

#### What's Changed

- Fix truncate_str panicking mid-character without ansi-parsing by
[@&#8203;lenamonj](https://redirect.github.com/lenamonj) in
[#&#8203;296](https://redirect.github.com/console-rs/console/pull/296)
- perf: accelerate printable ASCII text width by
[@&#8203;dexhunter](https://redirect.github.com/dexhunter) in
[#&#8203;297](https://redirect.github.com/console-rs/console/pull/297)
- fix: measure the truncation tail in visible columns, not raw width by
[@&#8203;youdie006](https://redirect.github.com/youdie006) in
[#&#8203;298](https://redirect.github.com/console-rs/console/pull/298)
- Prepare 0.16.6 by [@&#8203;djc](https://redirect.github.com/djc) in
[#&#8203;299](https://redirect.github.com/console-rs/console/pull/299)

</details>

<details>
<summary>hsivonen/encoding_rs (encoding_rs)</summary>

###
[`v0.8.42`](https://redirect.github.com/hsivonen/encoding_rs/compare/v0.8.41...v0.8.42)

[Compare
Source](https://redirect.github.com/hsivonen/encoding_rs/compare/v0.8.41...v0.8.42)

###
[`v0.8.41`](https://redirect.github.com/hsivonen/encoding_rs/compare/v0.8.40...v0.8.41)

[Compare
Source](https://redirect.github.com/hsivonen/encoding_rs/compare/v0.8.40...v0.8.41)

###
[`v0.8.40`](https://redirect.github.com/hsivonen/encoding_rs/compare/v0.8.35...v0.8.40)

[Compare
Source](https://redirect.github.com/hsivonen/encoding_rs/compare/v0.8.35...v0.8.40)

</details>

<details>
<summary>oxc-project/fast-glob (fast-glob)</summary>

###
[`v1.1.2`](https://redirect.github.com/oxc-project/fast-glob/blob/HEAD/CHANGELOG.md#112---2026-09-21)

[Compare
Source](https://redirect.github.com/oxc-project/fast-glob/compare/v1.1.1...v1.1.2)

##### Fixed

- recognize globstars in brace branches
([#&#8203;181](https://redirect.github.com/oxc-project/fast-glob/pull/181))
- keep character classes within path segments
([#&#8203;179](https://redirect.github.com/oxc-project/fast-glob/pull/179))
- validate the brace group limit
([#&#8203;178](https://redirect.github.com/oxc-project/fast-glob/pull/178))
- track syntactic brace depth
([#&#8203;177](https://redirect.github.com/oxc-project/fast-glob/pull/177))

</details>

<details>
<summary>jedisct1/rust-hmac-sha1 (hmac-sha1-compact)</summary>

###
[`v1.1.8`](https://redirect.github.com/jedisct1/rust-hmac-sha1/compare/1.1.7...1.1.8)

[Compare
Source](https://redirect.github.com/jedisct1/rust-hmac-sha1/compare/1.1.7...1.1.8)

</details>

<details>
<summary>mitsuhiko/insta (insta)</summary>

###
[`v1.49.0`](https://redirect.github.com/mitsuhiko/insta/blob/HEAD/CHANGELOG.md#1490)

[Compare
Source](https://redirect.github.com/mitsuhiko/insta/compare/1.48.0...1.49.0)

- Allow `Option<&OsStr>` snapshot names, such as `Path::file_name()`,
without explicit string conversion.
[#&#8203;929](https://redirect.github.com/mitsuhiko/insta/issues/929)
([@&#8203;dislogical](https://redirect.github.com/dislogical))
- Add prebuilt `cargo-insta` binaries for ARM64 Linux
(`aarch64-unknown-linux-gnu`).
[#&#8203;942](https://redirect.github.com/mitsuhiko/insta/issues/942)
([@&#8203;aljohri](https://redirect.github.com/aljohri))
- Fix JSON serialization of maps keyed by unit enum variants. Keys use
the
serialized variant name, including serde renames.
[#&#8203;934](https://redirect.github.com/mitsuhiko/insta/issues/934)
([@&#8203;teddytennant](https://redirect.github.com/teddytennant))
- Remove trailing semicolons from serialization macro bodies to avoid
compiler warnings when used in expression position.
[#&#8203;940](https://redirect.github.com/mitsuhiko/insta/issues/940)
([@&#8203;Tiwalun](https://redirect.github.com/Tiwalun))
- Mention `INSTA_UPDATE=always` in snapshot mismatch hints for file
snapshots.
[#&#8203;927](https://redirect.github.com/mitsuhiko/insta/issues/927)
([@&#8203;hiro-nikaitou](https://redirect.github.com/hiro-nikaitou))
- Update the lockfile's `tempfile` and `rustix` dependencies to fix
builds
with newer Rust toolchains.
[#&#8203;939](https://redirect.github.com/mitsuhiko/insta/issues/939)
- Fix `cargo insta test --all-targets --test-runner nextest` failing
with
"Can't mix --doc with other target selecting options". Like `cargo test
--all-targets`, it no longer runs doctests.
[#&#8203;460](https://redirect.github.com/mitsuhiko/insta/issues/460)

</details>

<details>
<summary>Canop/lazy-regex (lazy-regex)</summary>

###
[`v3.6.2`](https://redirect.github.com/Canop/lazy-regex/blob/HEAD/CHANGELOG.md#v362---2026-10-03)

- `syn` dependency updated to 3.0. Lighten compilation for programs
already importing syn 3 (serde, this_error, etc.) - Thanks
[@&#8203;hwright](https://redirect.github.com/hwright)
- fix "unreachable_code" warning in regex_switch still emitted by rustc
< 1.83
- explicit compilation error when neither a regex feature nor "lite" is
enabled

</details>

<details>
<summary>napi-rs/mimalloc-safe (mimalloc-safe)</summary>

###
[`v0.1.67`](https://redirect.github.com/napi-rs/mimalloc-safe/blob/HEAD/CHANGELOG.md#0167---2026-09-14)

[Compare
Source](https://redirect.github.com/napi-rs/mimalloc-safe/compare/mimalloc-safe-v0.1.66...mimalloc-safe-v0.1.67)

##### Chore

- *(deps)* Update mimalloc to v2.5.2 and mimalloc3 to v3.5.2 + init fix
([#&#8203;104](https://redirect.github.com/napi-rs/mimalloc-safe/pull/104))
- *(deps)* Update
[@&#8203;napi-rs/cli](https://redirect.github.com/napi-rs/cli) and
emnapi, group emnapi in renovate
([#&#8203;106](https://redirect.github.com/napi-rs/mimalloc-safe/pull/106))

</details>

<details>
<summary>rust-random/rand (rand)</summary>

###
[`v0.10.3`](https://redirect.github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0103--2026-09-20)

[Compare
Source](https://redirect.github.com/rust-random/rand/compare/0.10.2...0.10.3)

##### Fixes

- Fix `WeightedIndex` panic when the sum of float weights is infinite;
return `Error::Overflow` instead ([#&#8203;1808])
- Fix spurious `Error::NonFinite` from `Uniform::new_inclusive` on large
finite float ranges such as `0.0..=f64::MAX` ([#&#8203;1821])
- Fix possible panic due to sampling a deserialized `Uniform<char>`
([#&#8203;1831])

##### Changes

- Report exact remaining lengths from `WeightedIndex::weights()` and
reduce overhead when reading weights ([#&#8203;1838])

[#&#8203;1808]: https://redirect.github.com/rust-random/rand/pull/1808

[#&#8203;1821]: https://redirect.github.com/rust-random/rand/pull/1821

[#&#8203;1831]: https://redirect.github.com/rust-random/rand/pull/1831

[#&#8203;1838]: https://redirect.github.com/rust-random/rand/pull/1838

</details>

<details>
<summary>saphyr-rs/saphyr (saphyr)</summary>

###
[`v0.2.2`](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.2.1...v0.2.2)

[Compare
Source](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.2.1...v0.2.2)

###
[`v0.2.1`](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.2.0...v0.2.1)

[Compare
Source](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.2.0...v0.2.1)

###
[`v0.2.0`](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.1.2...v0.2.0)

[Compare
Source](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.1.2...v0.2.0)

###
[`v0.1.2`](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.1.1...v0.1.2)

[Compare
Source](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.1.1...v0.1.2)

###
[`v0.1.1`](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.1.0...v0.1.1)

[Compare
Source](https://redirect.github.com/saphyr-rs/saphyr/compare/v0.1.0...v0.1.1)

</details>

<details>
<summary>serde-rs/json (serde_json)</summary>

###
[`v1.0.154`](https://redirect.github.com/serde-rs/json/releases/tag/v1.0.154)

[Compare
Source](https://redirect.github.com/serde-rs/json/compare/v1.0.153...v1.0.154)

- Support preserve_order in no_std builds
([#&#8203;1333](https://redirect.github.com/serde-rs/json/issues/1333),
thanks [@&#8203;razmser](https://redirect.github.com/razmser))

###
[`v1.0.153`](https://redirect.github.com/serde-rs/json/releases/tag/v1.0.153)

[Compare
Source](https://redirect.github.com/serde-rs/json/compare/v1.0.152...v1.0.153)

- Report invalid UTF-8 at the first bad byte
([#&#8203;1345](https://redirect.github.com/serde-rs/json/issues/1345),
thanks [@&#8203;00200200](https://redirect.github.com/00200200))

###
[`v1.0.152`](https://redirect.github.com/serde-rs/json/releases/tag/v1.0.152)

[Compare
Source](https://redirect.github.com/serde-rs/json/compare/v1.0.151...v1.0.152)

- Preserve sign of `-0` in arbitrary_precision mode
([#&#8203;1346](https://redirect.github.com/serde-rs/json/issues/1346),
thanks
[@&#8203;yuxi-liu-wired](https://redirect.github.com/yuxi-liu-wired))
- Fix comparison of large non-integer values with f32::INFINITY
([#&#8203;1347](https://redirect.github.com/serde-rs/json/issues/1347),
thanks
[@&#8203;yuxi-liu-wired](https://redirect.github.com/yuxi-liu-wired))

</details>

<details>
<summary>servo/rust-smallvec (smallvec)</summary>

###
[`v1.16.3`](https://redirect.github.com/servo/rust-smallvec/releases/tag/v1.16.3)

[Compare
Source](https://redirect.github.com/servo/rust-smallvec/compare/v1.16.2...v1.16.3)

#### What's Changed

- Port new fuzzer to v1 by
[@&#8203;bolshoytoster](https://redirect.github.com/bolshoytoster) in
[#&#8203;678](https://redirect.github.com/servo/rust-smallvec/pull/678)
- fix: overflow during fuzzy check by
[@&#8203;GauravPawar101](https://redirect.github.com/GauravPawar101) in
[#&#8203;693](https://redirect.github.com/servo/rust-smallvec/pull/693)
- chore: bump version by
[@&#8203;alejandro-vaz](https://redirect.github.com/alejandro-vaz) in
[#&#8203;723](https://redirect.github.com/servo/rust-smallvec/pull/723)

**Full Changelog**:
<https://github.com/servo/rust-smallvec/compare/v1.16.2...v1.16.3>

###
[`v1.16.2`](https://redirect.github.com/servo/rust-smallvec/releases/tag/v1.16.2)

[Compare
Source](https://redirect.github.com/servo/rust-smallvec/compare/v1.16.1...v1.16.2)

#### What's Changed

- Backport v2’s retain implementation to v1 by
[@&#8203;charliermarsh](https://redirect.github.com/charliermarsh) in
[#&#8203;596](https://redirect.github.com/servo/rust-smallvec/pull/596)
- Fix element ownership tracking with may_dangle by
[@&#8203;charliermarsh](https://redirect.github.com/charliermarsh) in
[#&#8203;594](https://redirect.github.com/servo/rust-smallvec/pull/594)
- Fix Cargo manual_readme warning by
[@&#8203;Rayan-and-beyond](https://redirect.github.com/Rayan-and-beyond)
in
[#&#8203;608](https://redirect.github.com/servo/rust-smallvec/pull/608)
- chore: bump version by
[@&#8203;alejandro-vaz](https://redirect.github.com/alejandro-vaz) in
[#&#8203;617](https://redirect.github.com/servo/rust-smallvec/pull/617)

#### New Contributors

-
[@&#8203;Rayan-and-beyond](https://redirect.github.com/Rayan-and-beyond)
made their first contribution in
[#&#8203;608](https://redirect.github.com/servo/rust-smallvec/pull/608)

**Full Changelog**:
<https://github.com/servo/rust-smallvec/compare/v1.16.1...v1.16.2>

###
[`v1.16.1`](https://redirect.github.com/servo/rust-smallvec/releases/tag/v1.16.1)

[Compare
Source](https://redirect.github.com/servo/rust-smallvec/compare/v1.16.0...v1.16.1)

#### What's Changed

- Speed up push by expanding triple_mut by
[@&#8203;bolshoytoster](https://redirect.github.com/bolshoytoster) in
[#&#8203;557](https://redirect.github.com/servo/rust-smallvec/pull/557)
- chore: bump version to 1.16.1 by
[@&#8203;ryux1](https://redirect.github.com/ryux1) in
[#&#8203;585](https://redirect.github.com/servo/rust-smallvec/pull/585)
- fix: doc warning by
[@&#8203;alejandro-vaz](https://redirect.github.com/alejandro-vaz) in
[#&#8203;582](https://redirect.github.com/servo/rust-smallvec/pull/582)
- fix: cargo warnings by
[@&#8203;alejandro-vaz](https://redirect.github.com/alejandro-vaz) in
[#&#8203;581](https://redirect.github.com/servo/rust-smallvec/pull/581)

#### New Contributors

- [@&#8203;ryux1](https://redirect.github.com/ryux1) made their first
contribution in
[#&#8203;585](https://redirect.github.com/servo/rust-smallvec/pull/585)

**Full Changelog**:
<https://github.com/servo/rust-smallvec/compare/v1.16.0...v1.16.1>

</details>

<details>
<summary>dtolnay/syn (syn)</summary>

###
[`v3.0.9`](https://redirect.github.com/dtolnay/syn/releases/tag/3.0.9)

[Compare
Source](https://redirect.github.com/dtolnay/syn/compare/3.0.8...3.0.9)

- Add Punctuated::retain
([#&#8203;2088](https://redirect.github.com/dtolnay/syn/issues/2088))

###
[`v3.0.8`](https://redirect.github.com/dtolnay/syn/releases/tag/3.0.8)

[Compare
Source](https://redirect.github.com/dtolnay/syn/compare/3.0.7...3.0.8)

- Fix parsing of `<-` and `->` tokens in expressions
([#&#8203;2086](https://redirect.github.com/dtolnay/syn/issues/2086),
[#&#8203;2087](https://redirect.github.com/dtolnay/syn/issues/2087))

###
[`v3.0.7`](https://redirect.github.com/dtolnay/syn/releases/tag/3.0.7)

[Compare
Source](https://redirect.github.com/dtolnay/syn/compare/3.0.6...3.0.7)

- Fix parsing absolute path expr in labeled break
([#&#8203;2085](https://redirect.github.com/dtolnay/syn/issues/2085),
thanks [@&#8203;A4-Tacks](https://redirect.github.com/A4-Tacks))

###
[`v3.0.6`](https://redirect.github.com/dtolnay/syn/releases/tag/3.0.6)

[Compare
Source](https://redirect.github.com/dtolnay/syn/compare/3.0.5...3.0.6)

- Fix parsing interpolated lifetime at statement start
([#&#8203;2082](https://redirect.github.com/dtolnay/syn/issues/2082))

</details>

<details>
<summary>mgeisler/textwrap (textwrap)</summary>

###
[`v0.16.4`](https://redirect.github.com/mgeisler/textwrap/blob/HEAD/CHANGELOG.md#Version-0164-2026-09-13)

[Compare
Source](https://redirect.github.com/mgeisler/textwrap/compare/0.16.3...0.16.4)

- [#&#8203;628](https://redirect.github.com/mgeisler/textwrap/pull/628):
Reduce MSRV to 1.88.

###
[`v0.16.3`](https://redirect.github.com/mgeisler/textwrap/blob/HEAD/CHANGELOG.md#Version-0163-2026-09-10)

[Compare
Source](https://redirect.github.com/mgeisler/textwrap/compare/0.16.2...0.16.3)

This release adds `no_std` support as well as optional support for
wrapping
complex Unicode scripts such as Khmer, Lao, Myanmar, and Thai. The
minimum
supported Rust version is now 1.90.

- [#&#8203;586](https://redirect.github.com/mgeisler/textwrap/pull/586):
Make `Word::width`
  public so it can be used without `Word::from`.
- [#&#8203;587](https://redirect.github.com/mgeisler/textwrap/pull/587):
Add
`Options::preserve_trailing_space` to keep trailing whitespace when
wrapping
  text.
- [#&#8203;594](https://redirect.github.com/mgeisler/textwrap/pull/594):
Add example showing how
  one can use owned `Options`.
- [#&#8203;597](https://redirect.github.com/mgeisler/textwrap/pull/597):
Add GitHub Sponsors
  configuration.
- [#&#8203;608](https://redirect.github.com/mgeisler/textwrap/pull/608):
Switch from
  `unicode-linebreak` to `icu_segmenter`.
- [#&#8203;623](https://redirect.github.com/mgeisler/textwrap/pull/623):
Avoid arithmetic
  overflow in `wrap_columns`.
- [#&#8203;626](https://redirect.github.com/mgeisler/textwrap/pull/626):
Add `no_std` support.

</details>

<details>
<summary>tokio-rs/tokio (tokio)</summary>

###
[`v1.53.3`](https://redirect.github.com/tokio-rs/tokio/releases/tag/tokio-1.53.3):
Tokio v1.53.3

[Compare
Source](https://redirect.github.com/tokio-rs/tokio/compare/tokio-1.53.2...tokio-1.53.3)

### 1.53.3 (October 13th, 2026)

##### Added

- io: add `AsyncFd::register` and `AsyncFd::register_with_interest`
([#&#8203;8587])

##### Changed

- io: deprecate `AsyncFd::{new, with_interest, try_new,
try_with_interest}` ([#&#8203;8587])

##### Fixed

- io: wake and drop `DuplexStream` wakers outside the lock
([#&#8203;8618])
- macros: avoid `unreachable_code` in `join!` and `try_join!` for
`Infallible` ([#&#8203;8518])
- runtime: fix paused time auto-advancing when I/O wakes a task on
`current_thread` ([#&#8203;8595])
- sync: wake waiters outside the lock when closing a semaphore
([#&#8203;8529])
- test: fix several flaky tests ([#&#8203;8196], [#&#8203;8427],
[#&#8203;8609])

##### Fixed (unstable)

- rt: keep `io_uring` op alive when submission fails after push
([#&#8203;8185])

[#&#8203;8185]: https://redirect.github.com/tokio-rs/tokio/pull/8185

[#&#8203;8196]: https://redirect.github.com/tokio-rs/tokio/pull/8196

[#&#8203;8427]: https://redirect.github.com/tokio-rs/tokio/pull/8427

[#&#8203;8518]: https://redirect.github.com/tokio-rs/tokio/pull/8518

[#&#8203;8529]: https://redirect.github.com/tokio-rs/tokio/pull/8529

[#&#8203;8587]: https://redirect.github.com/tokio-rs/tokio/pull/8587

[#&#8203;8595]: https://redirect.github.com/tokio-rs/tokio/pull/8595

[#&#8203;8609]: https://redirect.github.com/tokio-rs/tokio/pull/8609

[#&#8203;8618]: https://redirect.github.com/tokio-rs/tokio/pull/8618

###
[`v1.53.2`](https://redirect.github.com/tokio-rs/tokio/releases/tag/tokio-1.53.2):
Tokio v1.53.2

[Compare
Source](https://redirect.github.com/tokio-rs/tokio/compare/tokio-1.53.1...tokio-1.53.2)

##### 1.53.2 (October 3rd, 2026)

##### Fixed

- fs: handle integer overflow in buffered relative seek ([#&#8203;8574])
- io: revert "always cleanup `AsyncFd` registration list on deregister"
([#&#8203;8540])
- process: unregister Windows wait before closing child handle
([#&#8203;8564])
- rt: drop blocking pool mutex before shutting down rejected task
([#&#8203;8562])
- sync: fix mpsc index wraparound in block reclamation ([#&#8203;8546])
- sync: forget mpsc `Permit` before sending value ([#&#8203;8560])
- sync: validate `MAX_PERMITS` in `Semaphore::acquire` ([#&#8203;8548])
- sync: wake broadcast `Sender::closed` outside mutex ([#&#8203;8558])
- task: drop replaced waker outside lock in `JoinSet` ([#&#8203;8554])
- time: drop timer lock before dropping waker in `clear_entry`
([#&#8203;8552])
- time: expire timers directly on shutdown without rotating wheel
([#&#8203;8570])

##### Fixed (unstable)

- fs: clamp `io_uring` read length to `u32::MAX` ([#&#8203;8572])
- rt: ignore `current_thread` task dumps from other runtimes
([#&#8203;8544])
- rt: preserve `io_uring` context if a completion waker panics
([#&#8203;8566])
- sync: fix semaphore use-after-free and permit leak on tracing panic
([#&#8203;8542])
- taskdump: restore deferred leaf wakes during capture ([#&#8203;8445])
- time: drop stored waker when cancelling alt timer entry
([#&#8203;8550])

[#&#8203;8445]: https://redirect.github.com/tokio-rs/tokio/pull/8445

[#&#8203;8572]: https://redirect.github.com/tokio-rs/tokio/pull/8572

[#&#8203;8540]: https://redirect.github.com/tokio-rs/tokio/pull/8540

[#&#8203;8542]: https://redirect.github.com/tokio-rs/tokio/pull/8542

[#&#8203;8544]: https://redirect.github.com/tokio-rs/tokio/pull/8544

[#&#8203;8546]: https://redirect.github.com/tokio-rs/tokio/pull/8546

[#&#8203;8548]: https://redirect.github.com/tokio-rs/tokio/pull/8548

[#&#8203;8550]: https://redirect.github.com/tokio-rs/tokio/pull/8550

[#&#8203;8552]: https://redirect.github.com/tokio-rs/tokio/pull/8552

[#&#8203;8554]: https://redirect.github.com/tokio-rs/tokio/pull/8554

[#&#8203;8558]: https://redirect.github.com/tokio-rs/tokio/pull/8558

[#&#8203;8560]: https://redirect.github.com/tokio-rs/tokio/pull/8560

[#&#8203;8562]: https://redirect.github.com/tokio-rs/tokio/pull/8562

[#&#8203;8564]: https://redirect.github.com/tokio-rs/tokio/pull/8564

[#&#8203;8566]: https://redirect.github.com/tokio-rs/tokio/pull/8566

[#&#8203;8570]: https://redirect.github.com/tokio-rs/tokio/pull/8570

[#&#8203;8574]: https://redirect.github.com/tokio-rs/tokio/pull/8574

</details>

<details>
<summary>toml-rs/toml (toml)</summary>

###
[`v1.1.8`](https://redirect.github.com/toml-rs/toml/compare/toml-v1.1.7...toml-v1.1.8)

[Compare
Source](https://redirect.github.com/toml-rs/toml/compare/toml-v1.1.7...toml-v1.1.8)

###
[`v1.1.7`](https://redirect.github.com/toml-rs/toml/compare/toml-v1.1.6...toml-v1.1.7)

[Compare
Source](https://redirect.github.com/toml-rs/toml/compare/toml-v1.1.6...toml-v1.1.7)

###
[`v1.1.6`](https://redirect.github.com/toml-rs/toml/compare/toml-v1.1.5...toml-v1.1.6)

[Compare
Source](https://redirect.github.com/toml-rs/toml/compare/toml-v1.1.5...toml-v1.1.6)

</details>

<details>
<summary>Boshen/unicode-id-start (unicode-id-start)</summary>

###
[`v1.5.0`](https://redirect.github.com/Boshen/unicode-id-start/blob/HEAD/CHANGELOG.md#150---2026-09-19)

##### Fixed

- fix clippy

##### Other

- *(unicode-id-start)* exclude extraneous files from published package
([#&#8203;47](https://redirect.github.com/oxc-project/unicode-id-start/pull/47))
- Upgrade to Unicode 18.0.0
([#&#8203;55](https://redirect.github.com/oxc-project/unicode-id-start/pull/55))
- Update github actions
([#&#8203;54](https://redirect.github.com/oxc-project/unicode-id-start/pull/54))
- Update github actions
([#&#8203;53](https://redirect.github.com/oxc-project/unicode-id-start/pull/53))
- Update github actions
([#&#8203;52](https://redirect.github.com/oxc-project/unicode-id-start/pull/52))
- Update github actions
([#&#8203;51](https://redirect.github.com/oxc-project/unicode-id-start/pull/51))
- reduce Rust dev debug info
([#&#8203;50](https://redirect.github.com/oxc-project/unicode-id-start/pull/50))
- Update github actions
([#&#8203;49](https://redirect.github.com/oxc-project/unicode-id-start/pull/49))
- Update github actions
([#&#8203;48](https://redirect.github.com/oxc-project/unicode-id-start/pull/48))
- *(semgrep)* add scan workflow
([#&#8203;46](https://redirect.github.com/oxc-project/unicode-id-start/pull/46))
- Update taiki-e/install-action action to v2.83.3
([#&#8203;45](https://redirect.github.com/oxc-project/unicode-id-start/pull/45))
- update sponsor section
- Update taiki-e/install-action action to v2.83.0
([#&#8203;43](https://redirect.github.com/oxc-project/unicode-id-start/pull/43))
- Update github actions
([#&#8203;37](https://redirect.github.com/oxc-project/unicode-id-start/pull/37))
- standardize rustfmt config
([#&#8203;42](https://redirect.github.com/oxc-project/unicode-id-start/pull/42))
- normalize README sponsor section
- configure clippy exported api lint
([#&#8203;39](https://redirect.github.com/oxc-project/unicode-id-start/pull/39))
- add crates environment to release workflow
- Update github actions to v2.82.0
([#&#8203;36](https://redirect.github.com/oxc-project/unicode-id-start/pull/36))
- Update github actions to v2.81.10
([#&#8203;35](https://redirect.github.com/oxc-project/unicode-id-start/pull/35))
- Update github actions to v2.81.4
([#&#8203;34](https://redirect.github.com/oxc-project/unicode-id-start/pull/34))
- Update github actions
([#&#8203;33](https://redirect.github.com/oxc-project/unicode-id-start/pull/33))
- Update taiki-e/install-action action to v2.79.3
([#&#8203;32](https://redirect.github.com/oxc-project/unicode-id-start/pull/32))
- Update github actions
([#&#8203;31](https://redirect.github.com/oxc-project/unicode-id-start/pull/31))
- Update github actions
([#&#8203;30](https://redirect.github.com/oxc-project/unicode-id-start/pull/30))
- Update Rust crate rand to 0.10.0
([#&#8203;28](https://redirect.github.com/oxc-project/unicode-id-start/pull/28))
- Update github actions
([#&#8203;29](https://redirect.github.com/oxc-project/unicode-id-start/pull/29))
- Update github-actions
([#&#8203;27](https://redirect.github.com/oxc-project/unicode-id-start/pull/27))
- Update Rust crate rand to 0.9.3 \[SECURITY]
([#&#8203;20](https://redirect.github.com/oxc-project/unicode-id-start/pull/20))
- Add release workflow
([#&#8203;25](https://redirect.github.com/oxc-project/unicode-id-start/pull/25))
- make security analysis required-check friendly
([#&#8203;24](https://redirect.github.com/oxc-project/unicode-id-start/pull/24))
- Update github-actions
([#&#8203;23](https://redirect.github.com/oxc-project/unicode-id-start/pull/23))
- add security analysis workflow
([#&#8203;22](https://redirect.github.com/oxc-project/unicode-id-start/pull/22))
- replace OXC_BOT_PAT with GitHub App tokens
([#&#8203;21](https://redirect.github.com/oxc-project/unicode-id-start/pull/21))
- Fix rand dev-dependency version
([#&#8203;19](https://redirect.github.com/oxc-project/unicode-id-start/pull/19))
- Update rust crates
([#&#8203;17](https://redirect.github.com/oxc-project/unicode-id-start/pull/17))
- Update peter-evans/create-pull-request action to v8
([#&#8203;18](https://redirect.github.com/oxc-project/unicode-id-start/pull/18))
- Update github-actions
([#&#8203;16](https://redirect.github.com/oxc-project/unicode-id-start/pull/16))
- Update Rust crate rand to 0.9.3 \[SECURITY]
([#&#8203;15](https://redirect.github.com/oxc-project/unicode-id-start/pull/15))
- Move Renovate config to repository root
([#&#8203;14](https://redirect.github.com/oxc-project/unicode-id-start/pull/14))
- enable renovatebot
([#&#8203;13](https://redirect.github.com/oxc-project/unicode-id-start/pull/13))
- apply cargo shear --fix
([#&#8203;12](https://redirect.github.com/oxc-project/unicode-id-start/pull/12))
- add SECURITY.md
- replace wrapping_shr with direct bit shift
([#&#8203;10](https://redirect.github.com/oxc-project/unicode-id-start/pull/10))
- pin dtolnay/rust-toolchain
- update
- Fix readme badges
([#&#8203;9](https://redirect.github.com/oxc-project/unicode-id-start/pull/9))
- update permissions
- add renovatebot
- Add manual workflow for Unicode update
([#&#8203;7](https://redirect.github.com/oxc-project/unicode-id-start/pull/7))

</details>

<details>
<summary>algesten/ureq (ureq)</summary>

###
[`v3.4.2`](https://redirect.github.com/algesten/ureq/blob/HEAD/CHANGELOG.md#342)

[Compare
Source](https://redirect.github.com/algesten/ureq/compare/3.4.1...3.4.2)

- Bump ureq-proto to 0.6.3 (fixes network-path references in redirects)
- Bypass pooling for request connection settings incompatible with the
Agent
[#&#8203;1201](https://redirect.github.com/algesten/ureq/issues/1201)
- Try the next resolved address on unreachable/unavailable connect
errors
[#&#8203;1195](https://redirect.github.com/algesten/ureq/issues/1195)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - "before 10am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-10-18 18:45:40 +00:00
overlookmotel 7e40ffc372 feat(lexer): cpu_versions macro work on methods (#27907)
`cpu_versions` macro (introduced in #27712) could only be put on free functions, not methods. Add support for methods to the macro.
2026-10-17 23:20:55 +00:00
overlookmotel 775a84ba0c feat(lexer): add types for runtime feature detection (#27712)
This PR is the start of the transition from compile-time CPU features detection to runtime detection.

It introduces:

- `DynCpu`: Enum representing any of the CPU feature sets available on the current platform.
- `Avx2`, `Neon`, `Generic`: Zero-sized types which each represent a single CPU feature set.
- `Cpu`: Trait which is implemented for all the above types.
- `cpu_select!`: Macro to dispatch to a different implementation depending on CPU capabilities, given an `impl Cpu`.
- `cpu_versions!`: Macro to generate multiple versions of a function for all CPU feature sets available on current platform, with an entry point that dispatches to the appropriate one depending on what `impl Cpu` is passed to it.

`DynCpu` and the feature set types (`Avx2`, `Neon`, `Generic`) are unforgeable. `DynCpu` can only be created with `DynCpu::detect()`, which returns a definitive answer. `Avx2` etc types can only be obtained from `DynCpu`, so they act as tokens guaranteeing that feature set _is_ supported on current CPU.

Therefore, it's statically impossible to call a function which takes `Avx2` as a parameter when the CPU does not support AVX2. This invariant is a type system-level guarantee, meaning that some functions which would otherwise be unsafe purely because they rely on a specific CPU feature set can become safe functions.

This PR only introduces these primitives, it does not use them anywhere in `oxc_lexer` yet. Migrating over to them can happen incrementally. Later PRs in this stack start that process.

`DynCpu::detect()` at present does _not_ do runtime feature detection. It still requires building with `-C target-feature=+avx2,+bmi2,+popcnt` to enable AVX2 on x86_64. It can be switched over to doing runtime feature detection once the whole crate has migrated to the new primitives.
2026-10-17 13:24:38 +00:00
leaysgur 52ee29d1be fix(formatter_yaml): never start col-0 line with document marker or BOM (#27818)
- Bump `oxc-yaml-parser` to 0.0.7
  - handles NUL as content, BOM only outside a document, markers only at column 0
- Keep `---`/`...` content on the `---` line, keep `?` on a root key starting with a marker, and indent a flow scalar continuation line starting with a marker
- Add `---` before a document whose first text is U+FEFF
2026-10-16 10:17:38 +00:00
leaysgur 814eaeb2c6 fix(formatter_toml): bump oxc-toml to keep commented inline table (#27782)
https://github.com/oxc-project/oxc-toml/releases/tag/v0.15.1
2026-10-16 04:21:11 +00:00
Yuji Sugiura fddf422904 fix(deps): update rustls to 0.23.46 (#27810)
- Update the locked `rustls` version from 0.23.45 to 0.23.46.
- Address RUSTSEC-2026-0346, RUSTSEC-2026-0347, RUSTSEC-2026-0348, and
RUSTSEC-2026-0349 reported by Security Analysis CI.
-
https://github.com/oxc-project/oxc/actions/runs/38845387708/job/116794625241
2026-10-16 13:01:26 +09:00
Dunqing e3c1b11531 fix(ast)!: preserve lone surrogates in static property names (#27095)
`PropertyKey::static_name()` and `ClassElement::static_name()` returned `None` for a key such as `{ "\uD800": 1 }`, so rules treated it as dynamic and missed duplicate keys, duplicate class members, accessor pairs and overloads with these names.

They now return `StaticPropertyName`, which borrows the key's `JSStr` from the AST or owns the text of a numeric key. Regex keys use their canonical name, so `[/a/ig]` is `/a/gi`. `sort-keys` now sorts lone-surrogate keys too, with the comparator from #27579. async-to-generator no longer emits an invalid function name such as `1` for a key like `"\uD8001"`. `JSStr::display()` is added for diagnostics; it writes a lone surrogate as `\uXXXX`.

## Breaking changes

- `PropertyKey::static_name`, `PropertyKey::name` and `ClassElement::static_name` return `Option<StaticPropertyName<'a>>` instead of `Option<Cow<'a, str>>`.
- `oxc_semantic::class::table::Element.name` is `StaticPropertyName<'a>`.

Based on #26677. Part of #26242. Continues #26720.

Implemented with AI assistance.
2026-10-14 08:29:10 +00:00
leaysgur 1c393c0289 perf(formatter_core): skip scanning texts with nothing to rewrite (#27561)
Most texts have no byte that `normalize_string` or `normalize_newlines` rewrites, so find the first candidate with `memchr` and return the text borrowed when there is none.

`is_all_printable_ascii` drops its early exit so that it vectorizes.

JSON benefited the most, and instructions tested locally showed a 12% reduction.
2026-10-14 07:06:46 +00:00
leaysgur 1d3ef102fe perf(formatter_core): keep the embedded IR when nothing in it is rewritten (#27673)
`map_text_in_ir` now takes the IR by value and returns it as is when the callback rewrites nothing; a rebuild starts at the first change.

Markdown code blocks no longer pre-scan their IR (`scan_texts`), the fence character is found by the same walk.
2026-10-14 07:06:46 +00:00
Dunqing 3b07d0d52d refactor(ast)!: migrate string literals and templates to JSStr (#26548)
JavaScript strings can contain lone surrogates, which Rust's `str` cannot hold. String literal values and template cooked values stored them in a private U+FFFD escape encoding behind a `lone_surrogates` flag that every consumer had to check.

This migrates `StringLiteral::value` and `TemplateElementValue::cooked` to `JSStr`, which keeps the exact UTF-16 value through parsing, AST consumers, codegen and ESTree/raw transfer. Code that needs Rust text calls `JSStr::as_str()`, which returns `None` for a value with a lone surrogate. Surrogate halves written as separate escapes or concatenated from separate parts are joined. Enum members whose name or value contains a lone surrogate keep their string kind, so lowering no longer emits a reverse mapping for a string alias that could overwrite another member.

Some lint and declaration checks skip lone-surrogate names until #26677, #27095, #26716 and #26717.

## Breaking changes

- `StringLiteral::value` is `JSStr<'a>`, and `TemplateElementValue::cooked` is `Option<JSStr<'a>>`.
- Removed: the `lone_surrogates` fields, the `*_with_lone_surrogates` builder methods, `oxc_parser::Token::lone_surrogates`, and `impl Display for StringLiteral`.
- `ImportAttributeKey::as_arena_str` is renamed to `as_js_str`. `TSEnumMemberName::static_name`, `TemplateLiteral::single_quasi` and `ModuleRunnerTransform::transform` return `JSStr`.
- `oxc_estree::LoneSurrogatesString` wraps an iterator of code points.
- `ModuleExportName::name` panics on a string name with a lone surrogate, which only a built AST can contain.

Part of #26242.

Implemented with AI assistance.
2026-10-14 00:26:15 +00:00
oxc-guard[bot]andleaysgur 6941b4ed45 release(apps): oxlint v1.88.0 && oxfmt v0.73.0 (#27643)
# Oxlint
### 💥 BREAKING CHANGES

- 7730e14 ast: [**BREAKING**] Refactor comment attachment storage
(#27512) (camc314)
- c904b61 ast: [**BREAKING**] Add comment attachment storage (#27393)
(camc314)

### 🚀 Features

- bde9f69 oxlint/lsp: Show config errors to LSP client (#25486) (Sysix)
- 3c361a7 linter/unicorn/prefer-query-selector: Add `allowWithVariables`
option (#27346) (Mikhail Baev)

### 🐛 Bug Fixes

- 82ecc43 linter/sort-keys: Compare natural order like ESLint (#27579)
(Dunqing)
- 598ac03 linter/unicorn/prefer-bigint-literals: Unwrap redundant
constructor call; don't auto-fix for lost precision (#25690) (Jacob
Bandes-Storch)
- 2512213 linter: Prevent conflicting type import fixes (#27409)
(camc314)
- 2349a31 oxfmt: Follow symlinked configs in discovery (#27389)
(leaysgur)
- 6e573f9 oxlint,oxfmt: Set stderr blocking (#27363) (leaysgur)

### ⚡ Performance

- 91b588c linter/oxc/bad-array-method-on-arguments: Check arguments
references once (#26930) (camc314)
- c5f47ed linter/plugins: Inline `firstCommentAtOrAfter` into call sites
(#27539) (overlookmotel)
- c5f9235 linter/plugins: Use shift over multiply for powers of 2
(#27536) (overlookmotel)
- 8c57c5e linter: Share one source per file across type-aware
diagnostics (#27462) (Max Schwenk)
- 19c227d minifier: Use ident when checking specific id names (#27208)
(Armano)

### 📚 Documentation

- 98cc2b4 linter/plugins: Improve documentation for
`firstCommentAtOrAfter` (#27538) (overlookmotel)
- 3bb54f6 linter: Update stale comment (#27519) (overlookmotel)
- 848a4e7 linter: Update fix metadata for tsgolint rules that already
provide fixes (#27408) (Mikhail Baev)
# Oxfmt
### 💥 BREAKING CHANGES

- 1ef2888 oxfmt: [**BREAKING**] Improve `--migrate prettier` (#27444)
(leaysgur)
- c2e6d5f formatter_toml: [**BREAKING**] Add `oxc_formatter_toml` crate
wrapping `oxc-toml` (#27365) (leaysgur)

### 🚀 Features

- ce4e8dc oxfmt: Support `overrides[].parser` ->
`associations[].language` migration (#27475) (leaysgur)
- a495e82 oxfmt: Support `associations` config to specify language over
filepath (#27437) (leaysgur)
- 77f8156 oxfmt/lsp: Show root config errors to LSP client (#26014)
(Sysix)
- c1adce3 oxfmt/lsp: Support astro language (#27388) (leaysgur)
- 4f024a1 oxfmt: Support astro plugin in `--migrate prettier` (#27387)
(leaysgur)
- 5db28fa oxfmt: Support Astro via `prettier-plugin-astro@1.x` (#27386)
(leaysgur)

### 🐛 Bug Fixes

- 76ec31b formatter_css: Support css-in-js placeholders in property
names and conditions (#27640) (leaysgur)
- 99bb268 formatter_css: Keep css-in-js placeholder as media type
(#27639) (leaysgur)
- 372849e formatter: Fix crash on css-in-js comment containing
interpolation (#27638) (leaysgur)
- da692b8 formatter: Wrap `export default class|function` consistently
(#27628) (leaysgur)
- 21dee96 formatter: Keep parens around `TSInstantiationExpression`
before ! and export (#27626) (leaysgur)
- b6eb914 oxfmt: Normalize symlink targets in CLI snapshots (#27498)
(camc314)
- 5dae56f oxfmt/lsp: Return error on config resolving error (#26003)
(Sysix)
- 676cc60 formatter/jsdoc: Preserve paragraphs by checking
`@description` tag width (#27439) (leaysgur)
- 2349a31 oxfmt: Follow symlinked configs in discovery (#27389)
(leaysgur)
- db360de oxfmt: Load svelte plugin for svelte-in-mdx-in-md (#27369)
(leaysgur)
- 6e573f9 oxlint,oxfmt: Set stderr blocking (#27363) (leaysgur)
- d730fdd formatter_core: Leave blank frontmatter without dispatcher
(#27359) (leaysgur)

### 📚 Documentation

- 4a28c91 formatter_css: Clarify `missed-semicolon-accepted` divergence
(#27433) (leaysgur)
- 408d87f oxfmt: Simplify oxfmtrc docs (#27432) (leaysgur)
- 902e188 oxfmt: Update how `embeddedLanguageFormatting` option works
(#27362) (leaysgur)
- 37b3c48 formatter_markdown: Fix DIVERGENCES.md examples and slug to
match behavior (#27358) (leaysgur)

Co-authored-by: leaysgur <6259812+leaysgur@users.noreply.github.com>
2026-10-13 10:12:17 +01:00
oxc-guard[bot]andleaysgur d47efe5cb8 release(crates): oxc v0.154.0 (#27644)
### 💥 BREAKING CHANGES

- 7730e14 ast: [**BREAKING**] Refactor comment attachment storage
(#27512) (camc314)
- c904b61 ast: [**BREAKING**] Add comment attachment storage (#27393)
(camc314)
- b5e8eff parser: [**BREAKING**] Assign node IDs during parsing (#27411)
(camc314)

### 🚀 Features

- 3d00bbd minifier: Add folding of delete expression (#27522) (Armano)

### 🐛 Bug Fixes

- 760b60b codegen, packages/codegen: Remove extraneous space before
`RestElement` in `ArrayPattern` (#27613) (overlookmotel)
- 0353d37 packages/codegen: Support printing `V8IntrinsicExpression`s
(#27597) (overlookmotel)
- 1e4c6ee minifier: Preserve parameter writes through mapped arguments
(#27494) (Dunqing)
- f8e9a50 semantic: Stop arguments resolution at ordinary functions
(#26929) (camc314)
- 4b75662 transformer_plugins: Preserve optional chains through non-null
assertions (#27526) (Dunqing)
- 72bf06f crates/oxc_semantic: Decline to evaluate unary ops on strings
in enum initializers (#27447) (Brooooooklyn)
- c57d9c7 parser: Apply no-side-effects annotations after export
(#27504) (camc314)
- 02577b1 minifier: Preserve delete semantic when folding non-finite
numbers (#27466) (Armano)
- f14ead5 minifier: Eliminate unused IIFE calls with constant arguments
(#27434) (Dunqing)
- aec14bc transformer: Avoid synthetic private fields for static blocks
(#27300) (Kuroda Kayn)
- 558a890 semantic: Mark delete of optional members as MemberWriteTarget
(#27430) (Bartok)
- f50257e codegen: Avoid extra indent before empty do-while bodies
(#27407) (camc314)
- 82bfc5f codegen: Fix printing negative `BigIntLiteral` after `-`
(#27378) (overlookmotel)
- 5461c1a packages/codegen: Fix printing negative `BigIntLiteral` after
`-` (#27377) (overlookmotel)
- bebef88 packages/codegen: Fix debug assert fail printing
`TSJSDocNonNullableType` (#27373) (overlookmotel)
- 7e6a050 semantic: Visit `TSMethodSignature` computed method keys in
enclosing scope (#27357) (camc314)

### ⚡ Performance

- e1c97f8 packages/codegen: Remove all `printSpaceBeforeIdentifier`
calls (#27620) (overlookmotel)
- 70ecfdd packages/codegen: Skip redundant `printSpaceBeforeIdentifier`
call (#27619) (overlookmotel)
- 3c289f3 packages/codegen: Remove branches from loops printing arrays
(#27614) (overlookmotel)
- 27f5b45 packages/codegen: Remove branch printing `RestElement` in
`ArrayPattern` (#27608) (overlookmotel)
- adc90ed packages/codegen: Reduce branches in `printArguments` (#27607)
(overlookmotel)
- 262dd21 packages/codegen: Remove unnecessary
`printSpaceBeforeIdentifier` calls (#27606) (overlookmotel)
- 4bb9722 packages/codegen: Print `SpreadElement` arguments via
`printExpression` (#27599) (overlookmotel)
- 0c98dc5 packages/codegen: Reduce megamorphic `type` reads in
`printParams` (#27595) (overlookmotel)
- e3780b5 packages/codegen: Reduce writes in `printForOfStatement`
(#27594) (overlookmotel)
- 8d0ba20 packages/codegen: Reduce megamorphic `type` reads in
`printForOfStatement` (#27593) (overlookmotel)
- b29f35e packages/codegen: Reduce megamorphic `type` reads in
`printDirectivesAndStatements` (#27592) (overlookmotel)
- 256259d packages/codegen: Reduce megamorphic `type` reads in
`printConditionalExpression` (#27591) (overlookmotel)
- a9bd942 packages/codegen: Reduce megamorphic `type` reads in
`printObjectProperty` (#27590) (overlookmotel)
- 0a386ff packages/codegen: Ensure `shorthand` var is always a boolean
(#27589) (overlookmotel)
- 8d4c633 packages/codegen: Reduce branches in `printObjectProperty`
(#27588) (overlookmotel)
- b4c8c04 packages/codegen: Reduce megamorphic `type` reads in
`printMemberExpression` (#27587) (overlookmotel)
- ff5eae8 packages/codegen: Reduce megamorphic `type` reads (#27586)
(overlookmotel)
- 5487247 ast: Generate derive for `CloneIn` on `Comment` (#27542)
(overlookmotel)
- cd1c192 minifier: Optimize unused expression removal in minimize_if
(#27545) (Armano)
- 14a92ba transformer: Skip expression exit pipeline for unaffected
nodes (#27492) (camc314)
- cd9a62f transformer: Skip static block dispatch for ordinary
statements (#27491) (camc314)
- 135dd04 transformer: Skip ES2022 exits for non-class expressions
(#27489) (camc314)
- 961f318 packages/codegen: Reduce megamorphic `type` reads in
`binCheckAndPrepare` (#27460) (overlookmotel)
- 3d2f93f packages/codegen: Reduce megamorphic property accesses for
`BinaryExpression`s (#27459) (overlookmotel)
- 675ec5e packages/codegen: Reduce megamorphic property accesses in
`printBinaryish` (#27458) (overlookmotel)
- b0dbfff packages/codegen: Reduce writes and branches printing
functions (#27455) (overlookmotel)
- 5f3865c packages/codegen: Reduce writes for optional
`MemberExpression`s (#27454) (overlookmotel)
- 8c57c5e linter: Share one source per file across type-aware
diagnostics (#27462) (Max Schwenk)
- 19c227d minifier: Use ident when checking specific id names (#27208)
(Armano)
- 180d4e7 minifier: Avoid unecessary import/export merging for
cjs/scripts (#27291) (Armano)

### 📚 Documentation

- c993555 minifier: Align guides with current implementation (#27584)
(Cameron)
- 59472c5 packages/codegen: Add `@param`s to JSDoc comments which had
none (#27601) (overlookmotel)
- 5ee0fc9 packages/codegen: Complete `@param` lists in partly documented
JSDoc comments (#27600) (overlookmotel)
- 12dfa25 packages/codegen: Correct doc comment for `printBinaryish`
(#27456) (overlookmotel)
- add0443 mangler: Clarify node ID renumbering in build (#27448)
(camc314)

Co-authored-by: leaysgur <6259812+leaysgur@users.noreply.github.com>
2026-10-13 10:10:49 +01:00
leaysgur 76ec31b031 fix(formatter_css): support css-in-js placeholders in property names and conditions (#27640)
Fixes #27635, fixes #27572.

With bumping `oxc-css-parser`.
2026-10-13 07:23:06 +00:00
renovate[bot] 80840acdb9 chore(deps): update napi (#27374)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update |
|---|---|---|---|---|---|---|---|
| [@napi-rs/cli](https://napi.rs/)
([source](https://redirect.github.com/napi-rs/napi-rs)) | [`3.10.7` →
`3.10.8`](https://renovatebot.com/diffs/npm/@napi-rs%2fcli/3.10.7/3.10.8)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@napi-rs%2fcli/3.10.8?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@napi-rs%2fcli/3.10.8?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@napi-rs%2fcli/3.10.7/3.10.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@napi-rs%2fcli/3.10.7/3.10.8?slim=true)
| pnpm.catalog.default | patch |
| [napi](https://redirect.github.com/napi-rs/napi-rs) | `3.14.1` →
`3.14.2` |
![age](https://developer.mend.io/api/mc/badges/age/crate/napi/3.14.2?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi/3.14.2?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi/3.14.1/3.14.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi/3.14.1/3.14.2?slim=true)
| workspace.dependencies | patch |
| [napi-derive](https://redirect.github.com/napi-rs/napi-rs) | `3.6.11`
→ `3.6.12` |
![age](https://developer.mend.io/api/mc/badges/age/crate/napi-derive/3.6.12?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi-derive/3.6.12?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi-derive/3.6.11/3.6.12?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi-derive/3.6.11/3.6.12?slim=true)
| workspace.dependencies | patch |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (@&#8203;napi-rs/cli)</summary>

###
[`v3.10.8`](https://redirect.github.com/napi-rs/napi-rs/releases/tag/%40napi-rs/cli%403.10.8)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.10.7...@napi-rs/cli@3.10.8)

#### What's Changed

- chore(deps): update dependency oxc-parser to ^0.153.0 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;3569](https://redirect.github.com/napi-rs/napi-rs/pull/3569)
- fix(napi): bound serde_json::Value conversion depth at 128 levels by
[@&#8203;Brooooooklyn](https://redirect.github.com/Brooooooklyn) in
[#&#8203;3568](https://redirect.github.com/napi-rs/napi-rs/pull/3568)
- fix(napi): own NativeBorrowScope storage via NonNull to fix aliasing
violation by
[@&#8203;Brooooooklyn](https://redirect.github.com/Brooooooklyn) in
[#&#8203;3573](https://redirect.github.com/napi-rs/napi-rs/pull/3573)
- fix(napi): register the wasm cleanup through the env cleanup hook by
[@&#8203;Brooooooklyn](https://redirect.github.com/Brooooooklyn) in
[#&#8203;3571](https://redirect.github.com/napi-rs/napi-rs/pull/3571)
- chore(deps): update dependency webdriverio to v10 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;3566](https://redirect.github.com/napi-rs/napi-rs/pull/3566)
- fix(cli): keep WASI-managed root entry that differs from package main
by [@&#8203;Brooooooklyn](https://redirect.github.com/Brooooooklyn) in
[#&#8203;3572](https://redirect.github.com/napi-rs/napi-rs/pull/3572)
- chore(deps): update dependency
[@&#8203;oxc-node/core](https://redirect.github.com/oxc-node/core) to
v0.1.3 by [@&#8203;renovate](https://redirect.github.com/renovate)\[bot]
in [#&#8203;3564](https://redirect.github.com/napi-rs/napi-rs/pull/3564)
- chore(cli): recognize the aarch64-unknown-freebsd target by
[@&#8203;samm-git](https://redirect.github.com/samm-git) in
[#&#8203;3574](https://redirect.github.com/napi-rs/napi-rs/pull/3574)

#### New Contributors

- [@&#8203;samm-git](https://redirect.github.com/samm-git) made their
first contribution in
[#&#8203;3574](https://redirect.github.com/napi-rs/napi-rs/pull/3574)

**Full Changelog**:
<https://github.com/napi-rs/napi-rs/compare/napi-async-runtime-v0.2.5...@napi-rs/cli@3.10.8>

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEzNC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-06 12:08:17 +00:00
leaysgur c2e6d5fad2 feat(formatter_toml)!: add oxc_formatter_toml crate wrapping oxc-toml (#27365)
- Before: Oxfmt directly calls `oxc-toml`
- After: Oxfmt calls `oxc_formatter_toml` as like others
  - `oxc_formatter_toml` is wrapper for `oxc-toml` but aligned behavior with other formatters
  - Also embedded TOML (frontmatter, toml-in-markdown) are now formatted
  - Formatting logic still lives in `oxc-toml` side, not yet ported

And by bumping `oxc-toml`, TOML 1.1 syntax is supported.
2026-10-06 06:37:47 +00:00
oxc-guard 2bd08ebe8f release(apps): oxlint v1.87.0 && oxfmt v0.72.0 (#27341)
# Oxlint
### 🚀 Features

- 42dcfd2 linter/react/no-unescaped-entities: Implement suggestion (#27292) (Mikhail Baev)
- cd4510d linter/unicorn/no-useless-switch-case: Implement suggestion (#27245) (Mikhail Baev)
- 1a7c902 linter/react/jsx-no-target-blank: Implement suggestion (#27181) (Mikhail Baev)

### 🐛 Bug Fixes

- 176b4b9 linter/jsx-a11y/label-has-associated-control: Validate label attribute values (#27302) (sama Pyb)
- 7d381c3 linter/jsx-a11y/mouse-events-have-key-events: Handle nullish event handlers (#27306) (sama Pyb)
- 4e09837 linter/jsx-a11y/lang: Validate lang expression strings (#27304) (sama Pyb)
- 7d28a66 linter/unicorn/numeric-separators-style: Report misgrouped BigInt literals (#27207) (breken)
- e928322 linter/unicorn/no-zero-fractions: Parenthesize separator and large integers in fixer (#27206) (breken)
- 3d61a59 parser: Validate TypeScript type member separators (#27222) (camc314)
- f08236b linter/eslint/prefer-exponentiation-operator: Preserve autofix precedence (#27150) (camc314)
- 7d60ae3 linter/valid-title: Continue checks after allowed words (#27146) (Cameron)
- ad5dd5d linter/eslint/no-unused-vars: Respect disabled argument checks for used ignore patterns (#26925) (camc314)
# Oxfmt
### 💥 BREAKING CHANGES

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

### 🚀 Features

- b538e3c formatter_css: Parse embedded CSS as a block's contents (#27284) (leaysgur)

### 🐛 Bug Fixes

- 71e400b formatter_markdown: Fixed remaining issues found by fuzz (#27334) (leaysgur)
- 7d0e54d formatter_markdown: Preserve line breaks around Chinese/Japanese characters in all `proseWrap` (#27331) (leaysgur)
- e9ae2d8 formatter_css: Fix layouts found in mdn-content repo (css-in-md) (#27326) (leaysgur)
- df85b4c oxfmt: Keep blank lines after a line break in Prettier Doc to IR (#27325) (leaysgur)
- 7f65b75 formatter: Format assignment target property as assignment-like (#27289) (leaysgur)
- 6c08f2a formatter_css: Apply the `url()` import exception to a lone comma group (#27288) (leaysgur)
- 1967302 formatter_css: Hug a spaced `ident (` only at the at-rule prelude head (#27283) (leaysgur)
- 2445064 formatter_markdown: Keep a preserved line break before a delimiter row that opens no table (#27278) (leaysgur)
- dd72fbf formatter_markdown: Keep container columns as spaces under `useTabs` (#27277) (leaysgur)
- 1686018 oxfmt: Make one state `conditionalGroup` fit up to first `hardline` (#27275) (leaysgur)
- fd4ddce formatter_json: Flatten block comment only array|object (#27274) (leaysgur)
- 267557c formatter,oxfmt: Embed only original JSDoc plugin supported languages (#27241) (leaysgur)
- 2606c60 oxfmt: Do not re-include a file below an excluded directory with a negated pattern (#27237) (Nicolas Le Cam)
- c2de02b formatter: Decide embedded template layout from AST, not source shape (#27218) (leaysgur)
- c9e1224 formatter: Handle `quoteProps: consistent` for patterns and computed keys (#27216) (leaysgur)
- 36e14df formatter: Keep comments between callee and its opener on the callee side (#27172) (leaysgur)
- 6da7657 oxfmt: Render diagnostics with source in Stdin mode (#27130) (leaysgur)
- e9b2ec5 oxfmt/lsp: Reload `.prettierignore` on watched file change (#27129) (leaysgur)
- 30eb463 oxfmt: Check global ignores before resolving nested config in Stdin mode (#27128) (leaysgur)

### ⚡ Performance

- 72f42a3 formatter_markdown: Pre-allocate the IR buffer (#27333) (leaysgur)
- cea47e3 formatter_core: Avoid exponential `will_break` check on nested interned (#27211) (leaysgur)
- 0aba566 oxfmt: Do not resolve root js config from nested context (#27147) (leaysgur)

### 📚 Documentation

- 51506c6 formatter_css: Record divergences found in mdn-content (css-in-md) (#27327) (leaysgur)
- 656b81c formatter_markdown: Record unclosed fences closing at a directive's closer (#27279) (leaysgur)
- 66545bf formatter_markdown: Record setext heading wrap divergence (#27221) (leaysgur)
- af4b269 oxfmt: Document why `format()` API does not take cwd (#27131) (leaysgur)
2026-10-05 10:14:18 +00:00
renovate[bot] 2d5310df24 chore(deps): update napi to v3.14.1 (#27345)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [napi](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | patch | `3.14.0` → `3.14.1` |
| [napi-derive](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | patch | `3.6.10` → `3.6.11` |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (napi)</summary>

###
[`v3.14.1`](https://redirect.github.com/napi-rs/napi-rs/releases/tag/napi-v3.14.1)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/napi-v3.14.0...napi-v3.14.1)

##### Fixed

- *(napi)* create objects with napi\_define\_properties on every Node
version
([#&#8203;3560](https://redirect.github.com/napi-rs/napi-rs/pull/3560))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- 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/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-05 10:14:02 +00:00
oxc-guard 7f56ec9301 release(crates): oxc v0.153.0 (#27342)
### 🚀 Features

- 61003c7 minifier: Fold undefined argument in non delegating yield (#27324) (Armano)
- 07833c0 ast: Tie `debug_name` return lifetime to the underlying AST node (#27295) (sadan)
- adb1139 minifier: Merge import statements against the same module (#25534) (翠)
- cc82598 minifier: Merge import and export statements against the same module (#25533) (翠)
- 1c352ce minifier: Minimize bitwise binary expressions (#27107) (Armano)
- d1a0bcc minifier: Merge statements after terminating if block branches (#26667) (Armano)
- 7a95376 minifier: Merge adjucent if stmt with the same content (#26445) (Armano)

### 🐛 Bug Fixes

- 6a7d48b parser: Report abstract private field error on modifier (#27314) (camc314)
- 2ff6fb5 parser: Include generator marker in overload diagnostic span (#27313) (camc314)
- 4359a66 parser: Reject TypeScript class modifiers in JavaScript (#27312) (camc314)
- 565d75d minifier: Correct indopedency when processing nested sequences (#27273) (Armano)
- d0b9372 parser: Remove type-dependent tuple rest diagnostics (#27234) (camc314)
- 3d61a59 parser: Validate TypeScript type member separators (#27222) (camc314)
- b2793fa parser: Reject module syntax in script (#27220) (leaysgur)
- 5914a24 parser: Report `TS1243` for abstract async methods (#27192) (camc314)
- c6c6e5e parser: Report `TS1242` for interfaces with `abstract` modifier (#27191) (camc314)
- dd0bbb9 parser: Avoid duplicate index signature modifier diagnostic (#27190) (camc314)
- 8f61129 regex: Decode escaped capturing group names (#27156) (camc314)
- da1fed2 minifier: Fold conditional expressions with long sequences (#27083) (Armano)
- 0c601f4 isolated-declarations: Allow adding undefined to keyof parameter types (#27173) (Dunqing)
- 4896287 isolated-declarations: Support readonly parameter types (#27009) (sama Pyb)
- 72d62a1 transformer/explicit-resource-management: Transform classic for loop using declarations (#27148) (camc314)
- 4cf9ae2 minifier: Preserve sibling declarations in arguments copy rewrite (#27140) (camc314)
- 24b7015 transformer/explicit-resource-management: Lower using in catch and finally (#27142) (camc314)

### ⚡ Performance

- 99e3c15 minifier: Small performance improvement when merging imports (#27238) (Armano)
- d37d1db codegen: Pre-allocate sourcemap builder vectors (#27230) (codspeed)
- 466ef10 minifier: Update expressions in place in `merge_import_export` (#27226) (Armano)
- 028ffb8 minifier: Update nodes in place in `wrap_to_avoid_ambiguous_else` (#27194) (Armano)
- 6fcd135 minifier: Avoid conversion from ident to str when for substitute symbols (#27209) (Armano)
- 0b9799d minifier: Reduce usage of minimize_conditional (#26028) (Armano)
- 3ca3ded minifier: Short-circuit IfStatement termination on alternate (#25198) (Armano)

### 📚 Documentation

- 335ce79 agents: Scope verification for local and stacked work (#27299) (Dunqing)
2026-10-05 10:09:39 +00:00
leaysgur e2c68b17fa feat(oxfmt)!: format parser:markdown files by oxc_formatter_markdown (#27256)
Part of #24607

Now oxfmt formats Markdown files natively with `oxc_formatter_markdown`.

Basically the same output with Prettier 3.9.9, but we already covers some not yet released fixes as well. Please see DIVERGENCES.md.

Before, Markdown files were formatted by Prettier. So, JS in Markdown code fence was also formatted by Prettier (babel/typescript).

But now it is handled by `oxc_formatter`, it means `sortImports` and `sortTailwindcss` works.

For Markdown code fence langauge detection, we uses shiki languages (https://shiki.style/languages).

We also supports `::: directive` syntax, both VitePress (`::: withspace`) and remark-directive (`:::withoutspace`). (BLOCK only, no LEAF and TEXT position)
2026-10-05 05:13:53 +00:00
leaysgur b538e3c2ee feat(formatter_css): parse embedded CSS as a block's contents (#27284)
css-in-md supports selector-less block contents.
2026-10-02 11:36:18 +00:00
leaysgur 2445064092 fix(formatter_markdown): keep a preserved line break before a delimiter row that opens no table (#27278)
- Update `oxc_markdown_parser` to `0.0.3`
  - For https://github.com/oxc-project/oxc-markdown-parser/pull/28
- Add `NUL` character handling DIVERGENCES entry
2026-10-02 07:55:18 +00:00
renovate[bot] 119c55eee5 chore(deps): update rust crate napi-derive to v3.6.10 (#27242)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [napi-derive](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | patch | `3.6.9` → `3.6.10` |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (napi-derive)</summary>

###
[`v3.6.10`](https://redirect.github.com/napi-rs/napi-rs/releases/tag/napi-derive-v3.6.10)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/napi-derive-v3.6.9...napi-derive-v3.6.10)

##### Other

- update Cargo.toml dependencies

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- 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/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-01 05:59:22 +00:00
renovate[bot] 4333fe8da7 chore(deps): update napi (#27240)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [napi](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | minor | `3.13.0` → `3.14.0` |
| [napi-build](https://redirect.github.com/napi-rs/napi-rs) |
workspace.dependencies | minor | `2.5.0` → `2.6.0` |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (napi)</summary>

###
[`v3.14.0`](https://redirect.github.com/napi-rs/napi-rs/releases/tag/napi-v3.14.0)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/napi-v3.13.0...napi-v3.14.0)

##### Added

- *(napi)* lock the allocator on threaded WASI and never hang after a
worker crash
([#&#8203;3552](https://redirect.github.com/napi-rs/napi-rs/pull/3552))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-01 05:26:38 +00:00
oxc-guard 2ae2939bb2 release(apps): oxlint v1.86.0 && oxfmt v0.71.0 (#27132)
# Oxlint
### 🚀 Features

- 9d80eed linter/react/only-export-components: Support `allowCompoundComponents` (#27117) (Kuroda Kayn)
- e05b155 linter: Add typescript/no-generated-empty-object-type (#26958) (camc314)

### 🐛 Bug Fixes

- 42dfbb5 linter/eslint/one-var: Keep `declare` when splitting declarations (#27081) (Cheolhee Lee)
- 2ba7e33 linter/eslint/require-await: Count `await using` as an await (#27080) (Cheolhee Lee)
- 611e4ed linter/plugins: Include executing selectors in JS plugin rule timings (#27111) (overlookmotel)
- 2cac66f react-compiler: Handle recursive function expressions (#26796) (Brennan Butler)
- e996e6c react-compiler: Treat zero-argument new Date as impure (#26894) (Boshen)
- 571cfa3 oxlint: Skip type-aware lint rules in type-check-only mode (#27076) (camc314)
- d0b2462 oxlint: Skip undefined children in CFG walker (#27075) (camc314)
- 5186328 parser: Handle HTML comment values (#22933) (Boshen)
- 0b630e8 linter/typescript/unified-signatures: Align rule with upstream (#26956) (camc314)
- ebb22f1 linter/node/no-exports-assign: Change category from style to suspicious (#26555) (Bartok)
- cce28a0 linter/import/no-duplicates: Distinguish import attributes (#26936) (camc314)
- feb733b linter/unicorn/prefer-spread: Stop checking string split calls (#26935) (camc314)
- 929e154 linter/eslint/no-unused-vars: Honor ignore patterns inside array rest bindings (#26923) (camc314)
- 5bdb9b8 linter/eslint/no-unused-vars: Recognize consumed update expressions (#26782) (camc314)
- 5c05bef linter/eslint/prefer-const: Ignore embedded assignments (#26920) (camc314)

### ⚡ Performance

- ded4c29 linter/eslint/no-unused-vars: Skip sequence checks when absent (#26921) (camc314)
# Oxfmt
### 🚀 Features

- e0b1f9f oxfmt: Bump bundled Prettier version to 3.9.9 (#27002) (leaysgur)
- 342527d oxfmt: Bump bundled Prettier version to 3.9.8 (#26999) (leaysgur)

### 🐛 Bug Fixes

- eeba1db formatter: Skip test-call layout when arguments have comments (#27119) (leaysgur)
- 1f7b8ad oxfmt: Allow repeated CLI calls in the same process (#27051) (Liang)
- 7bcb807 formatter_markdown: Keep blank line between HTML and nested list (#27112) (leaysgur)
- 10b10c5 formatter: Keep comments around `=` on their side and line (#27041) (leaysgur)
- 9aad365 formatter: Keep comments deferred before an assignment operator (#26997) (waltu)
- 8fbddb1 formatter/jsdoc: More alignment with original plugin (#27039) (leaysgur)
- 50be18e formatter: Keep trailing spaces on normal block comments (#27037) (leaysgur)
- 56d1880 formatter: Nestle adjacent block comments (#27036) (leaysgur)
- 3be5d94 formatter: Treat `/***` comments as JSDoc (#27035) (leaysgur)
- cd45f71 formatter: Keep trailing double spaces on JSDoc lines (#26861) (John Costa)
- fd695f4 formatter_markdown: Fix more mismatches found in ecosystem-ci repos (#27003) (leaysgur)
- 4e77d59 formatter_markdown: Keep a math span after a kept line break from opening a block (#27001) (leaysgur)
- 584b8b0 formatter_markdown: Keep a shape line after a multi-line inline node or link title (#27000) (leaysgur)
- b939645 formatter_markdown: Keep a line break before an inline liquid tag under preserve (#26998) (leaysgur)
2026-09-28 09:44:05 +00:00
oxc-guard dfbc0d1ea7 release(crates): oxc v0.152.0 (#27133)
### 🚀 Features

- 02331c8 str: Add `JSStr`, `JSChar` and `JSStrBuilder` types (#26435) (Dunqing)
- 52ae63f regular_expression: Support buffer boundary assertions (#27048) (Boshen)
- 3255b89 transform-react: Add `reportDiagnostics` option to expose recoverable React Compiler diagnostics (#26624) (Jack)
- f585cb4 napi: Add threadless WASI builds (#26898) (Boshen)

### 🐛 Bug Fixes

- c380c85 minifier: Preserve iife with directives (#27060) (Armano)
- c55b35d str: Correct clippy reason (#27013) (overlookmotel)
- 8fbddb1 formatter/jsdoc: More alignment with original plugin (#27039) (leaysgur)
- 5186328 parser: Handle HTML comment values (#22933) (Boshen)
- 01ff33e parser: Reject module export names containing a lone surrogate (#26953) (Dunqing)
- d79ad19 codegen: Remove redundant dollar escapes in minified templates (#26924) (camc314)

### ⚡ Performance

- 0afbf85 minifier: Fold logical expressions in place (#26768) (Armano)
- 3471f29 minifier: Avoid creation of empty block when folding try finally (#26971) (Armano)
- 3893d64 minifier: Update boolean context expressions in place (#26823) (Armano)
- de8af47 minifier: Take return argument directly when converting arrow fn (#26830) (Armano)
- fc37ba0 minifier: Reduce allocations when minimizing assignments (#26609) (Armano)
- dce64f6 minifier: Use ident hashes for catch var and arguments (#26907) (Armano)
- 57610b3 minifier: Use ident hashes in label comparison (#26887) (Armano)

### 📚 Documentation

- dfa6cf9 str: Reformat and simplify comments (#27011) (overlookmotel)
- d775315 parser: Document AST property order (#27038) (Boshen)
- cd80e3f ast: Correct `JSXExpressionContainer` example (#26975) (camc314)
- 8cb05e3 ast: Simplify `JSXAttribute` value description (#26974) (camc314)
- fda7fbb ast: Correct `TSNumberKeyword` example (#26973) (camc314)
- e63c439 ast: Clarify `RegExpFlags::V` flag features (#26972) (camc314)
- 278288e ast: Correct `JSXText` example (#26970) (camc314)
- e9ff529 ast: Correct `TSIntrinsicKeyword` example (#26967) (camc314)
- c643ce4 ast: Fix `TSTupleType` example syntax (#26966) (camc314)
- 895b1a7 ast: Correct `TSPropertySignature` usage example (#26964) (camc314)
- 8d8cc7c ast: Correct `Class` abstract example values (#26963) (camc314)
- f7ef2e2 ast: Use valid variance example for `TSTypeParameter` (#26962) (camc314)
- 145fcdb ast: Attach `pure` comment to `NewExpression` field (#26961) (camc314)
- 06dfd9f ast: Clarify `TSNonNullExpression` docs (#26960) (camc314)
- d5f92b5 ast: Add docs for TSNonNullExpression (#26910) (camchenry)
- 4a76723 ast: Add docs for TSNamespaceExportDeclaration (#26909) (camchenry)
- de41927 ast: Add docs for `TSInstantiationExpression` (#26908) (camchenry)
2026-09-28 09:39:56 +00:00
renovate[bot]andCameron Clark efc646a590 chore(deps): update rust crate oxc_sourcemap to v9 (#27078)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [oxc_sourcemap](https://redirect.github.com/oxc-project/oxc-sourcemap)
| workspace.dependencies | major | `8.0.2` → `9.0.0` |

---

### Release Notes

<details>
<summary>oxc-project/oxc-sourcemap (oxc_sourcemap)</summary>

###
[`v9.0.0`](https://redirect.github.com/oxc-project/oxc-sourcemap/blob/HEAD/CHANGELOG.md#900---2026-09-25)

[Compare
Source](https://redirect.github.com/oxc-project/oxc-sourcemap/compare/v8.1.2...v9.0.0)

##### Added

- \[**breaking**] adopt ignoreList with legacy Google fallback
([#&#8203;470](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/470))
- add source map composition
([#&#8203;468](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/468))

##### Fixed

- allow sourcemap serialization to exceed capacity estimates
([#&#8203;473](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/473))
- handle Unicode boundaries in sourcemap visualization
([#&#8203;472](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/472))

##### Other

- *(deps)* upgrade Cargo dependencies
([#&#8203;476](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/476))
- simplify Rust code across the codebase
([#&#8203;475](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/475))
- remove redundant sourcemap builder allocations
([#&#8203;474](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/474))
- *(deps)* update napi
([#&#8203;469](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/469))
- *(deps)* update napi
([#&#8203;465](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/465))
- *(deps)* update napi
([#&#8203;463](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/463))
- *(deps)* update napi to v3.12.5
([#&#8203;462](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/462))
- *(deps)* update rust crate json-escape-simd to v3.1.2
([#&#8203;458](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/458))
- *(deps)* update napi to v3.12.4
([#&#8203;457](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/457))
- *(deps)* update napi
([#&#8203;456](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/456))
- *(deps)* update dependency dprint-markdown to v0.23.2
([#&#8203;447](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/447))
- *(deps)* update rust crate napi to v3.12.2
([#&#8203;444](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/444))
- reduce Rust dev debug info
([#&#8203;440](https://redirect.github.com/oxc-project/oxc-sourcemap/pull/440))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- 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/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTIuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjExMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Cameron Clark <cameron.clark@hey.com>
2026-09-28 08:05:35 +00:00
overlookmotel a5290a690b test(lexer): add lexer wallclock benchmark (#27110)
Add wallclock benchmarks for `oxc_lexer` vs old lexer (`oxc_parser`).

Benchmarks can be run locally with `just bench-lexer`, and also run in CI for all PRs which touch `oxc_lexer`.

Running wallclock benchmarks on a noisy CI machine is not ideal, but it at least gives some rough guidance. It also gives me *some* way to run benchmarks on the x86_86 SIMD implementation, which otherwise I can't do, as I only have access to aarch64 Macs.
2026-09-27 22:16:11 +00:00
leaysgur e0b1f9f9c0 feat(oxfmt): bump bundled Prettier version to 3.9.9 (#27002)
Follow Prettier v3.9.9 changes: https://github.com/prettier/prettier/pull/20140

Required `oxc_markdown_parser` bump.
2026-09-24 07:35:13 +00:00
renovate[bot]andCameron Clark 6fe829bbd8 chore(deps): update napi (#26941)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update |
|---|---|---|---|---|---|---|---|
| [@napi-rs/cli](https://napi.rs/)
([source](https://redirect.github.com/napi-rs/napi-rs)) | [`3.10.4` →
`3.10.5`](https://renovatebot.com/diffs/npm/@napi-rs%2fcli/3.10.4/3.10.5)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@napi-rs%2fcli/3.10.5?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@napi-rs%2fcli/3.10.5?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@napi-rs%2fcli/3.10.4/3.10.5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@napi-rs%2fcli/3.10.4/3.10.5?slim=true)
| pnpm.catalog.default | patch |
| [napi](https://redirect.github.com/napi-rs/napi-rs) | `3.12.7` →
`3.13.0` |
![age](https://developer.mend.io/api/mc/badges/age/crate/napi/3.13.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi/3.13.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi/3.12.7/3.13.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi/3.12.7/3.13.0?slim=true)
| workspace.dependencies | minor |
| [napi-build](https://redirect.github.com/napi-rs/napi-rs) | `2.4.4` →
`2.5.0` |
![age](https://developer.mend.io/api/mc/badges/age/crate/napi-build/2.5.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi-build/2.5.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi-build/2.4.4/2.5.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi-build/2.4.4/2.5.0?slim=true)
| workspace.dependencies | minor |
| [napi-derive](https://redirect.github.com/napi-rs/napi-rs) | `3.6.8` →
`3.6.9` |
![age](https://developer.mend.io/api/mc/badges/age/crate/napi-derive/3.6.9?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi-derive/3.6.9?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi-derive/3.6.8/3.6.9?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi-derive/3.6.8/3.6.9?slim=true)
| workspace.dependencies | patch |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (@&#8203;napi-rs/cli)</summary>

###
[`v3.10.5`](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.10.4...@napi-rs/cli@3.10.5)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.10.4...@napi-rs/cli@3.10.5)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMDMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjEwMy4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Cameron Clark <cameron.clark@hey.com>
2026-09-23 14:48:55 +01:00
Shanon Jackson 591966d8dd fix(lexer): use disambiguation state machine (#26919)
- Closes out remaining disambiguation cases; Across all ts/js/jsx
corpuses that I can find and fuzz for. Ran on large swathes of
node_modules 500k+ files came back completely green now.
- This closes it out in a way that is `performant` and `elegant` (the
design not the code) but not yet simple; Now that we're `correct` the
next work is to continue the stuff @overlookmotel has already been doing
and just start refactoring to condense is down, and logically
compartmentalize it until hopefully the final thing is something that
meets sensible maintainability goals.
----
3 level disambiguation runs
Level 1 - O(1) look behind; If it's context-independent we resolve the
ambiguity from the previous token.
Level 2 - Finite backward check, context-independent resolves some cases
that are rare in user-code
Level 3 - Full state-machine that runs essentially the JS lexical rules
to resolve the grammar; This is for fully context-dependent ambiguity
and almost never appears in real user-authored code.

Each level is `pay-when-occurs` performance so the hot path is never
degraded by grammatical cases are very rare. However the worst case
performance doesn't degrade to quadratic, it degrades to an O(N) full
token walk which would happen under circumstances where a whole file is
level 3 grammar.
2026-09-22 17:49:34 +01:00