turbopack_ecmascript_plugins/transform/
modularize_imports.rs1use 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}