Skip to content

Commit ed6f627

Browse files
authored
feat: module error js api (#14351)
1 parent c4425f1 commit ed6f627

4 files changed

Lines changed: 62 additions & 34 deletions

File tree

crates/node_binding/napi-binding.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export interface NormalModule extends Module {
6969
readonly loaders: JsLoaderItem[];
7070
get matchResource(): string | undefined;
7171
set matchResource(val: string | undefined);
72+
get error(): RspackError | undefined;
7273
}
7374

7475
export interface ConcatenatedModule extends Module {

crates/node_binding/scripts/banner.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export interface NormalModule extends Module {
6969
readonly loaders: JsLoaderItem[];
7070
get matchResource(): string | undefined;
7171
set matchResource(val: string | undefined);
72+
get error(): RspackError | undefined;
7273
}
7374

7475
export interface ConcatenatedModule extends Module {

crates/rspack_binding_api/src/modules/normal_module.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ use napi::{
33
bindgen_prelude::{FromNapiMutRef, Object, ToNapiValue},
44
};
55
use rspack_core::{ResourceData, ResourceParsedData, parse_resource};
6+
use rspack_error::Diagnosable;
67

78
use crate::{
9+
diagnostic,
10+
error::RspackError,
811
impl_module_methods,
912
module::{MODULE_PROPERTIES_BUFFER, Module},
1013
plugins::JsLoaderItem,
@@ -86,6 +89,22 @@ impl NormalModule {
8689
Ok(())
8790
}
8891

92+
#[js_function]
93+
fn error_getter(ctx: CallContext<'_>) -> napi::Result<Either<RspackError, ()>> {
94+
let this = ctx.this_unchecked::<JsObject>();
95+
let env = ctx.env.raw();
96+
let wrapped_value = unsafe { NormalModule::from_napi_mut_ref(env, this.raw())? };
97+
98+
let (compilation, module) = wrapped_value.as_ref()?;
99+
Ok(match module.first_error() {
100+
Some(diagnostic) => Either::A(RspackError::try_from_diagnostic(
101+
compilation,
102+
diagnostic.as_ref(),
103+
)?),
104+
None => Either::B(()),
105+
})
106+
}
107+
89108
MODULE_PROPERTIES_BUFFER.with(|ref_cell| {
90109
let mut properties = ref_cell.borrow_mut();
91110
properties.clear();
@@ -126,6 +145,12 @@ impl NormalModule {
126145
.with_getter(match_resource_getter)
127146
.with_setter(match_resource_setter),
128147
);
148+
// Info from Build
149+
properties.push(
150+
napi::Property::new()
151+
.with_utf8_name("error")?
152+
.with_getter(error_getter),
153+
);
129154
Self::new_inherited(self, env, &mut properties)
130155
})
131156
}

tests/rspack-test/errorCases/warning-write.js

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,40 @@ module.exports = {
2121
},
2222
async check() {
2323
expect(warnings).toMatchInlineSnapshot(`
24-
Array [
25-
Object {
26-
error: Object {
27-
"message": "Unsupported feature: require.main.require() is not supported by Rspack.",
28-
"name": "Error",
29-
"stack": undefined,
30-
},
31-
index: 0,
32-
module: NormalModule {
33-
buildInfo: KnownBuildInfo {},
34-
buildMeta: Object {},
35-
context: <TEST_ROOT>/fixtures/errors,
36-
factoryMeta: Object {},
37-
layer: undefined,
38-
loaders: Array [],
39-
matchResource: undefined,
40-
rawRequest: ./require.main.require,
41-
request: <TEST_ROOT>/fixtures/errors/require.main.require.js,
42-
resource: <TEST_ROOT>/fixtures/errors/require.main.require.js,
43-
resourceResolveData: ReadonlyResourceData {
44-
fragment: ,
45-
path: <TEST_ROOT>/fixtures/errors/require.main.require.js,
46-
query: ,
47-
resource: <TEST_ROOT>/fixtures/errors/require.main.require.js,
48-
},
49-
type: javascript/auto,
50-
useSimpleSourceMap: false,
51-
useSourceMap: false,
52-
userRequest: <TEST_ROOT>/fixtures/errors/require.main.require.js,
53-
},
54-
name: ModuleParseWarning,
55-
},
56-
]
57-
`);
24+
Array [
25+
Object {
26+
error: Object {
27+
"message": "Unsupported feature: require.main.require() is not supported by Rspack.",
28+
"name": "Error",
29+
"stack": undefined,
30+
},
31+
index: 0,
32+
module: NormalModule {
33+
buildInfo: KnownBuildInfo {},
34+
buildMeta: Object {},
35+
context: <TEST_ROOT>/fixtures/errors,
36+
error: undefined,
37+
factoryMeta: Object {},
38+
layer: undefined,
39+
loaders: Array [],
40+
matchResource: undefined,
41+
rawRequest: ./require.main.require,
42+
request: <TEST_ROOT>/fixtures/errors/require.main.require.js,
43+
resource: <TEST_ROOT>/fixtures/errors/require.main.require.js,
44+
resourceResolveData: ReadonlyResourceData {
45+
fragment: ,
46+
path: <TEST_ROOT>/fixtures/errors/require.main.require.js,
47+
query: ,
48+
resource: <TEST_ROOT>/fixtures/errors/require.main.require.js,
49+
},
50+
type: javascript/auto,
51+
useSimpleSourceMap: false,
52+
useSourceMap: false,
53+
userRequest: <TEST_ROOT>/fixtures/errors/require.main.require.js,
54+
},
55+
name: ModuleParseWarning,
56+
},
57+
]
58+
`);
5859
}
5960
};

0 commit comments

Comments
 (0)