From 22b8a2dba35bd2ef62b18f44eb4aea62588d55f0 Mon Sep 17 00:00:00 2001 From: Maia Teegarden Date: Wed, 4 Aug 2021 11:36:57 -0700 Subject: [PATCH] Handle multiple imports of next/dynamic --- packages/next/build/swc/src/next_dynamic.rs | 13 +++++++------ .../next-dynamic/duplicated-imports/input.js | 5 +++++ .../next-dynamic/duplicated-imports/output.js | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/input.js create mode 100644 packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/output.js diff --git a/packages/next/build/swc/src/next_dynamic.rs b/packages/next/build/swc/src/next_dynamic.rs index 2e0355316c56d..611bf3dab4f82 100644 --- a/packages/next/build/swc/src/next_dynamic.rs +++ b/packages/next/build/swc/src/next_dynamic.rs @@ -1,23 +1,24 @@ -use swc_atoms::{js_word, JsWord}; +use swc_atoms::js_word; use swc_common::{FileName, DUMMY_SP}; use swc_ecmascript::ast::{ ArrayLit, ArrowExpr, BinExpr, BinaryOp, BlockStmtOrExpr, CallExpr, Expr, ExprOrSpread, ExprOrSuper, Ident, ImportDecl, ImportSpecifier, KeyValueProp, Lit, MemberExpr, ObjectLit, Prop, PropName, PropOrSpread, Str, StrKind, }; +use swc_ecmascript::utils::ident::{Id, IdentLike}; use swc_ecmascript::visit::Fold; pub fn next_dynamic(filename: FileName) -> impl Fold { NextDynamicPatcher { filename, - dynamic_binding: js_word!(""), + dynamic_bindings: vec![], } } #[derive(Debug)] struct NextDynamicPatcher { filename: FileName, - dynamic_binding: JsWord, + dynamic_bindings: Vec, } impl Fold for NextDynamicPatcher { @@ -30,7 +31,7 @@ impl Fold for NextDynamicPatcher { if &src.value == "next/dynamic" { for specifier in specifiers { if let ImportSpecifier::Default(default_specifier) = specifier { - self.dynamic_binding = default_specifier.local.sym.clone(); + self.dynamic_bindings.push(default_specifier.local.to_id()); } } } @@ -40,8 +41,8 @@ impl Fold for NextDynamicPatcher { fn fold_call_expr(&mut self, mut expr: CallExpr) -> CallExpr { if let ExprOrSuper::Expr(i) = &expr.callee { - if let Expr::Ident(Ident { sym, .. }) = &**i { - if sym == &self.dynamic_binding { + if let Expr::Ident(identifier) = &**i { + if self.dynamic_bindings.contains(&identifier.to_id()) { let mut import_specifier = None; if let Expr::Arrow(ArrowExpr { body: BlockStmtOrExpr::Expr(e), diff --git a/packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/input.js b/packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/input.js new file mode 100644 index 0000000000000..617649e96875a --- /dev/null +++ b/packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/input.js @@ -0,0 +1,5 @@ +import dynamic1 from 'next/dynamic' +import dynamic2 from 'next/dynamic' + +const DynamicComponent1 = dynamic1(() => import('../components/hello1')) +const DynamicComponent2 = dynamic2(() => import('../components/hello2')) diff --git a/packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/output.js b/packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/output.js new file mode 100644 index 0000000000000..e281495c7f7d0 --- /dev/null +++ b/packages/next/build/swc/tests/fixture/next-dynamic/duplicated-imports/output.js @@ -0,0 +1,14 @@ +import dynamic1 from 'next/dynamic' +import dynamic2 from 'next/dynamic' +const DynamicComponent1 = dynamic1(() => import('../components/hello1'), { + loadableGenerated: { + webpack: () => [require.resolveWeak('/some-project/src/some-file.js')], + modules: ['/some-project/src/some-file.js -> ' + '../components/hello1'], + }, +}) +const DynamicComponent2 = dynamic2(() => import('../components/hello2'), { + loadableGenerated: { + webpack: () => [require.resolveWeak('/some-project/src/some-file.js')], + modules: ['/some-project/src/some-file.js -> ' + '../components/hello2'], + }, +})