Skip to content

Commit 6585bfa

Browse files
ahabhgkfi3ework
authored andcommitted
external function getResolve
fix get resolve # Conflicts: # crates/node_binding/binding.d.ts # crates/rspack_binding_options/src/options/raw_external.rs # crates/rspack_core/src/compiler/make/repair/factorize.rs # crates/rspack_core/src/compiler/module_executor/entry.rs # crates/rspack_core/src/context_module.rs # crates/rspack_core/src/module_factory.rs # crates/rspack_core/src/resolver/mod.rs # crates/rspack_plugin_externals/src/plugin.rs # packages/rspack/etc/api.md # packages/rspack/src/builtin-plugin/ExternalsPlugin.ts # packages/rspack/src/config/zod.ts
1 parent deb10b9 commit 6585bfa

File tree

23 files changed

+15583
-44
lines changed

23 files changed

+15583
-44
lines changed

crates/node_binding/binding.d.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,11 @@ export declare class JsStats {
205205
getLogging(acceptedTypes: number): Array<JsStatsLogging>
206206
}
207207

208+
export declare class RawExternalItemFnCtx {
209+
data(): RawExternalItemFnCtxData
210+
getResolver(): JsResolver
211+
}
212+
208213
export declare class Rspack {
209214
constructor(options: RawOptions, builtinPlugins: Array<BuiltinPlugin>, registerJsTaps: RegisterJsTaps, outputFilesystem: ThreadsafeNodeFS, resolverFactoryReference: JsResolverFactory)
210215
setNonSkippableRegisters(kinds: Array<RegisterJsTapKind>): void
@@ -1374,7 +1379,7 @@ export interface RawExposeOptions {
13741379
import: Array<string>
13751380
}
13761381

1377-
export interface RawExternalItemFnCtx {
1382+
export interface RawExternalItemFnCtxData {
13781383
request: string
13791384
context: string
13801385
dependencyType: string

crates/rspack_binding_options/src/options/raw_external.rs

+40-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
use std::collections::HashMap;
22
use std::fmt::Debug;
3+
use std::sync::Arc;
34

45
use napi::bindgen_prelude::Either4;
56
use napi_derive::napi;
6-
use rspack_core::ExternalItemFnCtx;
7+
use rspack_binding_values::JsResolver;
78
use rspack_core::{ExternalItem, ExternalItemFnResult, ExternalItemValue};
9+
use rspack_core::{ExternalItemFnCtx, ResolveOptionsWithDependencyType, ResolverFactory};
10+
// use rspack_napi::regexp::{JsRegExp, JsRegExpExt};
811
use rspack_napi::threadsafe_function::ThreadsafeFunction;
912
use rspack_regex::RspackRegex;
1013

@@ -68,15 +71,47 @@ pub struct ContextInfo {
6871
pub issuer: String,
6972
}
7073

71-
#[derive(Debug, Clone)]
72-
#[napi(object)]
74+
#[derive(Debug)]
75+
#[napi]
7376
pub struct RawExternalItemFnCtx {
77+
request: String,
78+
context: String,
79+
dependency_type: String,
80+
context_info: ContextInfo,
81+
resolve_options_with_dependency_type: ResolveOptionsWithDependencyType,
82+
resolver_factory: Arc<ResolverFactory>,
83+
}
84+
85+
#[derive(Debug)]
86+
#[napi(object)]
87+
pub struct RawExternalItemFnCtxData {
7488
pub request: String,
7589
pub context: String,
7690
pub dependency_type: String,
7791
pub context_info: ContextInfo,
7892
}
7993

94+
#[napi]
95+
impl RawExternalItemFnCtx {
96+
#[napi]
97+
pub fn data(&self) -> RawExternalItemFnCtxData {
98+
RawExternalItemFnCtxData {
99+
request: self.request.clone(),
100+
context: self.context.clone(),
101+
dependency_type: self.dependency_type.clone(),
102+
context_info: self.context_info.clone(),
103+
}
104+
}
105+
106+
#[napi]
107+
pub fn get_resolver(&self) -> JsResolver {
108+
JsResolver::new(
109+
self.resolver_factory.clone(),
110+
self.resolve_options_with_dependency_type.clone(),
111+
)
112+
}
113+
}
114+
80115
impl From<ExternalItemFnCtx> for RawExternalItemFnCtx {
81116
fn from(value: ExternalItemFnCtx) -> Self {
82117
Self {
@@ -86,6 +121,8 @@ impl From<ExternalItemFnCtx> for RawExternalItemFnCtx {
86121
context_info: ContextInfo {
87122
issuer: value.context_info.issuer,
88123
},
124+
resolve_options_with_dependency_type: value.resolve_options_with_dependency_type,
125+
resolver_factory: value.resolver_factory,
89126
}
90127
}
91128
}

crates/rspack_binding_values/src/resolver.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::raw_resolve::{
1010
};
1111

1212
#[napi]
13+
#[derive(Debug)]
1314
pub struct JsResolver {
1415
resolver_factory: Arc<ResolverFactory>,
1516
resolver: Arc<Resolver>,

crates/rspack_core/src/compiler/make/repair/factorize.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
utils::task_loop::{Task, TaskResult, TaskType},
1111
BoxDependency, CompilationId, CompilerOptions, Context, ExportInfoData, ExportsInfoData,
1212
ModuleFactory, ModuleFactoryCreateData, ModuleFactoryResult, ModuleIdentifier, ModuleLayer,
13-
ModuleProfile, Resolve,
13+
ModuleProfile, Resolve, ResolverFactory,
1414
};
1515

1616
#[derive(Debug)]
@@ -23,9 +23,10 @@ pub struct FactorizeTask {
2323
pub issuer: Option<Box<str>>,
2424
pub issuer_layer: Option<ModuleLayer>,
2525
pub dependencies: Vec<BoxDependency>,
26-
pub resolve_options: Option<Box<Resolve>>,
26+
pub resolve_options: Option<Arc<Resolve>>,
2727
pub options: Arc<CompilerOptions>,
2828
pub current_profile: Option<Box<ModuleProfile>>,
29+
pub resolver_factory: Arc<ResolverFactory>,
2930
}
3031

3132
#[async_trait::async_trait]
@@ -88,6 +89,7 @@ impl Task<MakeTaskContext> for FactorizeTask {
8889
issuer: self.issuer,
8990
issuer_identifier: self.original_module_identifier,
9091
issuer_layer,
92+
resolver_factory: self.resolver_factory,
9193

9294
file_dependencies: Default::default(),
9395
missing_dependencies: Default::default(),

crates/rspack_core/src/compiler/make/repair/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ pub async fn repair(
142142
resolve_options: parent_module.and_then(|module| module.get_resolve_options()),
143143
options: compilation.options.clone(),
144144
current_profile,
145+
resolver_factory: compilation.resolver_factory.clone(),
145146
}))
146147
})
147148
.collect::<Vec<_>>();

crates/rspack_core/src/compiler/make/repair/process_dependencies.rs

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ impl Task<MakeTaskContext> for ProcessDependenciesTask {
109109
resolve_options: module.get_resolve_options(),
110110
options: context.compiler_options.clone(),
111111
current_profile,
112+
resolver_factory: context.resolver_factory.clone(),
112113
}));
113114
}
114115
Ok(res)

