rspack_core/dependency/
dependency_template.rs1use 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#[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}