Skip to content

Commit 8a4dce6

Browse files
committed
feat: Support import.meta.filename/dirname/resolve
1 parent 39f82ff commit 8a4dce6

File tree

24 files changed

+1325
-55
lines changed

24 files changed

+1325
-55
lines changed

crates/node_binding/napi-binding.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2100,6 +2100,7 @@ export interface RawEnvironment {
21002100
optionalChaining?: boolean
21012101
templateLiteral?: boolean
21022102
dynamicImportInWorker?: boolean
2103+
importMetaDirnameAndFilename?: boolean
21032104
}
21042105

21052106
export interface RawEsmLibraryPlugin {

crates/rspack/tests/snapshots/defaults__default_options.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ CompilerOptions {
140140
dynamic_import_in_worker: Some(
141141
false,
142142
),
143+
import_meta_dirname_and_filename: None,
143144
},
144145
compare_before_emit: true,
145146
},

crates/rspack_binding_api/src/raw_options/raw_output.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ pub struct RawEnvironment {
5858
pub optional_chaining: Option<bool>,
5959
pub template_literal: Option<bool>,
6060
pub dynamic_import_in_worker: Option<bool>,
61+
pub import_meta_dirname_and_filename: Option<bool>,
6162
}
6263

6364
impl From<RawEnvironment> for Environment {
@@ -78,6 +79,7 @@ impl From<RawEnvironment> for Environment {
7879
optional_chaining: value.optional_chaining,
7980
template_literal: value.template_literal,
8081
dynamic_import_in_worker: value.dynamic_import_in_worker,
82+
import_meta_dirname_and_filename: value.import_meta_dirname_and_filename,
8183
}
8284
}
8385
}

