swc_bundler/
load.rs

1use anyhow::Error;
2use swc_common::{sync::Lrc, FileName, SourceFile};
3use swc_ecma_ast::Module;
4use swc_ecma_transforms_base::helpers::Helpers;
5
6#[derive(Debug)]
7pub struct ModuleData {
8    pub fm: Lrc<SourceFile>,
9    pub module: Module,
10    /// Used helpers
11    ///
12    /// # Example
13    ///
14    /// ```rust,ignore
15    /// 
16    /// impl Load for Loader {
17    ///     fn load(&self, name: &FileName) -> Result<ModuleData, Error> {
18    ///         let helpers = Helpers::new(false);
19    ///         let fm = self.load_file(name)?;
20    ///         let module = self.parse(fm.clone())?;
21    ///
22    ///         let module = helpers::HELPERS.set(&helpers, || {
23    ///             // Apply transforms (like decorators pass)
24    ///             module
25    ///         });
26    ///
27    ///         Ok(ModuleData { fm, module, helpers })
28    ///     }
29    /// }
30    /// ```
31    pub helpers: Helpers,
32}
33
34/// Responsible for providing files to the bundler.
35///
36/// Note: Resolve and Load are separate trait because multiple module can depend
37/// on a single module. Due to the possibility of 'common' module, bundler
38/// should implement some caching. The bundler uses [FileName] as a key of the
39/// cache.
40///
41/// This trait is designed to allow passing pre-parsed module.
42pub trait Load: swc_common::sync::Send + swc_common::sync::Sync {
43    fn load(&self, file: &FileName) -> Result<ModuleData, Error>;
44}
45
46impl<T: ?Sized + Load> Load for Box<T> {
47    fn load(&self, file: &FileName) -> Result<ModuleData, Error> {
48        (**self).load(file)
49    }
50}
51
52impl<T: ?Sized + Load> Load for &T {
53    fn load(&self, file: &FileName) -> Result<ModuleData, Error> {
54        (**self).load(file)
55    }
56}