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}