From d8395e6bec94f08e9a9fce6148d777d93ee0d904 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Tue, 16 Aug 2022 02:20:10 +0800 Subject: [PATCH 1/5] chore: add test case --- .../tests/fixture/next-dynamic/template-literal/input.js | 3 +++ .../fixture/next-dynamic/template-literal/output-dev.js | 8 ++++++++ .../fixture/next-dynamic/template-literal/output-prod.js | 8 ++++++++ .../next-dynamic/template-literal/output-server.js | 8 ++++++++ 4 files changed, 27 insertions(+) create mode 100644 packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js create mode 100644 packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js create mode 100644 packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js create mode 100644 packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js new file mode 100644 index 000000000000..785cdb687bef --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js @@ -0,0 +1,3 @@ +import dynamic from "next/dynamic" + +const Test = dynamic(() => import(`/components/test`)) diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js new file mode 100644 index 000000000000..d869be4001dd --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic"; +const Test = dynamic(()=>import(`/components/test`), { + loadableGenerated: { + modules: [ + "some-file.js -> " + "/components/test" + ] + } +}); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js new file mode 100644 index 000000000000..3d309e0ca56d --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic"; +const Test = dynamic(()=>import(`/components/test`), { + loadableGenerated: { + webpack: ()=>[ + require.resolveWeak("/components/test") + ] + } +}); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js new file mode 100644 index 000000000000..d869be4001dd --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js @@ -0,0 +1,8 @@ +import dynamic from "next/dynamic"; +const Test = dynamic(()=>import(`/components/test`), { + loadableGenerated: { + modules: [ + "some-file.js -> " + "/components/test" + ] + } +}); From 9ecc340d95cf8499ce54c404b529c85356e8ba66 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Tue, 16 Aug 2022 02:27:05 +0800 Subject: [PATCH 2/5] fix(next/dynamic): handle template literal import path --- packages/next-swc/crates/core/src/next_dynamic.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/next-swc/crates/core/src/next_dynamic.rs b/packages/next-swc/crates/core/src/next_dynamic.rs index b8c2f7fdd120..345d5baede25 100644 --- a/packages/next-swc/crates/core/src/next_dynamic.rs +++ b/packages/next-swc/crates/core/src/next_dynamic.rs @@ -7,7 +7,7 @@ use swc_common::{FileName, DUMMY_SP}; use swc_ecmascript::ast::{ ArrayLit, ArrowExpr, BinExpr, BinaryOp, BlockStmtOrExpr, Bool, CallExpr, Callee, Expr, ExprOrSpread, Id, Ident, ImportDecl, ImportSpecifier, KeyValueProp, Lit, MemberExpr, - MemberProp, Null, ObjectLit, Prop, PropName, PropOrSpread, Str, + MemberProp, Null, ObjectLit, Prop, PropName, PropOrSpread, Str, Tpl, }; use swc_ecmascript::utils::ExprFactory; use swc_ecmascript::visit::{Fold, FoldWith}; @@ -61,8 +61,14 @@ impl Fold for NextDynamicPatcher { fn fold_call_expr(&mut self, expr: CallExpr) -> CallExpr { if self.is_next_dynamic_first_arg { if let Callee::Import(..) = &expr.callee { - if let Expr::Lit(Lit::Str(Str { value, .. })) = &*expr.args[0].expr { - self.dynamically_imported_specifier = Some(value.to_string()); + match &*expr.args[0].expr { + Expr::Lit(Lit::Str(Str { value, .. })) => { + self.dynamically_imported_specifier = Some(value.to_string()); + } + Expr::Tpl(Tpl { exprs, quasis, .. }) if exprs.len() == 0 => { + self.dynamically_imported_specifier = Some(quasis[0].raw.to_string()); + } + _ => {} } } return expr.fold_children_with(self); From 98090edd1322557c6e9cf68fb1f84556450af8d1 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Tue, 16 Aug 2022 02:29:11 +0800 Subject: [PATCH 3/5] chore: update test case --- .../tests/fixture/next-dynamic/template-literal/input.js | 4 ++-- .../fixture/next-dynamic/template-literal/output-dev.js | 6 +++--- .../fixture/next-dynamic/template-literal/output-prod.js | 6 +++--- .../fixture/next-dynamic/template-literal/output-server.js | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js index 785cdb687bef..3fcd617bc34e 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js @@ -1,3 +1,3 @@ -import dynamic from "next/dynamic" +import dynamic from 'next/dynamic' -const Test = dynamic(() => import(`/components/test`)) +const DynamicComponent = dynamic(() => import(`../components/hello`)) diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js index d869be4001dd..674314bdecf7 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js @@ -1,8 +1,8 @@ -import dynamic from "next/dynamic"; -const Test = dynamic(()=>import(`/components/test`), { +import dynamic from 'next/dynamic'; +const DynamicComponent = dynamic(()=>import(`../components/hello`), { loadableGenerated: { modules: [ - "some-file.js -> " + "/components/test" + "some-file.js -> " + "../components/hello" ] } }); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js index 3d309e0ca56d..0da6e366ce15 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js @@ -1,8 +1,8 @@ -import dynamic from "next/dynamic"; -const Test = dynamic(()=>import(`/components/test`), { +import dynamic from 'next/dynamic'; +const DynamicComponent = dynamic(()=>import(`../components/hello`), { loadableGenerated: { webpack: ()=>[ - require.resolveWeak("/components/test") + require.resolveWeak("../components/hello") ] } }); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js index d869be4001dd..674314bdecf7 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js @@ -1,8 +1,8 @@ -import dynamic from "next/dynamic"; -const Test = dynamic(()=>import(`/components/test`), { +import dynamic from 'next/dynamic'; +const DynamicComponent = dynamic(()=>import(`../components/hello`), { loadableGenerated: { modules: [ - "some-file.js -> " + "/components/test" + "some-file.js -> " + "../components/hello" ] } }); From 1ae23c7bbab8de00c5472987eb8930876e2513d7 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Tue, 16 Aug 2022 08:18:36 +0800 Subject: [PATCH 4/5] fix: cargo clippy --- packages/next-swc/crates/core/src/next_dynamic.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/src/next_dynamic.rs b/packages/next-swc/crates/core/src/next_dynamic.rs index 345d5baede25..7b82bcaef2e3 100644 --- a/packages/next-swc/crates/core/src/next_dynamic.rs +++ b/packages/next-swc/crates/core/src/next_dynamic.rs @@ -65,7 +65,7 @@ impl Fold for NextDynamicPatcher { Expr::Lit(Lit::Str(Str { value, .. })) => { self.dynamically_imported_specifier = Some(value.to_string()); } - Expr::Tpl(Tpl { exprs, quasis, .. }) if exprs.len() == 0 => { + Expr::Tpl(Tpl { exprs, quasis, .. }) if exprs.is_empty() => { self.dynamically_imported_specifier = Some(quasis[0].raw.to_string()); } _ => {} From 69f8c9b73c58d5b911c62dce0c788b353a086879 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Tue, 16 Aug 2022 12:15:06 +0800 Subject: [PATCH 5/5] chore: update test case --- .../core/tests/fixture/next-dynamic/template-literal/input.js | 4 ++++ .../tests/fixture/next-dynamic/template-literal/output-dev.js | 3 +++ .../fixture/next-dynamic/template-literal/output-prod.js | 3 +++ .../fixture/next-dynamic/template-literal/output-server.js | 3 +++ 4 files changed, 13 insertions(+) diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js index 3fcd617bc34e..534a01d415ad 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/input.js @@ -1,3 +1,7 @@ import dynamic from 'next/dynamic' const DynamicComponent = dynamic(() => import(`../components/hello`)) + +const componentRoot = '@/some-components' +const Component1 = dynamic(() => import(`${componentRoot}/component1`)); +const Component2 = dynamic(() => import(`${componentRoot}/component2`)); \ No newline at end of file diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js index 674314bdecf7..57f30d46f41d 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-dev.js @@ -6,3 +6,6 @@ const DynamicComponent = dynamic(()=>import(`../components/hello`), { ] } }); +const componentRoot = '@/some-components'; +const Component1 = dynamic(()=>import(`${componentRoot}/component1`)); +const Component2 = dynamic(()=>import(`${componentRoot}/component2`)); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js index 0da6e366ce15..03c318a2ae23 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-prod.js @@ -6,3 +6,6 @@ const DynamicComponent = dynamic(()=>import(`../components/hello`), { ] } }); +const componentRoot = '@/some-components'; +const Component1 = dynamic(()=>import(`${componentRoot}/component1`)); +const Component2 = dynamic(()=>import(`${componentRoot}/component2`)); diff --git a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js index 674314bdecf7..57f30d46f41d 100644 --- a/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js +++ b/packages/next-swc/crates/core/tests/fixture/next-dynamic/template-literal/output-server.js @@ -6,3 +6,6 @@ const DynamicComponent = dynamic(()=>import(`../components/hello`), { ] } }); +const componentRoot = '@/some-components'; +const Component1 = dynamic(()=>import(`${componentRoot}/component1`)); +const Component2 = dynamic(()=>import(`${componentRoot}/component2`));