Skip to main content

rspack_plugin_javascript/dependency/amd/
amd_require_item_dependency.rs

1use 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    // ModuleDependencyTemplateAsRequireId
113    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}