turbopack_ecmascript_plugins/transform/
modularize_imports.rs

1use std::sync::Arc;
2
3use anyhow::Result;
4use async_trait::async_trait;
5use modularize_imports::{Config, PackageConfig, modularize_imports};
6use serde::{Deserialize, Serialize};
7use swc_core::ecma::ast::Program;
8use turbo_tasks::{FxIndexMap, NonLocalValue, trace::TraceRawVcs};
9use turbopack_ecmascript::{CustomTransformer, TransformContext};
10
11#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, TraceRawVcs, NonLocalValue)]
12#[serde(rename_all = "camelCase")]
13pub struct ModularizeImportPackageConfig {
14    pub transform: String,
15    #[serde(default)]
16    pub prevent_full_import: bool,
17    #[serde(default)]
18    pub skip_default_conversion: bool,
19}
20
21#[derive(Debug)]
22pub struct ModularizeImportsTransformer {
23    config: Config,
24}
25
26impl ModularizeImportsTransformer {
27    pub fn new(packages: &FxIndexMap<String, ModularizeImportPackageConfig>) -> Self {
28        Self {
29            config: Config {
30                packages: packages
31                    .iter()
32                    .map(|(k, v)| {
33                        (
34                            k.clone(),
35                            Arc::new(PackageConfig {
36                                transform: modularize_imports::Transform::String(
37                                    v.transform.clone(),
38                                ),
39                                prevent_full_import: v.prevent_full_import,
40                                skip_default_conversion: v.skip_default_conversion,
41                                handle_default_import: false,
42                                handle_namespace_import: false,
43                            }),
44                        )
45                    })
46                    .collect(),
47            },
48        }
49    }
50}
51
52#[async_trait]
53impl CustomTransformer for ModularizeImportsTransformer {
54    #[tracing::instrument(level = tracing::Level::TRACE, name = "modularize_imports", skip_all)]
55    async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> {
56        program.mutate(modularize_imports(&self.config));
57
58        Ok(())
59    }
60}