Skip to content

Commit c0c1ace

Browse files
committed
refactor(rust/binding): use BindingError to cover JsError and NativeError (#6388)
1 parent f1930ab commit c0c1ace

File tree

7 files changed

+42
-40
lines changed

7 files changed

+42
-40
lines changed

crates/rolldown_binding/src/options/plugin/binding_plugin_options.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::types::{
88
binding_normalized_options::BindingNormalizedOptions,
99
binding_outputs::{BindingOutputs, JsChangedOutputs},
1010
binding_rendered_chunk::BindingRenderedChunk,
11-
error::native_error::NativeError,
11+
error::BindingError,
1212
js_callback::MaybeAsyncJsCallback,
1313
};
1414

@@ -97,13 +97,10 @@ pub struct BindingPluginOptions {
9797
pub module_parsed_meta: Option<BindingPluginHookMeta>,
9898

9999
#[napi(
100-
ts_type = "(ctx: BindingPluginContext, error?: (Error | NativeError)[]) => MaybePromise<VoidNullable>"
100+
ts_type = "(ctx: BindingPluginContext, error?: BindingError[]) => MaybePromise<VoidNullable>"
101101
)]
102-
pub build_end: Option<
103-
MaybeAsyncJsCallback<
104-
FnArgs<(BindingPluginContext, Option<Vec<napi::Either<napi::JsError, NativeError>>>)>,
105-
>,
106-
>,
102+
pub build_end:
103+
Option<MaybeAsyncJsCallback<FnArgs<(BindingPluginContext, Option<Vec<BindingError>>)>>>,
107104
pub build_end_meta: Option<BindingPluginHookMeta>,
108105

