Skip to content

Comments

feat: expose error location and context fields on JS API error objects#7341

Merged
graphite-app[bot] merged 1 commit intomainfrom
copilot/expose-error-information-js-api
Dec 5, 2025
Merged

feat: expose error location and context fields on JS API error objects#7341
graphite-app[bot] merged 1 commit intomainfrom
copilot/expose-error-information-js-api

Conversation

Copy link
Contributor

Copilot AI commented Dec 4, 2025

  • Understand the issue and existing code structure
  • Build the project to verify current state
  • Add fields (id, exporter, loc, pos) to NativeError struct in Rust
  • Update to_binding_error function to populate new fields from BuildDiagnostic
  • Update TypeScript error types to include new fields
  • Create tests to verify error information is exposed correctly
  • Run build and tests to verify changes
  • Address code review feedback
  • Use 1-based numbering for line and match editor conventions
  • Convert loc and pos to UTF-16 based encoding
  • Add test with UTF-16 multi-byte characters (emoji)
  • Remove unused string_wizard dependency
  • All tests passing
Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature Request]: expose error information on JS API error object</issue_title>
<issue_description>### What problem does this feature solve?

When there is an error from API-based usage, e.g. a missing export:

try {
  const bundle = await rolldown({
    input: '...'
  })
  const generated = await bundle.generate({ format: 'cjs' })
} catch (e) {
  console.log(e) // e doesn't expose anything useful
}

The error message is printed to the console, but the caught error object doesn't contain the same information. e.message is "Build failed" and e.code is "GenericFailure" - which are not really helpful.

What does the proposed API look like?

e.message and e.code should contain more specific information.</issue_description>

Comments on the Issue (you are @copilot in this section)

@hyf0 I think this one is solved. Errors returned from rust or caught in Js would be displayed as it is.

--- edited

looks like there are much to be improved</comment_new>
<comment_new>@sapphi-red

looks like there are much to be improved

Would you clarify this?</comment_new>
<comment_new>@hyf0

looks like there are much to be improved

Would you clarify this?

I reopen it becuase of reqeust I saw in #2734.

