mirror of
https://github.com/oxc-project/oxc.git
synced 2026-09-14 19:36:11 +08:00
codex/parser-grouped-expression-allocation
1234 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
cdc0ac4aef |
chore(deps): update npm packages (#23087)
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/) | |---|---|---|---|---|---| | [@arethetypeswrong/core](https://redirect.github.com/arethetypeswrong/arethetypeswrong.github.io) ([source](https://redirect.github.com/arethetypeswrong/arethetypeswrong.github.io/tree/HEAD/packages/core)) | [`0.18.2` → `0.18.3`](https://renovatebot.com/diffs/npm/@arethetypeswrong%2fcore/0.18.2/0.18.3) |  |  |  |  | | [@codspeed/vitest-plugin](https://codspeed.io) ([source](https://redirect.github.com/CodSpeedHQ/codspeed-node)) | [`5.4.0` → `5.5.0`](https://renovatebot.com/diffs/npm/@codspeed%2fvitest-plugin/5.4.0/5.5.0) |  |  |  |  | | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.60.0` → `8.60.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.60.0/8.60.1) |  |  |  |  | | [@typescript-eslint/scope-manager](https://typescript-eslint.io/packages/scope-manager) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)) | [`8.60.0` → `8.60.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fscope-manager/8.60.0/8.60.1) |  |  |  |  | | [@typescript-eslint/visitor-keys](https://typescript-eslint.io) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)) | [`8.60.0` → `8.60.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fvisitor-keys/8.60.0/8.60.1) |  |  |  |  | | [@vitest/browser](https://vitest.dev/guide/browser/) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser)) | [`4.1.7` → `4.1.8`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser/4.1.7/4.1.8) |  |  |  |  | | [@vitest/browser-playwright](https://vitest.dev/config/browser/playwright) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright)) | [`4.1.7` → `4.1.8`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser-playwright/4.1.7/4.1.8) |  |  |  |  | | [degit](https://redirect.github.com/Rich-Harris/degit) | [`3.3.2` → `3.4.1`](https://renovatebot.com/diffs/npm/degit/3.3.2/3.4.1) |  |  |  |  | | [eslint](https://eslint.org) ([source](https://redirect.github.com/eslint/eslint)) | [`10.4.0` → `10.4.1`](https://renovatebot.com/diffs/npm/eslint/10.4.0/10.4.1) |  |  |  |  | | [prettier-plugin-svelte](https://redirect.github.com/sveltejs/prettier-plugin-svelte) | [`4.0.1` → `4.1.0`](https://renovatebot.com/diffs/npm/prettier-plugin-svelte/4.0.1/4.1.0) |  |  |  |  | | [svelte](https://svelte.dev) ([source](https://redirect.github.com/sveltejs/svelte/tree/HEAD/packages/svelte)) | [`5.55.10` → `5.56.1`](https://renovatebot.com/diffs/npm/svelte/5.55.10/5.56.1) |  |  |  |  | | [tsx](https://tsx.hirok.io) ([source](https://redirect.github.com/privatenumber/tsx)) | [`4.22.3` → `4.22.4`](https://renovatebot.com/diffs/npm/tsx/4.22.3/4.22.4) |  |  |  |  | | [type-fest](https://redirect.github.com/sindresorhus/type-fest) | [`5.6.0` → `5.7.0`](https://renovatebot.com/diffs/npm/type-fest/5.6.0/5.7.0) |  |  |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.7` → `4.1.8`](https://renovatebot.com/diffs/npm/vitest/4.1.7/4.1.8) |  |  |  |  | | [vscode-languageserver-protocol](https://redirect.github.com/Microsoft/vscode-languageserver-node) ([source](https://redirect.github.com/Microsoft/vscode-languageserver-node/tree/HEAD/protocol)) | [`3.17.5` → `3.18.0`](https://renovatebot.com/diffs/npm/vscode-languageserver-protocol/3.17.5/3.18.0) |  |  |  |  | --- ### Release Notes <details> <summary>arethetypeswrong/arethetypeswrong.github.io (@​arethetypeswrong/core)</summary> ### [`v0.18.3`](https://redirect.github.com/arethetypeswrong/arethetypeswrong.github.io/blob/HEAD/packages/core/CHANGELOG.md#0183) ##### Patch Changes - [`14e61d5`](https://redirect.github.com/arethetypeswrong/arethetypeswrong.github.io/commit/14e61d5): Update [@​types/node](https://redirect.github.com/types/node), use [@​typescript/native-preview](https://redirect.github.com/typescript/native-preview) for local build/check - [`25031aa`](https://redirect.github.com/arethetypeswrong/arethetypeswrong.github.io/commit/25031aa): - Fix "Cannot read properties of undefined (reading 'filename')" caused by fflate 0.8.3 ([#​258](https://redirect.github.com/arethetypeswrong/arethetypeswrong.github.io/issues/258)) - Bump fflate to ^0.8.3 </details> <details> <summary>CodSpeedHQ/codspeed-node (@​codspeed/vitest-plugin)</summary> ### [`v5.5.0`](https://redirect.github.com/CodSpeedHQ/codspeed-node/releases/tag/v5.5.0) [Compare Source](https://redirect.github.com/CodSpeedHQ/codspeed-node/compare/v5.4.0...v5.5.0) ### Highlights We are introducing `@codspeed/playwright`, for walltime benchmarking and profiling of end to end browser applications through playwright. Here's an example usage, but head to the [docs](https://codspeed.io/docs/benchmarks/nodejs/playwright) for more information ```typescript import { bench, type Page } from "@​codspeed/playwright-plugin"; import electronExecutable from "electron"; import path from "node:path"; import { fileURLToPath } from "node:url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const appRoot = path.resolve(__dirname, ".."); async function waitUntilSettled(page: Page): Promise<void> { await page.waitForFunction(() => { const main = document.getElementById("main"); return !!main && !main.classList.contains("loading"); }); } await bench( "inbox-search-archive-threads", async ({ page }) => { await page.fill("#search", "update"); await waitUntilSettled(page); await page.click("#select-visible-btn"); await page.click("#archive-btn"); await waitUntilSettled(page); await page.click('#sidebar nav button[data-view="threads"]'); await waitUntilSettled(page); }, { target: { kind: "electron", appPath: path.join(appRoot, "out/main/index.js"), cwd: appRoot, }, beforeRound: async ({ page }) => { page.setDefaultTimeout(180_000); await page.waitForSelector("#main"); await waitUntilSettled(page); }, }, ); ``` Note: this plugin is only compatible with the walltime instrument. #### What's Changed - Add playwright profiling package by [@​GuillaumeLagrange](https://redirect.github.com/GuillaumeLagrange) in [#​80](https://redirect.github.com/CodSpeedHQ/codspeed-node/pull/80) **Full Changelog**: <https://github.com/CodSpeedHQ/codspeed-node/compare/v5.4.0...v5.5.0> </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.60.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8601-2026-06-01) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.60.0...v8.60.1) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.1) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/scope-manager)</summary> ### [`v8.60.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8601-2026-06-01) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.60.0...v8.60.1) This was a version bump only for scope-manager to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.1) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/visitor-keys)</summary> ### [`v8.60.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/visitor-keys/CHANGELOG.md#8601-2026-06-01) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.60.0...v8.60.1) This was a version bump only for visitor-keys to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.1) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>vitest-dev/vitest (@​vitest/browser)</summary> ### [`v4.1.8`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.8) [Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.7...v4.1.8) ##### 🐞 Bug Fixes - **browser**: - Disable client `cdp` API when `allowWrite/allowExec: false` \[backport to v4] - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex** in [#​10450](https://redirect.github.com/vitest-dev/vitest/issues/10450) [<samp>(e4067)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e4067b3b1) - Remove orphaned Playwright route when same module is mocked via multiple ids \[backport to v4] - by [@​toxik](https://redirect.github.com/toxik) and [@​Zelys-DFKH](https://redirect.github.com/Zelys-DFKH) in [#​10474](https://redirect.github.com/vitest-dev/vitest/issues/10474) [<samp>(675b4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/675b4343f) ##### [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.7...v4.1.8) </details> <details> <summary>Rich-Harris/degit (degit)</summary> ### [`v3.4.1`](https://redirect.github.com/Rich-Harris/degit/compare/v3.4.0...v3.4.1) [Compare Source](https://redirect.github.com/Rich-Harris/degit/compare/v3.4.0...v3.4.1) ### [`v3.4.0`](https://redirect.github.com/Rich-Harris/degit/compare/v3.3.2...v3.4.0) [Compare Source](https://redirect.github.com/Rich-Harris/degit/compare/v3.3.2...v3.4.0) </details> <details> <summary>eslint/eslint (eslint)</summary> ### [`v10.4.1`](https://redirect.github.com/eslint/eslint/releases/tag/v10.4.1) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v10.4.0...v10.4.1) #### Bug Fixes - [`e557467`](https://redirect.github.com/eslint/eslint/commit/e557467db7496220eebcbe2ac5ea6d38c12bb1ec) fix: update `@eslint/plugin-kit` version to 0.7.2 ([#​20930](https://redirect.github.com/eslint/eslint/issues/20930)) (Francesco Trotta) - [`d4ce898`](https://redirect.github.com/eslint/eslint/commit/d4ce898796ca22c3b96aa70d3014cb85f4bac1cd) fix: propagate failures from delegated commands ([#​20917](https://redirect.github.com/eslint/eslint/issues/20917)) (Minh Vu) - [`f4f3507`](https://redirect.github.com/eslint/eslint/commit/f4f3507460bc016b5be979c05d2969793f570cbf) fix: prefer-arrow-callback invalid autofix with newline after `async` ([#​20916](https://redirect.github.com/eslint/eslint/issues/20916)) (kuldeep kumar) - [`c5bc78b`](https://redirect.github.com/eslint/eslint/commit/c5bc78b37e08b9054a11f0cc2d81808bb24acb85) fix: false positive for reference in `finally` block ([#​20655](https://redirect.github.com/eslint/eslint/issues/20655)) (Tanuj Kanti) - [`27538c0`](https://redirect.github.com/eslint/eslint/commit/27538c01f5df4e9306f6f4ba867b2dd6307fae59) fix: add missing CodePath and CodePathSegment types ([#​20853](https://redirect.github.com/eslint/eslint/issues/20853)) (Pixel998) #### Documentation - [`61b0add`](https://redirect.github.com/eslint/eslint/commit/61b0add61ffc52665562be7bb96f526690a78b30) docs: remove deprecated rule from related rules of `max-params` ([#​20921](https://redirect.github.com/eslint/eslint/issues/20921)) (Tanuj Kanti) - [`305d5b9`](https://redirect.github.com/eslint/eslint/commit/305d5b91aeac24d36fde42f75625a8f183d4ce43) docs: remove deprecated rules from related rules section ([#​20911](https://redirect.github.com/eslint/eslint/issues/20911)) (Tanuj Kanti) - [`49b0202`](https://redirect.github.com/eslint/eslint/commit/49b0202d01918b8061720d586dffd7c68047090c) docs: fix `display: none` of ad ([#​20901](https://redirect.github.com/eslint/eslint/issues/20901)) (Tanuj Kanti) - [`9067f94`](https://redirect.github.com/eslint/eslint/commit/9067f9492ec998afc5b4f057a477ecf6ebd45e44) docs: switch build to Node.js 24 ([#​20893](https://redirect.github.com/eslint/eslint/issues/20893)) (Milos Djermanovic) - [`c91b041`](https://redirect.github.com/eslint/eslint/commit/c91b0417e3420c76807ce1fa2aea76e2de87ab86) docs: Update README (GitHub Actions Bot) - [`e349265`](https://redirect.github.com/eslint/eslint/commit/e349265cb37f3ebc837e178e48a725bb782bd870) docs: clarify semver strings in rule deprecation objects ([#​20885](https://redirect.github.com/eslint/eslint/issues/20885)) (Milos Djermanovic) #### Chores - [`b0e466b`](https://redirect.github.com/eslint/eslint/commit/b0e466b6ab47bfc7de43d8de0c315d8ee83aa584) test: add `data` property to invalid tests cases for rules ([#​20924](https://redirect.github.com/eslint/eslint/issues/20924)) (Tanuj Kanti) - [`f78838b`](https://redirect.github.com/eslint/eslint/commit/f78838bc4c86d487e1bcc7cede260c4467721c46) test: add CodePath type coverage ([#​20904](https://redirect.github.com/eslint/eslint/issues/20904)) (Pixel998) - [`1daa4bd`](https://redirect.github.com/eslint/eslint/commit/1daa4bd734b79a62e317d0394394a6b38cff49f9) chore: update `eslint-plugin-eslint-comments` test data to latest commit ([#​20922](https://redirect.github.com/eslint/eslint/issues/20922)) (Francesco Trotta) - [`002942c`](https://redirect.github.com/eslint/eslint/commit/002942ce988ea28b78e0a2f3b074081e638b552c) ci: declare contents:read on update-readme workflow ([#​20919](https://redirect.github.com/eslint/eslint/issues/20919)) (Arpit Jain) - [`64bca24`](https://redirect.github.com/eslint/eslint/commit/64bca24e7bed35bc3c864fc625cb2d89eca87d5b) chore: update ecosystem plugins ([#​20912](https://redirect.github.com/eslint/eslint/issues/20912)) (ESLint Bot) - [`6d7c832`](https://redirect.github.com/eslint/eslint/commit/6d7c832950d5e92499d88e504080661f888f8f56) chore: ignore fflate updates in renovate ([#​20908](https://redirect.github.com/eslint/eslint/issues/20908)) (Pixel998) - [`b2c8638`](https://redirect.github.com/eslint/eslint/commit/b2c86382164d87c6203b78d52068cd6a2a6ffe30) ci: bump pnpm/action-setup from 6.0.7 to 6.0.8 ([#​20889](https://redirect.github.com/eslint/eslint/issues/20889)) (dependabot\[bot]) - [`a9b8d7f`](https://redirect.github.com/eslint/eslint/commit/a9b8d7f74c50211701cfc49710fa541fd91b2aa5) chore: increase maxBuffer for ecosystem tests ([#​20881](https://redirect.github.com/eslint/eslint/issues/20881)) (sethamus) - [`b702ead`](https://redirect.github.com/eslint/eslint/commit/b702ead5e1ed7cb9f28238a454797662efb37396) chore: update ecosystem update PR settings ([#​20884](https://redirect.github.com/eslint/eslint/issues/20884)) (Pixel998) - [`507f60e`](https://redirect.github.com/eslint/eslint/commit/507f60e9a78c9a902bc8759f066ae17a1ea6cd81) chore: update ecosystem plugins ([#​20882](https://redirect.github.com/eslint/eslint/issues/20882)) (ESLint Bot) - [`92f5c5b`](https://redirect.github.com/eslint/eslint/commit/92f5c5bb6bf3a5d167c8ee53a430833410295c6d) test: add unit test for message-count ([#​20878](https://redirect.github.com/eslint/eslint/issues/20878)) (kuldeep kumar) - [`df32108`](https://redirect.github.com/eslint/eslint/commit/df321080af5758b1fa25e4b9a40e26135642dd6e) chore: add [@​eslint/markdown](https://redirect.github.com/eslint/markdown) and typescript-eslint ecosystem tests ([#​20837](https://redirect.github.com/eslint/eslint/issues/20837)) (sethamus) - [`327f91d`](https://redirect.github.com/eslint/eslint/commit/327f91d36aa49f2a50ded931d841a16374fd875f) chore: use includeIgnoreFile internally ([#​20876](https://redirect.github.com/eslint/eslint/issues/20876)) (Kirk Waiblinger) - [`f0dc4bd`](https://redirect.github.com/eslint/eslint/commit/f0dc4bd893fb3a9f44e4ddc3ad7063ffb0beacd3) chore: pin fflate\@​0.8.2 ([#​20877](https://redirect.github.com/eslint/eslint/issues/20877)) (Milos Djermanovic) - [`0f4bd25`](https://redirect.github.com/eslint/eslint/commit/0f4bd257a67a082b756de746d9e0c4842ab764ca) ci: run Discord alert for ecosystem test failures ([#​20873](https://redirect.github.com/eslint/eslint/issues/20873)) (Copilot) </details> <details> <summary>sveltejs/prettier-plugin-svelte (prettier-plugin-svelte)</summary> ### [`v4.1.0`](https://redirect.github.com/sveltejs/prettier-plugin-svelte/blob/HEAD/CHANGELOG.md#410) [Compare Source](https://redirect.github.com/sveltejs/prettier-plugin-svelte/compare/prettier-plugin-svelte@4.0.1...prettier-plugin-svelte@4.1.0) ##### Minor Changes - feat: support Svelte 5 declaration tags ([#​533](https://redirect.github.com/sveltejs/prettier-plugin-svelte/pull/533)) </details> <details> <summary>sveltejs/svelte (svelte)</summary> ### [`v5.56.1`](https://redirect.github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5561) [Compare Source](https://redirect.github.com/sveltejs/svelte/compare/svelte@5.56.0...svelte@5.56.1) ##### Patch Changes - fix: error at compile time on duplicate snippet/declaration tag definitions ([#​18351](https://redirect.github.com/sveltejs/svelte/pull/18351)) - fix: parse declaration tag contents more robustly ([#​18353](https://redirect.github.com/sveltejs/svelte/pull/18353)) - fix: correctly transform references to earlier declarators in a declaration tag (e.g. `{let a = $state(0), b = $derived(a * 2)}`) ([#​18348](https://redirect.github.com/sveltejs/svelte/pull/18348)) - fix: avoid spurious `state_referenced_locally` warnings for `$derived` declarations in declaration tags ([#​18348](https://redirect.github.com/sveltejs/svelte/pull/18348)) - fix: tolerate whitespace before `let`/`const` in declaration tags ([#​18348](https://redirect.github.com/sveltejs/svelte/pull/18348)) - fix: prevent infinite loop when a tag's expression ends with a trailing `/` at the end of the input ([#​18350](https://redirect.github.com/sveltejs/svelte/pull/18350)) - fix: more robust parsing of declaration tags with regards to `type` ([#​18330](https://redirect.github.com/sveltejs/svelte/pull/18330)) - fix: preserve newlines in spread input values when the `type` attribute is applied after `value` ([#​18345](https://redirect.github.com/sveltejs/svelte/pull/18345)) - fix: update `SvelteURLSearchParams` when setting duplicate keys to the same joined value ([#​18336](https://redirect.github.com/sveltejs/svelte/pull/18336)) - fix: check references for blockers on server, too ([#​18352](https://redirect.github.com/sveltejs/svelte/pull/18352)) ### [`v5.56.0`](https://redirect.github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5560) [Compare Source](https://redirect.github.com/sveltejs/svelte/compare/svelte@5.55.10...svelte@5.56.0) ##### Minor Changes - feat: allow declarations in the template ([#​18282](https://redirect.github.com/sveltejs/svelte/pull/18282)) ##### Patch Changes - perf: use `createElement` instead of `createElementNS` for HTML elements ([#​18262](https://redirect.github.com/sveltejs/svelte/pull/18262)) - perf: store `current_sources` as a `Set` for O(1) membership checks ([#​18278](https://redirect.github.com/sveltejs/svelte/pull/18278)) - perf: deduplicate identical hoisted templates within a component ([#​18320](https://redirect.github.com/sveltejs/svelte/pull/18320)) - perf: hoist `rest_props` exclude list as a module-scope `Set` ([#​18252](https://redirect.github.com/sveltejs/svelte/pull/18252)) </details> <details> <summary>privatenumber/tsx (tsx)</summary> ### [`v4.22.4`](https://redirect.github.com/privatenumber/tsx/releases/tag/v4.22.4) [Compare Source](https://redirect.github.com/privatenumber/tsx/compare/v4.22.3...v4.22.4) ##### Bug Fixes - resolve CommonJS directory requires inside dependencies ([#​803](https://redirect.github.com/privatenumber/tsx/issues/803)) ([1ce8463](https://redirect.github.com/privatenumber/tsx/commit/1ce846335b7c445a3328c7d27f06424949356d97)) *** This release is also available on: - [npm package (@​latest dist-tag)](https://www.npmjs.com/package/tsx/v/4.22.4) </details> <details> <summary>sindresorhus/type-fest (type-fest)</summary> ### [`v5.7.0`](https://redirect.github.com/sindresorhus/type-fest/releases/tag/v5.7.0) [Compare Source](https://redirect.github.com/sindresorhus/type-fest/compare/v5.6.0...v5.7.0) ##### New types - [`RemoveSuffix`](https://redirect.github.com/sindresorhus/type-fest/blob/main/source/remove-suffix.d.ts) ([#​1439](https://redirect.github.com/sindresorhus/type-fest/issues/1439)) [`d685b77`](https://redirect.github.com/sindresorhus/type-fest/commit/d685b77) - [`UnwrapRequired`](https://redirect.github.com/sindresorhus/type-fest/blob/main/source/unwrap-required.d.ts) ([#​1410](https://redirect.github.com/sindresorhus/type-fest/issues/1410)) [`3bfee8e`](https://redirect.github.com/sindresorhus/type-fest/commit/3bfee8e) ##### Improvements - `ExtendsStrict`: Add `distributiveUnions`, `strictNever` & `strictAny` options ([#​1408](https://redirect.github.com/sindresorhus/type-fest/issues/1408)) [`9ea810b`](https://redirect.github.com/sindresorhus/type-fest/commit/9ea810b) - `TupleOf`: Improve implementation ([#​1441](https://redirect.github.com/sindresorhus/type-fest/issues/1441)) [`391e1bb`](https://redirect.github.com/sindresorhus/type-fest/commit/391e1bb) ##### Fixes - `RemovePrefix`: Fix: Remove incorrect optimization and always fallback to `string` for non-literal prefixes ([#​1438](https://redirect.github.com/sindresorhus/type-fest/issues/1438)) [`9f35398`](https://redirect.github.com/sindresorhus/type-fest/commit/9f35398) - `DelimiterCase`: Fix behavior with non-single character delimiters ([#​1424](https://redirect.github.com/sindresorhus/type-fest/issues/1424)) [`9b36590`](https://redirect.github.com/sindresorhus/type-fest/commit/9b36590) - `RemovePrefix`: Fix `any` prefix behavior in non-strict mode ([#​1423](https://redirect.github.com/sindresorhus/type-fest/issues/1423)) [`c49cb75`](https://redirect.github.com/sindresorhus/type-fest/commit/c49cb75) - `DelimiterCase`: Fix behavior with union delimiters ([#​1422](https://redirect.github.com/sindresorhus/type-fest/issues/1422)) [`96172c0`](https://redirect.github.com/sindresorhus/type-fest/commit/96172c0) - `ApplyDefaultOptions`: Fix behavior with generic instantiations & `any` values ([#​1411](https://redirect.github.com/sindresorhus/type-fest/issues/1411)) [`c46020d`](https://redirect.github.com/sindresorhus/type-fest/commit/c46020d) - `ApplyDefaultOptions`: Fix behavior with explicit `undefined` ([#​1407](https://redirect.github.com/sindresorhus/type-fest/issues/1407)) [`60bfd3f`](https://redirect.github.com/sindresorhus/type-fest/commit/60bfd3f) *** </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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMDkuNCIsInVwZGF0ZWRJblZlciI6IjQzLjIwOS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Cameron Clark <cameron.clark@hey.com> |
||
|
|
963146f4b6 |
refactor(semantic): use SemanticBuilder presets at remaining call sites (#23057)
Use the `SemanticBuilder::new_linter()` preset at linter call sites that built semantic with ad-hoc `new().with_cfg(true)`-style chains, so they build semantic the same way the linter does instead of replicating its options by hand.
- linter test helpers: `disable_directives`, `utils/{regex,comment,jest,react}`
- playground's lint path
Behaviour-neutral; all linter tests pass.
|
||
|
|
336413bf5d |
refactor(semantic): use new_linter/new_compiler presets at callsites (#23037)
Replaces ad-hoc `SemanticBuilder::new().with_*()` chains with the `new_linter()` / `new_compiler()` presets where the preset already expands to the exact same option set, so the config lives in one place. - linter example + linter benchmark → `new_linter()` (cfg + class table + syntax) - semantic benchmark, cfg example, integration test util → `new_compiler()` (syntax) Behavior-neutral — each preset matches the options the callsite set by hand. Carved out of the larger store-optional refactor so it can land independently on `main` first. |
||
|
|
324c8ae137 |
refactor(semantic): add SemanticBuilder::new_compiler / new_linter presets (#23019)
## Summary Adds two named constructor presets to `SemanticBuilder` that bake in the options each use case needs, so the configuration lives in one place instead of being repeated at call sites: - **`SemanticBuilder::new_compiler()`** — compiler pipeline. Enables syntax-error checking; leaves linter-only analyses (control flow graph, class table) off. - **`SemanticBuilder::new_linter()`** — linter. Enables syntax-error checking, the control flow graph, and the class table. The presets are applied at the real pipeline entry points: - `new_linter()` → the linter service build. - `new_compiler()` → `oxc::Compiler`, and the napi parser/transform bindings. Everywhere else keeps `SemanticBuilder::new()` and turns on only the features it needs (mangler, minifier, formatter, transformer plugins, examples, tests, ...). Individual options can still be overridden after a preset (e.g. the linter service overrides `check_syntax_error` with its runtime flag). Behavior is preserved at every migrated site. Node-store access is intentionally untouched in this PR. ## Verified - Builds across the affected crates + napi; clippy clean; `oxc_linter` tests pass; full `cargo coverage` with no snapshot changes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) |
||
|
|
5778a2dfb5 |
refactor(formatter_core): purify core and define rules (#22952)
The Printer never consumes these; they belong with each language formatter. - Evict `Quote` (each formatter owns `QuoteStyle`) - `normalize_string` takes a quote byte - Evict `Expand` / `BracketSpacing` / `TrailingCommas` into oxc_formatter and oxc_formatter_json - JSON's `TrailingCommas` is now two-variant (`Always`/`Never`) - collapse Prettier's `all`/`es5` at each translation layer - Rename `util/` -> `spec/` (pure shared helpers) - Split `SourceText`: mechanical access stays in core, JS/TS lexis moves to `SourceTextExt` - Drop the `oxc_syntax` dependency from core All behaviros, Prettier conformance are unchanged. |
||
|
|
85efabfe0a |
feat(semantic): make building the class table optional, off by default (#22862)
Rolldown runs semantic multiple times, some runs do not require building the class table. |
||
|
|
6c30f81eca |
release(crates): oxc v0.134.0 (#22882)
### 🚀 Features - |
||
|
|
188b9e6b43 |
chore(bench): swap cal.com.tsx for excalidraw App.tsx everywhere (#22895)
## Summary Follow-up to #22590. That PR replaced the synthetic `cal.com.tsx` fixture — a concatenation of Next.js pages that declares top-level names 70–113× and emits thousands of redeclaration diagnostics, inflating semantic `sys_allocs` — with excalidraw's real, single-file `App.tsx`. But it only touched `TestFiles::complicated()` (used by `track_memory_allocations`). This applies the same swap to every remaining benchmark that still used `cal.com.tsx`, and unifies **all** excalidraw `App.tsx` references on one pin (`f6d85bc8`): | File | Change | | --- | --- | | `tasks/common/src/test_file.rs` | `minimal()` (feeds every `tasks/benchmark` criterion bench): `cal.com.tsx` → `App.tsx@f6d85bc8`. `formatter()` re-pinned `@v0.18.0` → `@f6d85bc8` | | `napi/parser/bench.bench.js` | parser benchmark fixture → `App.tsx@f6d85bc8` | | `napi/parser/test/parse-raw.test.ts` | bench-fixture list + size comment → `App.tsx@f6d85bc8` | | `tasks/benchmark/benches/semantic.rs` | rewrote the now-false "`cal.com.tsx` has many errors" comment | | `crates/oxc_ast/src/serialize/mod.rs` | removed the stale `cal.com.tsx` row from the capacity-ratio doc table | ## Why a single pin `get_source_text` caches downloads by the last URL segment only (`App.tsx`). With two different pins live, a single `cargo bench` run would download both into the same `target/App.tsx` and silently bench whichever landed first. Re-pinning `formatter()` to `f6d85bc8` removes that collision — and the pre-existing latent one between `cargo bench` (`@v0.18.0`) and `cargo allocs` (`@f6d85bc8`). ## Notes No committed snapshots change: these fixtures feed only timing benches and a `programRaw.toEqual(programStandard)` self-consistency test; the snapshotted `complicated()` / `minifier()` sets are untouched. --- This PR was prepared with AI assistance; I reviewed, tested, and verified the changes. |
||
|
|
705c0e969b |
refactor(formatter): introduce text-in public APIs (#22872)
Align `oxc_formatter` with `oxc_formatter_json`, both now expose `format(...) -> Result<Formatted<'a, _>, OxcDiagnostic>`. - Add text-in `format` and `format_fragment`, also `format_program`, `parse_for_format` and the `FragmentContext` enum - Parse options, JSX enabling, js-in-xxx context aware handlings are applied internally - Make the `Formatter` struct and AST/IR primitives crate-internal - Fold `get_parse_options` / `enable_jsx_source_type` and the `service` module into `parse_for_format` |
||
|
|
5733868456 |
refactor(formatter_core,formatter,formatter_json): share Expand and BracketSpacing options (#22821)
We chose `core` as the location for duplicate `struct`s, but the final options will continue to be built by each formatter. |
||
|
|
c323187f37 |
refactor(formatter): Split oxc_formatter and oxc_formatter_core (#22611)
Split `oxc_formatter` into: - `oxc_formatter(_js)`: JS/TS specific formatter, comment handling, sortImports, jsdoc, etc - `oxc_formatter_core`: Language agnostic IR, printer, etc The naming convention is different from Biome or Ruff (they do not have `_core`, and `_formatter` is equivalent to the core), but this is because in Oxc, items without `_js` are the default. As a basic task, I have added `Context` as a generic to all relevant parts to ensure support for multiple languages. There might still be other components that could be refactored into the core, but I would like to finish them as I implement support for other languages. Also moved some shared utilities to the core in advance. |
||
|
|
b7568d54d7 |
chore(deps): update dependency @napi-rs/cli to v3.7.0 (#22771)
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/) | |---|---|---|---|---|---| | [@napi-rs/cli](https://napi.rs/) ([source](https://redirect.github.com/napi-rs/napi-rs)) | [`3.6.2` → `3.7.0`](https://renovatebot.com/diffs/npm/@napi-rs%2fcli/3.6.2/3.7.0) |  |  |  |  | --- ### Release Notes <details> <summary>napi-rs/napi-rs (@​napi-rs/cli)</summary> ### [`v3.7.0`](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.6.2...@napi-rs/cli@3.7.0) [Compare Source](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.6.2...@napi-rs/cli@3.7.0) </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:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE5NC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Cameron Clark <cameron.clark@hey.com> |
||
|
|
83328b65ce |
release(crates): oxc v0.133.0 (#22734)
### 🚀 Features - |
||
|
|
e857b0cfe5 |
feat(napi/minify): expose legalComments option and result (#20370)
## Summary - Add `legalComments` and `legalCommentsPath` fields to the NAPI `CodegenOptions` struct, accepting `"none"`, `"inline"`, `"eof"`, `"linked"`, `"external"` - Add `legalComments: Vec<String>` to `MinifyResult`, populated from `CodegenReturn::legal_comments` when using `"linked"` or `"external"` mode - Replace the `From<&CodegenOptions>` impl with a `to_codegen_options()` method that validates and maps string values to `oxc_codegen::LegalComment` variants This enables downstream consumers (e.g. `oxc-webpack-plugin`) to use oxc's built-in legal comment extraction instead of regex-based post-processing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) |
||
|
|
aa3de22643 |
chore(deps): update npm packages (#22699)
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/) | |---|---|---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.59.3` → `8.59.4`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.59.3/8.59.4) |  |  |  |  | | [@typescript-eslint/scope-manager](https://typescript-eslint.io/packages/scope-manager) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)) | [`8.59.3` → `8.59.4`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fscope-manager/8.59.3/8.59.4) |  |  |  |  | | [@typescript-eslint/visitor-keys](https://typescript-eslint.io) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)) | [`8.59.3` → `8.59.4`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fvisitor-keys/8.59.3/8.59.4) |  |  |  |  | | [@vitest/browser](https://vitest.dev/guide/browser/) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser)) | [`4.1.6` → `4.1.7`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser/4.1.6/4.1.7) |  |  |  |  | | [@vitest/browser-playwright](https://vitest.dev/config/browser/playwright) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright)) | [`4.1.6` → `4.1.7`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser-playwright/4.1.6/4.1.7) |  |  |  |  | | [eslint](https://eslint.org) ([source](https://redirect.github.com/eslint/eslint)) | [`10.3.0` → `10.4.0`](https://renovatebot.com/diffs/npm/eslint/10.3.0/10.4.0) |  |  |  |  | | [svelte](https://svelte.dev) ([source](https://redirect.github.com/sveltejs/svelte/tree/HEAD/packages/svelte)) | [`5.55.7` → `5.55.9`](https://renovatebot.com/diffs/npm/svelte/5.55.7/5.55.9) |  |  |  |  | | [tsx](https://tsx.hirok.io) ([source](https://redirect.github.com/privatenumber/tsx)) | [`4.22.0` → `4.22.3`](https://renovatebot.com/diffs/npm/tsx/4.22.0/4.22.3) |  |  |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.6` → `4.1.7`](https://renovatebot.com/diffs/npm/vitest/4.1.6/4.1.7) |  |  |  |  | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.59.4`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8594-2026-05-18) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.3...v8.59.4) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/scope-manager)</summary> ### [`v8.59.4`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8594-2026-05-18) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.3...v8.59.4) This was a version bump only for scope-manager to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/visitor-keys)</summary> ### [`v8.59.4`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/visitor-keys/CHANGELOG.md#8594-2026-05-18) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.3...v8.59.4) This was a version bump only for visitor-keys to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>vitest-dev/vitest (@​vitest/browser)</summary> ### [`v4.1.7`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.7) [Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.6...v4.1.7) ##### 🐞 Bug Fixes - **runner**: Limit concurrency per task branch in addition to per leaf callbacks (backport) - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10384](https://redirect.github.com/vitest-dev/vitest/issues/10384) [<samp>(4f0f2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4f0f2a1ee) ##### [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.6...v4.1.7) </details> <details> <summary>eslint/eslint (eslint)</summary> ### [`v10.4.0`](https://redirect.github.com/eslint/eslint/compare/v10.3.0...452c4010c07dc2e36fe6ec6a8c48298878e86887) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v10.3.0...v10.4.0) </details> <details> <summary>sveltejs/svelte (svelte)</summary> ### [`v5.55.9`](https://redirect.github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5559) [Compare Source](https://redirect.github.com/sveltejs/svelte/compare/svelte@5.55.8...svelte@5.55.9) ##### Patch Changes - fix: don't unset batch when calling `{#await ...}` promise ([#​18243](https://redirect.github.com/sveltejs/svelte/pull/18243)) - fix: promise-ify `{#await await ...}` expressions on the server and correctly hydrate them on the client ([#​18243](https://redirect.github.com/sveltejs/svelte/pull/18243)) - fix: deduplicate dependencies that are added outside the init/update cycle ([#​18243](https://redirect.github.com/sveltejs/svelte/pull/18243)) - fix: avoid false-positive batch invariant error ([#​18246](https://redirect.github.com/sveltejs/svelte/pull/18246)) - fix: inline primitive constants in attribute values during SSR ([#​18232](https://redirect.github.com/sveltejs/svelte/pull/18232)) ### [`v5.55.8`](https://redirect.github.com/sveltejs/svelte/blob/HEAD/packages/svelte/CHANGELOG.md#5558) [Compare Source](https://redirect.github.com/sveltejs/svelte/compare/svelte@5.55.7...svelte@5.55.8) ##### Patch Changes - fix(print): handle `svelte:body` and fix keyframe percentage double-printing ([#​18234](https://redirect.github.com/sveltejs/svelte/pull/18234)) - fix: execute uninitialized derived even if it's destroyed ([#​18228](https://redirect.github.com/sveltejs/svelte/pull/18228)) - fix: use named symbols everywhere ([#​18238](https://redirect.github.com/sveltejs/svelte/pull/18238)) - fix: don't run teardown effects when deriveds are unfreezed ([#​18227](https://redirect.github.com/sveltejs/svelte/pull/18227)) - fix: unset context synchronously in `run` ([#​18236](https://redirect.github.com/sveltejs/svelte/pull/18236)) </details> <details> <summary>privatenumber/tsx (tsx)</summary> ### [`v4.22.3`](https://redirect.github.com/privatenumber/tsx/compare/v4.22.2...dce02fc3b8b64a58d24560714902b16f89332f1f) [Compare Source](https://redirect.github.com/privatenumber/tsx/compare/v4.22.2...v4.22.3) ### [`v4.22.2`](https://redirect.github.com/privatenumber/tsx/compare/v4.22.1...v4.22.2) [Compare Source](https://redirect.github.com/privatenumber/tsx/compare/v4.22.1...v4.22.2) ### [`v4.22.1`](https://redirect.github.com/privatenumber/tsx/compare/v4.22.0...6979f28810829dc79ec9baf406e162a18b65ab4b) [Compare Source](https://redirect.github.com/privatenumber/tsx/compare/v4.22.0...v4.22.1) </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 becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/oxc-project/oxc). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xOTQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE5NC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> |
||
|
|
ee659b6785 |
feat(transformer/legacy-decorator): add strictNullChecks option for nullable-union design:type (#22266)
## Summary
Adds a `strictNullChecks` field to `DecoratorOptions` (default `true`)
that
controls whether `null` and `undefined` are elided from union
`design:type`
metadata. The default preserves tsc strict semantics (`T | null` →
`Object`);
setting `strictNullChecks: false` matches
babel-plugin-transform-typescript-metadata
and tsc with `--strictNullChecks=false`, emitting the underlying
primitive
(`T | null` → `String` when `T = string`).
Originally this PR unconditionally elided null/undefined. Per @Dunqing's
review, it's now opt-in so the default-strict behaviour is preserved.
## Motivation
When `strictNullChecks` is off, tsc emits the constructor of the
underlying
primitive. babel-plugin-transform-typescript-metadata always elides null
and
undefined regardless of tsconfig. Downstream consumers (NestJS Swagger,
class-validator, TypeORM, AutoMapper) treat `Object` as "no metadata"
and
silently drop fields, so users with `strictNullChecks: false` (common in
older codebases) get worse behaviour under OXC than under tsc/babel.
## Implementation
```rust
pub struct DecoratorOptions {
pub legacy: bool,
pub emit_decorator_metadata: bool,
#[serde(default = "default_as_true")]
pub strict_null_checks: bool, // default true
}
```
Threaded through `Decorator::new(options) →
LegacyDecorator::new(&options) →
LegacyDecoratorMetadata::new(&options)` (matching the established
`TypeScript::new(&TypeScriptOptions)` precedent), and gated in
`serialize_union_or_intersection_constituents`:
```rust
TSType::TSNullKeyword(_) | TSType::TSUndefinedKeyword(_)
if !is_intersection && !self.strict_null_checks => continue,
```
Mirrored at the napi binding (`napi/transform/src/transformer.rs`) so
direct
Node consumers can flip it the day this lands. Consumers that wire
tsconfig
(rolldown, bundlers) can forward `compilerOptions.strictNullChecks` to
it.
## Behaviour matrix
| Source | `strictNullChecks: true` (default) | `strictNullChecks:
false` |
|---|---|---|
| `string \| null` | `Object` (matches tsc strict, current behaviour) |
`String` (matches babel, tsc non-strict) |
| `number \| undefined` | `Object` | `Number` |
| `boolean \| null \| undefined` | `Object` | `Boolean` |
| `null \| undefined` | `void 0` | `void 0` |
| `string \| number` | `Object` | `Object` (distinct primitives) |
| `string & null` | `Object` | `Object` (intersection unchanged) |
## Test plan
- [x] 7 unit tests in `tests/integrations/decorator_metadata.rs`
covering
`T | null` under both `strictNullChecks: true` (emits `Object`, current
behaviour) and `strictNullChecks: false` (emits primitive), plus
`T | undefined`, `T | null | undefined`, the `null | undefined`
void-only
case, the `string | number` distinct-primitive case (still `Object`),
and
the intersection-with-null regression
- [x] New conformance fixture `oxc/metadata/nullable-union/` with its
own
`options.json` setting `strictNullChecks: false`
- [x] `cargo test -p oxc_transformer` passes (31 unit + 11 integration)
- [x] `cargo run -p oxc_transform_conformance` shows 0 regressions;
baseline
fixtures still pass plus the new `nullable-union`
- [x] `cargo fmt -p oxc_transformer -p oxc_transform_napi` and
`cargo clippy --tests --no-deps` clean
AI assistance was used in writing this patch and tests; the contributor
has
reviewed and tested locally.
---------
Co-authored-by: Dunqing <dengqing0821@gmail.com>
|
||
|
|
63b129182d |
release(crates): oxc v0.132.0 (#22527)
### 🐛 Bug Fixes - |
||
|
|
03b7ac5b55 |
chore(deps): update npm packages (#22504)
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/) | |---|---|---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.59.2` → `8.59.3`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.59.2/8.59.3) |  |  |  |  | | [@typescript-eslint/scope-manager](https://typescript-eslint.io/packages/scope-manager) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)) | [`8.59.2` → `8.59.3`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fscope-manager/8.59.2/8.59.3) |  |  |  |  | | [@typescript-eslint/visitor-keys](https://typescript-eslint.io) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)) | [`8.59.2` → `8.59.3`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fvisitor-keys/8.59.2/8.59.3) |  |  |  |  | | [@vitest/browser](https://vitest.dev/guide/browser/) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser)) | [`4.1.5` → `4.1.6`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser/4.1.5/4.1.6) |  |  |  |  | | [@vitest/browser-playwright](https://vitest.dev/config/browser/playwright) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright)) | [`4.1.5` → `4.1.6`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser-playwright/4.1.5/4.1.6) |  |  |  |  | | [playwright](https://playwright.dev) ([source](https://redirect.github.com/microsoft/playwright)) | [`1.59.1` → `1.60.0`](https://renovatebot.com/diffs/npm/playwright/1.59.1/1.60.0) |  |  |  |  | | [publint](https://publint.dev) ([source](https://redirect.github.com/publint/publint/tree/HEAD/packages/publint)) | [`0.3.19` → `0.3.21`](https://renovatebot.com/diffs/npm/publint/0.3.19/0.3.21) |  |  |  |  | | [tsx](https://tsx.hirok.io) ([source](https://redirect.github.com/privatenumber/tsx)) | [`4.21.0` → `4.22.0`](https://renovatebot.com/diffs/npm/tsx/4.21.0/4.22.0) |  |  |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.5` → `4.1.6`](https://renovatebot.com/diffs/npm/vitest/4.1.5/4.1.6) |  |  |  |  | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.59.3`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8593-2026-05-11) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.2...v8.59.3) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.3) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/scope-manager)</summary> ### [`v8.59.3`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8593-2026-05-11) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.2...v8.59.3) This was a version bump only for scope-manager to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.3) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/visitor-keys)</summary> ### [`v8.59.3`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/visitor-keys/CHANGELOG.md#8593-2026-05-11) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.2...v8.59.3) This was a version bump only for visitor-keys to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.3) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>vitest-dev/vitest (@​vitest/browser)</summary> ### [`v4.1.6`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.6) [Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6) ##### 🐞 Bug Fixes - **browser**: Provide project reference in `ToMatchScreenshotResolvePath` - by [@​macarie](https://redirect.github.com/macarie) and [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10138](https://redirect.github.com/vitest-dev/vitest/issues/10138) [<samp>(31882)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/31882607c) - Global `sequence.concurrent: true` with top-level `test(..., { concurrent: false })` + depreacte `sequential` test API and options - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa), **Codex** and [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10196](https://redirect.github.com/vitest-dev/vitest/issues/10196) [<samp>(2847d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2847dfa2a) - **browser**: Simplify orchestrator otel carrier - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10285](https://redirect.github.com/vitest-dev/vitest/issues/10285) [<samp>(18af9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/18af98cee) ##### 🏎 Performance - Stringify diff objects only once - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10276](https://redirect.github.com/vitest-dev/vitest/issues/10276) [<samp>(9f7b1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9f7b1528c) ##### [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6) </details> <details> <summary>microsoft/playwright (playwright)</summary> ### [`v1.60.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.60.0) [Compare Source](https://redirect.github.com/microsoft/playwright/compare/v1.59.1...v1.60.0) #### 🌐 HAR recording on Tracing [tracing.startHar()](https://playwright.dev/docs/api/class-tracing#tracing-start-har) / [tracing.stopHar()](https://playwright.dev/docs/api/class-tracing#tracing-stop-har) expose HAR recording as a first-class tracing API, with the same `content`, `mode` and `urlFilter` options as `recordHar`. The returned [Disposable](https://playwright.dev/docs/api/class-disposable) makes it easy to scope a recording with `await using`: ```js await using har = await context.tracing.startHar('trace.har'); const page = await context.newPage(); await page.goto('https://playwright.dev'); // HAR is finalized when `har` goes out of scope. ``` #### 🪝 Drop API New [locator.drop()](https://playwright.dev/docs/api/class-locator#locator-drop) simulates an external drag-and-drop of files or clipboard-like data onto an element. Playwright dispatches `dragenter`, `dragover`, and `drop` with a synthetic \[DataTransfer] in the page context — works cross-browser and is great for testing upload zones: ```js await page.locator('#dropzone').drop({ files: { name: 'note.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') }, }); await page.locator('#dropzone').drop({ data: { 'text/plain': 'hello world', 'text/uri-list': 'https://example.com', }, }); ``` #### 🎯 Aria snapshots - [expect(page).toMatchAriaSnapshot()](https://playwright.dev/docs/api/class-pageassertions#page-assertions-to-match-aria-snapshot) now works on a [Page](https://playwright.dev/docs/api/class-page), in addition to a [Locator](https://playwright.dev/docs/api/class-locator) — equivalent to asserting against `page.locator('body')`. - New `boxes` option on [locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot) / [page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot) appends each element's bounding box as `[box=x,y,width,height]`, useful for AI consumption. #### 🛑 test.abort() New [test.abort()](https://playwright.dev/docs/api/class-test#test-abort) aborts the currently running test from a fixture, hook, or route handler with an optional message. Use it when you have detected an unrecoverable misuse and want to fail the test right away: ```js test('does not publish to the shared page', async ({ page }) => { await page.route('**/publish', route => { test.abort('Tests must not publish to the shared page. Use the `clone` option.'); return route.abort(); }); // ... }); ``` #### New APIs ##### Browser, Context and Page - Event [browser.on('context')](https://playwright.dev/docs/api/class-browser#browser-event-context) — fired when a new context is created on the browser. - [BrowserContext](https://playwright.dev/docs/api/class-browsercontext) now mirrors lifecycle events from its pages: [browserContext.on('download')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-download), [browserContext.on('frameattached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-attached), [browserContext.on('framedetached')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-detached), [browserContext.on('framenavigated')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-frame-navigated), [browserContext.on('pageclose')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-close), [browserContext.on('pageload')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-page-load). ##### Locators and Assertions - New option `description` in [page.getByRole()](https://playwright.dev/docs/api/class-page#page-get-by-role) / [locator.getByRole()](https://playwright.dev/docs/api/class-locator#locator-get-by-role) / [frame.getByRole()](https://playwright.dev/docs/api/class-frame#frame-get-by-role) / [frameLocator.getByRole()](https://playwright.dev/docs/api/class-framelocator#frame-locator-get-by-role) for matching the [accessible description](https://www.w3.org/TR/wai-aria-1.2/#dfn-accessible-description). - New option `pseudo` in [expect(locator).toHaveCSS()](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-css) reads computed styles from `::before` or `::after`. - New option `style` in [locator.highlight()](https://playwright.dev/docs/api/class-locator#locator-highlight) applies extra inline CSS to the highlight overlay, plus new [page.hideHighlight()](https://playwright.dev/docs/api/class-page#page-hide-highlight) to clear all highlights. ##### Network - [webSocketRoute.protocols()](https://playwright.dev/docs/api/class-websocketroute#web-socket-route-protocols) returns the WebSocket subprotocols requested by the page. - New option `noDefaults` in [browserType.connectOverCDP()](https://playwright.dev/docs/api/class-browsertype#browser-type-connect-over-cdp) disables Playwright's default overrides on the default context (download behavior, focus emulation, media emulation), so attaching to a user's daily-driver browser doesn't disturb its state. ##### Errors and Reporting - New [webError.location()](https://playwright.dev/docs/api/class-weberror#web-error-location) mirrors [consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location). - [consoleMessage.location()](https://playwright.dev/docs/api/class-consolemessage#console-message-location) now exposes `line` / `column` properties (`lineNumber` / `columnNumber` are deprecated). - New [testInfoError.errorContext](https://playwright.dev/docs/api/class-testinfoerror#test-info-error-error-context) surfaces additional diagnostic context, such as the aria snapshot of the receiver at the time of an `expect(...)` matcher failure. - [reporter.onError()](https://playwright.dev/docs/api/class-reporter#reporter-on-error) now receives a `workerInfo` argument with details about the worker for fixture teardown errors. ##### Test runner - New `{testFileBaseName}` token in [testProject.snapshotPathTemplate](https://playwright.dev/docs/api/class-testproject#test-project-snapshot-path-template) — file name without extension. - Test runner now errors when a config tries to override a non-option fixture, and rejects `workers: 0` or negative values. #### 🛠️ Other improvements - HTML reporter: - `npx playwright show-report` accepts `.zip` files directly — no need to unzip first. - Steps that contain attachments inside nested children show an indicator on the parent step. - The `repeatEachIndex` is shown in the test header when non-zero. - Trace Viewer adds a pretty-print toggle for JSON / form request and response bodies in the network details panel. #### Breaking Changes ⚠️ - Removed long-deprecated APIs: - `Locator.ariaRef()` — use the standard [locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot) pipeline. - `handle` option on `BrowserContext.exposeBinding` and `Page.exposeBinding`. - `logger` option on `BrowserType.connect` and `BrowserType.connectOverCDP` — use [tracing](https://playwright.dev/docs/trace-viewer) instead. - Context options `videosPath` / `videoSize` — use `recordVideo` instead. #### Browser Versions - Chromium 148.0.7778.96 - Mozilla Firefox 150.0.2 - WebKit 26.4 This version was also tested against the following stable channels: - Google Chrome 147 - Microsoft Edge 147 </details> <details> <summary>publint/publint (publint)</summary> ### [`v0.3.21`](https://redirect.github.com/publint/publint/blob/HEAD/packages/publint/CHANGELOG.md#0321) [Compare Source](https://redirect.github.com/publint/publint/compare/publint@0.3.20...publint@0.3.21) ##### Patch Changes - Suggest adding `"sideEffects": false` when bundler-oriented package fields or conditions are detected and the field is missing. ([#​228](https://redirect.github.com/publint/publint/pull/228)) ### [`v0.3.20`](https://redirect.github.com/publint/publint/blob/HEAD/packages/publint/CHANGELOG.md#0320) [Compare Source](https://redirect.github.com/publint/publint/compare/publint@0.3.19...publint@0.3.20) ##### Patch Changes - Suggest adding `engines.node` when it is missing from detected Node.js packages ([#​226](https://redirect.github.com/publint/publint/pull/226)) - Loosen "breaking change" wording in lint messages ([`7bb3f4f`](https://redirect.github.com/publint/publint/commit/7bb3f4fd03415d0c860dda0c252d7029144b9f94)) </details> <details> <summary>privatenumber/tsx (tsx)</summary> ### [`v4.22.0`](https://redirect.github.com/privatenumber/tsx/compare/v4.21.1...b29f6ee4d6872fdef474eb0a89c6d4e982478a77) [Compare Source](https://redirect.github.com/privatenumber/tsx/compare/v4.21.1...v4.22.0) ### [`v4.21.1`](https://redirect.github.com/privatenumber/tsx/releases/tag/v4.21.1) [Compare Source](https://redirect.github.com/privatenumber/tsx/compare/v4.21.0...v4.21.1) ##### Bug Fixes - support Node 20.11/21.2 import.meta paths ([acf3d8f](https://redirect.github.com/privatenumber/tsx/commit/acf3d8ffee39fcb4655956fc052b78666aacbc3d)) - support Node.js 24.15.0 ([c1d2d45](https://redirect.github.com/privatenumber/tsx/commit/c1d2d45432eba7c6ff0785a43b0aeae85b5a3391)) - support Node.js 26.1.0 and 25.9.0 ([1d7e528](https://redirect.github.com/privatenumber/tsx/commit/1d7e528762a7e4f801175fd7d7d6082b00df3e5c)) *** This release is also available on: - [npm package (@​latest dist-tag)](https://www.npmjs.com/package/tsx/v/4.21.1) </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:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> |
||
|
|
564ebbf46f |
release(crates): oxc v0.131.0 (#22459)
### 🚀 Features - |
||
|
|
e3b0d54556 |
refactor(napi/parser, linter/plugins): improve safety of raw transfer interface (#22424)
Add a check that the input passed to raw transfer parser implementations is valid - both in `napi/parser` and in the raw transfer implementation used in Oxlint's `RuleTester`. Check that `source_start` and `source_len` which are passed from JS side are within bounds of the active region of the `Arena`. This check is not strictly necessary - it's part of the safety contract, and is enforced on JS side - but it's critical as the setup of the `Arena` on Rust side depends on the accuracy of these values. If they were wrong, it could lead to reading/writing out of bounds. The check is cheap, so it seems worthwhile - safety trumps the tiny perf impact here. The 3rd invariant of these functions is that the bytes in the buffer between `source_start` and `source_start + source_len` represent a valid UTF-8 string. Here a full runtime check isn't appropriate, as it would involve scanning and validating the whole source text string (expensive). But _do_ enable the full check in debug builds (used by raw transfer parser tests, and Oxlint conformance tests). |
||
|
|
c2c8f806f9 |
refactor(napi/parser): raw transfer store source text at end of buffer (#22392)
Oxlint's raw transfer implementation stores the source text at end of the buffer. Prior to this PR `napi/parser` stored source text at the start of the buffer. Bring `napi/parser` into line with Oxlint, by also storing source text at end of the buffer. Making all versions of raw transfer that we use align with each other removes complication (all versions now have the same implementation of `deserializeStr`) and also removes some fragile code where it'd be easy to accidentally trigger UB (see the updated comments in `arena/fixed_size/windows.rs` and `arena/alloc_impl.rs`). Unfortunately, storing source at end of buffer is slightly less efficient than storing it at the start. We'll switch all implementations to storing source at start of buffer when we move to storing all strings (source text and all other strings) together in a single contiguous block. But in meantime, this slight inefficiency is outweighed by the gain in safety. |
||
|
|
650417ffd0 |
release(crates): oxc v0.130.0 (#22316)
### 🚀 Features - |
||
|
|
a4a6892f2c |
docs(napi/parser): correct code comment (#22278)
Just fix a small inaccuracy in a comment. |
||
|
|
24946bea55 | refactor(napi/parser): use rolldown for browser bundle (#22231) | ||
|
|
ec00055e64 |
release(crates): oxc v0.129.0 (#22108)
### 💥 BREAKING CHANGES - |
||
|
|
339a9fb1ce |
refactor(linter): simplify context sub host options (#22056)
Simplifies ContextSubHost construction by replacing constructor variants with a single options struct. |
||
|
|
429deac502 |
fix(napi/parser): export visitorKeys from wasm entrypoint (#21996)
Fixes #21995 Unblocks - https://github.com/sxzz/ast-explorer/pull/263 Why? - getting the actual list of visitorKeys provides an optimization for tools like zimmerframe, which will `walk` over only the things specified in the visitorKeys list -- helping prevent accidental recursive visiting, which can happen when a tree adds parent referencs Co-authored-by: Cameron <cameron.clark@hey.com> |
||
|
|
aedc1b8db5 |
refactor(linter/plugins, napi/parser): document pointer arithmetic (#21872)
Refactor. Document some quite unintuitive pointer arithmetic, and avoid casting pointers to integers with `as usize`. |
||
|
|
245f813cc1 |
refactor(napi/parser): avoid converting between NonNull and raw pointers (#21870)
Refactor. Simplify raw transfer code in `napi/parser`, by consistently using `NonNull` pointers, rather than converting back and forth between `NonNull` and `*mut` pointers. |
||
|
|
99eef72e2d |
refactor(allocator, linter/plugins, napi/parser): store raw transfer metadata within Arena chunk (#21869)
Large change to how raw transfer stores metadata about the allocations it uses.
Previously the two metadata structures `RawTransferMetadata` and `FixedSizeAllocator` after the chunk's `ChunkFooter`.
This had a few problems:
1. It was confusing and unwieldy - a recipe for bugs.
2. `ChunkFooter`'s memory was exposed on JS side - a bit unsafe as altering bytes in this region could easily trigger UB.
3. It entwined `Arena` (which is just the thing that allocates) with the details of exactly _what_ raw transfer allocates.
4. Imposed annoying alignment requirements, because `ChunkFooter` must be aligned on 16, and so anything after it must ensure it doesn't break that invariant.
Old layout:
```
WHOLE BLOCK - aligned on 4 GiB
<-----------------------------------------------------> Allocated block (`BLOCK_SIZE` bytes)
ALLOCATOR
<-----------------------------------------> `Allocator` chunk (`CHUNK_SIZE` bytes)
<----> `ChunkFooter` (aligned on 16)
<-----------------------------------> `Allocator` chunk data storage (for AST)
(`ACTIVE_SIZE` bytes)
METADATA
<----> `RawTransferMetadata`
<----> `FixedSizeAllocatorMetadata`
BUFFER SENT TO JS
<-----------------------------------------------> Buffer sent to JS (`BUFFER_SIZE` bytes)
```
This PR moves `RawTransferMetadata` and `FixedSizeAllocatorMetadata` into the chunk itself. New layout:
```
WHOLE BLOCK - size 2 GiB - 16, aligned on 4 GiB
<-----------------------------------------------------> Allocated block (`BLOCK_SIZE` bytes)
ARENA
<-----------------------------------------------------> Chunk (fills whole block)
<--------------------------------------> Allocatable region for AST (`ACTIVE_SIZE` bytes)
<---> `RawTransferMetadata`
<---> `FixedSizeAllocatorMetadata`
<---> `ChunkFooter` (aligned on 16, last in block)
BUFFER SENT TO JS
<-------------------------------------------> Buffer sent to JS (`BUFFER_SIZE` bytes)
```
`FixedSizeAllocatorMetadata` and `ChunkFooter` are no longer in the region which is shared with JS side. As far as `Arena` is concerned, they're now just some data (like any other data) which is allocated in the arena.
Also:
- Introduce more consistency to the naming of constants which specify the size and position of these various data structures in the arena.
- Add more const assertions to ensure everything is laid out and aligned as it should be.
|
||
|
|
b86197d455 |
refactor(allocator): fixed size allocators store backing allocation pointer in ChunkFooter (#21868)
Previously, fixed size allocators stored the pointer to the start of `Allocator`'s backing memory in `FixedSizeAllocatorMetadata`. Instead, store this pointer in `ChunkFooter`, in the field introduced in #21865. |
||
|
|
9951013ece |
release(crates): oxc v0.128.0 (#21837)
### 💥 BREAKING CHANGES - |
||
|
|
15ded1326b |
chore(deps): update npm packages (#21791)
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/) | |---|---|---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.58.2` → `8.59.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.58.2/8.59.0) |  |  |  |  | | [@typescript-eslint/scope-manager](https://typescript-eslint.io/packages/scope-manager) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)) | [`8.58.2` → `8.59.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fscope-manager/8.58.2/8.59.0) |  |  |  |  | | [@typescript-eslint/visitor-keys](https://typescript-eslint.io) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)) | [`8.58.2` → `8.59.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fvisitor-keys/8.58.2/8.59.0) |  |  |  |  | | [@vitest/browser](https://vitest.dev/guide/browser/) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser)) | [`4.1.4` → `4.1.5`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser/4.1.4/4.1.5) |  |  |  |  | | [@vitest/browser-playwright](https://vitest.dev/config/browser/playwright) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright)) | [`4.1.4` → `4.1.5`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser-playwright/4.1.4/4.1.5) |  |  |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.4` → `4.1.5`](https://renovatebot.com/diffs/npm/vitest/4.1.4/4.1.5) |  |  |  |  | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.59.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8590-2026-04-20) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.58.2...v8.59.0) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/scope-manager)</summary> ### [`v8.59.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8590-2026-04-20) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.58.2...v8.59.0) This was a version bump only for scope-manager to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/visitor-keys)</summary> ### [`v8.59.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/visitor-keys/CHANGELOG.md#8590-2026-04-20) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.58.2...v8.59.0) This was a version bump only for visitor-keys to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>vitest-dev/vitest (@​vitest/browser)</summary> ### [`v4.1.5`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.5) [Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.4...v4.1.5) ##### 🚀 Experimental Features - **coverage**: Istanbul to support `instrumenter` option - by [@​BartWaardenburg](https://redirect.github.com/BartWaardenburg) and [@​AriPerkkio](https://redirect.github.com/AriPerkkio) in [#​10119](https://redirect.github.com/vitest-dev/vitest/issues/10119) [<samp>(0e0ff)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0e0ff41c7) ##### 🐞 Bug Fixes - \--project negation excludes browser instances - by [@​felamaslen](https://redirect.github.com/felamaslen) in [#​10131](https://redirect.github.com/vitest-dev/vitest/issues/10131) [<samp>(9423d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9423dc084) - Project color label on html reporter - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10142](https://redirect.github.com/vitest-dev/vitest/issues/10142) [<samp>(596f7)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/596f73986) - Fix `vi.defineHelper` called as object method - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10163](https://redirect.github.com/vitest-dev/vitest/issues/10163) [<samp>(122c2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/122c25b5b) - Alias `agent` reporter to `minimal` - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10157](https://redirect.github.com/vitest-dev/vitest/issues/10157) [<samp>(663b9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/663b99fe3) - Respect diff config options in soft assertions - by [@​Copilot](https://redirect.github.com/Copilot), **sheremet-va** and [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​8696](https://redirect.github.com/vitest-dev/vitest/issues/8696) [<samp>(9787d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9787dedad) - Respect diff config options in soft assertions " - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​8696](https://redirect.github.com/vitest-dev/vitest/issues/8696) [<samp>(7dc6d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7dc6d54fd) - **ast-collect**: Recognize \_*vi\_import* prefix in static test discovery - by [@​Yejneshwar](https://redirect.github.com/Yejneshwar) in [#​10129](https://redirect.github.com/vitest-dev/vitest/issues/10129) [<samp>(32546)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/325463ab2) - **coverage**: Descriptive error message when reports directory is removed during test run - by [@​DaveT1991](https://redirect.github.com/DaveT1991) and [@​AriPerkkio](https://redirect.github.com/AriPerkkio) in [#​10117](https://redirect.github.com/vitest-dev/vitest/issues/10117) [<samp>(14133)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1413382e1) - **snapshot**: Increase default snapshot max output length - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex** in [#​10150](https://redirect.github.com/vitest-dev/vitest/issues/10150) [<samp>(21e66)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/21e66ff63) - **ui**: Fix jsx/tsx syntax highlight - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10152](https://redirect.github.com/vitest-dev/vitest/issues/10152) [<samp>(f1b1f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f1b1f6c7b) - **web-worker**: Support MessagePort objects referenced inside postMessage data - by [@​whitphx](https://redirect.github.com/whitphx) and **Claude Opus 4.6 (1M context)** in [#​9927](https://redirect.github.com/vitest-dev/vitest/issues/9927) and [#​10124](https://redirect.github.com/vitest-dev/vitest/issues/10124) [<samp>(7ad7d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7ad7d39af) - **api**: Make test-specification options writable - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10154](https://redirect.github.com/vitest-dev/vitest/issues/10154) [<samp>(6abd5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6abd557b7) ##### [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.4...v4.1.5) </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:eyJjcmVhdGVkSW5WZXIiOiI0My4xNDEuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE0MS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Cameron Clark <cameron.clark@hey.com> |
||
|
|
245273ef0a |
feat(napi/playground): add optimizeEnums and optimizeConstEnums options (#21815)
## Summary This PR adds `optimizeEnums` and `optimizeConstEnums` options to the playground's transformer configuration, enabling TypeScript enum optimization features that are already available in the transformer. ## Changes - Added `optimize_enums: bool` and `optimize_const_enums: bool` fields to the `OxcTransformerOptions` struct in `napi/playground/src/options.rs` - Updated `apply_transformations` method in `napi/playground/src/lib.rs` to apply these options to `options.typescript.optimize_enums` and `options.typescript.optimize_const_enums` ## Reference Resolves https://github.com/oxc-project/oxc/blob/d1cf22efc2bc9cf9fa82e887c34965d2ce3004c3/napi/playground/src/options.rs#L59 These options enable: - `optimize_enums`: Optimize regular (non-const) enums by inlining their member accesses at usage sites when the member value is statically known - `optimize_const_enums`: Optimize const enums by inlining their values at usage sites and removing the enum declaration |
||
|
|
9fa362eac7 |
perf(napi/parser): do not generate tokens except in tests (#21811)
#19885 added support for tokens in `oxc-parser`, but only via raw transfer and behind an undocumented `experimentalTokens` option. It's currently only used in tests for the purpose of conformance testing. This slowed down `oxc-parser` a little (very little as the difference in execution time on Rust side is dwarfed by the cost of JSON transfer). The worse effect is that it caused a large binary size increase in Rolldown (https://github.com/rolldown/rolldown/issues/9166) because Rolldown re-exports `napi/parser`'s Rust code, which meant that Rolldown now contains 2 versions of Oxc's parser with different `ParserConfig`s, leading to the entire parser being compiled and included in the binary twice. Fix this by introducing a Cargo feature `tokens` on `napi/parser` crate. Only when `tokens` feature is enabled is a `ParserConfig` which generates tokens used. When disabled (the default), the default `ParserConfig` which does not produce tokens is used. Enable the `tokens` feature only in tests. |
||
|
|
a7521cb122 |
refactor(linter/plugins, napi/plugins): use constant for arena alignment from Allocator (#21797)
Refactor. Don't hard-code the minimum alignment of `Arena` chunks in `apps/oxlint` and `napi/parser`. Get the value from a property on `Allocator`. This will avoid this code getting out of sync if the value changes in future. Also rename the vars `BUMP_ALIGN` to `ARENA_ALIGN`, as the arena type is now called `Arena` not `Bump`, and update some comments which were out of date. |
||
|
|
502e804ffa |
perf(ast)!: reduce size of TSTypePredicateName (#21711)
#21653 revealed that `TSTypePredicateName` has an unboxed variant `This`. Before the introduction of `NodeId` fields, this was fine as `TSThisType` contained only a `Span` (8 bytes). But with `NodeId` field added, it's 16 bytes, which makes `TSTypePredicateName` larger too - 24 bytes. Box `TSThisType` in this variant, bringing `TSTypePredicateName` back down to 16 bytes. This also has the side-effect of making `TSTypePredicateName`'s `node_id`, `span`, and `span_mut` methods branchless. |
||
|
|
5651539aba |
perf(ast)!: reduce size of JSXExpression (#21710)
#21653 revealed that `JSXExpression` has an unboxed variant `EmptyExpression`. Before the introduction of `NodeId` fields, this was fine as `JSXEmptyExpression` contained only a `Span` (8 bytes). But with `NodeId` field added, it's 16 bytes, which makes `JSXExpression` larger too - 24 bytes. Box `JSXEmptyExpression` in this variant, bringing `JSXExpression` back down to 16 bytes. This also has the side-effect of making `JSXExpression`'s `node_id`, `span`, and `span_mut` methods branchless. |
||
|
|
c44e28068e |
perf(ast)!: reduce size of ArrayExpressionElement (#21709)
#21653 revealed that `ArrayExpressionElement` has an unboxed variant `Elision`. Before the introduction of `NodeId` fields, this was fine as `Elison` contained only a `Span` (8 bytes). But with `NodeId` field added, it's 16 bytes, which makes `ArrayExpressionElement` larger too - 24 bytes. Box `Elison` in this variant, bringing `ArrayExpressionElement` back down to 16 bytes. This also has the side-effect of making `ArrayExpressionElement`'s `node_id`, `span`, and `span_mut` methods branchless. |
||
|
|
e4cea255b7 |
docs(transform): use the node: namespace in the example (#19998)
Hi, This PR simply updates the documentation example in `napi/transform/README.md` to use the `node:` namespace when importing a Node.js built-in module. As far as I know, the `node:` namespace prefix for built-in modules was introduced in Node.js `14.18.0` and `16.0.0`, so it should work with the current Node.js supported version range. https://github.com/oxc-project/oxc/blob/6245c5629f2ca3bbbfbaffd1400fad06cc23d659/napi/transform/package.json#L87-L89 Also, it appears that the other source files already use it when importing Node.js built-in modules. https://github.com/oxc-project/oxc/blob/6245c5629f2ca3bbbfbaffd1400fad06cc23d659/napi/transform/scripts/patch.js#L1-L2 https://github.com/oxc-project/oxc/blob/6245c5629f2ca3bbbfbaffd1400fad06cc23d659/napi/transform/webcontainer-fallback.cjs#L1-L2 Please let me know if there's anything wrong with this change! |
||
|
|
5e755d14f9 |
chore(transformer, playground): enable enum_eval in semantic for transformer (#21671)
close: https://github.com/oxc-project/oxc/issues/21667 |
||
|
|
d8076c9780 |
chore(deps): update rolldown (#21639)
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/) | |---|---|---|---|---|---| | [rolldown](https://rolldown.rs/) ([source](https://redirect.github.com/rolldown/rolldown/tree/HEAD/packages/rolldown)) | [`1.0.0-rc.16` → `1.0.0-rc.17`](https://renovatebot.com/diffs/npm/rolldown/1.0.0-rc.16/1.0.0-rc.17) |  |  |  |  | | [tsdown](http://tsdown.dev/) ([source](https://redirect.github.com/rolldown/tsdown)) | [`0.21.9` → `0.21.10`](https://renovatebot.com/diffs/npm/tsdown/0.21.9/0.21.10) |  |  |  |  | --- ### Release Notes <details> <summary>rolldown/rolldown (rolldown)</summary> ### [`v1.0.0-rc.17`](https://redirect.github.com/rolldown/rolldown/blob/HEAD/CHANGELOG.md#100-rc17---2026-04-22) [Compare Source](https://redirect.github.com/rolldown/rolldown/compare/v1.0.0-rc.16...v1.0.0-rc.17) ##### 🐛 Bug Fixes - link: error on missing export between TS modules ([#​9197](https://redirect.github.com/rolldown/rolldown/issues/9197)) by [@​IWANABETHATGUY](https://redirect.github.com/IWANABETHATGUY) - rolldown\_plugin\_vite\_import\_glob: import path should not be affected by absolute base option ([#​9145](https://redirect.github.com/rolldown/rolldown/issues/9145)) by [@​kermanx](https://redirect.github.com/kermanx) - `this.resolve()` returns null for bare relative paths without importer ([#​9142](https://redirect.github.com/rolldown/rolldown/issues/9142)) by [@​Copilot](https://redirect.github.com/Copilot) - collect destructured bindings in HMR module exports ([#​9146](https://redirect.github.com/rolldown/rolldown/issues/9146)) by [@​h-a-n-a](https://redirect.github.com/h-a-n-a) - esbuild-tests: handle 0.28.0 test cases ([#​9149](https://redirect.github.com/rolldown/rolldown/issues/9149)) by [@​sapphi-red](https://redirect.github.com/sapphi-red) - plugin/copy-module: honor external resolutions from other plugins ([#​9139](https://redirect.github.com/rolldown/rolldown/issues/9139)) by [@​TheAlexLichter](https://redirect.github.com/TheAlexLichter) - allow undefined in sourcesContent type ([#​9136](https://redirect.github.com/rolldown/rolldown/issues/9136)) by [@​jurijzahn8019](https://redirect.github.com/jurijzahn8019) - reduce false positives in chunk optimizer circular dependency detection ([#​9049](https://redirect.github.com/rolldown/rolldown/issues/9049)) by [@​AlonMiz](https://redirect.github.com/AlonMiz) ##### 🚜 Refactor - chunk-optimizer: extract runtime-module placement into rehome\_runtime\_module ([#​9163](https://redirect.github.com/rolldown/rolldown/issues/9163)) by [@​IWANABETHATGUY](https://redirect.github.com/IWANABETHATGUY) ##### 📚 Documentation - add design doc for sort\_modules execution ordering ([#​9169](https://redirect.github.com/rolldown/rolldown/issues/9169)) by [@​IWANABETHATGUY](https://redirect.github.com/IWANABETHATGUY) - add document for `RenderedModule` ([#​9147](https://redirect.github.com/rolldown/rolldown/issues/9147)) by [@​sapphi-red](https://redirect.github.com/sapphi-red) ##### ⚡ Performance - rolldown\_plugin\_vite\_import\_glob: skip self-import earlier using raw path comparison ([#​9193](https://redirect.github.com/rolldown/rolldown/issues/9193)) by [@​shulaoda](https://redirect.github.com/shulaoda) ##### 🧪 Testing - lazy: add `playground/lazy-compilation` ([#​7974](https://redirect.github.com/rolldown/rolldown/issues/7974)) by [@​hyf0](https://redirect.github.com/hyf0) ##### ⚙️ Miscellaneous Tasks - use app token for release PR ([#​9198](https://redirect.github.com/rolldown/rolldown/issues/9198)) by [@​Boshen](https://redirect.github.com/Boshen) - upgrade oxc to 0.127.0 ([#​9194](https://redirect.github.com/rolldown/rolldown/issues/9194)) by [@​Dunqing](https://redirect.github.com/Dunqing) - use oxc security action ([#​9196](https://redirect.github.com/rolldown/rolldown/issues/9196)) by [@​Boshen](https://redirect.github.com/Boshen) - esbuild-tests: remove some tests from ignored list as enum inline is now supported ([#​9184](https://redirect.github.com/rolldown/rolldown/issues/9184)) by [@​sapphi-red](https://redirect.github.com/sapphi-red) - deps: update dependency vite-plus to v0.1.19 ([#​9183](https://redirect.github.com/rolldown/rolldown/issues/9183)) by [@​renovate](https://redirect.github.com/renovate)\[bot] - use vp instead of pnpm in check-wasi-binding-deps ([#​9182](https://redirect.github.com/rolldown/rolldown/issues/9182)) by [@​shulaoda](https://redirect.github.com/shulaoda) - verify wasm32-wasi binding deps match [@​rolldown/browser](https://redirect.github.com/rolldown/browser) before publish ([#​9162](https://redirect.github.com/rolldown/rolldown/issues/9162)) by [@​shulaoda](https://redirect.github.com/shulaoda) - deps: update esbuild for tests to 0.28.0 ([#​9172](https://redirect.github.com/rolldown/rolldown/issues/9172)) by [@​sapphi-red](https://redirect.github.com/sapphi-red) - deps: update rollup submodule for tests to v4.60.2 ([#​9173](https://redirect.github.com/rolldown/rolldown/issues/9173)) by [@​sapphi-red](https://redirect.github.com/sapphi-red) - deps: update test262 submodule for tests ([#​9174](https://redirect.github.com/rolldown/rolldown/issues/9174)) by [@​sapphi-red](https://redirect.github.com/sapphi-red) - sort\_modules: fix stale async-entry sort key comment ([#​9170](https://redirect.github.com/rolldown/rolldown/issues/9170)) by [@​IWANABETHATGUY](https://redirect.github.com/IWANABETHATGUY) - deps: update npm packages ([#​9157](https://redirect.github.com/rolldown/rolldown/issues/9157)) by [@​renovate](https://redirect.github.com/renovate)\[bot] - deps: update dependency diff to v9 ([#​9158](https://redirect.github.com/rolldown/rolldown/issues/9158)) by [@​renovate](https://redirect.github.com/renovate)\[bot] - deps: update rust crates ([#​9156](https://redirect.github.com/rolldown/rolldown/issues/9156)) by [@​renovate](https://redirect.github.com/renovate)\[bot] - run Windows CI on PRs labeled with `ci: windows` ([#​9153](https://redirect.github.com/rolldown/rolldown/issues/9153)) by [@​hyf0](https://redirect.github.com/hyf0) - update-test-dependencies: run setup-rust before file changes ([#​9151](https://redirect.github.com/rolldown/rolldown/issues/9151)) by [@​sapphi-red](https://redirect.github.com/sapphi-red) - deps: update dependency rust to v1.95.0 ([#​9140](https://redirect.github.com/rolldown/rolldown/issues/9140)) by [@​renovate](https://redirect.github.com/renovate)\[bot] ##### ❤️ New Contributors - [@​jurijzahn8019](https://redirect.github.com/jurijzahn8019) made their first contribution in [#​9136](https://redirect.github.com/rolldown/rolldown/pull/9136) - [@​AlonMiz](https://redirect.github.com/AlonMiz) made their first contribution in [#​9049](https://redirect.github.com/rolldown/rolldown/pull/9049) </details> <details> <summary>rolldown/tsdown (tsdown)</summary> ### [`v0.21.10`](https://redirect.github.com/rolldown/tsdown/releases/tag/v0.21.10) [Compare Source](https://redirect.github.com/rolldown/tsdown/compare/v0.21.9...v0.21.10) ##### 🚀 Features - Upgrade rolldown - by [@​sxzz](https://redirect.github.com/sxzz) [<samp>(8a449)</samp>](https://redirect.github.com/rolldown/tsdown/commit/8a4498d) ##### [View changes on GitHub](https://redirect.github.com/rolldown/tsdown/compare/v0.21.9...v0.21.10) </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:eyJjcmVhdGVkSW5WZXIiOiI0My4xMzkuNCIsInVwZGF0ZWRJblZlciI6IjQzLjEzOS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> |
||
|
|
161d6b5583 |
release(crates): oxc v0.127.0 (#21572)
### 🐛 Bug Fixes - |
||
|
|
00fc13620d |
fix(codegen): preserve coverage comments before object properties (#21312)
Closes #21302 --------- Co-authored-by: Dunqing <dengqing0821@gmail.com> |
||
|
|
611b3b69ef |
chore(deps): update dependency rust to v1.95.0 (#21509)
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [rust](https://redirect.github.com/rust-lang/rust) | minor | `1.94.1` → `1.95.0` | --- ### Release Notes <details> <summary>rust-lang/rust (rust)</summary> ### [`v1.95.0`](https://redirect.github.com/rust-lang/rust/compare/1.94.1...1.95.0) [Compare Source](https://redirect.github.com/rust-lang/rust/compare/1.94.1...1.95.0) </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:eyJjcmVhdGVkSW5WZXIiOiI0My4xMjMuOCIsInVwZGF0ZWRJblZlciI6IjQzLjEyMy44IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> |
||
|
|
836fe9d51c |
release(crates): oxc v0.126.0 (#21471)
### 💥 BREAKING CHANGES - |
||
|
|
f5deb55ea6 |
feat(napi/transform): expose optimizeConstEnums and optimizeEnums options (#21388)
Surface the TypeScript transformer's `optimize_const_enums` and `optimize_enums` options through the napi bindings so JavaScript consumers can opt into const enum inlining and regular (non-const) enum inlining. Previously both were hardcoded to `false` in the `From<TypeScriptOptions>` conversion, making them unreachable from JS. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
fb6b1b053f |
release(crates): oxc v0.125.0 (#21374)
### 💥 BREAKING CHANGES - |
||
|
|
e7e1aead4c |
feat(transformer/typescript): add optimize_enums option for regular enum inlining (#20539)
This is required in Rolldown to align with `esbuild`, which could inline a regular enum as long as all its enum members can be evaluated. See https://github.com/rolldown/rolldown/pull/8796 ## Summary Depends on #20508. - Add `optimize_enums` option to `TypeScriptOptions` that treats regular enums with all-evaluable members the same as const enums: inlines member accesses and removes non-exported declarations - Regular enums are only removed when no runtime value references remain (e.g., `typeof Foo`, passing as argument) - Includes 14 conformance test fixtures covering basic, string values, binary expressions, cross-member/cross-enum references, merged enums, exported (kept), non-evaluable (kept), template literals, unary expressions, typeof/value-usage/passed-as-argument (kept), and re-exported (kept) ## Test plan - [x] 14 new conformance test fixtures under `optimize-enums/` - [x] `cargo run -p oxc_transform_conformance` passes - [x] `cargo test -p oxc_transformer` passes |
||
|
|
9d617b8fc7 |
chore(deps): update npm packages (#21345)
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/) | |---|---|---|---|---|---| | [@napi-rs/wasm-runtime](https://napi.rs/) ([source](https://redirect.github.com/napi-rs/napi-rs/tree/HEAD/wasm-runtime)) | [`1.1.2` → `1.1.3`](https://renovatebot.com/diffs/npm/@napi-rs%2fwasm-runtime/1.1.2/1.1.3) |  |  |  |  | | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.58.0` → `8.58.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.58.0/8.58.1) |  |  |  |  | | [@typescript-eslint/scope-manager](https://typescript-eslint.io/packages/scope-manager) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/scope-manager)) | [`8.58.0` → `8.58.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fscope-manager/8.58.0/8.58.1) |  |  |  |  | | [@typescript-eslint/visitor-keys](https://typescript-eslint.io) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)) | [`8.58.0` → `8.58.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fvisitor-keys/8.58.0/8.58.1) |  |  |  |  | | [@vitest/browser](https://vitest.dev/guide/browser/) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser)) | [`4.1.2` → `4.1.4`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser/4.1.2/4.1.4) |  |  |  |  | | [@vitest/browser-playwright](https://vitest.dev/config/browser/playwright) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright)) | [`4.1.2` → `4.1.4`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser-playwright/4.1.2/4.1.4) |  |  |  |  | | [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.1.2` → `4.1.4`](https://renovatebot.com/diffs/npm/vitest/4.1.2/4.1.4) |  |  |  |  | --- ### Release Notes <details> <summary>napi-rs/napi-rs (@​napi-rs/wasm-runtime)</summary> ### [`v1.1.3`](https://redirect.github.com/napi-rs/napi-rs/blob/HEAD/wasm-runtime/CHANGELOG.md#113-2026-04-08) [Compare Source](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/wasm-runtime@1.1.2...@napi-rs/wasm-runtime@1.1.3) **Note:** Version bump only for package [@​napi-rs/wasm-runtime](https://redirect.github.com/napi-rs/wasm-runtime) </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v8.58.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8581-2026-04-08) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.58.0...v8.58.1) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.58.1) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/scope-manager)</summary> ### [`v8.58.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8581-2026-04-08) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.58.0...v8.58.1) This was a version bump only for scope-manager to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.58.1) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/visitor-keys)</summary> ### [`v8.58.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/visitor-keys/CHANGELOG.md#8581-2026-04-08) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.58.0...v8.58.1) This was a version bump only for visitor-keys to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.58.1) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> <details> <summary>vitest-dev/vitest (@​vitest/browser)</summary> ### [`v4.1.4`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.4) [Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.3...v4.1.4) ##### 🚀 Experimental Features - **coverage**: - Default to text reporter `skipFull` if agent detected - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10018](https://redirect.github.com/vitest-dev/vitest/issues/10018) [<samp>(53757)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/53757804c) - **experimental**: - Expose `assertion` as a public field - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10095](https://redirect.github.com/vitest-dev/vitest/issues/10095) [<samp>(a120e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a120e3ab8) - Support aria snapshot - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa), **Claude Opus 4.6 (1M context)**, [@​AriPerkkio](https://redirect.github.com/AriPerkkio), **Codex** and [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​9668](https://redirect.github.com/vitest-dev/vitest/issues/9668) [<samp>(d4fbb)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d4fbb5cc9) - **reporter**: - Add filterMeta option to json reporter - by [@​nami8824](https://redirect.github.com/nami8824) and [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10078](https://redirect.github.com/vitest-dev/vitest/issues/10078) [<samp>(b77de)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b77de968e) ##### 🐞 Bug Fixes - Use "black" foreground for labeled terminal message to ensure contrast - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10076](https://redirect.github.com/vitest-dev/vitest/issues/10076) [<samp>(203f0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/203f07af7) - Make `expect(..., message)` consistent as error message prefix - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex** in [#​10068](https://redirect.github.com/vitest-dev/vitest/issues/10068) [<samp>(a1b5f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a1b5f0f4f) - Do not hoist imports whose names match class properties . - by [@​SunsetFi](https://redirect.github.com/SunsetFi) in [#​10093](https://redirect.github.com/vitest-dev/vitest/issues/10093) and [#​10094](https://redirect.github.com/vitest-dev/vitest/issues/10094) [<samp>(0fc4b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0fc4b47e0) - **browser**: Spread user server options into browser Vite server in project - by [@​GoldStrikeArch](https://redirect.github.com/GoldStrikeArch) in [#​10049](https://redirect.github.com/vitest-dev/vitest/issues/10049) [<samp>(65c9d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/65c9d55eb) ##### [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.3...v4.1.4) ### [`v4.1.3`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.1.3) [Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.2...v4.1.3) ##### 🚀 Experimental Features - Add `experimental.preParse` flag - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10070](https://redirect.github.com/vitest-dev/vitest/issues/10070) [<samp>(78273)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/7827363bd) - Support `browser.locators.exact` option - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10013](https://redirect.github.com/vitest-dev/vitest/issues/10013) [<samp>(48799)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/487990a19) - Add `TestAttachment.bodyEncoding` - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​9969](https://redirect.github.com/vitest-dev/vitest/issues/9969) [<samp>(89ca0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/89ca0e254) - Support custom snapshot matcher - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa), **Claude Sonnet 4.6** and **Codex** in [#​9973](https://redirect.github.com/vitest-dev/vitest/issues/9973) [<samp>(59b0e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/59b0e6411) ##### 🐞 Bug Fixes - Advance fake timers with `expect.poll` interval - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude Sonnet 4.6** in [#​10022](https://redirect.github.com/vitest-dev/vitest/issues/10022) [<samp>(3f5bf)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3f5bfa365) - Add `@vitest/coverage-v8` and `@vitest/coverage-istanbul` as optional dependency - by [@​alan-agius4](https://redirect.github.com/alan-agius4) in [#​10025](https://redirect.github.com/vitest-dev/vitest/issues/10025) [<samp>(146d4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/146d4f0a0) - Fix `defineHelper` for webkit async stack trace + update playwright 1.59.0 - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​10036](https://redirect.github.com/vitest-dev/vitest/issues/10036) [<samp>(5a5fa)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5a5fa49fe) - Fix suite hook throwing errors for unused auto test-scoped fixture - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude Sonnet 4.6** in [#​10035](https://redirect.github.com/vitest-dev/vitest/issues/10035) [<samp>(39865)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/398657e8d) - **expect**: - Remove `JestExtendError.context` from verbose error reporting - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) in [#​9983](https://redirect.github.com/vitest-dev/vitest/issues/9983) [<samp>(66751)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/66751c9e8) - Don't leak "runner" types - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10004](https://redirect.github.com/vitest-dev/vitest/issues/10004) [<samp>(ec204)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/ec2045543) - **snapshot**: - Fix flagging obsolete snapshots for snapshot properties mismatch - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude Sonnet 4.6** in [#​9986](https://redirect.github.com/vitest-dev/vitest/issues/9986) [<samp>(6b869)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6b869156b) - Export custom snapshot matcher helper from `vitest` - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Codex** in [#​10042](https://redirect.github.com/vitest-dev/vitest/issues/10042) [<samp>(691d3)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/691d341fd) - **ui**: - Don't leak vite types - by [@​sheremet-va](https://redirect.github.com/sheremet-va) in [#​10005](https://redirect.github.com/vitest-dev/vitest/issues/10005) [<samp>(fdff1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fdff1bf9a) - **vm**: - Fix external module resolve error with deps optimizer query - by [@​hi-ogawa](https://redirect.github.com/hi-ogawa) and **Claude Sonnet 4.6** in [#​10024](https://redirect.github.com/vitest-dev/vitest/issues/10024) [<samp>(9dbf4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9dbf47786) ##### [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.1.2...v4.1.3) </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:eyJjcmVhdGVkSW5WZXIiOiI0My4xMTAuMiIsInVwZGF0ZWRJblZlciI6IjQzLjExMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> |