Skip to content

Commit 37f633e

Browse files
authored
feat: simplify mock logic, dynamic import based hoist (#11521)
1 parent 053f7d6 commit 37f633e

File tree

4 files changed

+155
-233
lines changed

4 files changed

+155
-233
lines changed

crates/rspack_plugin_rstest/src/mock_method_dependency.rs

Lines changed: 22 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
use rspack_cacheable::{cacheable, cacheable_dyn, with::Skip};
22
use rspack_core::{
3-
AsContextDependency, AsModuleDependency, ConditionalInitFragment, DependencyCodeGeneration,
4-
DependencyId, DependencyRange, DependencyTemplate, DependencyTemplateType, DependencyType,
5-
InitFragmentExt, InitFragmentKey, InitFragmentStage, NormalInitFragment, RuntimeCondition,
6-
TemplateContext, TemplateReplaceSource, import_statement,
3+
AsContextDependency, AsModuleDependency, DependencyCodeGeneration, DependencyRange,
4+
DependencyTemplate, DependencyTemplateType, DependencyType, InitFragmentExt, InitFragmentKey,
5+
InitFragmentStage, NormalInitFragment, TemplateContext, TemplateReplaceSource,
76
};
87
use swc_core::common::Span;
98

10-
#[cacheable]
11-
#[derive(Debug, Clone)]
12-
pub enum Position {
13-
Before,
14-
After,
15-
}
16-
179
#[cacheable]
1810
#[derive(Debug, Clone)]
1911
pub struct MockMethodDependency {
@@ -24,16 +16,18 @@ pub struct MockMethodDependency {
2416
request: String,
2517
hoist: bool,
2618
method: MockMethod,
27-
module_dep_id: Option<DependencyId>,
28-
position: Position,
2919
}
3020

3121
#[cacheable]
3222
#[derive(Debug, Clone, PartialEq, Eq)]
23+
#[allow(dead_code)]
3324
pub enum MockMethod {
3425
Mock,
3526
DoMock,
27+
MockRequire,
28+
DoMockRequire,
3629
Unmock,
30+
DoUnmock,
3731
Hoisted,
3832
}
3933

@@ -44,17 +38,13 @@ impl MockMethodDependency {
4438
request: String,
4539
hoist: bool,
4640
method: MockMethod,
47-
module_dep_id: Option<DependencyId>,
48-
position: Position,
4941
) -> Self {
5042
Self {
5143
call_expr_span,
5244
callee_span,
5345
request,
5446
hoist,
5547
method,
56-
module_dep_id,
57-
position,
5848
}
5949
}
6050
}
@@ -86,14 +76,7 @@ impl DependencyTemplate for MockMethodDependencyTemplate {
8676
source: &mut TemplateReplaceSource,
8777
code_generatable_context: &mut TemplateContext,
8878
) {
89-
let TemplateContext {
90-
module,
91-
runtime_requirements,
92-
compilation,
93-
init_fragments,
94-
runtime,
95-
..
96-
} = code_generatable_context;
79+
let TemplateContext { init_fragments, .. } = code_generatable_context;
9780
let dep = dep
9881
.as_any()
9982
.downcast_ref::<MockMethodDependency>()
@@ -103,52 +86,33 @@ impl DependencyTemplate for MockMethodDependencyTemplate {
10386
let hoist_flag = match dep.method {
10487
MockMethod::Mock => "MOCK",
10588
MockMethod::DoMock => "", // won't be used.
89+
MockMethod::MockRequire => "MOCKREQUIRE",
90+
MockMethod::DoMockRequire => "", // won't be used.
10691
MockMethod::Unmock => "UNMOCK",
10792
MockMethod::Hoisted => "HOISTED",
93+
MockMethod::DoUnmock => "", // won't be used.
10894
};
10995

11096
let mock_method = match dep.method {
11197
MockMethod::Mock => "rstest_mock",
11298
MockMethod::DoMock => "rstest_do_mock",
99+
MockMethod::MockRequire => "rstest_mock_require",
100+
MockMethod::DoMockRequire => "rstest_do_mock_require",
113101
MockMethod::Unmock => "rstest_unmock",
114102
MockMethod::Hoisted => "rstest_hoisted",
103+
MockMethod::DoUnmock => "rstest_do_unmock",
115104
};
116105

117106
// Hoist placeholder init fragment.
118-
let init = NormalInitFragment::new(
119-
format!("/* RSTEST:{hoist_flag}_PLACEHOLDER:{request} */;"),
120-
InitFragmentStage::StageESMImports,
121-
match dep.position {
122-
Position::Before => 0,
123-
Position::After => i32::MAX - 1,
124-
},
125-
InitFragmentKey::Const(format!("rstest mock_hoist {request}")),
126-
None,
127-
);
128-
init_fragments.push(init.boxed());
129-
130-
if dep.method == MockMethod::Mock
131-
&& let Some(module_dep_id) = dep.module_dep_id
132-
{
133-
let content: (String, String) = import_statement(
134-
*module,
135-
*runtime,
136-
compilation,
137-
runtime_requirements,
138-
&module_dep_id,
139-
request,
140-
false,
141-
);
142-
143-
// Redeclaration init fragment.
144-
init_fragments.push(Box::new(ConditionalInitFragment::new(
145-
format!("{}{}", content.0, content.1),
146-
InitFragmentStage::StageAsyncESMImports,
147-
i32::MAX,
148-
InitFragmentKey::ESMImport(format!("{} {}", request, "mock")),
107+
if !hoist_flag.is_empty() {
108+
let init = NormalInitFragment::new(
109+
format!("/* RSTEST:{hoist_flag}_PLACEHOLDER:{request} */;"),
110+
InitFragmentStage::StageESMImports,
111+
0,
112+
InitFragmentKey::Const(format!("rstest mock_hoist {request}")),
149113
None,
150-
RuntimeCondition::Boolean(true),
151-
)));
114+
);
115+
init_fragments.push(init.boxed());
152116
}
153117

154118
// Start before hoist.

crates/rspack_plugin_rstest/src/mock_module_id_dependency.rs

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use rspack_cacheable::{cacheable, cacheable_dyn};
22
use rspack_core::{
3-
AsContextDependency, ConditionalInitFragment, Dependency, DependencyCategory,
4-
DependencyCodeGeneration, DependencyId, DependencyRange, DependencyTemplate,
5-
DependencyTemplateType, DependencyType, ExtendedReferencedExport, FactorizeInfo, InitFragmentKey,
6-
InitFragmentStage, ModuleDependency, ModuleGraph, ModuleGraphCacheArtifact, RuntimeCondition,
3+
AsContextDependency, Dependency, DependencyCategory, DependencyCodeGeneration, DependencyId,
4+
DependencyRange, DependencyTemplate, DependencyTemplateType, DependencyType,
5+
ExtendedReferencedExport, FactorizeInfo, ModuleDependency, ModuleGraph, ModuleGraphCacheArtifact,
76
RuntimeSpec, TemplateContext, TemplateReplaceSource,
87
};
98

@@ -20,8 +19,6 @@ pub struct MockModuleIdDependency {
2019
factorize_info: FactorizeInfo,
2120
category: DependencyCategory,
2221
pub suffix: Option<String>,
23-
hoist: bool,
24-
await_factory: bool,
2522
}
2623

2724
#[allow(clippy::too_many_arguments)]
@@ -33,8 +30,6 @@ impl MockModuleIdDependency {
3330
optional: bool,
3431
category: DependencyCategory,
3532
suffix: Option<String>,
36-
hoist: bool,
37-
async_factory: bool,
3833
) -> Self {
3934
Self {
4035
range,
@@ -45,8 +40,6 @@ impl MockModuleIdDependency {
4540
factorize_info: Default::default(),
4641
category,
4742
suffix,
48-
hoist,
49-
await_factory: async_factory,
5043
}
5144
}
5245
}
@@ -136,8 +129,6 @@ impl DependencyTemplate for MockModuleIdDependencyTemplate {
136129
source: &mut TemplateReplaceSource,
137130
code_generatable_context: &mut TemplateContext,
138131
) {
139-
let TemplateContext { init_fragments, .. } = code_generatable_context;
140-
141132
let dep = dep
142133
.as_any()
143134
.downcast_ref::<MockModuleIdDependency>()
@@ -150,18 +141,6 @@ impl DependencyTemplate for MockModuleIdDependencyTemplate {
150141
dep.weak,
151142
);
152143

153-
if dep.hoist && dep.await_factory {
154-
// Await exec init fragment.
155-
init_fragments.push(Box::new(ConditionalInitFragment::new(
156-
format!("await __webpack_require__.rstest_exec({module_id})\n"),
157-
InitFragmentStage::StageAsyncESMImports,
158-
i32::MAX - 1,
159-
InitFragmentKey::ESMImport(format!("{}_{}", module_id, "mock")),
160-
None,
161-
RuntimeCondition::Boolean(true),
162-
)));
163-
}
164-
165144
source.replace(
166145
dep.range.start,
167146
dep.range.end,

0 commit comments

Comments
 (0)