crates/rspack_core/src/compiler/module_executor/entry.rs

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ impl Task<MakeTaskContext> for EntryTask {
4545
.compiler_options
4646
.profile
4747
.then(Box::<ModuleProfile>::default),
48+
resolver_factory: context.resolver_factory.clone(),
4849
})])
4950
}
5051
}

crates/rspack_core/src/concatenated_module.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub struct RootModuleContext {
6161
pub readable_identifier: String,
6262
pub name_for_condition: Option<Box<str>>,
6363
pub lib_indent: Option<String>,
64-
pub resolve_options: Option<Box<Resolve>>,
64+
pub resolve_options: Option<Arc<Resolve>>,
6565
pub code_generation_dependencies: Option<Vec<Box<dyn ModuleDependency>>>,
6666
pub presentational_dependencies: Option<Vec<Box<dyn DependencyTemplate>>>,
6767
pub context: Option<Context>,
@@ -1354,7 +1354,7 @@ impl Module for ConcatenatedModule {
13541354
self.root_module_ctxt.lib_indent.clone().map(Cow::Owned)
13551355
}
13561356

1357-
fn get_resolve_options(&self) -> Option<Box<Resolve>> {
1357+
fn get_resolve_options(&self) -> Option<Arc<Resolve>> {
13581358
self.root_module_ctxt.resolve_options.clone()
13591359
}
13601360

crates/rspack_core/src/context_module.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ pub struct ContextModuleOptions {
137137
pub resource_fragment: String,
138138
pub context_options: ContextOptions,
139139
pub layer: Option<ModuleLayer>,
140-
pub resolve_options: Option<Box<Resolve>>,
140+
pub resolve_options: Option<Arc<Resolve>>,
141141
pub type_prefix: ContextTypePrefix,
142142
}
143143

crates/rspack_core/src/context_module_factory.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,10 @@ impl ContextModuleFactory {
125125
tracing::trace!("resolving context module path {}", options.resource);
126126

127127
let resolver = &resolver_factory.get(ResolveOptionsWithDependencyType {
128-
resolve_options: options.resolve_options.clone(),
128+
resolve_options: options
129+
.resolve_options
130+
.clone()
131+
.map(|arc| Box::new(Arc::try_unwrap(arc).unwrap_or_else(|arc| (*arc).clone()))),
129132
resolve_to_context: false,
130133
dependency_category: options.context_options.category,
131134
});

crates/rspack_core/src/module.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ pub trait Module:
329329
/// Resolve options matched by module rules.
330330
/// e.g `javascript/esm` may have special resolving options like `fullySpecified`.
331331
/// `css` and `css/module` may have special resolving options like `preferRelative`.
332-
fn get_resolve_options(&self) -> Option<Box<Resolve>> {
332+
fn get_resolve_options(&self) -> Option<Arc<Resolve>> {
333333
None
334334
}
335335

crates/rspack_core/src/module_factory.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@ use rustc_hash::FxHashSet as HashSet;
55

66
use crate::{
77
BoxDependency, BoxModule, CompilationId, CompilerOptions, Context, ModuleIdentifier, ModuleLayer,
8-
Resolve,
8+
Resolve, ResolverFactory,
99
};
1010

1111
#[derive(Debug, Clone)]
1212
pub struct ModuleFactoryCreateData {
1313
pub compilation_id: CompilationId,
14-
pub resolve_options: Option<Box<Resolve>>,
14+
// pub resolve_options: Option<Box<Resolve>>,
15+
pub resolve_options: Option<Arc<Resolve>>,
1516
pub options: Arc<CompilerOptions>,
1617
pub context: Context,
1718
pub dependencies: Vec<BoxDependency>,
1819
pub issuer: Option<Box<str>>,
1920
pub issuer_identifier: Option<ModuleIdentifier>,
2021
pub issuer_layer: Option<ModuleLayer>,
22+
pub resolver_factory: Arc<ResolverFactory>,
2123

2224
pub file_dependencies: HashSet<PathBuf>,
2325
pub context_dependencies: HashSet<PathBuf>,

crates/rspack_core/src/normal_module.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ pub struct NormalModule {
127127
source: NormalModuleSource,
128128

129129
/// Resolve options derived from [Rule.resolve]
130-
resolve_options: Option<Box<Resolve>>,
130+
resolve_options: Option<Arc<Resolve>>,
131131
/// Parser options derived from [Rule.parser]
132132
parser_options: Option<ParserOptions>,
133133
/// Generator options derived from [Rule.generator]
@@ -197,7 +197,7 @@ impl NormalModule {
197197
generator_options: Option<GeneratorOptions>,
198198
match_resource: Option<ResourceData>,
199199
resource_data: Arc<ResourceData>,
200-
resolve_options: Option<Box<Resolve>>,
200+
resolve_options: Option<Arc<Resolve>>,
201201
loaders: Vec<BoxLoader>,
202202
) -> Self {
203203
let module_type = module_type.into();
@@ -693,7 +693,7 @@ impl Module for NormalModule {
693693
Some(Cow::Owned(ident))
694694
}
695695

696-
fn get_resolve_options(&self) -> Option<Box<Resolve>> {
696+
fn get_resolve_options(&self) -> Option<Arc<Resolve>> {
697697
self.resolve_options.clone()
698698
}
699699

crates/rspack_core/src/normal_module_factory.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ impl NormalModuleFactory {
329329
span: dependency_source_span,
330330
// take the options is safe here, because it
331331
// is not used in after_resolve hooks
332-
resolve_options: data.resolve_options.take(),
332+
resolve_options: data.resolve_options.clone(),
333333
resolve_to_context: false,
334334
optional: dependency_optional,
335335
file_dependencies: &mut file_dependencies,
@@ -641,7 +641,7 @@ impl NormalModuleFactory {
641641
Ok(rules)
642642
}
643643

644-
fn calculate_resolve_options(&self, module_rules: &[&ModuleRuleEffect]) -> Option<Box<Resolve>> {
644+
fn calculate_resolve_options(&self, module_rules: &[&ModuleRuleEffect]) -> Option<Arc<Resolve>> {
645645
let mut resolved: Option<Resolve> = None;
646646
for rule in module_rules {
647647
if let Some(rule_resolve) = &rule.resolve {
@@ -652,7 +652,7 @@ impl NormalModuleFactory {
652652
}
653653
}
654654
}
655-
resolved.map(Box::new)
655+
resolved.map(Arc::new)
656656
}
657657

658658
fn calculate_side_effects(&self, module_rules: &[&ModuleRuleEffect]) -> Option<bool> {

crates/rspack_core/src/options/externals.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
use std::fmt::Debug;
1+
use std::{fmt::Debug, sync::Arc};
22

33
use futures::future::BoxFuture;
44
use rspack_error::Result;
55
use rspack_regex::RspackRegex;
66
use rustc_hash::FxHashMap as HashMap;
77

8+
use crate::{ResolveOptionsWithDependencyType, ResolverFactory};
9+
810
pub type Externals = Vec<ExternalItem>;
911

1012
#[derive(Debug)]
@@ -26,6 +28,8 @@ pub struct ExternalItemFnCtx {
2628
pub context: String,
2729
pub dependency_type: String,
2830
pub context_info: ContextInfo,
31+
pub resolve_options_with_dependency_type: ResolveOptionsWithDependencyType,
32+
pub resolver_factory: Arc<ResolverFactory>,
2933
}
3034

3135
pub struct ExternalItemFnResult {

crates/rspack_core/src/resolver/mod.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::borrow::Borrow;
55
use std::fmt;
66
use std::fs;
77
use std::path::PathBuf;
8+
use std::sync::Arc;
89
use std::sync::LazyLock;
910

1011
use regex::Regex;
@@ -41,7 +42,7 @@ pub struct ResolveArgs<'a> {
4142
pub dependency_type: &'a DependencyType,
4243
pub dependency_category: &'a DependencyCategory,
4344
pub span: Option<ErrorSpan>,
44-
pub resolve_options: Option<Box<Resolve>>,
45+
pub resolve_options: Option<Arc<Resolve>>,
4546
pub resolve_to_context: bool,
4647
pub optional: bool,
4748
pub file_dependencies: &'a mut FxHashSet<PathBuf>,
@@ -94,7 +95,9 @@ pub fn resolve_for_error_hints(
9495
plugin_driver: &SharedPluginDriver,
9596
) -> Option<String> {
9697
let dep = ResolveOptionsWithDependencyType {
97-
resolve_options: args.resolve_options.clone(),
98+
resolve_options: args
99+
.resolve_options
100+
.map(|r| Box::new(Arc::unwrap_or_clone(r))),
98101
resolve_to_context: args.resolve_to_context,
99102
dependency_category: *args.dependency_category,
100103
};
@@ -284,7 +287,10 @@ pub async fn resolve(
284287
plugin_driver: &SharedPluginDriver,
285288
) -> Result<ResolveResult, Error> {
286289
let dep = ResolveOptionsWithDependencyType {
287-
resolve_options: args.resolve_options.clone(),
290+
resolve_options: args
291+
.resolve_options
292+
.clone()
293+
.map(|r| Box::new(Arc::unwrap_or_clone(r))),
288294
resolve_to_context: args.resolve_to_context,
289295
dependency_category: *args.dependency_category,
290296
};

crates/rspack_plugin_externals/src/plugin.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
use std::fmt::Debug;
21
use std::sync::LazyLock;
2+
use std::{fmt::Debug, sync::Arc};
33

44
use regex::Regex;
55
use rspack_core::{
66
ApplyContext, BoxModule, CompilerOptions, ContextInfo, DependencyMeta, ExternalItem,
77
ExternalItemFnCtx, ExternalItemValue, ExternalModule, ExternalRequest, ExternalRequestValue,
88
ExternalType, ExternalTypeEnum, ModuleDependency, ModuleExt, ModuleFactoryCreateData,
9-
NormalModuleFactoryFactorize, Plugin, PluginContext,
9+
NormalModuleFactoryFactorize, Plugin, PluginContext, ResolveOptionsWithDependencyType,
1010
};
1111
use rspack_error::Result;
1212
use rspack_hook::{plugin, plugin_hook};
@@ -182,6 +182,16 @@ async fn factorize(&self, data: &mut ModuleFactoryCreateData) -> Result<Option<B
182182
.clone()
183183
.map_or("".to_string(), |i| i.to_string()),
184184
},
185+
resolve_options_with_dependency_type: ResolveOptionsWithDependencyType {
186+
resolve_options: data
187+
.resolve_options
188+
.clone()
189+
.map(|r| Box::new(Arc::unwrap_or_clone(r))),
190+
resolve_to_context: false,
191+
// dependency_category: *data.dependency.category(),
192+
dependency_category: *data.dependencies.get(0).unwrap().category(),
193+
},
194+
resolver_factory: data.resolver_factory.clone(),
185195
})
186196
.await?;
187197
if let Some(r) = result.result {

crates/rspack_plugin_lazy_compilation/src/factory.rs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ impl ModuleFactory for LazyCompilationDependencyFactory {
4141
issuer: proxy_data.issuer.clone(),
4242
issuer_layer: proxy_data.issuer_layer.clone(),
4343
issuer_identifier: proxy_data.issuer_identifier,
44+
resolver_factory: proxy_data.resolver_factory.clone(),
4445
file_dependencies: proxy_data.file_dependencies.clone(),
4546
context_dependencies: proxy_data.context_dependencies.clone(),
4647
missing_dependencies: proxy_data.missing_dependencies.clone(),

0 commit comments

Comments
 (0)