diff --git a/crates/mako/src/module_graph.rs b/crates/mako/src/module_graph.rs index f4a89bce3..a0d458d69 100644 --- a/crates/mako/src/module_graph.rs +++ b/crates/mako/src/module_graph.rs @@ -238,11 +238,20 @@ impl ModuleGraph { targets } - pub fn remove_dependencies(&mut self, module_id: &ModuleId) { + pub fn remove_dependency_module_by_source(&mut self, module_id: &ModuleId, source: &String) { let mut edges = self.get_edges(module_id, Direction::Outgoing); - while let Some((edge_index, _)) = edges.next(&self.graph) { - self.graph.remove_edge(edge_index); + while let Some((edge_index, _node_index)) = edges.next(&self.graph) { + let dependencies = self.graph.edge_weight_mut(edge_index).unwrap(); + + if let Some(to_del_dep) = dependencies.iter().position(|dep| *source == dep.source) { + dependencies.take(&dependencies.iter().nth(to_del_dep).unwrap().clone()); + + if dependencies.is_empty() { + self.graph.remove_edge(edge_index); + } + return; + } } } diff --git a/crates/mako/src/plugins/farm_tree_shake/module/import_exports.rs b/crates/mako/src/plugins/farm_tree_shake/module/import_exports.rs index c402c576a..d05b19eee 100644 --- a/crates/mako/src/plugins/farm_tree_shake/module/import_exports.rs +++ b/crates/mako/src/plugins/farm_tree_shake/module/import_exports.rs @@ -1,10 +1,10 @@ use crate::plugins::farm_tree_shake::module::{is_ident_sym_equal, TreeShakeModule}; -use crate::plugins::farm_tree_shake::shake::skip_module::{ReExportSource2, ReExportType2}; +use crate::plugins::farm_tree_shake::shake::skip_module::{ReExportSource, ReExportType}; use crate::plugins::farm_tree_shake::shake::strip_context; use crate::plugins::farm_tree_shake::statement_graph::{ExportSpecifierInfo, ImportSpecifierInfo}; impl TreeShakeModule { - pub fn find_export_source(&self, ident: &String) -> Option { + pub fn find_export_source(&self, ident: &String) -> Option { let mut local_ident = None; let mut re_export_type = None; @@ -15,8 +15,8 @@ impl TreeShakeModule { match export_specifier { ExportSpecifierInfo::All(all_exports) => { if all_exports.iter().any(|i| is_ident_sym_equal(i, ident)) { - return Some(ReExportSource2 { - re_export_type: ReExportType2::Named(strip_context(ident)), + return Some(ReExportSource { + re_export_type: ReExportType::Named(strip_context(ident)), source: Some(source.clone()), }); } @@ -31,21 +31,21 @@ impl TreeShakeModule { if let Some(exported_name) = exported { if is_ident_sym_equal(exported_name, ident) { - return Some(ReExportSource2 { + return Some(ReExportSource { re_export_type: if stripped_local == "default" { - ReExportType2::Default + ReExportType::Default } else { - ReExportType2::Named(stripped_local.clone()) + ReExportType::Named(stripped_local.clone()) }, source: Some(source.clone()), }); } } else if is_ident_sym_equal(ident, local) { - return Some(ReExportSource2 { + return Some(ReExportSource { re_export_type: if stripped_local == "default" { - ReExportType2::Default + ReExportType::Default } else { - ReExportType2::Named(stripped_local.clone()) + ReExportType::Named(stripped_local.clone()) }, source: Some(source.clone()), }); @@ -60,8 +60,8 @@ impl TreeShakeModule { ExportSpecifierInfo::Namespace(name) => { let stripped_name = strip_context(name); if stripped_name.eq(ident) { - return Some(ReExportSource2 { - re_export_type: ReExportType2::Namespace, + return Some(ReExportSource { + re_export_type: ReExportType::Namespace, source: Some(source.clone()), }); } @@ -75,16 +75,15 @@ impl TreeShakeModule { ExportSpecifierInfo::Named { exported, local } => { if let Some(exported_name) = exported { if is_ident_sym_equal(exported_name, ident) { - re_export_type = Some(ReExportType2::Named(strip_context( - exported_name, - ))); + re_export_type = + Some(ReExportType::Named(strip_context(exported_name))); local_ident = Some(local.clone()); break; } } else if is_ident_sym_equal(ident, local) { re_export_type = - Some(ReExportType2::Named(strip_context(local))); + Some(ReExportType::Named(strip_context(local))); local_ident = Some(local.clone()); break; @@ -93,12 +92,12 @@ impl TreeShakeModule { ExportSpecifierInfo::Default(export_default_ident) => { if ident == "default" { if let Some(default_ident) = export_default_ident { - re_export_type = Some(ReExportType2::Default); + re_export_type = Some(ReExportType::Default); local_ident = Some(default_ident.clone()); break; } else { - return Some(ReExportSource2 { - re_export_type: ReExportType2::Default, + return Some(ReExportSource { + re_export_type: ReExportType::Default, source: None, }); } @@ -119,8 +118,8 @@ impl TreeShakeModule { if let Some(import_specifier) = import_info.find_define_specifier(local) { match import_specifier { ImportSpecifierInfo::Namespace(_namespace) => { - return Some(ReExportSource2 { - re_export_type: ReExportType2::Namespace, + return Some(ReExportSource { + re_export_type: ReExportType::Namespace, source: Some(import_info.source.clone()), }); } @@ -135,8 +134,8 @@ impl TreeShakeModule { local.clone() }; - return Some(ReExportSource2 { - re_export_type: ReExportType2::Named(strip_context( + return Some(ReExportSource { + re_export_type: ReExportType::Named(strip_context( &next_name, )), source: Some(import_info.source.clone()), @@ -145,8 +144,8 @@ impl TreeShakeModule { } ImportSpecifierInfo::Default(name) => { if local == name { - return Some(ReExportSource2 { - re_export_type: ReExportType2::Default, + return Some(ReExportSource { + re_export_type: ReExportType::Default, source: Some(import_info.source.clone()), }); } @@ -156,7 +155,7 @@ impl TreeShakeModule { } } - re_export_type.map(|re_export_type| ReExportSource2 { + re_export_type.map(|re_export_type| ReExportSource { re_export_type, source: None, }) @@ -177,9 +176,9 @@ mod tests { use crate::ast::build_js_ast; use crate::compiler::Context; use crate::module::{Module, ModuleAst, ModuleInfo}; - use crate::plugins::farm_tree_shake::shake::skip_module::ReExportSource2; + use crate::plugins::farm_tree_shake::shake::skip_module::ReExportSource; - impl ReExportSource2 { + impl ReExportSource { pub fn describe(&self) -> String { if let Some(source) = &self.source { format!("ReExport from {} by {:?}", source, self.re_export_type) diff --git a/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs b/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs index f25be8133..8a37096d4 100644 --- a/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs +++ b/crates/mako/src/plugins/farm_tree_shake/shake/skip_module.rs @@ -4,47 +4,45 @@ use std::sync::Arc; use mako_core::anyhow::Result; use mako_core::swc_common::util::take::Take; +use swc_core::common::{Span, Spanned}; use swc_core::ecma::ast::{ ExportSpecifier, Ident, ImportSpecifier, ModuleDecl, ModuleExportName, ModuleItem, }; use swc_core::ecma::utils::{quote_ident, quote_str}; use swc_core::quote; -use crate::analyze_deps::analyze_deps; -use crate::ast::js_ast_to_code; use crate::compiler::Context; -use crate::module::ModuleId; +use crate::module::{Dependency, ModuleId, ResolveType}; use crate::module_graph::ModuleGraph; use crate::plugins::farm_tree_shake::module::{is_ident_sym_equal, TreeShakeModule}; use crate::plugins::farm_tree_shake::shake::strip_context; use crate::plugins::farm_tree_shake::statement_graph::{ ExportSpecifierInfo, ImportSpecifierInfo, StatementId, }; -use crate::resolve::{resolve, ResolverResource}; #[derive(Debug)] pub struct ReExportReplace { pub(crate) re_export_ident: String, - pub(crate) re_export_source: ReExportSource2, + pub(crate) re_export_source: ReExportSource, pub(crate) from_module_id: ModuleId, } impl ReExportReplace { pub(crate) fn to_export_module_item(&self, ident: Ident) -> ModuleItem { match &self.re_export_source.re_export_type { - ReExportType2::Default => { + ReExportType::Default => { quote!("export { default as $ident } from \"$from\";" as ModuleItem, ident: Ident = ident, from: Str = quote_str!(self.from_module_id.id.clone()) ) } - ReExportType2::Namespace => { + ReExportType::Namespace => { quote!("export * as $ident from \"$from\";" as ModuleItem, ident: Ident = ident, from: Str = quote_str!(self.from_module_id.id.clone()) ) } - ReExportType2::Named(local) => { + ReExportType::Named(local) => { if ident.sym.eq(local) { quote!("export { $ident } from \"$from\";" as ModuleItem, ident: Ident = ident, @@ -61,15 +59,35 @@ impl ReExportReplace { } } + pub(crate) fn to_import_dep(&self, span: Span) -> Dependency { + Dependency { + source: self.from_module_id.id.clone(), + span: Some(span), + order: 0, + resolve_as: None, + resolve_type: ResolveType::Import, + } + } + + pub(crate) fn to_export_dep(&self, span: Span) -> Dependency { + Dependency { + source: self.from_module_id.id.clone(), + resolve_as: None, + resolve_type: ResolveType::ExportNamed, + order: 0, + span: Some(span), + } + } + pub(crate) fn to_import_module_item(&self, ident: Ident) -> ModuleItem { match &self.re_export_source.re_export_type { - ReExportType2::Default => { + ReExportType::Default => { quote!("import $ident from \"$from\";" as ModuleItem, ident: Ident = ident, from: Str = quote_str!(self.from_module_id.id.clone()) ) } - ReExportType2::Named(local) => { + ReExportType::Named(local) => { if ident.sym.eq(local) { quote!("import { $ident } from \"$from\";" as ModuleItem, ident: Ident = ident, @@ -83,7 +101,7 @@ impl ReExportReplace { ) } } - ReExportType2::Namespace => { + ReExportType::Namespace => { quote!("import * as $ident from \"$from\";" as ModuleItem, ident: Ident = ident, from: Str = quote_str!(self.from_module_id.id.clone()) @@ -94,23 +112,23 @@ impl ReExportReplace { } #[derive(Debug)] -pub struct ReExportSource2 { +pub struct ReExportSource { pub(crate) source: Option, - pub(crate) re_export_type: ReExportType2, + pub(crate) re_export_type: ReExportType, } -impl ReExportSource2 { +impl ReExportSource { pub fn to_outer_ref(&self) -> String { match &self.re_export_type { - ReExportType2::Default => "default".into(), - ReExportType2::Named(local) => local.clone(), - ReExportType2::Namespace => "*".into(), + ReExportType::Default => "default".into(), + ReExportType::Named(local) => local.clone(), + ReExportType::Namespace => "*".into(), } } } #[derive(Debug)] -pub enum ReExportType2 { +pub enum ReExportType { // export * as x from "x" Namespace, // import x from "y" @@ -130,20 +148,32 @@ pub(super) fn skip_module_optimize( tree_shake_modules_ids: &Vec, tree_shake_modules_map: &HashMap>, - context: &Arc, + _context: &Arc, ) -> Result<()> { - let mut re_export_replace_map: HashMap)>> = - HashMap::new(); + let mut re_export_replace_map: HashMap< + ModuleId, + Vec<(StatementId, Vec, String)>, + > = HashMap::new(); let mut current_index: usize = 0; let len = tree_shake_modules_ids.len(); - fn apply_replace(body: &mut Vec, to_replace: &(StatementId, Vec)) { + fn apply_replace( + to_replace: &(StatementId, Vec, String), + module_id: &ModuleId, + module_graph: &mut ModuleGraph, + ) { let stmt_id = to_replace.0; let replaces = &to_replace.1; + let source = &to_replace.2; - let mut stmt = body.get(stmt_id).unwrap().clone(); + let module = module_graph.get_module_mut(module_id).unwrap(); + + let swc_module = module.info.as_mut().unwrap().ast.as_script_mut(); + + let mut stmt = swc_module.body.get(stmt_id).unwrap().clone(); let mut to_insert = vec![]; + let mut to_insert_deps = vec![]; let mut to_delete = false; match &mut stmt { @@ -180,14 +210,20 @@ pub(super) fn skip_module_optimize( } } } - matched_index.map(|i| import_decl.specifiers.remove(i)); + let remove_specifier = + matched_index.map(|i| import_decl.specifiers.remove(i)); to_delete = import_decl.specifiers.is_empty(); - if let Some(module_item) = - matched_ident.map(|ident| replace.to_import_module_item(ident)) + if let Some(ident) = matched_ident + && let Some(specifier) = remove_specifier { + let span = specifier.span(); + let module_item = replace.to_import_module_item(ident); + let dep = replace.to_import_dep(span); + to_insert.push(module_item); + to_insert_deps.push(dep); } } } @@ -234,15 +270,17 @@ pub(super) fn skip_module_optimize( } } - if let Some(index) = matched_index { - export_named.specifiers.remove(index); - } + let specifier = + matched_index.map(|index| export_named.specifiers.remove(index)); + to_delete = export_named.specifiers.is_empty(); - if let Some(module_item) = - matched_ident.map(|ident| replace.to_export_module_item(ident)) + if let Some(ident) = matched_ident + && let Some(specifier) = specifier { + let module_item = replace.to_export_module_item(ident); to_insert.push(module_item); + to_insert_deps.push(replace.to_export_dep(specifier.span())); } } } @@ -262,10 +300,17 @@ pub(super) fn skip_module_optimize( } if to_delete { - body.remove(stmt_id); - body.splice(stmt_id..stmt_id, to_insert); + swc_module.body.remove(stmt_id); + swc_module.body.splice(stmt_id..stmt_id, to_insert); } else { - body.splice(stmt_id..stmt_id, to_insert); + swc_module.body.splice(stmt_id..stmt_id, to_insert); + } + + if to_delete { + module_graph.remove_dependency_module_by_source(module_id, source); + } + for dep in to_insert_deps { + module_graph.add_dependency(module_id, &dep.source.clone().into(), dep); } } @@ -279,6 +324,7 @@ pub(super) fn skip_module_optimize( for stmt in tsm.stmt_graph.stmts() { let mut stmt_replaces = vec![]; + let mut stmt_source = None; if let Some(import) = &stmt.import_info { if import.specifiers.is_empty() { @@ -306,6 +352,8 @@ pub(super) fn skip_module_optimize( continue; } + stmt_source = Some(import.source.clone()); + for sp in &import.specifiers { match sp { ImportSpecifierInfo::Namespace(_) => { @@ -349,16 +397,17 @@ pub(super) fn skip_module_optimize( } if let Some(export_info) = &stmt.export_info - && let Some(_source) = &export_info.source + && let Some(source) = &export_info.source { if let Some(tsm_ref) = get_imported_tree_shake_module( current_module_id, - _source, + source, module_graph, tree_shake_modules_map, ) { let proxy_tsm = tsm_ref.borrow(); + stmt_source = Some(source.clone()); for export_specifier in export_info.specifiers.iter() { match export_specifier { ExportSpecifierInfo::All(_) => {} @@ -398,13 +447,13 @@ pub(super) fn skip_module_optimize( } if !stmt_replaces.is_empty() { - replaces.push((stmt.id, stmt_replaces)); + replaces.push((stmt.id, stmt_replaces, stmt_source.unwrap())); } } } if !replaces.is_empty() { - replaces.sort_by(|(stmt_id_1, _), (stmt_id_2, _)| stmt_id_2.cmp(stmt_id_1)); + replaces.sort_by(|(stmt_id_1, _, _), (stmt_id_2, _, _)| stmt_id_2.cmp(stmt_id_1)); re_export_replace_map.insert(current_module_id.clone(), replaces); } @@ -413,38 +462,25 @@ pub(super) fn skip_module_optimize( } for (module_id, replaces) in re_export_replace_map.iter() { - if let Some(module) = module_graph.get_module_mut(module_id) { - { - let swc_module = module.info.as_mut().unwrap().ast.as_script_mut(); - - // stmt_id is reversed order - for to_replace in replaces.iter() { - // println!("{} apply with {:?}", module_id.id, to_replace.1); - apply_replace(&mut swc_module.body, to_replace) - } - - let mut tsm = tree_shake_modules_map.get(module_id).unwrap().borrow_mut(); - let (_code, _) = js_ast_to_code(swc_module, context, &module_id.id).unwrap(); - - tsm.update_stmt_graph(swc_module); + if module_graph.has_module(module_id) { + // stmt_id is reversed order + for to_replace in replaces.iter() { + // println!("{} apply with {:?}", module_id.id, to_replace.1); + apply_replace(to_replace, module_id, module_graph); } - let deps = analyze_deps(&module.info.as_mut().unwrap().ast, &module_id.id, context)?; - - module_graph.remove_dependencies(module_id); - - for dep in deps.iter() { - let ret = resolve(&module_id.id, dep, &context.resolvers, context)?; + let mut tsm = tree_shake_modules_map.get(module_id).unwrap().borrow_mut(); - match &ret { - ResolverResource::Resolved(_) => { - let resolved_module_id: ModuleId = ret.get_resolved_path().into(); + let swc_module = module_graph + .get_module(module_id) + .unwrap() + .info + .as_ref() + .unwrap() + .ast + .as_script(); - module_graph.add_dependency(module_id, &resolved_module_id, dep.clone()); - } - ResolverResource::External(_) | ResolverResource::Ignored => {} - } - } + tsm.update_stmt_graph(swc_module); } } @@ -486,7 +522,7 @@ fn find_ident_export_source( { let next_tsm = next_tsm_rc.borrow(); - if matches!(re_export_source.re_export_type, ReExportType2::Namespace) { + if matches!(re_export_source.re_export_type, ReExportType::Namespace) { return Some(ReExportReplace { re_export_ident: used_ident.clone(), from_module_id: next_tsm.module_id.clone(), diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_deep_named_import_then_export_as/expect.js b/e2e/fixtures/tree-shaking.skip_module.reexport_deep_named_import_then_export_as/expect.js index 07dd3383a..5766ae9f2 100644 --- a/e2e/fixtures/tree-shaking.skip_module.reexport_deep_named_import_then_export_as/expect.js +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_deep_named_import_then_export_as/expect.js @@ -1,12 +1,12 @@ -const assert = require("assert"); -const { parseBuildResult } = require("../../../scripts/test-utils"); +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); const { files } = parseBuildResult(__dirname); -const content = files["index.js"]; +const content = files['index.js']; -assert(!content.includes("dep/dep1.js"), `should not contains reexport module`); -assert(!content.includes("dep/dep2.js"), `should not contains reexport module`); -assert(!content.includes("dep/dep3.js"), `should not contains reexport module`); -assert(!content.includes("dep/dep4.js"), `should not contains reexport module`); +assert(!content.includes('dep/dep1.js'), `should not contains reexport module`); +assert(!content.includes('dep/dep2.js'), `should not contains reexport module`); +assert(!content.includes('dep/dep3.js'), `should not contains reexport module`); +assert(!content.includes('dep/dep4.js'), `should not contains reexport module`); -assert(content.includes("dep5.e"), `should change access field from .a to .z`); +assert(content.includes('dep5.e'), `should change access field from .a to .z`); diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_deep_named_import_then_export_as/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.reexport_deep_named_import_then_export_as/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_deep_named_import_then_export_as/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_default_as/expect.js b/e2e/fixtures/tree-shaking.skip_module.reexport_default_as/expect.js index 157bc94ec..c25a9bd55 100644 --- a/e2e/fixtures/tree-shaking.skip_module.reexport_default_as/expect.js +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_default_as/expect.js @@ -1,9 +1,9 @@ -const assert = require("assert"); -const { parseBuildResult } = require("../../../scripts/test-utils"); +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); const { files } = parseBuildResult(__dirname); -const content = files["index.js"]; +const content = files['index.js']; -assert(!content.includes("src/dep/index.js"), `should skip middle files`); +assert(!content.includes('src/dep/index.js'), `should skip middle files`); -assert(content.includes("dep.default"), `should change field name`); +assert(content.includes('dep.default'), `should change field name`); diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_default_as/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.reexport_default_as/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_default_as/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_from_export_star/expect.js b/e2e/fixtures/tree-shaking.skip_module.reexport_from_export_star/expect.js index b93ccdb66..f1b2f86d3 100644 --- a/e2e/fixtures/tree-shaking.skip_module.reexport_from_export_star/expect.js +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_from_export_star/expect.js @@ -1,10 +1,10 @@ -const assert = require("assert"); -const { parseBuildResult } = require("../../../scripts/test-utils"); +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); const { files } = parseBuildResult(__dirname); -const content = files["index.js"]; +const content = files['index.js']; -assert(!content.includes("src/dep/index.js"), `should skip middle files`); -assert(!content.includes("src/dep/dep.js"), `should skip middle files`); +assert(!content.includes('src/dep/index.js'), `should skip middle files`); +assert(!content.includes('src/dep/dep.js'), `should skip middle files`); -assert(content.includes("dep2.b"), `should change field name`); +assert(content.includes('dep2.b'), `should change field name`); diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_from_export_star/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.reexport_from_export_star/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_from_export_star/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_from_sideeffects_module/expect.js b/e2e/fixtures/tree-shaking.skip_module.reexport_from_sideeffects_module/expect.js index f925bda26..ae058aa25 100644 --- a/e2e/fixtures/tree-shaking.skip_module.reexport_from_sideeffects_module/expect.js +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_from_sideeffects_module/expect.js @@ -1,11 +1,17 @@ -const assert = require("assert"); -const { parseBuildResult } = require("../../../scripts/test-utils"); +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); const { files } = parseBuildResult(__dirname); -const content = files["index.js"]; +const content = files['index.js']; -assert(!content.includes("node_modules/pure"), `should skip pure module`); -assert(content.includes("node_modules/side_effects/index.js"), `should keep all side effects modules`); -assert(content.includes("node_modules/side_effects/dep.js"), `should keep all side effects modules`); +assert(!content.includes('node_modules/pure'), `should skip pure module`); +assert( + content.includes('node_modules/side_effects/index.js'), + `should keep all side effects modules`, +); +assert( + content.includes('node_modules/side_effects/dep.js'), + `should keep all side effects modules`, +); -assert(content.includes("index.default"), `should change field name`); +assert(content.includes('index.default'), `should change field name`); diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_from_sideeffects_module/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.reexport_from_sideeffects_module/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_from_sideeffects_module/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_import_as_then_export/expect.js b/e2e/fixtures/tree-shaking.skip_module.reexport_import_as_then_export/expect.js index 08f0278f9..cd7237829 100644 --- a/e2e/fixtures/tree-shaking.skip_module.reexport_import_as_then_export/expect.js +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_import_as_then_export/expect.js @@ -1,9 +1,9 @@ -const assert = require("assert"); -const { parseBuildResult } = require("../../../scripts/test-utils"); +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); const { files } = parseBuildResult(__dirname); -const content = files["index.js"]; +const content = files['index.js']; -assert(!content.includes("src/dep/index.js"), `should skip middle files`); +assert(!content.includes('src/dep/index.js'), `should skip middle files`); -assert(content.includes("dep.z"), `should change field name`); +assert(content.includes('dep.z'), `should change field name`); diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_import_as_then_export/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.reexport_import_as_then_export/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_import_as_then_export/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_named_import_then_export_as/expect.js b/e2e/fixtures/tree-shaking.skip_module.reexport_named_import_then_export_as/expect.js index f424d6b0c..2a11616c9 100644 --- a/e2e/fixtures/tree-shaking.skip_module.reexport_named_import_then_export_as/expect.js +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_named_import_then_export_as/expect.js @@ -1,8 +1,11 @@ -const assert = require("assert"); -const { parseBuildResult } = require("../../../scripts/test-utils"); +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); const { files } = parseBuildResult(__dirname); -const content = files["index.js"]; +const content = files['index.js']; -assert(!content.includes("dep/index.js"), `dep/index.js should be skipped`); -assert(content.includes("console.log(_dep.z);"), `access field changed to exported name`); +assert(!content.includes('dep/index.js'), `dep/index.js should be skipped`); +assert( + content.includes('console.log(_dep.z);'), + `access field changed to exported name`, +); diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_named_import_then_export_as/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.reexport_named_import_then_export_as/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_named_import_then_export_as/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_namespace/expect.js b/e2e/fixtures/tree-shaking.skip_module.reexport_namespace/expect.js index eb4d93dcc..0823c9a33 100644 --- a/e2e/fixtures/tree-shaking.skip_module.reexport_namespace/expect.js +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_namespace/expect.js @@ -1,13 +1,19 @@ -const assert = require("assert"); -const { parseBuildResult } = require("../../../scripts/test-utils"); +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); const { files } = parseBuildResult(__dirname); -const content = files["index.js"]; +const content = files['index.js']; -assert(!content.includes("dep/index.js"), `dep/index.js should be skipped`); -assert(!content.includes("dep/y.js"), `unused namespace should tree-shaken`); +assert(!content.includes('dep/index.js'), `dep/index.js should be skipped`); +assert(!content.includes('dep/y.js'), `unused namespace should tree-shaken`); -assert(content.includes("dep/x.js"), `should keep namespace exported module`); -assert(content.includes("dep/a.js"), `should keep namespace exported module's dep`); +assert(content.includes('dep/x.js'), `should keep namespace exported module`); +assert( + content.includes('dep/a.js'), + `should keep namespace exported module's dep`, +); -assert(content.includes("console.log(_x);"), `access field changed to exported name`); +assert( + content.includes('console.log(_x);'), + `access field changed to exported name`, +); diff --git a/e2e/fixtures/tree-shaking.skip_module.reexport_namespace/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.reexport_namespace/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.reexport_namespace/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/expect.js b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/expect.js new file mode 100644 index 000000000..b09303650 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/expect.js @@ -0,0 +1,11 @@ +const assert = require('assert'); +const { parseBuildResult } = require('../../../scripts/test-utils'); +const { files } = parseBuildResult(__dirname); + +const content = files['index.js']; + +assert( + content.includes('src/dep/index.js'), + `dep/index.js should keep in chunk`, +); +assert(content.includes('src/dep/dep.js'), `dep/dep.js should keep in chunk`); diff --git a/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/mako.config.json b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/mako.config.json new file mode 100644 index 000000000..1b25a8c21 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/mako.config.json @@ -0,0 +1,3 @@ +{ + "optimizePackageImports": false +} diff --git a/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/dep/dep.js b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/dep/dep.js new file mode 100644 index 000000000..d948b4e39 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/dep/dep.js @@ -0,0 +1,3 @@ +export const x = 'x'; +export const y = 'y'; +export const z = 'z'; diff --git a/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/dep/index.js b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/dep/index.js new file mode 100644 index 000000000..600830b09 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/dep/index.js @@ -0,0 +1,2 @@ +export * from './dep.js'; +export const a = 'a'; diff --git a/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/index.ts b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/index.ts new file mode 100644 index 000000000..b6e73e130 --- /dev/null +++ b/e2e/fixtures/tree-shaking.skip_module.use_multi_same_source/src/index.ts @@ -0,0 +1,4 @@ +import { a, x } from './dep'; +import { y } from './dep'; + +console.log(a, x, y); diff --git a/e2e/fixtures/tree-shaking_export_default/mako.config.json b/e2e/fixtures/tree-shaking_export_default/mako.config.json index f1427b7fa..c2b789458 100644 --- a/e2e/fixtures/tree-shaking_export_default/mako.config.json +++ b/e2e/fixtures/tree-shaking_export_default/mako.config.json @@ -2,6 +2,7 @@ "mode": "production", "minify": false, "hmr": false, + "optimizePackageImports": false, "optimization": { "skipModules": false }