Commit Graph

1234 Commits

Author SHA1 Message Date
overlookmotel 2fbc39e501 test(napi/parser): correct nesting of tests (#18193)
Refactor tests. The tests for `ImportDeclaration` and `ImportExpression` had somehow got nested within the tests for `TemplateExpression`. Move them to a better place.
2026-01-18 21:14:16 +00:00
Boshen 4f45a2845a refactor(ast)!: replace TSMappedType.type_parameter with dedicated key and constraint fields (#18185)
## Summary

- Replace `type_parameter: Box<'a, TSTypeParameter<'a>>` with two dedicated fields:
  - `key: BindingIdentifier<'a>` - the parameter name (e.g., `P` in `[P in keyof T]`)
  - `constraint: TSType<'a>` - the constraint type (e.g., `keyof T`)
- Improves type safety by preventing invalid AST states - `TSTypeParameter` contains `const`, `in`, `out`, and `default` fields that are syntactically invalid in mapped types
- Matches TSESTree structure more closely

Closes #15101

## Test plan

- [x] All parser, codegen, semantic, and linter tests pass
- [x] Conformance tests show no regressions
- [x] Semantic snapshots updated to reflect the new structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-01-18 14:49:37 +00:00
Boshen 08da7bd29a refactor(allocator): clean up obsolete bumpalo references (#18172)
## Summary

Now that bumpalo has been inlined into oxc_allocator (#18168), this PR cleans up comments and documentation that still reference bumpalo as an external dependency.

- Update module docs in `bump.rs` and `bumpalo_alloc.rs` to say "originally derived from" instead of "ported from"
- Remove obsolete comments about bumpalo version pinning in `from_raw_parts.rs`
- Update inline comments in `allocator.rs` from "delegates to bumpalo" to "it's a small function"
- Remove outdated TODO about replacing bumpalo in `tracking.rs`
- Update `ARCHITECTURE.md` and parser docs to reference `oxc_allocator` instead of bumpalo
- Clean up bumpalo references in other crates (`oxc_semantic`, `oxc_data_structures`, `apps/oxlint`, `napi/parser`, `tasks/ast_tools`)

## Test plan

- [x] `cargo check -p oxc_allocator` passes
- [x] `cargo test -p oxc_allocator` passes
- [x] Changes are documentation/comment only - no functional changes

🤖 Generated with [Claude Code](https://claude.ai/code)
2026-01-18 08:47:25 +00:00
Boshen 66b8c022ab feat(parser): implement unambiguous module parsing for JS/TS files (#18124)
## Summary

- Implements speculative/unambiguous parsing for `.js`, `.jsx`, `.ts`, and `.tsx` files
- Instead of assuming module or script upfront, parses with `ModuleKind::Unambiguous` and upgrades to module mode when ESM syntax is detected
- ESM indicators: `import`, `export`, `import.meta` (NOT top-level await alone)
- Defers top-level await errors until module type is resolved
- Vue loader upgrades unambiguous scripts to module mode
- Updates linter tests to use explicit ESM extensions (`.mjs`/`.mts`) where needed

## Test plan

- [x] All parser tests pass
- [x] All linter tests pass
- [x] All semantic tests pass
- [x] Coverage conformance tests updated

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-01-17 13:40:28 +00:00
Boshen 08dad63678 feat(span): add sourceType: 'commonjs' support (#18089)
## Summary

- Add `ModuleKind::CommonJS` variant to support CommonJS module type in the parser
- Enable top-level `return` statements (CommonJS files are wrapped in a function)
- Enable top-level `new.target` (allowed in CommonJS function wrapper)
- Add proper errors for `import`/`export` statements in CommonJS
- Add proper errors for `import.meta` in CommonJS

The CommonJS source type can be set via:
- `SourceType::with_commonjs(true)` method
- Babel's `sourceType: "commonjs"` option

Closes #16200

## Test plan

- [x] Added test cases in `tasks/coverage/misc/pass/` for valid CommonJS features
- [x] Added test cases in `tasks/coverage/misc/fail/` for invalid CommonJS usage
- [x] Enabled Babel conformance tests for `sourceType: "commonjs"`
- [x] All existing tests pass

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-01-16 16:08:27 +00:00
Boshen 9135b0b2f3 feat(ast)!: move scope from TSEnumDeclaration to TSEnumBody (#18058)
## Summary

- Move `scope_id: Cell<Option<ScopeId>>` from `TSEnumDeclaration` to `TSEnumBody`
- Since `TSEnumBody` was introduced as a dedicated type in PR #10284, the scope logically belongs on the body rather than on the parent declaration node

Closes #10331

## Test plan

- [x] Unit tests pass (`just test`)
- [x] Conformance tests pass (`just conformance`)
- [x] Updated semantic test snapshots reflect scope now on `TSEnumBody`

🤖 Generated with [Claude Code](https://claude.ai/code)
2026-01-16 13:30:08 +00:00
Peter Wagenet 7a0ca9999b fix(linter/plugins): use correct ScriptKind for tokens (#17185)
When parsing tokens for JS plugins, the TypeScript parser was always using `ScriptKind.TSX`, regardless of file extension. This caused TypeScript to incorrectly parse generic arrow functions like `<T>() => {}` in `.ts` files, creating bogus `JsxText` tokens that overlap with comments.

This PR adds an `is_jsx` flag to `RawTransferMetadata`. Rust side sets the flag depending on source type, and JS side uses that information to pass the correct `ScriptKind` for the file to TypeScript parser.

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: overlookmotel <theoverlookmotel@gmail.com>
2026-01-15 19:06:08 +00:00
Boshen 140cb1f405 release(crates): oxc v0.108.0 (#17920)
### 🚀 Features

- 10426af codegen: Print soft space between inline block comments on the
same line (#17799) (camc314)
- 2261e6e semantic: Improve error message to add `#` for private
identifiers (#17779) (Dunqing)

### 🐛 Bug Fixes

- 7422b7e parser/trivia: Correctly mark whether a block comment is on a
newline (#17754) (camc314)
- c32e8d5 codegen: Wrap `TSAsExpression` in parens when used with
in/instanceof operators (#17752) (camc314)
- 5755b2d semantic: Report duplicate private identifier for static and
instance elements (#17591) (camc314)
- 0600df3 isolated_declarations: Only print jsdoc comments (#17748)
(camc314)
- ef7e014 parser: Preserve `@__NO_SIDE_EFFECTS__` annotation with
parenthesized expressions (#17711) (camc314)
- 59a6228 parser: Detect TS1363 error for type-only imports with mixed
default and named/namespace bindings (#17712) (Copilot)

### ⚡ Performance

- 864f1fa semantic: Mark duplicate class element error reporting as cold
(#17746) (camc314)
- 3a452b8 semantic: Use smallvec for storing reference IDs (#17731)
(camchenry)
- d5979dc minifier: Do not allocate when checking to convert `const` to
`let` (#17730) (camchenry)
- 3f4429c parser: Do not re-allocate TS interface heritage (#17692)
(camchenry)

### 📚 Documentation

- 120a27c minifier: Add prettier-ignore for js-in-md part (#17687)
(leaysgur)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
2026-01-12 17:51:21 +08:00
camc314 6c1f690fe8 chore(napi/transform): remove alpha note in readme (#17828)
I think it makes sense to remove this line so that AI doesn't pick this up, thinking it's still alpha software
2026-01-09 15:32:51 +00:00
renovate 5ac8a3e98a chore(deps): update dependency oxfmt to ^0.22.0 (#17679)
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/) |
|---|---|---|---|---|---|
| [oxfmt](https://oxc.rs) ([source](https://redirect.github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt)) | [`^0.21.0` → `^0.22.0`](https://renovatebot.com/diffs/npm/oxfmt/0.21.0/0.22.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/oxfmt/0.22.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/oxfmt/0.22.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/oxfmt/0.21.0/0.22.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/oxfmt/0.21.0/0.22.0?slim=true) |

---

### Release Notes

<details>
<summary>oxc-project/oxc (oxfmt)</summary>

### [`v0.22.0`](https://redirect.github.com/oxc-project/oxc/blob/HEAD/npm/oxfmt/CHANGELOG.md#0220---2026-01-05)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.21.0...oxfmt_v0.22.0)

##### 💥 BREAKING CHANGES

- [`f7da875`](https://redirect.github.com/oxc-project/oxc/commit/f7da875) oxlint: \[**BREAKING**] Remove oxc\_language\_server binary ([#&#8203;17457](https://redirect.github.com/oxc-project/oxc/issues/17457)) (Boshen)

##### 🚀 Features

- [`8fd4ea9`](https://redirect.github.com/oxc-project/oxc/commit/8fd4ea9) oxfmt: `options.embeddedLanguageFormatting` is now `"auto"` by default ([#&#8203;17649](https://redirect.github.com/oxc-project/oxc/issues/17649)) (leaysgur)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, 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:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2026-01-06 01:39:42 +00:00
Boshen 811b2a753c release(crates): oxc v0.107.0 (#17661)
### 🚀 Features

- 659c23e linter: Init note field boilerplate  (#17589) (Shrey Sudhir)
- 6870b64 parser: Add TS1363 error code (#17609) (Sysix)
- 23680a3 mangler: Skip mangling only in scopes affected by direct eval (#17612) (camc314)
- a7e1643 parser: Add TS2528 error code to duplicate_default_export diagnostic (#17558) (camc314)

### 🐛 Bug Fixes

- 1044116 ecmascript: Mark `new Symbol` as non side-effect free (#17568) (camc314)
- ab5e4ca isolated-declarations: Strip default values from rest parameter binding patterns (#17602) (camc314)
- 68b2e54 minifier: Prevent incorrect ??= transformation when member base is mutated (#17472) (copilot-swe-agent)

### ⚡ Performance

- 6067143 semantic: Remove hash when checking identifier (#17564) (camchenry)
- a28ab3d semantic: Avoid bounds check when checking string literal (#17545) (camc314)
- 04809d1 semantic: Use SIMD for finding backslashes in `check_string_literal` (#17534) (camchenry)
- 49ad2f0 semantic: Mark all diagnostic functions as `#[cold]` (#17487) (camc314)
- ea82b50 transformer: Mark all diagnostic functions as `#[cold]` (#17486) (camc314)
- d968e51 semantic: Mark `checker::check` as `inline(always)` (#17459) (camc314)
2026-01-05 13:45:22 +00:00
Dunqing 26ed46bc02 feat(formatter): add TailwindCSS support for JS/TS files (#16990)
Based on https://github.com/oxc-project/oxc/pull/16826

## Summary

Add experimental Tailwind CSS class sorting support to Oxfmt via integration with `prettier-plugin-tailwindcss`.

This implementation uses a patch-based approach to export necessary functions from `prettier-plugin-tailwindcss`. We've requested better integration support from the Tailwind team at https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/430, and can improve the integration when that's available.

## Features

- ✅ Sorts Tailwind CSS classes in `className` and `class` attributes
- ✅ Sorts classes in custom JSX attributes (configurable)
- ✅ Sorts classes in function calls like `clsx()`, `cn()`, `tw()` (configurable)
- ✅ Supports template literals with expressions
- ✅ Supports Tailwind v3 config files and v4 stylesheets
- ✅ Preserves whitespace and duplicates (configurable)
- ✅ **Fixes [prettier-plugin-tailwindcss#426](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/426)** - Correctly handles strings in nested non-Tailwind call expressions
- ⏳ Non-JS file support (HTML, Vue, Svelte, etc.) - Coming in follow-up PR
- ⏳ Tailwind CSS config migration in `oxfmt --migrate=prettier` - Coming in follow-up PR

## Example Usage

### Basic Usage

Enable Tailwind CSS sorting with default options by setting `experimentalTailwindcss` to an empty object in your `.oxfmtrc.json`:

```json
{
  "experimentalTailwindcss": {}
}
```

### With Configuration Options

```json
{
  "experimentalTailwindcss": {
    "config": "./tailwind.config.js",
    "functions": ["clsx", "cn", "cva", "tw"],
    "attributes": ["myCustomClass"],
    "preserveWhitespace": false,
    "preserveDuplicates": false
  }
}
```

### Configuration Options

All options from `prettier-plugin-tailwindcss` are supported (with `tailwind` prefix removed):

| Option | Type | Description | Default |
|--------|------|-------------|---------|
| `config` | `string` | Path to your Tailwind CSS v3 configuration file. Paths are resolved relative to the Oxfmt configuration file. | `"./tailwind.config.js"` |
| `stylesheet` | `string` | Path to your Tailwind CSS v4 stylesheet. Paths are resolved relative to the Oxfmt configuration file. | `undefined` |
| `functions` | `string[]` | List of custom function names that contain Tailwind CSS classes (e.g., `["clsx", "cn", "cva", "tw"]`). | `[]` |
| `attributes` | `string[]` | List of custom JSX attributes that should be sorted (e.g., `["myCustomClass"]`). Note: `class` and `className` are always sorted by default. | `[]` |
| `preserveWhitespace` | `boolean` | Preserve whitespace around classes. | `false` |
| `preserveDuplicates` | `boolean` | Preserve duplicate classes. | `false` |

## Migration from prettier-plugin-tailwindcss

If you're currently using `prettier-plugin-tailwindcss`, you can migrate to Oxfmt's built-in support:

### Manual Migration (Current)

#### Before (Prettier)

```json
{
  "plugins": ["prettier-plugin-tailwindcss"],
  "tailwindConfig": "./tailwind.config.js",
  "tailwindFunctions": ["clsx", "cn"]
}
```

#### After (Oxfmt)

```json
{
  "experimentalTailwindcss": {
    "config": "./tailwind.config.js",
    "functions": ["clsx", "cn"]
  }
}
```

**Key differences:**
- Remove `tailwind` prefix from all option names (e.g., `tailwindConfig` → `config`)
- No need to install `prettier-plugin-tailwindcss` separately, it is bundled within Oxfmt
### Automated Migration (Follow-up PR)

Tailwind CSS configuration migration will be added to the existing `oxfmt --migrate=prettier` command in a follow-up PR. This will automatically convert your `prettier-plugin-tailwindcss` settings from `.prettierrc` to `.oxfmtrc.json`.

## Implementation Details

### Technical Approach

- Uses `pnpm patch` to export necessary functions from `prettier-plugin-tailwindcss`
- Implements Rust-side detection for Tailwind contexts (JSX attributes, function calls, template literals)
- Passes class strings to the JS plugin for sorting via external callback
- Optimized context tracking to avoid repeated AST traversal

### Improvements Over prettier-plugin-tailwindcss

- **Context-based quasi position tracking** ([tailwindcss.rs:273-276](https://github.com/oxc-project/oxc/blob/main/crates/oxc_formatter/src/utils/tailwindcss.rs#L273-L276)) - Stores template literal position in context stack instead of traversing AST, improving performance
- **Fixes [issue #426](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/426)** - Correctly handles strings in nested non-Tailwind call expressions (e.g., `value.includes("\n")` no longer gets corrupted)
- **Comprehensive edge case testing** - Added 58 tests covering edge cases, nested scenarios, error handling, and performance

## Changes

- Changed `experimentalTailwindcss` option from `boolean` to `TailwindcssOptions` object
- Added all configuration options from `prettier-plugin-tailwindcss` (without `tailwind` prefix)
- Exported necessary functions from `prettier-plugin-tailwindcss` via patch
- Added comprehensive test suite with 58 tests
- Improved documentation for all configuration options

## Test Plan

- [x] `pnpm test` passes (58 tests)
- [x] `cargo clippy` passes
- [x] `just fmt` passes
- [x] Basic Tailwind class sorting works with `class` and `className` attributes
- [x] `attributes` option sorts custom JSX attributes
- [x] `functions` option sorts string arguments in function calls (e.g., `clsx()`, `cn()`)
- [x] Template literals with expressions handle whitespace correctly
- [x] Edge cases: empty strings, Unicode, emoji, special characters
- [x] Nested scenarios: deeply nested template literals, function calls
- [x] Strings in nested non-Tailwind calls are preserved (fixes [#426](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/426))
- [x] Test in https://github.com/tailwindlabs/headlessui and https://github.com/dubinc/dub

## Follow-up Work

- **Non-JS file support** - HTML, Vue, Svelte, etc. by enabling original plugin when `experimentalTailwindcss` is set
- **Migration support** - Add Tailwind CSS config migration to existing `oxfmt --migrate=prettier` command
- **Better integration** - Improve when https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/430 is resolved

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-01-05 10:07:07 +00:00
Sysix e8e42ebc9c chore(all): enable tsconfig noUnusedLocals compiler option (#17541)
Unused local variables did not get reported by `@typescript-eslint/no-unused-vars`.
Added `noUnusedLocals` check for every tsconfig, so `pnpm lint` will report them.
Example of failed CI: https://github.com/oxc-project/oxc/actions/runs/20626453016/job/59237769046?pr=17541
2025-12-31 20:31:35 +00:00
renovate 3741b8171c chore(deps): update napi (#17481)
This PR contains the following updates:

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

---

### Release Notes

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

### [`v3.5.1`](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.5.0...@napi-rs/cli@3.5.1)

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

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), 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:eyJjcmVhdGVkSW5WZXIiOiI0Mi41OS4wIiwidXBkYXRlZEluVmVyIjoiNDIuNjYuMTQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->
2025-12-31 12:52:40 +00:00
Boshen 9ec93401a3 release(crates): oxc v0.106.0 (#17447) 2025-12-29 17:16:30 +08:00
Boshen a7f385237f build(napi): Align NAPI targets to 20 platforms across all packages (#17203) 2025-12-24 15:36:45 +08:00
Boshen e031056b2f feat(codegen): add sourcemap feature flag (#17305)
Oxlint uses `oxc_codegen` for fixes, but do not require sourcemap.
2025-12-23 10:28:49 +00:00
sapphi-red 8e4409a478 feat(minifier): add invalid_import_side_effects option (#17300)
Added a new option (`invalid_import_side_effects`) to disable #16797 as it requires a new assumptions.

refs https://github.com/rolldown/rolldown/pull/7512#issuecomment-3682642929
2025-12-23 09:49:53 +00:00
renovate 6cf7173c29 chore(deps): update dependency oxfmt to ^0.20.0 (#17263)
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/) |
|---|---|---|---|---|---|
| [oxfmt](https://oxc.rs) ([source](https://redirect.github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt)) | [`^0.19.0` -> `^0.20.0`](https://renovatebot.com/diffs/npm/oxfmt/0.19.0/0.20.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/oxfmt/0.20.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/oxfmt/0.20.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/oxfmt/0.19.0/0.20.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/oxfmt/0.19.0/0.20.0?slim=true) |

---

### Release Notes

<details>
<summary>oxc-project/oxc (oxfmt)</summary>

### [`v0.20.0`](https://redirect.github.com/oxc-project/oxc/blob/HEAD/npm/oxfmt/CHANGELOG.md#0200---2025-12-22)

[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxfmt_v0.19.0...oxfmt_v0.20.0)

##### 🚀 Features

- [`97a02d1`](https://redirect.github.com/oxc-project/oxc/commit/97a02d1) oxfmt: Add `insertFinalNewline` option ([#&#8203;17251](https://redirect.github.com/oxc-project/oxc/issues/17251)) (leaysgur)

</details>

---

### Configuration

📅 **Schedule**: 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:eyJjcmVhdGVkSW5WZXIiOiI0Mi41OS4wIiwidXBkYXRlZEluVmVyIjoiNDIuNTkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2025-12-22 12:52:43 +00:00
camc314 3984750c69 refactor(all)!: remove binding pattern wierdness (#15925)
fixes #11489

Note, in quite a few places i changed the span we report on to look something like this, the only reason for this is to reduce the diff in some of the snapshots
```
decl.type_annotation.as_ref().map_or_else(
                        || decl.id.span(),
                        |type_annotation| decl.id.span().merge(type_annotation.span()),
                    ),
```
2025-12-22 10:04:20 +00:00
Boshen 06370495a0 release(crates): oxc v0.105.0 (#17259) 2025-12-22 17:32:08 +08:00
overlookmotel 5aefb84daa perf(linter/plugins): reduce size of walker code (#17176)
By hoisting `let enter;` up out of the the `if` block, minifier is able to convert the `if` statement into a `&&` expression, resulting in tighter minified output.

This optimization is only visible in the bundled output, as that's where we do more aggressive minification.
2025-12-20 13:59:13 +00:00
overlookmotel 19566641dc refactor(linter/plugins, parser/napi): add JSDoc comments to generated code (#17175)
Just add JSDoc comments to some generated code.
2025-12-20 13:59:13 +00:00
overlookmotel 24a8d9e17e refactor(linter/plugins, parser/napi): generate type IDs maps as variants (#17174)
Pure refactor. Generate the JS files containing `NODE_TYPE_IDS_MAP` as variants of a single source code file, instead of constructing to two different versions for parser and linter manually.

This makes changes in further PRs to come easier to implement.
2025-12-20 13:59:13 +00:00
renovate[bot] 86298e8234 chore(deps): update dependency oxfmt to ^0.19.0 (#16602) 2025-12-19 12:32:14 +08:00
Boshen c90ab786d0 release(crates): oxc v0.104.0 (#17096)
### 🚀 Features

- d209c21 allocator: Add cap to FixedSizeAllocatorPool and block when
exhausted (#17023) (Cameron)
- fb2af91 allocator: Add bitset utils (#17042) (zhaoting zhou)
- c16082c tasks/compat_data: Integrate `node-compat-table` (#16831)
(Boshen)
- 5586823 span: Extract TS declaration file check to its own function
(#17037) (camchenry)
- 3d2b492 minifier: Fold iife arrow functions in call expressions
(#16477) (Armano)
- 67e9f9e codegen: Keep comments on the export specifiers (#16943)
(夕舞八弦)
- cb515fa parser: Improve error message for `yield` as identifier usage
(#16950) (sapphi-red)
- dcc856b parser: Add help for `new_dynamic_import` error (#16949)
(sapphi-red)
- c3c79f8 parser: Improve import attribute value error message (#16948)
(sapphi-red)
- 291b57b ast_tools: Generate TS declaration files for deserializer and
walk files (#16912) (camc314)
- 74eae13 minifier: Remove unused import specifiers (#16797) (camc314)

### 🐛 Bug Fixes

- fb9e193 linter: OOM problems with custom plugins (#17082)
(overlookmotel)
- e59132b parser/napi: Fix lazy deser (#17069) (overlookmotel)
- a92faf0 ast_tools: Support `u128` in `assert_layouts` generator
(#17050) (overlookmotel)
- 47b4c2f minifier/docs: Correct hyperlink path in OPTIMIZATIONS.md
(#16986) (GRK)
- 3002649 transformer/typescript: Remove unused import equals
declaration (#16776) (Dunqing)
- 5a2af88 regular_expression: Correct named capture group reference
error (#16952) (sapphi-red)

### ⚡ Performance

- b657bb6 allocator: Reduce time `Mutex` lock is held in
`FixedSizeAllocatorPool::get` (#17079) (overlookmotel)
- 1f3b19b ast: `#[ast]` macro use `#[repr(transparent)]` for
single-field structs (#17052) (overlookmotel)
- 225f229 parser: Use SmallVec for duplicate default export detection
(#16801) (camc314)

### 📚 Documentation

- a9c419f traverse: Update safety comments (#16944) (overlookmotel)

Co-authored-by: overlookmotel <557937+overlookmotel@users.noreply.github.com>
2025-12-19 02:14:06 +00:00
overlookmotel d1ce274d39 test(estree): update estree-conformance submodule (#17066)
Bump `estree-conformance` and `test262` submodules.

`estree-conformance` submodule now contains snapshots for tokens conformance testing: https://github.com/oxc-project/estree-conformance/pull/131 & https://github.com/oxc-project/estree-conformance/pull/134
2025-12-18 16:03:24 +00:00
overlookmotel e59132b6c0 fix(parser/napi): fix lazy deser (#17069)
Lazy deserialization in `oxc-parser` was broken by #16957. Fix it.
2025-12-18 15:48:00 +00:00
overlookmotel a92faf08e8 fix(ast_tools): support u128 in assert_layouts generator (#17050)
Previously `u128` was not supported in `assert_layouts` generator, because Rust changed the alignment of `u128` from 8 to 16 - and therefore the alignment depended on Rust version.

That change happened some time ago now, and all Rust versions above our MSRV have `u128` with alignment of 16. So we can now support `u128` (and also `i128`, `NonZeroU128`, `NonZeroI128`).

Also support `u128` in `raw_transfer` and `raw_transfer_lazy` generators.

This will help with making lexer tokens serializable (#17025), since `Token` contains a `u128`.
2025-12-18 11:58:03 +00:00
camc314 5d211a8c69 refactor(napi/parser): move generated JS into src-js (#16957)
moves the generated code into src-js to keep the same pattern as oxlint
2025-12-17 11:43:42 +00:00
Boshen aa9f46f6fa chore(js): remove tsc from package scripts as we use oxlint --type-check (#16985) 2025-12-17 16:18:14 +08:00
Boshen c8281dd0bb chore(pnpm): move workspace devDependencies to used packages (#16982)
To ensure monorepo dependencies are only visible to where they are used.
2025-12-17 15:09:08 +08:00
Boshen 1d680de87e chore(pnpm): remove tasks/e2e workspace (#16881)
I thought making it a separate would be easier to manage,
but it's actually not.

Previous setup was also downloading packages from npm on every CI run.
2025-12-16 14:03:25 +00:00
camc314 4cbedc9437 fix(playground): pass transform target to minifier (#16910)
The playground minifier was not respecting the transform target option, causing ES features like optional chaining to be used even when targeting older browsers that do not support them.

Closes #16889
2025-12-16 11:49:07 +00:00
camc314 291b57bfb2 feat(ast_tools): generate TS declaration files for deserializer and walk files (#16912)
this fixes some ts-expect-errors in oxlint by generating declaration files.

We could also consider using oxc_isolated_declarations to generate these
2025-12-15 20:50:16 +00:00
Boshen 6fca2f7f60 chore(infra): use oxfmt for all files, remove dprint (#16599)
Toml formatting is missing but there's only a few toml files, can wait
for oxfmt plugins.

- [x] Something is slow, can't figure out why, need #16607
2025-12-15 12:06:24 +00:00
Boshen e6ad960231 release(crates): oxc v0.103.0 (#16887) 2025-12-15 18:17:19 +08:00
Boshen 3f5d6b7529 chore(rust): cargo-shear v1.9.0 (#16800)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-12-14 00:46:46 +08:00
camc314 af0f2af93f chore(lint): enable ban-ts-comment rule and fix ts-ignore usages (#16799)
follow on from https://github.com/oxc-project/oxc/pull/16796
2025-12-13 16:19:48 +00:00
camc314 2acd66ed42 style(all): enable eslint/curly lint rule (#16753)
built on https://github.com/oxc-project/oxc/pull/16749, we can use the linter to be consistent here
2025-12-11 14:49:48 +00:00
leaysgur afd6c44cd7 feat(oxfmt): Support quoteProps: consistent in Oxfmtrc (#16721)
Follow up #16677, fixes #16247.
2025-12-11 02:03:49 +00:00
renovate 211afcff5f chore(deps): update npm packages (#15994)
> **Note:** This PR body was truncated due to platform limits.

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://redirect.github.com/napi-rs/napi-rs) ([source](https://redirect.github.com/napi-rs/napi-rs/tree/HEAD/wasi-runtime)) | [`1.0.7` -> `1.1.0`](https://renovatebot.com/diffs/npm/@napi-rs%2fwasm-runtime/1.0.7/1.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@napi-rs%2fwasm-runtime/1.1.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@napi-rs%2fwasm-runtime/1.1.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@napi-rs%2fwasm-runtime/1.0.7/1.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@napi-rs%2fwasm-runtime/1.0.7/1.1.0?slim=true) |
| [@nestjs/common](https://nestjs.com) ([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/common)) | [`11.1.6` -> `11.1.9`](https://renovatebot.com/diffs/npm/@nestjs%2fcommon/11.1.6/11.1.9) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcommon/11.1.9?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcommon/11.1.9?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcommon/11.1.6/11.1.9?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcommon/11.1.6/11.1.9?slim=true) |
| [@nestjs/core](https://nestjs.com) ([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/core)) | [`11.1.6` -> `11.1.9`](https://renovatebot.com/diffs/npm/@nestjs%2fcore/11.1.6/11.1.9) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcore/11.1.9?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcore/11.1.9?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcore/11.1.6/11.1.9?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcore/11.1.6/11.1.9?slim=true) |
| [@nestjs/platform-express](https://nestjs.com) ([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/platform-express)) | [`11.1.6` -> `11.1.9`](https://renovatebot.com/diffs/npm/@nestjs%2fplatform-express/11.1.6/11.1.9) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fplatform-express/11.1.9?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fplatform-express/11.1.9?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fplatform-express/11.1.6/11.1.9?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fplatform-express/11.1.6/11.1.9?slim=true) |
| [@nestjs/testing](https://nestjs.com) ([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/testing)) | [`11.1.6` -> `11.1.9`](https://renovatebot.com/diffs/npm/@nestjs%2ftesting/11.1.6/11.1.9) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2ftesting/11.1.9?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2ftesting/11.1.9?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2ftesting/11.1.6/11.1.9?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2ftesting/11.1.6/11.1.9?slim=true) |
| [@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`24.9.1` -> `24.10.1`](https://renovatebot.com/diffs/npm/@types%2fnode/24.9.1/24.10.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/24.10.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/24.10.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/24.9.1/24.10.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/24.9.1/24.10.1?slim=true) |
| [@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.46.2` -> `8.48.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fscope-manager/8.46.2/8.48.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fscope-manager/8.48.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2fscope-manager/8.48.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2fscope-manager/8.46.2/8.48.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fscope-manager/8.46.2/8.48.1?slim=true) |
| [@typescript-eslint/typescript-estree](https://typescript-eslint.io/packages/typescript-estree) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-estree)) | [`8.47.0` -> `8.48.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2ftypescript-estree/8.47.0/8.48.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2ftypescript-estree/8.48.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2ftypescript-estree/8.48.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2ftypescript-estree/8.47.0/8.48.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2ftypescript-estree/8.47.0/8.48.1?slim=true) |
| [@typescript-eslint/visitor-keys](https://typescript-eslint.io) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/visitor-keys)) | [`8.47.0` -> `8.48.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fvisitor-keys/8.47.0/8.48.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fvisitor-keys/8.48.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2fvisitor-keys/8.48.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2fvisitor-keys/8.47.0/8.48.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fvisitor-keys/8.47.0/8.48.1?slim=true) |
| [@vitest/browser](https://redirect.github.com/vitest-dev/vitest/tree/main/packages/browser#readme) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser)) | [`4.0.6` -> `4.0.15`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser/4.0.6/4.0.15) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@vitest%2fbrowser/4.0.15?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@vitest%2fbrowser/4.0.15?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@vitest%2fbrowser/4.0.6/4.0.15?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@vitest%2fbrowser/4.0.6/4.0.15?slim=true) |
| [@vitest/browser-playwright](https://vitest.dev/config/browser/playwright) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/browser-playwright)) | [`4.0.6` -> `4.0.15`](https://renovatebot.com/diffs/npm/@vitest%2fbrowser-playwright/4.0.6/4.0.15) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@vitest%2fbrowser-playwright/4.0.15?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@vitest%2fbrowser-playwright/4.0.15?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@vitest%2fbrowser-playwright/4.0.6/4.0.15?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@vitest%2fbrowser-playwright/4.0.6/4.0.15?slim=true) |
| [@vscode/vsce](https://code.visualstudio.com) ([source](https://redirect.github.com/Microsoft/vsce)) | [`3.6.2` -> `3.7.1`](https://renovatebot.com/diffs/npm/@vscode%2fvsce/3.6.2/3.7.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@vscode%2fvsce/3.7.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@vscode%2fvsce/3.7.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@vscode%2fvsce/3.6.2/3.7.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@vscode%2fvsce/3.6.2/3.7.1?slim=true) |
| [alpinejs](https://alpinejs.dev) ([source](https://redirect.github.com/alpinejs/alpine/tree/HEAD/packages/alpinejs)) | [`3.15.0` -> `3.15.2`](https://renovatebot.com/diffs/npm/alpinejs/3.15.0/3.15.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/alpinejs/3.15.2?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/alpinejs/3.15.2?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/alpinejs/3.15.0/3.15.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/alpinejs/3.15.0/3.15.2?slim=true) |
| [antd](https://ant.design) ([source](https://redirect.github.com/ant-design/ant-design)) | [`6.0.0` -> `6.0.1`](https://renovatebot.com/diffs/npm/antd/6.0.0/6.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/antd/6.0.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/antd/6.0.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/antd/6.0.0/6.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/antd/6.0.0/6.0.1?slim=true) |
| [axios](https://axios-http.com) ([source](https://redirect.github.com/axios/axios)) | [`1.12.2` -> `1.13.2`](https://renovatebot.com/diffs/npm/axios/1.12.2/1.13.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/axios/1.13.2?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/axios/1.13.2?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/axios/1.12.2/1.13.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/axios/1.12.2/1.13.2?slim=true) |
| [dayjs](https://day.js.org) ([source](https://redirect.github.com/iamkun/dayjs)) | [`1.11.18` -> `1.11.19`](https://renovatebot.com/diffs/npm/dayjs/1.11.18/1.11.19) | ![age](https://developer.mend.io/api/mc/badges/age/npm/dayjs/1.11.19?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/dayjs/1.11.19?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/dayjs/1.11.18/1.11.19?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/dayjs/1.11.18/1.11.19?slim=true) |
| [emnapi](https://redirect.github.com/toyobayashi/emnapi) | [`1.6.0` -> `1.7.1`](https://renovatebot.com/diffs/npm/emnapi/1.6.0/1.7.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/emnapi/1.7.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/emnapi/1.7.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/emnapi/1.6.0/1.7.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/emnapi/1.6.0/1.7.1?slim=true) |
| [es-toolkit](https://es-toolkit.dev) ([source](https://redirect.github.com/toss/es-toolkit)) | [`1.40.0` -> `1.42.0`](https://renovatebot.com/diffs/npm/es-toolkit/1.40.0/1.42.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/es-toolkit/1.42.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/es-toolkit/1.42.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/es-toolkit/1.40.0/1.42.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/es-toolkit/1.40.0/1.42.0?slim=true) |
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`^0.25.0` -> `^0.27.0`](https://renovatebot.com/diffs/npm/esbuild/0.25.12/0.27.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.27.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.27.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.25.12/0.27.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.25.12/0.27.1?slim=true) |
| [execa](https://redirect.github.com/sindresorhus/execa) | [`9.6.0` -> `9.6.1`](https://renovatebot.com/diffs/npm/execa/9.6.0/9.6.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/execa/9.6.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/execa/9.6.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/execa/9.6.0/9.6.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/execa/9.6.0/9.6.1?slim=true) |
| [happy-dom](https://redirect.github.com/capricorn86/happy-dom) | [`20.0.7` -> `20.0.11`](https://renovatebot.com/diffs/npm/happy-dom/20.0.7/20.0.11) | ![age](https://developer.mend.io/api/mc/badges/age/npm/happy-dom/20.0.11?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/happy-dom/20.0.11?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/happy-dom/20.0.7/20.0.11?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/happy-dom/20.0.7/20.0.11?slim=true) |
| [memfs](https://redirect.github.com/streamich/memfs) | [`4.49.0` -> `4.51.1`](https://renovatebot.com/diffs/npm/memfs/4.49.0/4.51.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/memfs/4.51.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/memfs/4.51.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/memfs/4.49.0/4.51.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/memfs/4.49.0/4.51.1?slim=true) |
| [motion](https://redirect.github.com/motiondivision/motion) | [`12.23.24` -> `12.23.25`](https://renovatebot.com/diffs/npm/motion/12.23.24/12.23.25) | ![age](https://developer.mend.io/api/mc/badges/age/npm/motion/12.23.25?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/motion/12.23.25?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/motion/12.23.24/12.23.25?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/motion/12.23.24/12.23.25?slim=true) |
| [ovsx](https://open-vsx.org) ([source](https://redirect.github.com/eclipse/openvsx/tree/HEAD/cli)) | [`0.10.6` -> `0.10.7`](https://renovatebot.com/diffs/npm/ovsx/0.10.6/0.10.7) | ![age](https://developer.mend.io/api/mc/badges/age/npm/ovsx/0.10.7?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/ovsx/0.10.7?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/ovsx/0.10.6/0.10.7?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/ovsx/0.10.6/0.10.7?slim=true) |
| [playwright](https://playwright.dev) ([source](https://redirect.github.com/microsoft/playwright)) | [`1.56.1` -> `1.57.0`](https://renovatebot.com/diffs/npm/playwright/1.56.1/1.57.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/playwright/1.57.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/playwright/1.57.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/playwright/1.56.1/1.57.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/playwright/1.56.1/1.57.0?slim=true) |
| [pnpm](https://pnpm.io) ([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm)) | [`10.20.0` -> `10.24.0`](https://renovatebot.com/diffs/npm/pnpm/10.20.0/10.24.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/10.24.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/pnpm/10.24.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/pnpm/10.20.0/10.24.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/10.20.0/10.24.0?slim=true) |
| [preact](https://preactjs.com) ([source](https://redirect.github.com/preactjs/preact)) | [`10.27.2` -> `10.28.0`](https://renovatebot.com/diffs/npm/preact/10.27.2/10.28.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/preact/10.28.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/preact/10.28.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/preact/10.27.2/10.28.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/preact/10.27.2/10.28.0?slim=true) |
| [react](https://react.dev/) ([source](https://redirect.github.com/facebook/react/tree/HEAD/packages/react)) | [`19.2.0` -> `19.2.1`](https://renovatebot.com/diffs/npm/react/19.2.0/19.2.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/react/19.2.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/react/19.2.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/react/19.2.0/19.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react/19.2.0/19.2.1?slim=true) |
| [react-dom](https://react.dev/) ([source](https://redirect.github.com/facebook/react/tree/HEAD/packages/react-dom)) | [`19.2.0` -> `19.2.1`](https://renovatebot.com/diffs/npm/react-dom/19.2.0/19.2.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/react-dom/19.2.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/react-dom/19.2.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/react-dom/19.2.0/19.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-dom/19.2.0/19.2.1?slim=true) |
| [solid-js](https://solidjs.com) ([source](https://redirect.github.com/solidjs/solid)) | [`1.9.9` -> `1.9.10`](https://renovatebot.com/diffs/npm/solid-js/1.9.9/1.9.10) | ![age](https://developer.mend.io/api/mc/badges/age/npm/solid-js/1.9.10?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/solid-js/1.9.10?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/solid-js/1.9.9/1.9.10?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/solid-js/1.9.9/1.9.10?slim=true) |
| [terser](https://terser.org) ([source](https://redirect.github.com/terser/terser)) | [`5.44.0` -> `5.44.1`](https://renovatebot.com/diffs/npm/terser/5.44.0/5.44.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/terser/5.44.1?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/terser/5.44.1?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/terser/5.44.0/5.44.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/terser/5.44.0/5.44.1?slim=true) |
| [type-fest](https://redirect.github.com/sindresorhus/type-fest) | [`5.2.0` -> `5.3.0`](https://renovatebot.com/diffs/npm/type-fest/5.2.0/5.3.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/type-fest/5.3.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/type-fest/5.3.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/type-fest/5.2.0/5.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/type-fest/5.2.0/5.3.0?slim=true) |
| [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.0.1` -> `4.0.15`](https://renovatebot.com/diffs/npm/vitest/4.0.1/4.0.15) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/4.0.15?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/vitest/4.0.15?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/vitest/4.0.1/4.0.15?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/4.0.1/4.0.15?slim=true) |
| [vitest](https://vitest.dev) ([source](https://redirect.github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | [`4.0.10` -> `4.0.15`](https://renovatebot.com/diffs/npm/vitest/4.0.10/4.0.15) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vitest/4.0.15?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/vitest/4.0.15?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/vitest/4.0.10/4.0.15?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitest/4.0.10/4.0.15?slim=true) |
| [vue](https://redirect.github.com/vuejs/core/tree/main/packages/vue#readme) ([source](https://redirect.github.com/vuejs/core)) | [`3.5.22` -> `3.5.25`](https://renovatebot.com/diffs/npm/vue/3.5.22/3.5.25) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vue/3.5.25?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/vue/3.5.25?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/vue/3.5.22/3.5.25?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vue/3.5.22/3.5.25?slim=true) |

---

### Release Notes

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

### [`v1.1.0`](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/wasm-runtime@1.0.7...@napi-rs/wasm-runtime@1.1.0)

[Compare Source](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/wasm-runtime@1.0.7...@napi-rs/wasm-runtime@1.1.0)

</details>

<details>
<summary>nestjs/nest (@&#8203;nestjs/common)</summary>

### [`v11.1.9`](https://redirect.github.com/nestjs/nest/releases/tag/v11.1.9)

[Compare Source](https://redirect.github.com/nestjs/nest/compare/v11.1.8...v11.1.9)

##### v11.1.9 (2025-11-14)

##### Bug fixes

- `core`
  - [#&#8203;15865](https://redirect.github.com/nestjs/nest/pull/15865) fix(core): make get() throw for implicitly request-scoped trees ([@&#8203;JoeNutt](https://redirect.github.com/JoeNutt))

##### Enhancements

- `common`
  - [#&#8203;15863](https://redirect.github.com/nestjs/nest/pull/15863) feat(common): add method options to [@&#8203;sse](https://redirect.github.com/sse) decorator ([@&#8203;TomerSteinberg](https://redirect.github.com/TomerSteinberg))

##### Dependencies

- `platform-fastify`
  - [#&#8203;15899](https://redirect.github.com/nestjs/nest/pull/15899) chore(deps): bump fastify from 5.6.1 to 5.6.2 ([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))

##### Committers: 4

- Rami ([@&#8203;JoeNutt](https://redirect.github.com/JoeNutt))
- Rhynel Algopera ([@&#8203;dev-rhynel](https://redirect.github.com/dev-rhynel))
- Tomer Steinberg ([@&#8203;TomerSteinberg](https://redirect.github.com/TomerSteinberg))
- WuMingDao ([@&#8203;WuMingDao](https://redirect.github.com/WuMingDao))

### [`v11.1.8`](https://redirect.github.com/nestjs/nest/compare/v11.1.7...68cd54594972011663e19123c3f620e20baea53a)

[Compare Source](https://redirect.github.com/nestjs/nest/compare/v11.1.7...v11.1.8)

### [`v11.1.7`](https://redirect.github.com/nestjs/nest/compare/v11.1.6...ee1b3475551e9173b51381211f058298be504a6a)

[Compare Source](https://redirect.github.com/nestjs/nest/compare/v11.1.6...v11.1.7)

</details>

<details>
<summary>typescript-eslint/typescript-eslint (@&#8203;typescript-eslint/scope-manager)</summary>

### [`v8.48.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8481-2025-12-02)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.48.0...v8.48.1)

This was a version bump only for scope-manager to align it with other projects, there were no code changes.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.48.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8480-2025-11-24)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.47.0...v8.48.0)

##### 🚀 Features

- **eslint-plugin:** \[no-redundant-type-constituents] use assignability checking for redundancy checks ([#&#8203;10744](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/10744))

##### 🩹 Fixes

- **scope-manager:** change unhelpful `aaa` error message and change `analyze` to expects `Program` ([#&#8203;11747](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11747))

##### ❤️ Thank You

- Josh Goldberg
- mdm317 [@&#8203;gen-ip-1](https://redirect.github.com/gen-ip-1)
- Younsang Na [@&#8203;nayounsang](https://redirect.github.com/nayounsang)

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.47.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8470-2025-11-17)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.46.4...v8.47.0)

This was a version bump only for scope-manager to align it with other projects, there were no code changes.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.46.4`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8464-2025-11-10)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.46.3...v8.46.4)

This was a version bump only for scope-manager to align it with other projects, there were no code changes.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.46.3`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/scope-manager/CHANGELOG.md#8463-2025-11-03)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.46.2...v8.46.3)

This was a version bump only for scope-manager to align it with other projects, there were no code changes.

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 (@&#8203;typescript-eslint/typescript-estree)</summary>

### [`v8.48.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-estree/CHANGELOG.md#8481-2025-12-02)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.48.0...v8.48.1)

This was a version bump only for typescript-estree to align it with other projects, there were no code changes.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.48.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-estree/CHANGELOG.md#8480-2025-11-24)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.47.0...v8.48.0)

##### 🚀 Features

- **typescript-estree:** replace fast-glob with tinyglobby ([#&#8203;11740](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11740))
- **eslint-plugin:** \[no-redundant-type-constituents] use assignability checking for redundancy checks ([#&#8203;10744](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/10744))
- **typescript-estree:** gate all errors behind allowInvalidAST ([#&#8203;11693](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11693))

##### 🩹 Fixes

- **typescript-estree:** disallow binding patterns in parameter properties ([#&#8203;11760](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11760))
- **typescript-estree:** infers singleRun as true for project service ([#&#8203;11327](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11327))

##### ❤️ Thank You

- Ben McCann [@&#8203;benmccann](https://redirect.github.com/benmccann)
- Dima Barabash [@&#8203;dbarabashh](https://redirect.github.com/dbarabashh)
- fisker Cheung [@&#8203;fisker](https://redirect.github.com/fisker)
- James Henry [@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)
- JamesHenry [@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)
- Josh Goldberg
- Josh Goldberg ✨
- mdm317 [@&#8203;gen-ip-1](https://redirect.github.com/gen-ip-1)
- Younsang Na [@&#8203;nayounsang](https://redirect.github.com/nayounsang)

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 (@&#8203;typescript-eslint/visitor-keys)</summary>

### [`v8.48.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/visitor-keys/CHANGELOG.md#8481-2025-12-02)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.48.0...v8.48.1)

This was a version bump only for visitor-keys to align it with other projects, there were no code changes.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.48.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/visitor-keys/CHANGELOG.md#8480-2025-11-24)

[Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.47.0...v8.48.0)

This was a version bump only for visitor-keys to align it with other projects, there were no code changes.

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 (@&#8203;vitest/browser)</summary>

### [`v4.0.15`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.15)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.14...v4.0.15)

#####    🚀 Experimental Features

- **cache**: Add opt-out on a plugin level, fix internal root cache  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9154](https://redirect.github.com/vitest-dev/vitest/issues/9154) [<samp>(a68f7)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a68f74e5e)
- **reporters**: Print import duration breakdown  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9105](https://redirect.github.com/vitest-dev/vitest/issues/9105) [<samp>(122ff)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/122ff321c)

#####    🐞 Bug Fixes

- Keep built-in id as is in bun and deno  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9117](https://redirect.github.com/vitest-dev/vitest/issues/9117) [<samp>(075ab)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/075ab3520)
- Use `optimizeDeps.rolldownOptions` to fix depreated warning + fix `ssr.external: true`  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in [#&#8203;9121](https://redirect.github.com/vitest-dev/vitest/issues/9121) [<samp>(fd8bd)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fd8bd6dee)
- Fix external behavior with `deps.optimizer`  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in [#&#8203;9125](https://redirect.github.com/vitest-dev/vitest/issues/9125) [<samp>(4c754)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/4c75492cc)
- Very minor typo in "Chrome DevTools Protocol"  -  by [@&#8203;HowToTestFrontend](https://redirect.github.com/HowToTestFrontend) in [#&#8203;9146](https://redirect.github.com/vitest-dev/vitest/issues/9146) [<samp>(20997)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/209976419)
- **browser**: Run `toMatchScreenshot` only once when used with `expect.element`  -  by [@&#8203;macarie](https://redirect.github.com/macarie) in [#&#8203;9132](https://redirect.github.com/vitest-dev/vitest/issues/9132) [<samp>(0d2e7)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/0d2e7e3e2)
- **coverage**: Istanbul provider to not break source maps  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;9040](https://redirect.github.com/vitest-dev/vitest/issues/9040) [<samp>(e4ca9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e4ca917f1)
- **deps**: Update dependency tinyexec to v1  -  in [#&#8203;9122](https://redirect.github.com/vitest-dev/vitest/issues/9122) [<samp>(fd786)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fd7860222)
- **docs**: Remove `--browser.provider` from docs  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9115](https://redirect.github.com/vitest-dev/vitest/issues/9115) [<samp>(120b3)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/120b3dac1)
- **expect**: Preserve `currentTestName` in extended matchers  -  by [@&#8203;macarie](https://redirect.github.com/macarie) in [#&#8203;9106](https://redirect.github.com/vitest-dev/vitest/issues/9106) [<samp>(e4345)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e43458e02)
- **pool**: Terminate workers on `CTRL+c` forceful exits  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;9140](https://redirect.github.com/vitest-dev/vitest/issues/9140) [<samp>(d57d8)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d57d8bf0a)
- **reporters**: Show project in github reporter  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9138](https://redirect.github.com/vitest-dev/vitest/issues/9138) [<samp>(bb65e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/bb65e15c7)
- **spy**: Do not mock overriden method, if parent was automocked  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9116](https://redirect.github.com/vitest-dev/vitest/issues/9116) [<samp>(1a246)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1a24607b4)
- **web-worker**: MessagePort objects passed to Worker.postMessage work when clone === "native"  -  by [@&#8203;whitphx](https://redirect.github.com/whitphx) in [#&#8203;9118](https://redirect.github.com/vitest-dev/vitest/issues/9118) [<samp>(deee8)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/deee83e54)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.14...v4.0.15)

### [`v4.0.14`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.14)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.13...v4.0.14)

#####    🚀 Experimental Features

- **browser**: Expose `utils.configurePrettyDOM`  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9103](https://redirect.github.com/vitest-dev/vitest/issues/9103) [<samp>(2cc34)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2cc34e0d4)
- **runner**: Add full names to tasks  -  by [@&#8203;macarie](https://redirect.github.com/macarie) in [#&#8203;9087](https://redirect.github.com/vitest-dev/vitest/issues/9087) [<samp>(821aa)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/821aa2002)
- **ui**: Add tabbed failure view for `toMatchScreenshot` with comparison slider  -  by [@&#8203;macarie](https://redirect.github.com/macarie) in [#&#8203;8813](https://redirect.github.com/vitest-dev/vitest/issues/8813) [<samp>(c37c2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c37c2eb0b)

#####    🐞 Bug Fixes

- Externalize before caching  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9077](https://redirect.github.com/vitest-dev/vitest/issues/9077) [<samp>(e1b2e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e1b2e086a)
- Collect the duration of external imports  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9097](https://redirect.github.com/vitest-dev/vitest/issues/9097) [<samp>(3326c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/3326cc9f4)
- Rename `collect` to `import`, remove `prepare`  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9091](https://redirect.github.com/vitest-dev/vitest/issues/9091) [<samp>(1256b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1256b5ca3)
- **browser**:
  - Unsubscribe `onCancel` on rpc destroy  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;9088](https://redirect.github.com/vitest-dev/vitest/issues/9088) [<samp>(f5b72)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f5b72374b)
  - Revert the viewport scaling in non-ui mode [#&#8203;9018](https://redirect.github.com/vitest-dev/vitest/issues/9018)  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9072](https://redirect.github.com/vitest-dev/vitest/issues/9072) and [#&#8203;9018](https://redirect.github.com/vitest-dev/vitest/issues/9018) [<samp>(64502)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/64502a2c4)
- **coverage**:
  - Invalidate circular modules correctly on rerun with coverage  -  by [@&#8203;aicest](https://redirect.github.com/aicest) in [#&#8203;9096](https://redirect.github.com/vitest-dev/vitest/issues/9096) [<samp>(6f22c)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6f22c675f)
- **expect**:
  - Allow function as standard schema  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in [#&#8203;9099](https://redirect.github.com/vitest-dev/vitest/issues/9099) [<samp>(ed8a2)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/ed8a2ebbd)
- **jsdom**:
  - Reuse abort signals if possible  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9090](https://redirect.github.com/vitest-dev/vitest/issues/9090) [<samp>(2c468)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/2c468ee95)
- **pool**:
  - Init `VITEST_POOL_ID` + `VITEST_WORKER_ID` before environment setup  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;9085](https://redirect.github.com/vitest-dev/vitest/issues/9085) [<samp>(37918)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/379185b40)
- **web-worker**:
  - `postMessage` to send ports to workers  -  by [@&#8203;whitphx](https://redirect.github.com/whitphx) and [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;9078](https://redirect.github.com/vitest-dev/vitest/issues/9078) [<samp>(9d176)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9d1763d11)

#####    🏎 Performance

- Replace `debug` with `obug`  -  by [@&#8203;sxzz](https://redirect.github.com/sxzz) and [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;9057](https://redirect.github.com/vitest-dev/vitest/issues/9057) [<samp>(acc51)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/acc5152b9)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.13...v4.0.14)

### [`v4.0.13`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.13)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.12...v4.0.13)

#####    🐞 Bug Fixes

- **types**:
  - Don't use type from Vite 7.1  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9071](https://redirect.github.com/vitest-dev/vitest/issues/9071) [<samp>(6356b)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6356b1d38)
  - Don't import node.js dependent types in vitest/browser  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9068](https://redirect.github.com/vitest-dev/vitest/issues/9068) [<samp>(332af)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/332afa0de)

#####    🏎 Performance

- Avoid fetchModule roundtrip if the module is cached  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9075](https://redirect.github.com/vitest-dev/vitest/issues/9075) [<samp>(b27e0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b27e002e5)
- **experimental**: If `fsCacheModule` is enabled, read from the memory when possible  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9076](https://redirect.github.com/vitest-dev/vitest/issues/9076) [<samp>(6b9a1)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6b9a1b5b1)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.12...v4.0.13)

### [`v4.0.12`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.12)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.11...v4.0.12)

#####    🐞 Bug Fixes

- Inherit `fsModuleCachePath` by default  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9063](https://redirect.github.com/vitest-dev/vitest/issues/9063) [<samp>(9a8bc)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9a8bc78c5)
- Don't import from `@opentelemetry/api` in public types  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9066](https://redirect.github.com/vitest-dev/vitest/issues/9066) [<samp>(e944a)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/e944a37b7)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.11...v4.0.12)

### [`v4.0.11`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.11)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.10...v4.0.11)

#####    🚀 Experimental Features

- **api**: Add extensible test artifact API  -  by [@&#8203;macarie](https://redirect.github.com/macarie) in [#&#8203;8987](https://redirect.github.com/vitest-dev/vitest/issues/8987) [<samp>(77292)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/772923645)
  - See more at <https://vitest.dev/api/advanced/artifacts>
- **expect**: Provide `task` in `MatchState`  -  by [@&#8203;macarie](https://redirect.github.com/macarie) in [#&#8203;9022](https://redirect.github.com/vitest-dev/vitest/issues/9022) [<samp>(afd1f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/afd1f3e52)
- **experimental**: Support OpenTelemetry traces  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8994](https://redirect.github.com/vitest-dev/vitest/issues/8994) [<samp>(d6d33)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d6d3359dd)
  - See more at <https://vitest.dev/guide/open-telemetry>

#####    🏎 Performance

- **experimental**: Add file system cache  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9026](https://redirect.github.com/vitest-dev/vitest/issues/9026) [<samp>(1b147)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1b1473712)
  - See more at <https://vitest.dev/config/experimental#experimental-fsmodulecache>

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.10...v4.0.11)

### [`v4.0.10`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.10)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.9...v4.0.10)

#####    🐞 Bug Fixes

- Remove `onCancel` when worker is terminated  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9033](https://redirect.github.com/vitest-dev/vitest/issues/9033) [<samp>(6d7f0)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6d7f0a99e)
- **browser**:
  - Don't scale the iframe if UI is disabled  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9018](https://redirect.github.com/vitest-dev/vitest/issues/9018) [<samp>(5406e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5406e8ea4)
  - Handle dependency stack traces with external source maps. Resolves: [#&#8203;9003](https://redirect.github.com/vitest-dev/vitest/issues/9003)  -  by [@&#8203;iclectic](https://redirect.github.com/iclectic) in [#&#8203;9016](https://redirect.github.com/vitest-dev/vitest/issues/9016) and [#&#8203;9003](https://redirect.github.com/vitest-dev/vitest/issues/9003) [<samp>(57ae5)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/57ae547de)
- **bun**:
  - Parsing of stack trace for bun runtime  -  by [@&#8203;nazarhussain](https://redirect.github.com/nazarhussain) in [#&#8203;9032](https://redirect.github.com/vitest-dev/vitest/issues/9032) [<samp>(f3ec6)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f3ec6fcb0)
- **core**:
  - Prevent starting new run when cancelling  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;8991](https://redirect.github.com/vitest-dev/vitest/issues/8991) [<samp>(eb98d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/eb98dd8fd)
- **pool**:
  - Prevent writing to closed worker  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;9023](https://redirect.github.com/vitest-dev/vitest/issues/9023) [<samp>(042c6)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/042c60c80)
- **reporters**:
  - Report correct test run duration at the end  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8969](https://redirect.github.com/vitest-dev/vitest/issues/8969) [<samp>(bc3a6)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/bc3a6921e)
- **ui**:
  - Use execution time from ws reporter (`onFinished`)  -  by [@&#8203;userquin](https://redirect.github.com/userquin) in [#&#8203;8975](https://redirect.github.com/vitest-dev/vitest/issues/8975) [<samp>(f56dc)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/f56dc0cc4)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.9...v4.0.10)

### [`v4.0.9`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.9)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.8...v4.0.9)

#####    🚀 Experimental Features

- **expect**: Add Set support to toBeOneOf  -  by [@&#8203;tim-we](https://redirect.github.com/tim-we) and [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8906](https://redirect.github.com/vitest-dev/vitest/issues/8906) [<samp>(a415d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a415d0375)

#####    🐞 Bug Fixes

- **browser**: Add favicon icons to the browser mode ui  -  by [@&#8203;userquin](https://redirect.github.com/userquin) in [#&#8203;8972](https://redirect.github.com/vitest-dev/vitest/issues/8972) [<samp>(353ee)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/353ee5bbc)
- **forks**: Increase worker start timeout  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;9027](https://redirect.github.com/vitest-dev/vitest/issues/9027) [<samp>(5e750)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/5e750f4ba)
- **jsdom**: Cloned request is an instance of `Request`  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8985](https://redirect.github.com/vitest-dev/vitest/issues/8985) [<samp>(506a9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/506a9fd0f)
- **ui**: Collect file/suite/test duration correctly  -  by [@&#8203;userquin](https://redirect.github.com/userquin) in [#&#8203;8976](https://redirect.github.com/vitest-dev/vitest/issues/8976) [<samp>(8016d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/8016da886)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.8...v4.0.9)

### [`v4.0.8`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.8)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.7...v4.0.8)

#####    🐞 Bug Fixes

- Workaround `noExternal` merging bug on Vite 6  -  by [@&#8203;hi-ogawa](https://redirect.github.com/hi-ogawa) in [#&#8203;8950](https://redirect.github.com/vitest-dev/vitest/issues/8950) [<samp>(bcb13)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/bcb132fd4)
- Missed context.d.ts file  -  by [@&#8203;termorey](https://redirect.github.com/termorey) in [#&#8203;8965](https://redirect.github.com/vitest-dev/vitest/issues/8965) [<samp>(9044d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9044d9356)
- Incorrect error message for non-awaited `expect.element()`  -  by [@&#8203;StyleShit](https://redirect.github.com/StyleShit) in [#&#8203;8954](https://redirect.github.com/vitest-dev/vitest/issues/8954) [<samp>(9638d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9638db0f3)
- **browser**: Cleanup frame-ancestors from CSP header at coverage middleware  -  by [@&#8203;userquin](https://redirect.github.com/userquin) in [#&#8203;8941](https://redirect.github.com/vitest-dev/vitest/issues/8941) [<samp>(1f730)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/1f7303738)
- **deps**: Update all non-major dependencies  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8636](https://redirect.github.com/vitest-dev/vitest/issues/8636) [<samp>(da8b9)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/da8b93aa5)
- **forks**: Do not fail with Windows Defender enabled  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8967](https://redirect.github.com/vitest-dev/vitest/issues/8967) [<samp>(c79f4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c79f47c65)
- **runner**: Properly encode Uint8Array body in annotations  -  by [@&#8203;Livan-pro](https://redirect.github.com/Livan-pro) in [#&#8203;8951](https://redirect.github.com/vitest-dev/vitest/issues/8951) [<samp>(997ca)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/997ca5a82)
- **spy**: Copy static properties if spy is initialised with `vi.fn()`, fix types for `vi.spyOn(obj, class)`  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8956](https://redirect.github.com/vitest-dev/vitest/issues/8956) [<samp>(75e7f)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/75e7fcc51)
- **webdriverio**: When no argument is passed to the .click interaction command, the webdriver command should also have no argument  -  by [@&#8203;julienw](https://redirect.github.com/julienw) in [#&#8203;8937](https://redirect.github.com/vitest-dev/vitest/issues/8937) [<samp>(069e6)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/069e6db9b)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.7...v4.0.8)

### [`v4.0.7`](https://redirect.github.com/vitest-dev/vitest/releases/tag/v4.0.7)

[Compare Source](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.6...v4.0.7)

#####    🐞 Bug Fixes

- Bind `process` in case global is overwritten  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;8916](https://redirect.github.com/vitest-dev/vitest/issues/8916) [<samp>(6240d)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/6240d51a6)
- Create environment once per worker with `isolate: false`  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8915](https://redirect.github.com/vitest-dev/vitest/issues/8915) [<samp>(c9078)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/c9078a26e)
- Add Locator as a possible element type in `toContainElement()` matcher  -  by [@&#8203;vitalybaev](https://redirect.github.com/vitalybaev) in [#&#8203;8910](https://redirect.github.com/vitest-dev/vitest/issues/8910) and [#&#8203;8927](https://redirect.github.com/vitest-dev/vitest/issues/8927) [<samp>(35a27)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/35a27d4b3)
- **browser**: Inherit `isolate` option, deprecate `browser.isolate`/`browser.fileParallelism`  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8890](https://redirect.github.com/vitest-dev/vitest/issues/8890) [<samp>(9d2b4)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/9d2b4d501)
- **cli**: Parse `--execArgv` as array  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;8924](https://redirect.github.com/vitest-dev/vitest/issues/8924) [<samp>(751c3)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/751c3926f)
- **jsdom**: Support `URL.createObjectURL`, `FormData.set(prop, blob)`  -  by [@&#8203;sheremet-va](https://redirect.github.com/sheremet-va) in [#&#8203;8935](https://redirect.github.com/vitest-dev/vitest/issues/8935) [<samp>(a1b73)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/a1b7361ab)
- **pool**: Avoid `--require` argument when running in deno  -  by [@&#8203;pi0](https://redirect.github.com/pi0) in [#&#8203;8897](https://redirect.github.com/vitest-dev/vitest/issues/8897) [<samp>(d41fa)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/d41fa742f)
- **typecheck**: Handle re-runs outside `tsc`  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;8920](https://redirect.github.com/vitest-dev/vitest/issues/8920) [<samp>(fdb2e)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/fdb2e7982)

#####    🏎 Performance

- **pool**:
  - Sort test files by project by default  -  by [@&#8203;AriPerkkio](https://redirect.github.com/AriPerkkio) in [#&#8203;8914](https://redirect.github.com/vitest-dev/vitest/issues/8914) [<samp>(680a6)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/680a612ea)
- **reporters**:
  - Optimize getting the tests stats  -  by [@&#8203;Connormiha](https://redirect.github.com/Connormiha) in [#&#8203;8908](https://redirect.github.com/vitest-dev/vitest/issues/8908) [<samp>(06d62)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/06d6207fb)
  - Remove unnecessary `Array.from` call  -  by [@&#8203;Connormiha](https://redirect.github.com/Connormiha) in [#&#8203;8907](https://redirect.github.com/vitest-dev/vitest/issues/8907) [<samp>(b6014)</samp>](https://redirect.github.com/vitest-dev/vitest/commit/b60149b27)

#####     [View changes on GitHub](https://redirect.github.com/vitest-dev/vitest/compare/v4.0.6...v4.0.7)

</details>

<details>
<summary>Microsoft/vsce (@&#8203;vscode/vsce)</summary>

### [`v3.7.1`](https://redirect.github.com/microsoft/vscode-vsce/releases/tag/v3.7.1)

[Compare Source](https://redirect.github.com/Microsoft/vsce/compare/v3.7.0...v3.7.1)

#### Changes:

- [#&#8203;1223](https://redirect.github.com/Microsoft/vsce/issues/1223): Bump js-yaml
- [#&#8203;1222](https://redirect.github.com/Microsoft/vsce/issues/1222): Bump glob

This list of changes was [auto generated](https://dev.azure.com/monacotools/Monaco/_build/results?buildId=378097\&view=logs).

### [`v3.7.0`](https://redirect.github.com/microsoft/vscode-vsce/releases/tag/v3.7.0)

[Compare Source](https://redirect.github.com/Microsoft/vsce/compare/v3.6.2...v3.7.0)

#### Changes:

- [#&#8203;1219](https://redirect.github.com/Microsoft/vsce/issues/1219): Remove invalid validation for extension dependencies
- [#&#8203;1212](https://redirect.github.com/Microsoft/vsce/issues/1212): Validate extension dependencies use lowercase letters and warn about deprecated github.copilot
- [#&#8203;1209](https://redirect.github.com/Microsoft/vsce/issues/1209): Bump validator from 13.9.0 to 13.15.20
- [#&#8203;1200](https://redirect.github.com/Microsoft/vsce/issues/1200): Bump tar-fs from 2.1.3 to 2.1.4

This list of changes was [auto generated](https://dev.azure.com/monacotools/Monaco/_build/results?buildId=372155\&view=logs).

</details>

<details>
<summary>alpinejs/alpine (alpinejs)</summary>

### [`v3.15.2`](https://redirect.github.com/alpinejs/alpine/releases/tag/v3.15.2)

[Compare Source](https://redirect.github.com/alpinejs/alpine/compare/v3.15.1...v3.15.2)

#### Changes

- Imrove CSP bundle [#&#8203;4704](https://redirect.github.com/alpinejs/alpine/pull/4704)
- Add `setErrorHandler` [#&#8203;4673](https://redirect.github.com/alpinejs/alpine/pull/4673)

### [`v3.15.1`](https://redirect.github.com/alpinejs/alpine/releases/tag

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 10am on monday" in timezone Asia/Shanghai, 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:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xNi4xIiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
2025-12-09 14:39:49 +00:00
Dunqing 30a90762ec feat(ast, parser, codegen): add CommentKind::MultilineBlock (#16479)
Add `CommentKind::MultilineBlock` to indicate a block comment that has at least one linebreak, which would be useful in the Codegen and Formatter

Examples:

CommentKind::Block:
```js
/* single line block comment */
```

CommentKind::MultilineBlock

```js
/* multiline
block
 comment */
```

Maybe it would be better to rename `CommentKind::Block` to `CommentKind::SinglelineBlock.` as well
2025-12-09 02:02:10 +00:00
Boshen 745873e4cd release(crates): oxc v0.102.0 (#16595)
### 💥 BREAKING CHANGES

- 083fea9 napi/parser: [**BREAKING**] Represent empty optional fields on
JS side as `null` (#16411) (overlookmotel)

### 🚀 Features

- 7a2afee parser: Add TS1174 error for classes extending multiple base
classes (#15993) (sapphi-red)
- da87812 semantic: Add TS2309 error for export assignment with other
exports (#15992) (sapphi-red)
- d6d2bcd minifier: Remove unused function calls that are marked by
`manual_pure_functions` (#16534) (sapphi-red)
- c90f053 minifier: Support `.` separated values for
`compress.treeshake.manualPureFunctions` (#16529) (sapphi-red)
- a607cc4 codegen: Preserve comments between CatchClause's param and
body (#16167) (copilot-swe-agent)
- 8c10694 semantic: Expose get_comment_at method (#16439) (camc314)
- 3981e7a ast: Add get_comment_at to lookup a comment by span (#16438)
(camc314)

### 🐛 Bug Fixes

- 699406a napi/parser: Move `ExportEntry::module_request` field to first
(#16412) (overlookmotel)
- 12bd794 napi/parser: Move `ExportEntry::module_request` field to last
(#16403) (overlookmotel)

### ⚡ Performance

- 790beeb napi/parser: Do not remove extraneous options on JS side
(#16447) (overlookmotel)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
2025-12-08 11:47:22 +00:00
overlookmotel 3459f8a548 ci(lint): enable prefer-destructuring lint rule (#16449)
Enable `prefer-destructuring` rule in our linting setup.

Not related to JS plugins, I just like this rule, and it's useful not to make nitty comments on PRs, when linter can do it for me...
2025-12-03 22:10:54 +00:00
overlookmotel 790beebd17 perf(napi/parser): do not remove extraneous options on JS side (#16447)
Similar to #16442.

There's no need to remove the `experimental*` properties from `options` object on JS side. They'll be ignored by NAPI-RS on Rust side anyway, so creating a new object on JS side is pointless overhead.
2025-12-03 14:47:24 +00:00
Boshen 3f6387dd3b ci(workflows): add workflow_call support to update_submodules.yml (#16431)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
2025-12-03 19:47:57 +08:00
overlookmotel 699406af5e fix(napi/parser): move ExportEntry::module_request field to first (#16412)
Revert the change made in #16403. It's no longer necessary after #16411, because NAPI-RS no longer re-orders the fields.
2025-12-02 23:30:56 +00:00
overlookmotel 083fea9fa6 feat(napi/parser)!: represent empty optional fields on JS side as null (#16411)
Follow-on after #16383 and #16403.

While working on those I discovered an option NAPI-RS has to represent `Option::None` as `null`, instead of omitting the field entirely.

Use that option on the structs used for transferring errors and module record over to JS.

I think this is likely more performant because:

1. NAPI-RS can create all properties of the objects using only the faster `node_api_create_object_with_properties` API.
2. It produces consistent object shapes, so JS engine can better optimize code using these objects.

It also brings the shape of the data perfectly into line between standard transfer and raw transfer, and is consistent with how empty fields in the AST are represented as `null`.

I would have used this option before if I'd known it existed.

### Breaking change

I've marked this as a breaking change because code consuming these objects would now need to check for empty fields with `value === null` instead of `value === undefined`.

However in practice, most people probably use `!value` or `value ?? ...`, so it's unlikely to affect many users. This only affects module record and errors anyway, not the AST itself, as we transfer that as JSON, not via NAPI.
2025-12-02 23:30:56 +00:00
renovate[bot] 7731160241 chore(deps): update napi (#16383)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence | Type |
Update |
|---|---|---|---|---|---|---|---|
| [@napi-rs/cli](https://redirect.github.com/napi-rs/napi-rs) | [`3.4.1`
->
`3.5.0`](https://renovatebot.com/diffs/npm/@napi-rs%2fcli/3.4.1/3.5.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/@napi-rs%2fcli/3.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@napi-rs%2fcli/3.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@napi-rs%2fcli/3.4.1/3.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@napi-rs%2fcli/3.4.1/3.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| pnpm.catalog.default | minor |
| [napi](https://redirect.github.com/napi-rs/napi-rs) | `3.5.2` ->
`3.6.1` |
[![age](https://developer.mend.io/api/mc/badges/age/crate/napi/3.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi/3.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi/3.5.2/3.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi/3.5.2/3.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| workspace.dependencies | minor |
| [napi-derive](https://redirect.github.com/napi-rs/napi-rs) | `3.3.3`
-> `3.4.0` |
[![age](https://developer.mend.io/api/mc/badges/age/crate/napi-derive/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi-derive/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi-derive/3.3.3/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi-derive/3.3.3/3.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
| workspace.dependencies | minor |

---

### Release Notes

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

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

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

##### Added

- *(sys)* use libloading to load napi symbols at runtime on all platform
([#&#8203;2996](https://redirect.github.com/napi-rs/napi-rs/pull/2996))

##### Fixed

- *(napi)* memory leak in PromiseRaw cleanup callback
([#&#8203;2995](https://redirect.github.com/napi-rs/napi-rs/pull/2995))

##### Other

- *(napi)* mark tsfn data as pub and split SendableResolver to indent
file
([#&#8203;2992](https://redirect.github.com/napi-rs/napi-rs/pull/2992))
- *(napi)* mark SendableResolver and PromiseRaw as pub
([#&#8203;2981](https://redirect.github.com/napi-rs/napi-rs/pull/2981))
- add sponsors

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
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:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xOS45IiwidXBkYXRlZEluVmVyIjoiNDIuMTkuOSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: overlookmotel <theoverlookmotel@gmail.com>
2025-12-02 18:27:23 +00:00