crates/rspack_core/src/dependency/dependency_type.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ pub enum DependencyType {
7373
ImportContext,
7474
// import.meta.webpackContext
7575
ImportMetaContext,
76+
// import.meta.resolve
77+
ImportMetaResolve,
7678
// commonjs require context
7779
CommonJSRequireContext,
7880
// require.context
@@ -177,6 +179,7 @@ impl DependencyType {
177179
DependencyType::ExportInfoApi => "export info api",
178180
// TODO: mode
179181
DependencyType::ImportMetaContext => "import.meta context",
182+
DependencyType::ImportMetaResolve => "import.meta.resolve",
180183
DependencyType::ContainerExposed => "container exposed",
181184
DependencyType::ContainerEntry => "container entry",
182185
DependencyType::DllEntry => "dll entry",

crates/rspack_core/src/options/output.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@ pub struct Environment {
533533
pub optional_chaining: Option<bool>,
534534
pub template_literal: Option<bool>,
535535
pub dynamic_import_in_worker: Option<bool>,
536+
pub import_meta_dirname_and_filename: Option<bool>,
536537
}
537538

538539
impl Environment {

crates/rspack_plugin_circular_dependencies/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ impl AggregatedDependency {
108108
| DependencyType::LazyImport
109109
| DependencyType::ImportMetaHotAccept
110110
| DependencyType::ImportMetaHotDecline
111+
| DependencyType::ImportMetaResolve
111112
| DependencyType::ModuleHotAccept
112113
| DependencyType::ModuleHotDecline
113114
| DependencyType::RequireResolve
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
use rspack_cacheable::{cacheable, cacheable_dyn};
2+
use rspack_core::{
3+
AsContextDependency, Dependency, DependencyCategory, DependencyCodeGeneration, DependencyId,
4+
DependencyRange, DependencyTemplate, DependencyTemplateType, DependencyType,
5+
ExtendedReferencedExport, FactorizeInfo, ModuleDependency, ModuleGraph, ModuleGraphCacheArtifact,
6+
RuntimeSpec, TemplateContext, TemplateReplaceSource,
7+
};
8+
9+
#[cacheable]
10+
#[derive(Debug, Clone)]
11+
pub struct ImportMetaResolveDependency {
12+
pub id: DependencyId,
13+
pub request: String,
14+
range: DependencyRange,
15+
optional: bool,
16+
factorize_info: FactorizeInfo,
17+
}
18+
19+
impl ImportMetaResolveDependency {
20+
pub fn new(request: String, range: DependencyRange, optional: bool) -> Self {
21+
Self {
22+
range,
23+
request,
24+
optional,
25+
id: DependencyId::new(),
26+
factorize_info: Default::default(),
27+
}
28+
}
29+
}
30+
31+
#[cacheable_dyn]
32+
impl Dependency for ImportMetaResolveDependency {
33+
fn id(&self) -> &DependencyId {
34+
&self.id
35+
}
36+
37+
fn category(&self) -> &DependencyCategory {
38+
&DependencyCategory::Esm
39+
}
40+
41+
fn dependency_type(&self) -> &DependencyType {
42+
&DependencyType::ImportMetaResolve
43+
}
44+
45+
fn range(&self) -> Option<DependencyRange> {
46+
Some(self.range)
47+
}
48+
49+
fn get_referenced_exports(
50+
&self,
51+
_module_graph: &ModuleGraph,
52+
_module_graph_cache: &ModuleGraphCacheArtifact,
53+
_runtime: Option<&RuntimeSpec>,
54+
) -> Vec<ExtendedReferencedExport> {
55+
vec![]
56+
}
57+
58+
fn could_affect_referencing_module(&self) -> rspack_core::AffectType {
59+
rspack_core::AffectType::True
60+
}
61+
}
62+
63+
#[cacheable_dyn]
64+
impl ModuleDependency for ImportMetaResolveDependency {
65+
fn request(&self) -> &str {
66+
&self.request
67+
}
68+
69+
fn user_request(&self) -> &str {
70+
&self.request
71+
}
72+
73+
fn get_optional(&self) -> bool {
74+
self.optional
75+
}
76+
77+
fn factorize_info(&self) -> &FactorizeInfo {
78+
&self.factorize_info
79+
}
80+
81+
fn factorize_info_mut(&mut self) -> &mut FactorizeInfo {
82+
&mut self.factorize_info
83+
}
84+
}
85+
86+
#[cacheable_dyn]
87+
impl DependencyCodeGeneration for ImportMetaResolveDependency {
88+
fn dependency_template(&self) -> Option<DependencyTemplateType> {
89+
Some(ImportMetaResolveDependencyTemplate::template_type())
90+
}
91+
}
92+
93+
impl AsContextDependency for ImportMetaResolveDependency {}
94+
95+
#[cacheable]
96+
#[derive(Debug, Clone, Default)]
97+
pub struct ImportMetaResolveDependencyTemplate;
98+
99+
impl ImportMetaResolveDependencyTemplate {
100+
pub fn template_type() -> DependencyTemplateType {
101+
DependencyTemplateType::Dependency(DependencyType::ImportMetaResolve)
102+
}
103+
}
104+
105+
impl DependencyTemplate for ImportMetaResolveDependencyTemplate {
106+
fn render(
107+
&self,
108+
dep: &dyn DependencyCodeGeneration,
109+
source: &mut TemplateReplaceSource,
110+
code_generatable_context: &mut TemplateContext,
111+
) {
112+
let dep = dep
113+
.as_any()
114+
.downcast_ref::<ImportMetaResolveDependency>()
115+
.expect(
116+
"ImportMetaResolveDependencyTemplate should only be used for ImportMetaResolveDependency",
117+
);
118+
119+
source.replace(
120+
dep.range.start,
121+
dep.range.end,
122+
code_generatable_context
123+
.compilation
124+
.runtime_template
125+
.module_id(
126+
code_generatable_context.compilation,
127+
&dep.id,
128+
&dep.request,
129+
false,
130+
)
131+
.as_str(),
132+
None,
133+
);
134+
}
135+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use rspack_cacheable::{cacheable, cacheable_dyn, with::Skip};
2+
use rspack_core::{
3+
AffectType, AsContextDependency, AsModuleDependency, Dependency, DependencyCodeGeneration,
4+
DependencyId, DependencyLocation, DependencyRange, DependencyTemplate, DependencyTemplateType,
5+
SharedSourceMap, TemplateContext, TemplateReplaceSource,
6+
};
7+
8+
#[cacheable]
9+
#[derive(Debug, Clone)]
10+
pub struct ImportMetaResolveHeaderDependency {
11+
id: DependencyId,
12+
range: DependencyRange,
13+
#[cacheable(with=Skip)]
14+
source_map: Option<SharedSourceMap>,
15+
}
16+
17+
impl ImportMetaResolveHeaderDependency {
18+
pub fn new(range: DependencyRange, source_map: Option<SharedSourceMap>) -> Self {
19+
Self {
20+
id: DependencyId::new(),
21+
range,
22+
source_map,
23+
}
24+
}
25+
}
26+
27+
#[cacheable_dyn]
28+
impl Dependency for ImportMetaResolveHeaderDependency {
29+
fn id(&self) -> &DependencyId {
30+
&self.id
31+
}
32+
33+
fn loc(&self) -> Option<DependencyLocation> {
34+
self.range.to_loc(self.source_map.as_ref())
35+
}
36+
37+
fn could_affect_referencing_module(&self) -> AffectType {
38+
AffectType::False
39+
}
40+
}
41+
42+
impl AsModuleDependency for ImportMetaResolveHeaderDependency {}
43+
impl AsContextDependency for ImportMetaResolveHeaderDependency {}
44+
45+
#[cacheable_dyn]
46+
impl DependencyCodeGeneration for ImportMetaResolveHeaderDependency {
47+
fn dependency_template(&self) -> Option<DependencyTemplateType> {
48+
Some(ImportMetaResolveHeaderDependencyTemplate::template_type())
49+
}
50+
}
51+
52+
#[cacheable]
53+
#[derive(Debug, Clone, Default)]
54+
pub struct ImportMetaResolveHeaderDependencyTemplate;
55+
56+
impl ImportMetaResolveHeaderDependencyTemplate {
57+
pub fn template_type() -> DependencyTemplateType {
58+
DependencyTemplateType::Custom("ImportMetaResolveHeaderDependency")
59+
}
60+
}
61+
62+
impl DependencyTemplate for ImportMetaResolveHeaderDependencyTemplate {
63+
fn render(
64+
&self,
65+
dep: &dyn DependencyCodeGeneration,
66+
source: &mut TemplateReplaceSource,
67+
_code_generatable_context: &mut TemplateContext,
68+
) {
69+
let dep = dep
70+
.as_any()
71+
.downcast_ref::<ImportMetaResolveHeaderDependency>()
72+
.expect("ImportMetaResolveHeaderDependencyTemplate should only be used for ImportMetaResolveHeaderDependency");
73+
74+
source.replace(
75+
dep.range.start,
76+
dep.range.end,
77+
"/*import.meta.resolve*/",
78+
None,
79+
);
80+
}
81+
}

crates/rspack_plugin_javascript/src/dependency/esm/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ mod esm_import_specifier_dependency;
88
mod external_module_dependency;
99
mod import_dependency;
1010
mod import_eager_dependency;
11+
mod import_meta_resolve_dependency;
12+
mod import_meta_resolve_header_dependency;
1113
mod provide_dependency;
1214

1315
use rspack_core::{DependencyCategory, ImportAttributes, ResourceIdentifier};
@@ -36,6 +38,12 @@ pub use self::{
3638
external_module_dependency::{ExternalModuleDependency, ExternalModuleDependencyTemplate},
3739
import_dependency::{ImportDependency, ImportDependencyTemplate},
3840
import_eager_dependency::{ImportEagerDependency, ImportEagerDependencyTemplate},
41+
import_meta_resolve_dependency::{
42+
ImportMetaResolveDependency, ImportMetaResolveDependencyTemplate,
43+
},
44+
import_meta_resolve_header_dependency::{
45+
ImportMetaResolveHeaderDependency, ImportMetaResolveHeaderDependencyTemplate,
46+
},
3947
provide_dependency::{ProvideDependency, ProvideDependencyTemplate},
4048
};
4149

0 commit comments

Comments
 (0)