Skip to main content

rspack_core/dependency/
dependency_template.rs

1use std::{fmt::Debug, sync::Arc};
2
3use rspack_cacheable::cacheable_dyn;
4use rspack_hash::RspackHasher;
5use rspack_sources::ReplaceSource;
6use rspack_util::ext::AsAny;
7
8use crate::{
9  ChunkInitFragments, CodeGenerationData, CodeGenerationDataChunkInitFragments, Compilation,
10  ConcatenationScope, DependencyType, Module, ModuleCodeTemplate, ModuleInitFragments, RuntimeSpec,
11};
12
13pub struct TemplateContext<'a, 'b> {
14  pub compilation: &'a Compilation,
15  pub module: &'a dyn Module,
16  pub init_fragments: &'a mut ModuleInitFragments,
17  pub runtime: Option<&'a RuntimeSpec>,
18  pub concatenation_scope: Option<&'b mut ConcatenationScope>,
19  pub data: &'a mut CodeGenerationData,
20  pub runtime_template: &'a mut ModuleCodeTemplate,
21}
22
23impl TemplateContext<'_, '_> {
24  pub fn chunk_init_fragments(&mut self) -> &mut ChunkInitFragments {
25    if !self.data.contains::<CodeGenerationDataChunkInitFragments>() {
26      self
27        .data
28        .insert(CodeGenerationDataChunkInitFragments::default());
29    }
30    self
31      .data
32      .get_mut::<CodeGenerationDataChunkInitFragments>()
33      .expect("chunk init fragments should exist")
34      .inner_mut()
35  }
36}
37
38pub type TemplateReplaceSource = ReplaceSource;
39
40// Align with https://github.com/webpack/webpack/blob/671ac29d462e75a10c3fdfc785a4c153e41e749e/lib/DependencyCodeGeneration.js
41#[cacheable_dyn]
42pub trait DependencyCodeGeneration: Debug + Sync + Send + AsAny {
43  fn update_hash(
44    &self,
45    _hasher: &mut RspackHasher,
46    _compilation: &Compilation,
47    _runtime: Option<&RuntimeSpec>,
48  ) {
49  }
50
51  fn dependency_template(&self) -> Option<DependencyTemplateType> {
52    None
53  }
54}
55
56pub type DependencyCodeGenerationRef = Arc<dyn DependencyCodeGeneration>;
57
58pub trait AsDependencyCodeGeneration {
59  fn as_dependency_code_generation(&self) -> Option<&dyn DependencyCodeGeneration> {
60    None
61  }
62}
63
64impl<T: DependencyCodeGeneration> AsDependencyCodeGeneration for T {
65  fn as_dependency_code_generation(&self) -> Option<&dyn DependencyCodeGeneration> {
66    Some(self)
67  }
68}
69
70#[derive(Debug, Clone, Eq, PartialEq, Hash)]
71pub enum DependencyTemplateType {
72  Dependency(DependencyType),
73  Custom(&'static str),
74}
75
76pub trait DependencyTemplate: Debug + Sync + Send {
77  fn render(
78    &self,
79    dep: &dyn DependencyCodeGeneration,
80    source: &mut ReplaceSource,
81    code_generatable_context: &mut TemplateContext,
82  );
83}