It seemed it was suggesting add more specific fields to the each individual error object.</comment_new>
<comment_new>@sapphi-red
I see. Warnings support id and exporter property (#3711).

I think we can close this issue once we support id, exporter, loc, pos.

related code:

pub struct NativeError {
pub kind: String,
pub message: String,
}


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

@netlify
Copy link

netlify bot commented Dec 4, 2025

Deploy Preview for rolldown-rs ready!

Name Link
🔨 Latest commit 7a72a8a
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/693326276be29400095747be
😎 Deploy Preview https://deploy-preview-7341--rolldown-rs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copilot AI changed the title [WIP] Expose detailed error information on JS API error object feat: expose error location and context fields on JS API error objects Dec 4, 2025
Copilot AI requested a review from sapphi-red December 4, 2025 08:55
@sapphi-red
Copy link
Member

@copilot loc and pos should be utf16 based. fix that and add a test

Copy link
Contributor Author

Copilot AI commented Dec 4, 2025

@copilot loc and pos should be utf16 based. fix that and add a test

Fixed in f346cdb. Updated get_primary_location() to use UTF-16 encoding for both column and pos fields. Added string_wizard dependency for UTF-16 utilities and created a test with emoji characters to verify UTF-16 handling.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 4, 2025

Benchmarks Rust

  • target: main(220b77c)
  • pr: copilot/expose-error-information-js-api(7a72a8a)
group                                                        pr                                     target
-----                                                        --                                     ------
bundle/bundle@multi-duplicated-top-level-symbol              1.01     67.0±1.87ms        ? ?/sec    1.00     66.0±1.89ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-sourcemap    1.01     73.4±1.83ms        ? ?/sec    1.00     72.4±1.61ms        ? ?/sec
bundle/bundle@rome_ts                                        1.01    109.0±1.75ms        ? ?/sec    1.00    108.4±2.19ms        ? ?/sec
bundle/bundle@rome_ts-sourcemap                              1.02    123.4±2.49ms        ? ?/sec    1.00    121.5±1.74ms        ? ?/sec
bundle/bundle@threejs                                        1.00     39.5±0.72ms        ? ?/sec    1.02     40.4±2.55ms        ? ?/sec
bundle/bundle@threejs-sourcemap                              1.00     43.7±0.79ms        ? ?/sec    1.00     43.6±1.56ms        ? ?/sec
bundle/bundle@threejs10x                                     1.00    397.5±5.04ms        ? ?/sec    1.00    399.2±6.39ms        ? ?/sec
bundle/bundle@threejs10x-sourcemap                           1.00    457.0±4.83ms        ? ?/sec    1.00    457.9±4.38ms        ? ?/sec
scan/scan@rome_ts                                            1.04     87.6±1.71ms        ? ?/sec    1.00     84.2±1.51ms        ? ?/sec
scan/scan@threejs                                            1.02     29.2±1.62ms        ? ?/sec    1.00     28.5±0.39ms        ? ?/sec
scan/scan@threejs10x                                         1.01    299.0±4.58ms        ? ?/sec    1.00    296.9±4.54ms        ? ?/sec

Copilot AI requested a review from sapphi-red December 5, 2025 06:57
@sapphi-red sapphi-red force-pushed the copilot/expose-error-information-js-api branch from c37ca88 to 9f532eb Compare December 5, 2025 09:14
Copy link
Member


How to use the Graphite Merge Queue

Add the label graphite: merge to this PR to add it to the merge queue.

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@sapphi-red sapphi-red marked this pull request as ready for review December 5, 2025 09:27
@sapphi-red sapphi-red requested review from Copilot and hyf0 and removed request for sapphi-red December 5, 2025 09:27
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR exposes detailed error location and context information on JavaScript API error objects, addressing the issue where caught errors only contained generic "Build failed" messages. The implementation adds id, exporter, loc (line/column/file), and pos (UTF-16 position) fields to error objects, using 1-based line numbers and 0-based UTF-16 column offsets to match editor conventions.

Key changes:

  • Extended NativeError struct with location fields (id, exporter, loc, pos)
  • Implemented get_primary_location() method to extract UTF-16 encoded position information from diagnostics
  • Updated TypeScript type definitions to reflect new error fields
  • Added comprehensive tests including UTF-16 multi-byte character handling (emoji test)

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated no comments.

Show a summary per file
File Description
crates/rolldown_binding/src/types/error/native_error.rs Added NativeErrorLocation struct and extended NativeError with new fields for error location context
crates/rolldown_binding/src/types/binding_outputs.rs Updated to_binding_error to populate new location fields from diagnostic information using UTF-16 encoding
crates/rolldown_error/src/build_diagnostic/diagnostic.rs Implemented get_primary_location() method to extract file, line, column, and UTF-16 position from diagnostic labels
packages/rolldown/src/binding.d.cts Added TypeScript type definitions for NativeErrorLocation and updated NativeError interface with new optional fields
packages/rolldown/src/utils/error.ts Updated error normalization to include new fields (code, id, exporter, loc, pos) when converting binding errors
packages/rolldown/tests/fixtures/misc/error/missing-export-info/_config.ts Added test to verify basic error information exposure (id, kind, code, loc, pos)
packages/rolldown/tests/fixtures/misc/error/missing-export-info/main.js Test fixture with missing import to trigger error
packages/rolldown/tests/fixtures/misc/error/missing-export-info/dep.js Test fixture dependency file
packages/rolldown/tests/fixtures/misc/error/missing-export-utf16/_config.ts Added test verifying UTF-16 encoding correctness with multi-byte characters (emoji)
packages/rolldown/tests/fixtures/misc/error/missing-export-utf16/main.js Test fixture with emoji to verify UTF-16 handling
packages/rolldown/tests/fixtures/misc/error/missing-export-utf16/dep.js Test fixture dependency file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@graphite-app
Copy link
Contributor

graphite-app bot commented Dec 5, 2025

Merge activity

#7341)

- [x] Understand the issue and existing code structure
- [x] Build the project to verify current state
- [x] Add fields (`id`, `exporter`, `loc`, `pos`) to `NativeError` struct in Rust
- [x] Update `to_binding_error` function to populate new fields from `BuildDiagnostic`
- [x] Update TypeScript error types to include new fields
- [x] Create tests to verify error information is exposed correctly
- [x] Run build and tests to verify changes
- [x] Address code review feedback
- [x] Use 1-based numbering for line and match editor conventions
- [x] Convert loc and pos to UTF-16 based encoding
- [x] Add test with UTF-16 multi-byte characters (emoji)
- [x] Remove unused string_wizard dependency
- [x] All tests passing

<!-- START COPILOT CODING AGENT SUFFIX -->

<details>

<summary>Original prompt</summary>

>
> ----
>
> *This section details on the original issue you should resolve*
>
> <issue_title>[Feature Request]: expose error information on JS API error object</issue_title>
> <issue_description>### What problem does this feature solve?
>
> When there is an error from API-based usage, e.g. a missing export:
>
> ```js
> try {
>   const bundle = await rolldown({
>     input: '...'
>   })
>   const generated = await bundle.generate({ format: 'cjs' })
> } catch (e) {
>   console.log(e) // e doesn't expose anything useful
> }
> ```
>
> The error message is printed to the console, but the caught error object doesn't contain the same information. `e.message` is `"Build failed"` and `e.code` is `"GenericFailure"` - which are not really helpful.
>
> ### What does the proposed API look like?
>
> `e.message` and `e.code` should contain more specific information.</issue_description>
>
> ## Comments on the Issue (you are @copilot in this section)
>
> <comments>
> <comment_new><author>@hyf0</author><body>
> I think this one is solved. Errors returned from rust or caught in Js would be displayed as it is.
>
> --- edited
>
> looks like there are much to be improved</body></comment_new>
> <comment_new><author>@sapphi-red</author><body>
> > looks like there are much to be improved
>
> Would you clarify this?</body></comment_new>
> <comment_new><author>@hyf0</author><body>
> > > looks like there are much to be improved
> >
> > Would you clarify this?
>
> I reopen it becuase of reqeust I saw in #2734.
>
> It seemed it was suggesting add more specific fields to the each individual error object.</body></comment_new>
> <comment_new><author>@sapphi-red</author><body>
> I see. Warnings support `id` and `exporter` property (#3711).
>
> I think we can close this issue once we support `id`, `exporter`, `loc`, `pos`.
>
> related code: https://github.com/rolldown/rolldown/blob/06f24c0bc72d8700fec4563a97aa730510d2023c/crates/rolldown_binding/src/types/error/native_error.rs#L4-L7
>
> </body></comment_new>
> </comments>
>

</details>

- Fixes #1956

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more [Copilot coding agent tips](https://gh.io/copilot-coding-agent-tips) in the docs.
@graphite-app graphite-app bot force-pushed the copilot/expose-error-information-js-api branch from 9f532eb to 7a72a8a Compare December 5, 2025 18:36
@graphite-app graphite-app bot merged commit 7a72a8a into main Dec 5, 2025
28 checks passed
@graphite-app graphite-app bot deleted the copilot/expose-error-information-js-api branch December 5, 2025 18:51
shulaoda added a commit that referenced this pull request Dec 11, 2025
## [1.0.0-beta.54] - 2025-12-11

⏱️ Plugin Timing Analysis
- Added `checks.pluginTimings` option to emit warnings when plugins significantly impact build performance
- More details: https://rolldown.rs/options/checks#plugintimings
<img width="834" height="119" alt="image" src="https://github.com/user-attachments/assets/e819f906-6192-4503-8d5c-854fa92ecb45" />

> [!WARNING]
> For hooks using `ctx.resolve()` or `ctx.load()`, the reported time includes waiting for other plugins, which may overestimate that plugin's actual cost.
>
> Additionally, since plugin hooks execute concurrently, the statistics represent accumulated time rather than wall-clock time. The measured duration also includes Rust-side processing overhead, Tokio async scheduling overhead, NAPI data conversion overhead, and JavaScript event loop overhead.

### 🚀 Features

- rolldown_plugin_vite_reporter: add newline after build summary for better log separation (#7458) by @shulaoda
- plugin: collect plugin hook execution timings (#7364) by @shulaoda
- test-dev-server: reload page when detecting hmr reload message (#7422) by @hyf0
- rolldown_plugin_vite_dynamic_import_vars: add transform-based v2 implementation (#7400) by @shulaoda
- rolldown_plugin_vite_import_glob: add transform-based v2 implementation (#7394) by @shulaoda
- rolldown_plugin_vite_wasm_helper: add v2 implementation (#7402) by @shulaoda
- expose error location and context fields on JS API error objects (#7341) by @Copilot
- add `CIRCULAR_REEXPORT` error (#7337) by @Copilot
- support emit prebuilt chunk (#7277) by @Copilot

### 🐛 Bug Fixes

- preserve object key order when parse json with serde_json (#7443) by @IWANABETHATGUY
- improve JSON parsing with serde_json to emit proper diagnostic (#7442) by @IWANABETHATGUY
- deconflict external symbols in CJS modules (#7447) by @IWANABETHATGUY
- rolldown_plugin_vite_transform,rolldown_plugin_vite_resolve: enable `yarnPnp` option when pnp is detected (#5791) by @sapphi-red
- skip deconflicting top-level symbols for CJS modules (#7425) by @IWANABETHATGUY
- rolldown_plugin_esm_external_require: run resolveId hook before other plugins (#7426) by @shulaoda
- avoid duplicate underscores in legitimized identifiers (#7418) by @IWANABETHATGUY
- use `process.on('exit')` instead of `signal-exit` on webcontainers (#7421) by @sapphi-red
- dev: remove `imports` when an import is removed (#7348) by @sapphi-red
- bench: access latency.mean instead of mean in tinybench result (#7417) by @shulaoda
- path compression in symbol linking (#7392) by @IWANABETHATGUY
- rolldown_plugin_vite_resolve: add RwLock to avoid clearing cache while resolving (#7386) by @sapphi-red
- handle JSON prototype properties correctly (#7383) by @IWANABETHATGUY
- preserve entry signature strict chunk merging (#7343) by @IWANABETHATGUY
- support eliminating multiple unused dynamic imports in a single statement (#7361) by @IWANABETHATGUY
- eliminate unreachable dynamic entry (#7356) by @IWANABETHATGUY
- `NormalizedInputOptions#cwd` should always exists (#7360) by @hyf0
- cli: support multiple comma-separated define arguments (#7340) by @Copilot
- remove redundant symbol param in __reExport runtime helper (#7346) by @IWANABETHATGUY
- always use __export for empty namespace objects when symbols enabled (#7345) by @IWANABETHATGUY
- relax the restriction of preserveEntrySignatures when merging chunks (#7339) by @IWANABETHATGUY

### 🚜 Refactor

- builtin-plugin: make config parameter required for vite plugins (#7451) by @shulaoda
- move esbuild test related scripts to `scripts/src/esbuild-tests` (#7377) by @sapphi-red
- rewrite gen-esbuild-test in TypeScript (#7376) by @sapphi-red
- remove unnecessary Option in current_stmt_idx (#7359) by @IWANABETHATGUY
- move more code into chunk optimizer (#7335) by @IWANABETHATGUY

### 📚 Documentation

- checks: clarify pluginTimings measures CPU time due to concurrent execution (#7448) by @shulaoda
- checks: add accuracy note to pluginTimings documentation (#7441) by @shulaoda
- development-guide: add esbuild test description (#7439) by @sapphi-red
- checks: expand `pluginTimings` documentation with detection mechanism (#7428) by @shulaoda
- add checks options documentation (#7427) by @shulaoda
- development-guide: add test262 integration test description (#7430) by @sapphi-red
- guide: fix grammer in getting-started (#7331) by @jakeparis

### 🧪 Testing

- rollup-tests: make `--grep` work and document it (#7431) by @sapphi-red
- add a way to run some test262 test cases by name (#7429) by @sapphi-red
- rolldown_plugin_vite_dynamic_import_vars: add test cases for v2 implementation (#7401) by @shulaoda
- rolldown_plugin_vite_import_glob: add test cases for v2 implementation (#7395) by @shulaoda
- triage new esbuild tests (#7405) by @sapphi-red
- hmr: delete file used (#5933) by @sapphi-red
- watch: add `watchChange` hook `create` / `delete` tests (#7349) by @sapphi-red
- hmr: delete file not used anymore (#5932) by @sapphi-red
- triage esbuild failed reasons (#7391) by @sapphi-red
- change esbuild tests stats and diff generation (#7379) by @sapphi-red
- dev: add `continuous generate hmr patch` and `debounce bundle` tests (#7368) by @hyf0
- add new esbuild tests (#7353) by @sapphi-red

### ⚙️ Miscellaneous Tasks

- setup Node before updating snapshots for test262 update (#7435) by @sapphi-red
- run tests when submodules are updated (#7455) by @sapphi-red
- exclude NUL path pattern to prevent crash on Windows (#7450) by @IWANABETHATGUY
- run cargo-test for esbuild script changes and update esbuild snapshot (#7440) by @sapphi-red
- jsx_import_meta tests to `ignoreReasons` due to architectural limitation (#7434) by @Copilot
- deps: update dependency oxlint-tsgolint to v0.8.5 (#7433) by @renovate[bot]
- update test dependencies automatically (#7432) by @sapphi-red
- remove unused code (#7420) by @IWANABETHATGUY
- add back `just update-esbuild-diff` and add it to CI (#7404) by @sapphi-red
- deps: update oxc-resolver to 11.15.0 (#7415) by @shulaoda
- deps: update rust crate napi to v3.7.0 (#7393) by @renovate[bot]
- fix esbuild compatibility metrics calculation (#7390) by @sapphi-red
- support `tsconfig: true` in rust tests (#7389) by @sapphi-red
- hide oxc runtime in snapshots (#7388) by @sapphi-red
- deps: update oxc to v0.102.0 (#7385) by @camc314
- improve esbuild tests to download snapshots automatically (#7378) by @sapphi-red
- deps: update dependency tinybench to v6 (#7371) by @renovate[bot]
- deps: update actions/checkout action to v6 (#7370) by @renovate[bot]
- deps: update rust crates (#7367) by @renovate[bot]
- deps: update dependency oxlint to v1.32.0 (#7374) by @renovate[bot]
- deps: update dependency oxlint-tsgolint to v0.8.4 (#7373) by @renovate[bot]
- node/test-dev-server: support using custom html file (#7357) by @hyf0
- test: setup browser-based e2e test for `test-dev-server` (#7351) by @hyf0
- pin pnpm to version 10.23.0 (#7369) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to v0.18.3 (#7372) by @renovate[bot]
- deps: update github-actions (#7365) by @renovate[bot]
- deps: update npm packages (#7366) by @renovate[bot]
- polish the comments about `SymbolRefFlags` (#7358) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to v0.18.2 (#7355) by @renovate[bot]
- fix esbuild test generation script (#7352) by @sapphi-red
- apply cargo shear suggestion (#7347) by @IWANABETHATGUY
- deps: update oxc to v11.15.0 (#7344) by @renovate[bot]
- deps: update dependency @napi-rs/cli to v3.5.0 (#7338) by @renovate[bot]
- deps: update dependency oxlint to v1.31.0 (#7305) by @renovate[bot]
- update rollup-tests results (#7333) by @sapphi-red
- update rollup-tests Rollup version (#7332) by @sapphi-red
- add ignore config for test262 submodule (#7326) by @Copilot

### ❤️ New Contributors

* @jakeparis made their first contribution in [#7331](#7331)

Co-authored-by: shulaoda <[email protected]>
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.

[Feature Request]: expose error information on JS API error object

3 participants