109106
#[napi(
@@ -137,12 +134,8 @@ pub struct BindingPluginOptions {
137134
Option<MaybeAsyncJsCallback<FnArgs<(BindingPluginContext, BindingNormalizedOptions)>>>,
138135
pub render_start_meta: Option<BindingPluginHookMeta>,
139136

140-
#[napi(ts_type = "(ctx: BindingPluginContext, error: (Error | NativeError)[]) => void")]
141-
pub render_error: Option<
142-
MaybeAsyncJsCallback<
143-
FnArgs<(BindingPluginContext, Vec<napi::Either<napi::JsError, NativeError>>)>,
144-
>,
145-
>,
137+
#[napi(ts_type = "(ctx: BindingPluginContext, error: BindingError[]) => void")]
138+
pub render_error: Option<MaybeAsyncJsCallback<FnArgs<(BindingPluginContext, Vec<BindingError>)>>>,
146139
pub render_error_meta: Option<BindingPluginHookMeta>,
147140

148141
#[napi(

crates/rolldown_binding/src/types/binding_hmr_output.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use napi_derive::napi;
22
use rolldown_error::BuildDiagnostic;
33

4-
use crate::types::{binding_outputs::to_js_diagnostic, error::native_error::NativeError};
4+
use crate::types::{binding_outputs::to_js_diagnostic, error::BindingError};
55

66
#[napi]
77
#[derive(Debug)]
@@ -25,7 +25,7 @@ impl BindingHmrOutput {
2525
}
2626

2727
#[napi(getter)]
28-
pub fn errors(&mut self) -> Vec<napi::Either<napi::JsError, NativeError>> {
28+
pub fn errors(&mut self) -> Vec<BindingError> {
2929
if let Some(rolldown_common::OutputsDiagnostics { diagnostics, cwd }) = self.errors.as_ref() {
3030
return diagnostics
3131
.iter()
@@ -121,7 +121,7 @@ impl From<rolldown_common::ClientHmrUpdate> for BindingClientHmrUpdate {
121121
#[napi(discriminant = "type", object_from_js = false)]
122122
pub enum BindingGenerateHmrPatchReturn {
123123
Ok(Vec<BindingHmrUpdate>),
124-
Error(Vec<napi::Either<napi::JsError, NativeError>>),
124+
Error(Vec<BindingError>),
125125
}
126126

127127
impl BindingGenerateHmrPatchReturn {

crates/rolldown_binding/src/types/binding_outputs.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{
66
use super::{
77
binding_output_asset::{BindingOutputAsset, JsOutputAsset},
88
binding_output_chunk::{BindingOutputChunk, JsOutputChunk, update_output_chunk},
9-
error::native_error::NativeError,
9+
error::BindingError,
1010
};
1111
use napi::Either;
1212
use napi_derive::napi;
@@ -38,7 +38,7 @@ impl BindingOutputs {
3838
}
3939

4040
#[napi(getter)]
41-
pub fn errors(&mut self) -> Vec<napi::Either<napi::JsError, NativeError>> {
41+
pub fn errors(&mut self) -> Vec<BindingError> {
4242
if let Some(rolldown_common::OutputsDiagnostics { diagnostics, cwd }) = self.error.as_ref() {
4343
return diagnostics
4444
.iter()
@@ -111,10 +111,7 @@ impl JsChangedOutputs {
111111
}
112112
}
113113

114-
pub fn to_js_diagnostic(
115-
diagnostic: &BuildDiagnostic,
116-
cwd: std::path::PathBuf,
117-
) -> napi::Either<napi::JsError, NativeError> {
114+
pub fn to_js_diagnostic(diagnostic: &BuildDiagnostic, cwd: std::path::PathBuf) -> BindingError {
118115
match diagnostic.downcast_napi_error() {
119116
Ok(napi_error) => {
120117
// Note: In WASM workers, napi::Error objects with maybe_raw/maybe_env references cannot be
@@ -125,15 +122,15 @@ pub fn to_js_diagnostic(
125122
#[cfg(not(target_family = "wasm"))]
126123
{
127124
let error = napi_error.try_clone().unwrap_or_else(|e| e);
128-
napi::Either::A(napi::JsError::from(error))
125+
BindingError::JsError(napi::JsError::from(error))
129126
}
130127
#[cfg(target_family = "wasm")]
131128
{
132129
let error = napi::Error::new(napi_error.status, napi_error.reason.clone());
133-
napi::Either::A(napi::JsError::from(error))
130+
BindingError::JsError(napi::JsError::from(error))
134131
}
135132
}
136-
Err(error) => napi::Either::B(NativeError {
133+
Err(error) => BindingError::NativeError(super::error::native_error::NativeError {
137134
kind: error.kind().to_string(),
138135
message: error.to_diagnostic_with(&DiagnosticOptions { cwd }).to_color_string(),
139136
}),

crates/rolldown_binding/src/types/binding_watcher_event.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::sync::Arc;
33
use napi::tokio::sync::Mutex;
44
use napi_derive::napi;
55

6-
use super::{binding_outputs::to_js_diagnostic, error::native_error::NativeError};
6+
use super::{binding_outputs::to_js_diagnostic, error::BindingError};
77
use rolldown::{BundleEvent, Bundler, WatcherEvent};
88

99
#[napi]
@@ -100,7 +100,7 @@ impl BindingBundleEndEventData {
100100

101101
#[napi]
102102
pub struct BindingBundleErrorEventData {
103-
error: Vec<napi::Either<napi::JsError, NativeError>>,
103+
error: Vec<BindingError>,
104104
result: Arc<Mutex<Bundler>>,
105105
}
106106

@@ -112,7 +112,7 @@ impl BindingBundleErrorEventData {
112112
}
113113

114114
#[napi(getter)]
115-
pub fn error(&mut self) -> Vec<napi::Either<napi::JsError, NativeError>> {
115+
pub fn error(&mut self) -> Vec<BindingError> {
116116
std::mem::take(&mut self.error)
117117
}
118118
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
11
pub mod native_error;
2+
3+
pub use native_error::NativeError;
4+
5+
#[napi_derive::napi(discriminant = "type", object_from_js = false)]
6+
pub enum BindingError {
7+
JsError(napi::JsError),
8+
NativeError(NativeError),
9+
}

packages/rolldown/src/binding.d.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,7 +1269,7 @@ export declare class BindingBundleEndEventData {
12691269

12701270
export declare class BindingBundleErrorEventData {
12711271
get result(): BindingBundlerImpl
1272-
get error(): Array<Error | NativeError>
1272+
get error(): Array<BindingError>
12731273
}
12741274

12751275
export declare class BindingBundler {
@@ -1317,7 +1317,7 @@ export declare class BindingDevEngine {
13171317

13181318
export declare class BindingHmrOutput {
13191319
get patch(): BindingHmrUpdate | null
1320-
get errors(): Array<Error | NativeError>
1320+
get errors(): Array<BindingError>
13211321
}
13221322

13231323
export declare class BindingMagicString {
@@ -1416,7 +1416,7 @@ export declare class BindingOutputChunk {
14161416
export declare class BindingOutputs {
14171417
get chunks(): Array<BindingOutputChunk>
14181418
get assets(): Array<BindingOutputAsset>
1419-
get errors(): Array<Error | NativeError>
1419+
get errors(): Array<BindingError>
14201420
}
14211421

14221422
export declare class BindingPluginContext {
@@ -1651,6 +1651,10 @@ export interface BindingEmittedChunk {
16511651
preserveEntrySignatures?: BindingPreserveEntrySignatures
16521652
}
16531653

1654+
export type BindingError =
1655+
| { type: 'JsError', field0: Error }
1656+
| { type: 'NativeError', field0: NativeError }
1657+
16541658
export interface BindingEsmExternalRequirePluginConfig {
16551659
external: Array<BindingStringOrRegex>
16561660
skipDuplicateCheck?: boolean
@@ -1688,7 +1692,7 @@ export interface BindingGeneratedCodeOptions {
16881692

16891693
export type BindingGenerateHmrPatchReturn =
16901694
| { type: 'Ok', field0: Array<BindingHmrUpdate> }
1691-
| { type: 'Error', field0: Array<Error | NativeError> }
1695+
| { type: 'Error', field0: Array<BindingError> }
16921696

16931697
export interface BindingHmrBoundaryOutput {
16941698
boundary: string
@@ -2014,7 +2018,7 @@ export interface BindingPluginOptions {
20142018
transformFilter?: BindingHookFilter
20152019
moduleParsed?: (ctx: BindingPluginContext, module: BindingModuleInfo) => MaybePromise<VoidNullable>
20162020
moduleParsedMeta?: BindingPluginHookMeta
2017-
buildEnd?: (ctx: BindingPluginContext, error?: (Error | NativeError)[]) => MaybePromise<VoidNullable>
2021+
buildEnd?: (ctx: BindingPluginContext, error?: BindingError[]) => MaybePromise<VoidNullable>
20182022
buildEndMeta?: BindingPluginHookMeta
20192023
renderChunk?: (ctx: BindingPluginContext, code: string, chunk: BindingRenderedChunk, opts: BindingNormalizedOptions, meta: BindingRenderedChunkMeta) => MaybePromise<VoidNullable<BindingHookRenderChunkOutput>>
20202024
renderChunkMeta?: BindingPluginHookMeta
@@ -2023,7 +2027,7 @@ export interface BindingPluginOptions {
20232027
augmentChunkHashMeta?: BindingPluginHookMeta
20242028
renderStart?: (ctx: BindingPluginContext, opts: BindingNormalizedOptions) => void
20252029
renderStartMeta?: BindingPluginHookMeta
2026-
renderError?: (ctx: BindingPluginContext, error: (Error | NativeError)[]) => void
2030+
renderError?: (ctx: BindingPluginContext, error: BindingError[]) => void
20272031
renderErrorMeta?: BindingPluginHookMeta
20282032
generateBundle?: (ctx: BindingPluginContext, bundle: BindingOutputs, isWrite: boolean, opts: BindingNormalizedOptions) => MaybePromise<VoidNullable<JsChangedOutputs>>
20292033
generateBundleMeta?: BindingPluginHookMeta

packages/rolldown/src/utils/error.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { type NativeError } from '../binding';
1+
import { type BindingError } from '../binding';
22
import type { RollupError } from '../log/logging';
33

4-
export function normalizeErrors(rawErrors: (NativeError | Error)[]): Error {
4+
export function normalizeErrors(rawErrors: BindingError[]): Error {
55
const errors = rawErrors.map((e) =>
6-
e instanceof Error
7-
? e
6+
e.type === 'JsError'
7+
? e.field0
88
// strip stacktrace of errors from native diagnostics
99
: Object.assign(new Error(), {
10-
kind: e.kind,
11-
message: e.message,
10+
kind: e.field0.kind,
11+
message: e.field0.message,
1212
stack: undefined,
1313
})
1414
);

0 commit comments

Comments
 (0)