rspack_plugin_javascript/dependency/amd/
amd_require_item_dependency.rs1use rspack_cacheable::{cacheable, cacheable_dyn, with::AsPreset};
2use rspack_core::{
3 AffectType, AsContextDependency, Dependency, DependencyCategory, DependencyCodeGeneration,
4 DependencyId, DependencyRange, DependencyTemplate, DependencyTemplateType, DependencyType,
5 FactorizeInfo, ModuleDependency, TemplateContext, TemplateReplaceSource,
6};
7use rspack_util::atom::Atom;
8
9#[cacheable]
10#[derive(Debug, Clone)]
11pub struct AMDRequireItemDependency {
12 id: DependencyId,
13 #[cacheable(with=AsPreset)]
14 request: Atom,
15 range: Option<DependencyRange>,
16 optional: bool,
17 factorize_info: FactorizeInfo,
18}
19
20impl AMDRequireItemDependency {
21 pub fn new(request: Atom, range: Option<DependencyRange>) -> Self {
22 Self {
23 id: DependencyId::new(),
24 request,
25 range,
26 optional: false,
27 factorize_info: Default::default(),
28 }
29 }
30
31 pub fn set_optional(&mut self, optional: bool) {
32 self.optional = optional;
33 }
34}
35
36#[cacheable_dyn]
37impl Dependency for AMDRequireItemDependency {
38 fn id(&self) -> &DependencyId {
39 &self.id
40 }
41
42 fn range(&self) -> Option<DependencyRange> {
43 self.range
44 }
45
46 fn category(&self) -> &DependencyCategory {
47 &DependencyCategory::Amd
48 }
49
50 fn dependency_type(&self) -> &DependencyType {
51 &DependencyType::AmdRequireItem
52 }
53
54 fn could_affect_referencing_module(&self) -> AffectType {
55 AffectType::True
56 }
57}
58
59#[cacheable_dyn]
60impl ModuleDependency for AMDRequireItemDependency {
61 fn request(&self) -> &str {
62 &self.request
63 }
64
65 fn get_optional(&self) -> bool {
66 self.optional
67 }
68
69 fn factorize_info(&self) -> &FactorizeInfo {
70 &self.factorize_info
71 }
72
73 fn factorize_info_mut(&mut self) -> &mut FactorizeInfo {
74 &mut self.factorize_info
75 }
76}
77
78impl AsContextDependency for AMDRequireItemDependency {}
79
80#[cacheable_dyn]
81impl DependencyCodeGeneration for AMDRequireItemDependency {
82 fn dependency_template(&self) -> Option<DependencyTemplateType> {
83 Some(AMDRequireItemDependencyTemplate::template_type())
84 }
85}
86
87#[cacheable]
88#[derive(Debug, Clone, Default)]
89pub struct AMDRequireItemDependencyTemplate;
90
91impl AMDRequireItemDependencyTemplate {
92 pub fn template_type() -> DependencyTemplateType {
93 DependencyTemplateType::Dependency(DependencyType::AmdRequireItem)
94 }
95}
96
97impl DependencyTemplate for AMDRequireItemDependencyTemplate {
98 fn render(
99 &self,
100 dep: &dyn DependencyCodeGeneration,
101 source: &mut TemplateReplaceSource,
102 code_generatable_context: &mut TemplateContext,
103 ) {
104 let dep = dep
105 .as_any()
106 .downcast_ref::<AMDRequireItemDependency>()
107 .expect("AMDRequireItemDependencyTemplate should only be used for AMDRequireItemDependency");
108
109 let Some(range) = &dep.range else {
110 return;
111 };
112 let content = code_generatable_context.runtime_template.module_raw(
114 code_generatable_context.compilation,
115 &dep.id,
116 &dep.request,
117 dep.weak(),
118 );
119 source.replace(range.start, range.end, content, None);
120 }
121}