Skip to content

fix(napi): replace panics with error returns to prevent WASM traps#1055

Merged
Boshen merged 1 commit into
mainfrom
fix/napi-remove-panics
Mar 6, 2026
Merged

fix(napi): replace panics with error returns to prevent WASM traps#1055
Boshen merged 1 commit into
mainfrom
fix/napi-remove-panics

Conversation

@Boshen

@Boshen Boshen commented Mar 6, 2026

Copy link
Copy Markdown
Member

Summary

  • Convert panic!() and unwrap() calls in the NAPI binding layer to proper napi::Result error returns, preventing unrecoverable WASM unreachable traps in WebContainer/WASI environments
  • Change From impls to TryFrom for Restriction and TsconfigOptions, propagating errors through ResolverFactory::new and clone_with_options
  • Replace unwrap() with unwrap_or_default() in tracing initialization
  • Bump minimum napi version from 3 to 3.8 to include upstream bug fixes

related #635

🤖 Generated with Claude Code

Convert `panic!()` and `unwrap()` calls in the NAPI binding layer to
proper `napi::Result` error returns. This prevents unrecoverable WASM
`unreachable` traps when invalid options are provided, particularly in
WebContainer/WASI environments where `panic = "abort"`.

- Change `From` impls to `TryFrom` for `Restriction` and `TsconfigOptions`
- Update `ResolverFactory::new` and `clone_with_options` to return `napi::Result`
- Replace `unwrap()` with `unwrap_or_default()` in tracing init
- Bump minimum napi version from 3 to 3.8

Closes #635

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@Boshen Boshen enabled auto-merge (squash) March 6, 2026 05:57
@Boshen Boshen merged commit e6b682c into main Mar 6, 2026
11 checks passed
@Boshen Boshen deleted the fix/napi-remove-panics branch March 6, 2026 05:57
@Boshen Boshen mentioned this pull request Mar 5, 2026
@codspeed-hq

codspeed-hq Bot commented Mar 6, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 13 untouched benchmarks
⏩ 5 skipped benchmarks1


Comparing fix/napi-remove-panics (a0b7165) with main (4970984)

Open in CodSpeed

Footnotes

  1. 5 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

Boshen added a commit that referenced this pull request May 25, 2026
## 🤖 New release

* `oxc_resolver`: 11.19.1 -> 11.19.2
* `oxc_resolver_napi`: 11.19.1 -> 11.19.2

<details><summary><i><b>Changelog</b></i></summary><p>

## `oxc_resolver`

<blockquote>

##
[11.19.2](v11.19.1...v11.19.2)
- 2026-05-25

### <!-- 1 -->🐛 Bug Fixes

- *(tsconfig)* apply later-wins semantics for extends array
([#1156](#1156)) (by
@Boshen)
- *(tsconfig)* walk past a tsconfig that doesn't claim the file
([#1154](#1154)) (by
@Boshen)
- *(tsconfig)* let project references take priority over their parent
([#1151](#1151)) (by
@Boshen)
- *(tsconfig)* resolve `rootDirs` against the config that declared them
([#1150](#1150)) (by
@Boshen)
- *(tsconfig)* resolve `baseUrl` / `paths` against the canonical
tsconfig path
([#1148](#1148)) (by
@Boshen)
- strip query fragments when calling `find_tsconfig`
([#1147](#1147)) (by
@Boshen)
- avoid panic in resolve_file for parentless paths
([#1053](#1053)) (by
@Boshen)
- *(dts)* strip ./ prefix from package entry when matching typesVersions
([#1051](#1051)) (by
@Boshen)
- *(dts)* expand Declaration to TypeScript|Declaration for package entry
resolution
([#1050](#1050)) (by
@Boshen)
- *(dts)* prefer declaration extensions over JS in exports-resolved
paths ([#1047](#1047))
(by @Boshen)
- avoid wasm/wasi dead-code lint in NodePath
([#1043](#1043)) (by
@Boshen)
- *(napi)* replace panics with error returns to prevent WASM traps
([#1055](#1055)) (by
@Boshen)

### <!-- 2 -->🚜 Refactor

- remove clear_cache test that dynamically creates fixtures (by @Boshen)
- move resolve and misc fixtures into fixtures/integration (by @Boshen)
- replace ignored doctest with link to example (by @Boshen)
- consolidate fixture directories for better test file mapping (by
@Boshen)
- replace `url` crate with `percent-encoding`
([#1065](#1065)) (by
@Boshen)

### <!-- 4 -->⚡ Performance

- *(cache)* pack CachedPathImpl::meta into a CachedMeta byte
([#1144](#1144)) (by
@Boshen)
- *(cache)* store canonical path as Box<Path> instead of PathBuf
([#1143](#1143)) (by
@Boshen)
- *(alias)* fast-reject alias entries by cached first byte
([#1142](#1142)) (by
@Boshen)

### <!-- 6 -->🧪 Testing

- *(tsconfig)* port lookup scenarios from typescript-go
([#1155](#1155)) (by
@Boshen)
- add 28 tests to improve coverage (92% → 93%)
([#1082](#1082)) (by
@Boshen)

### Contributors

* @Boshen
* @renovate[bot]
</blockquote>



</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

Co-authored-by: oxc-guard[bot] <276638029+oxc-guard[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant