From 0899eebb71cbad6408cefc7efd118ada509b71d2 Mon Sep 17 00:00:00 2001 From: tajo Date: Wed, 5 Jul 2023 17:01:02 -0700 Subject: [PATCH 1/3] Add support for split transformation --- Cargo.lock | 18 +- packages/fusion/src/lib.rs | 4 + packages/fusion/transform/Cargo.toml | 2 + packages/fusion/transform/src/lib.rs | 11 +- .../fusion/transform/src/split/analyzer.rs | 31 ++++ packages/fusion/transform/src/split/mod.rs | 19 ++ packages/fusion/transform/src/visitors/mod.rs | 1 + .../fusion/transform/src/visitors/split.rs | 175 ++++++++++++++++++ packages/fusion/transform/tests/fixture.rs | 3 +- .../asseturl-use-file-name/config.json | 1 - .../tests/fixtures/dirname/config.json | 1 - .../fixtures/gql-use-file-name/config.json | 1 - .../tests/fixtures/i18n-component/config.json | 1 - .../fixtures/i18n-use-translate/config.json | 1 - .../i18n-with-translations/config.json | 1 - .../transform/tests/fixtures/split/code.js | 1 + .../tests/fixtures/split/config.json | 3 + .../transform/tests/fixtures/split/output.js | 14 ++ 18 files changed, 269 insertions(+), 19 deletions(-) create mode 100644 packages/fusion/transform/src/split/analyzer.rs create mode 100644 packages/fusion/transform/src/split/mod.rs create mode 100644 packages/fusion/transform/src/visitors/split.rs create mode 100644 packages/fusion/transform/tests/fixtures/split/code.js create mode 100644 packages/fusion/transform/tests/fixtures/split/config.json create mode 100644 packages/fusion/transform/tests/fixtures/split/output.js diff --git a/Cargo.lock b/Cargo.lock index 20064e1..2827a60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -311,9 +311,9 @@ dependencies = [ [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -338,6 +338,7 @@ dependencies = [ "byteorder", "fxhash", "once_cell", + "percent-encoding", "radix_fmt", "regex", "serde", @@ -346,6 +347,7 @@ dependencies = [ "swc_core", "testing", "tracing", + "url", ] [[package]] @@ -443,9 +445,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -795,9 +797,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "phf" @@ -2080,9 +2082,9 @@ checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", diff --git a/packages/fusion/src/lib.rs b/packages/fusion/src/lib.rs index 28a0606..216a594 100644 --- a/packages/fusion/src/lib.rs +++ b/packages/fusion/src/lib.rs @@ -45,6 +45,10 @@ fn fusion_asseturl(mut program: Program, data: TransformPluginProgramMetadata) - program.visit_mut_with(&mut pass); + let mut pass = fusion::split_macro(file_name.clone()); + + program.visit_mut_with(&mut pass); + debug!("Running i18n macro"); let mut pass = fusion::i18n_macro(file_name.clone()); diff --git a/packages/fusion/transform/Cargo.toml b/packages/fusion/transform/Cargo.toml index 463ab51..b563230 100644 --- a/packages/fusion/transform/Cargo.toml +++ b/packages/fusion/transform/Cargo.toml @@ -14,6 +14,7 @@ base64 = "0.13" byteorder = "1" fxhash = "0.2.1" once_cell = "1.13.0" +percent-encoding = "2.3.0" radix_fmt = "1" regex = "1.5" serde = "1" @@ -27,6 +28,7 @@ swc_core = { features = [ "trace_macro", ], version = "0.76.6" } tracing = { version = "0.1.37" } +url = "2.2.2" [dev-dependencies] serde_json = "1" diff --git a/packages/fusion/transform/src/lib.rs b/packages/fusion/transform/src/lib.rs index 285428b..e66b856 100644 --- a/packages/fusion/transform/src/lib.rs +++ b/packages/fusion/transform/src/lib.rs @@ -15,7 +15,9 @@ pub use crate::{ asseturl_utils::{analyzer as asseturlAnalyzer, State as asseturlState}, gql_utils::{analyzer as gqlAnalyzer, State as gqlState}, i18n::{i18n_analyze_imports, i18n_analyze_use_translation, State as i18n_state}, - visitors::{asseturl::asseturl, dirname::dirname, gql::gql, i18n::i18n_report_ids}, + visitors::{ + asseturl::asseturl, dirname::dirname, gql::gql, i18n::i18n_report_ids, split::split, + }, }; mod asseturl_utils; @@ -96,8 +98,9 @@ pub fn gql_macro(config: Config) -> impl Fold + VisitMut { } pub fn dirname_macro(file_name: FileName) -> impl Fold + VisitMut { - // let state: Rc> = Default::default(); - // let config = Rc::new(config); - dirname(file_name) } + +pub fn split_macro(file_name: FileName) -> impl Fold + VisitMut { + split(file_name) +} diff --git a/packages/fusion/transform/src/split/analyzer.rs b/packages/fusion/transform/src/split/analyzer.rs new file mode 100644 index 0000000..99c05e7 --- /dev/null +++ b/packages/fusion/transform/src/split/analyzer.rs @@ -0,0 +1,31 @@ +use std::{cell::RefCell, rc::Rc}; + +use swc_core::ecma::{ + ast::*, + visit::{as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitWith}, +}; + +use super::State; +use crate::Config; + +pub fn analyzer(config: Rc, state: Rc>) -> impl VisitMut + Fold { + as_folder(AsAnalyzer { config, state }) +} + +struct AsAnalyzer { + config: Rc, + state: Rc>, +} + +impl VisitMut for AsAnalyzer { + noop_visit_mut_type!(); +} + +struct Analyzer<'a> { + config: &'a Config, + state: &'a mut State, +} + +impl Visit for Analyzer<'_> { + noop_visit_type!(); +} diff --git a/packages/fusion/transform/src/split/mod.rs b/packages/fusion/transform/src/split/mod.rs new file mode 100644 index 0000000..772ba50 --- /dev/null +++ b/packages/fusion/transform/src/split/mod.rs @@ -0,0 +1,19 @@ +use std::cell::RefCell; + +use swc_core::{ + common::{collections::AHashMap, SyntaxContext}, + ecma::ast::*, +}; + +pub use self::analyzer::{analyzer}; + +mod analyzer; + +/// This is created once per file. +#[derive(Debug, Default)] +pub struct State { + +} + +impl State { +} diff --git a/packages/fusion/transform/src/visitors/mod.rs b/packages/fusion/transform/src/visitors/mod.rs index 3105aa5..10ec615 100644 --- a/packages/fusion/transform/src/visitors/mod.rs +++ b/packages/fusion/transform/src/visitors/mod.rs @@ -2,3 +2,4 @@ pub mod asseturl; pub mod dirname; pub mod gql; pub mod i18n; +pub mod split; diff --git a/packages/fusion/transform/src/visitors/split.rs b/packages/fusion/transform/src/visitors/split.rs new file mode 100644 index 0000000..90d3599 --- /dev/null +++ b/packages/fusion/transform/src/visitors/split.rs @@ -0,0 +1,175 @@ +use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; +use swc_core::{ + common::{FileName, DUMMY_SP}, + ecma::{ + ast::*, + visit::{as_folder, noop_visit_mut_type, Fold, VisitMut}, + }, +}; + +pub fn split(file_name: FileName) -> impl VisitMut + Fold { + as_folder(DisplayNameAndId { file_name }) +} + +#[derive(Debug)] +struct DisplayNameAndId { + file_name: FileName, +} + +impl VisitMut for DisplayNameAndId { + noop_visit_mut_type!(); + + fn visit_mut_call_expr(&mut self, call_expr: &mut CallExpr) { + match &call_expr.callee { + Callee::Import(_) => { + match call_expr.args.first() { + Some(arg) => { + match arg { + ExprOrSpread { expr, .. } => { + match &**expr { + &Expr::Lit(ref lit) => match lit { + Lit::Str(lit_str) => { + let obj_ident = + Expr::Ident(Ident::new("Object".into(), DUMMY_SP)); + let define_props_ident = MemberProp::Ident(Ident::new( + "defineProperties".into(), + DUMMY_SP, + )); + let new_callee = Expr::Member(MemberExpr { + span: DUMMY_SP, + obj: Box::new(obj_ident), + prop: define_props_ident, + }); + let import_arg = Expr::Lit(Lit::Str(Str { + value: lit_str.value.clone(), + span: DUMMY_SP, + raw: Default::default(), + })); + + let import_callee = + Expr::Ident(Ident::new("import".into(), DUMMY_SP)); + let import_call = Expr::Call(CallExpr { + span: DUMMY_SP, + callee: Callee::Expr(Box::new(import_callee)), + args: vec![ExprOrSpread { + spread: None, + expr: Box::new(import_arg.clone()), + }], + type_args: Default::default(), + }); + + let encoded_file_name = utf8_percent_encode( + &self.file_name.to_string(), + NON_ALPHANUMERIC, + ) + .to_string(); + + let encoded_import = utf8_percent_encode( + &lit_str.value.clone().to_string(), + NON_ALPHANUMERIC, + ) + .to_string(); + + let module_id = format!( + "{}{}{}{}", + "virtual:fusion-vite-split-loader?importer=", + encoded_file_name, + "&specifier=", + encoded_import + ); + + let obj_lit = Expr::Object(ObjectLit { + span: DUMMY_SP, + props: vec![ + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("__CHUNK_IDS".into(), DUMMY_SP)), + value: Box::new(Expr::Object(ObjectLit { + span: DUMMY_SP, + props: vec![PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("value".into(), DUMMY_SP)), + value: Box::new(Expr::Array(ArrayLit { + span: DUMMY_SP, + elems: vec![], + })), + })))], + })), + }))), + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("__MODULE_ID".into(), DUMMY_SP)), + value: Box::new(Expr::Object(ObjectLit { + span: DUMMY_SP, + props: vec![PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("value".into(), DUMMY_SP)), + value: Box::new(Expr::Lit(Lit::Str(Str { + span: DUMMY_SP, + value: module_id.clone().into(), + raw: Default::default(), + }))), + })))], + })), + }))), + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("__FUSION_DYNAMIC_IMPORT_METADATA__".into(), DUMMY_SP)), + value: Box::new(Expr::Object(ObjectLit { + span: DUMMY_SP, + props: vec![PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("value".into(), DUMMY_SP)), + value: Box::new(Expr::Object(ObjectLit { + span: DUMMY_SP, + props: vec![ + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("version".into(), DUMMY_SP)), + value: Box::new(Expr::Lit(Lit::Num(Number { + span: DUMMY_SP, + value: 0.0, + raw: Default::default(), + }))), + }))), + PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(Ident::new("moduleId".into(), DUMMY_SP)), + value: Box::new(Expr::Lit(Lit::Str(Str { + span: DUMMY_SP, + value: module_id.clone().into(), + raw: Default::default(), + }))), + }))), + ], + })), + })))], + })), + }))), + ], + }); + + let new_args = vec![ + ExprOrSpread { + spread: None, + expr: Box::new(import_call), + }, + ExprOrSpread { + spread: None, + expr: Box::new(obj_lit), + }, + ]; + + *call_expr = CallExpr { + span: call_expr.span, + callee: Callee::Expr(Box::new(new_callee)), + args: new_args, + type_args: Default::default(), + }; + } + _ => {} + }, + _ => {} + } + } + } + } + _ => {} + } + } + _ => (), + } + } +} diff --git a/packages/fusion/transform/tests/fixture.rs b/packages/fusion/transform/tests/fixture.rs index 5d8bc6b..2e59a7d 100644 --- a/packages/fusion/transform/tests/fixture.rs +++ b/packages/fusion/transform/tests/fixture.rs @@ -2,7 +2,7 @@ use std::{fs::read_to_string, path::PathBuf}; -use fusion::{asseturl_macro, dirname_macro, gql_macro, i18n_macro, Config}; +use fusion::{asseturl_macro, dirname_macro, gql_macro, i18n_macro, split_macro, Config}; use swc_core::{ common::{chain, FileName, Mark}, ecma::{ @@ -29,6 +29,7 @@ fn fixture(input: PathBuf) { asseturl_macro(config.clone()), gql_macro(config.clone()), dirname_macro(FileName::Real(PathBuf::from("/path/to/file.js"))), + split_macro(FileName::Real(PathBuf::from("/path/to/file.js"))), i18n_macro(FileName::Real(PathBuf::from("/path/to/file.js"))), ) }, diff --git a/packages/fusion/transform/tests/fixtures/asseturl-use-file-name/config.json b/packages/fusion/transform/tests/fixtures/asseturl-use-file-name/config.json index 2c67908..90b9e00 100644 --- a/packages/fusion/transform/tests/fixtures/asseturl-use-file-name/config.json +++ b/packages/fusion/transform/tests/fixtures/asseturl-use-file-name/config.json @@ -1,4 +1,3 @@ { - "transpileTemplateLiterals": false, "ssr": true } diff --git a/packages/fusion/transform/tests/fixtures/dirname/config.json b/packages/fusion/transform/tests/fixtures/dirname/config.json index 2c67908..90b9e00 100644 --- a/packages/fusion/transform/tests/fixtures/dirname/config.json +++ b/packages/fusion/transform/tests/fixtures/dirname/config.json @@ -1,4 +1,3 @@ { - "transpileTemplateLiterals": false, "ssr": true } diff --git a/packages/fusion/transform/tests/fixtures/gql-use-file-name/config.json b/packages/fusion/transform/tests/fixtures/gql-use-file-name/config.json index 2c67908..90b9e00 100644 --- a/packages/fusion/transform/tests/fixtures/gql-use-file-name/config.json +++ b/packages/fusion/transform/tests/fixtures/gql-use-file-name/config.json @@ -1,4 +1,3 @@ { - "transpileTemplateLiterals": false, "ssr": true } diff --git a/packages/fusion/transform/tests/fixtures/i18n-component/config.json b/packages/fusion/transform/tests/fixtures/i18n-component/config.json index 2c67908..90b9e00 100644 --- a/packages/fusion/transform/tests/fixtures/i18n-component/config.json +++ b/packages/fusion/transform/tests/fixtures/i18n-component/config.json @@ -1,4 +1,3 @@ { - "transpileTemplateLiterals": false, "ssr": true } diff --git a/packages/fusion/transform/tests/fixtures/i18n-use-translate/config.json b/packages/fusion/transform/tests/fixtures/i18n-use-translate/config.json index 2c67908..90b9e00 100644 --- a/packages/fusion/transform/tests/fixtures/i18n-use-translate/config.json +++ b/packages/fusion/transform/tests/fixtures/i18n-use-translate/config.json @@ -1,4 +1,3 @@ { - "transpileTemplateLiterals": false, "ssr": true } diff --git a/packages/fusion/transform/tests/fixtures/i18n-with-translations/config.json b/packages/fusion/transform/tests/fixtures/i18n-with-translations/config.json index 2c67908..90b9e00 100644 --- a/packages/fusion/transform/tests/fixtures/i18n-with-translations/config.json +++ b/packages/fusion/transform/tests/fixtures/i18n-with-translations/config.json @@ -1,4 +1,3 @@ { - "transpileTemplateLiterals": false, "ssr": true } diff --git a/packages/fusion/transform/tests/fixtures/split/code.js b/packages/fusion/transform/tests/fixtures/split/code.js new file mode 100644 index 0000000..ba1843f --- /dev/null +++ b/packages/fusion/transform/tests/fixtures/split/code.js @@ -0,0 +1 @@ +import('./foo/baz') diff --git a/packages/fusion/transform/tests/fixtures/split/config.json b/packages/fusion/transform/tests/fixtures/split/config.json new file mode 100644 index 0000000..90b9e00 --- /dev/null +++ b/packages/fusion/transform/tests/fixtures/split/config.json @@ -0,0 +1,3 @@ +{ + "ssr": true +} diff --git a/packages/fusion/transform/tests/fixtures/split/output.js b/packages/fusion/transform/tests/fixtures/split/output.js new file mode 100644 index 0000000..d833a8d --- /dev/null +++ b/packages/fusion/transform/tests/fixtures/split/output.js @@ -0,0 +1,14 @@ +Object.defineProperties(import("./foo/baz"), { + __CHUNK_IDS: { + value: [] + }, + __MODULE_ID: { + value: "virtual:fusion-vite-split-loader?importer=%2Fpath%2Fto%2Ffile%2Ejs&specifier=%2E%2Ffoo%2Fbaz" + }, + __FUSION_DYNAMIC_IMPORT_METADATA__: { + value: { + version: 0, + moduleId: "virtual:fusion-vite-split-loader?importer=%2Fpath%2Fto%2Ffile%2Ejs&specifier=%2E%2Ffoo%2Fbaz" + } + } +}); From b61fc0318956f8712bf67165fb76a30528d9b474 Mon Sep 17 00:00:00 2001 From: tajo Date: Wed, 5 Jul 2023 23:39:55 -0700 Subject: [PATCH 2/3] bump version --- packages/fusion/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fusion/package.json b/packages/fusion/package.json index 9f900e0..f04b99b 100644 --- a/packages/fusion/package.json +++ b/packages/fusion/package.json @@ -1,6 +1,6 @@ { "name": "swc-plugin-fusion", - "version": "1.0.4", + "version": "1.0.8", "description": "SWC plugin for fusion", "main": "plugin_fusion.wasm", "publishConfig": { From fde4b78ad95a806406f0648f4ac3a1fe5b21f1e0 Mon Sep 17 00:00:00 2001 From: tajo Date: Wed, 5 Jul 2023 23:48:57 -0700 Subject: [PATCH 3/3] fix format and errors --- .../fusion/transform/src/dirname/analyzer.rs | 31 ---- packages/fusion/transform/src/dirname/mod.rs | 19 --- .../fusion/transform/src/split/analyzer.rs | 31 ---- packages/fusion/transform/src/split/mod.rs | 19 --- .../fusion/transform/src/visitors/split.rs | 161 +++++++++--------- 5 files changed, 81 insertions(+), 180 deletions(-) delete mode 100644 packages/fusion/transform/src/dirname/analyzer.rs delete mode 100644 packages/fusion/transform/src/dirname/mod.rs delete mode 100644 packages/fusion/transform/src/split/analyzer.rs delete mode 100644 packages/fusion/transform/src/split/mod.rs diff --git a/packages/fusion/transform/src/dirname/analyzer.rs b/packages/fusion/transform/src/dirname/analyzer.rs deleted file mode 100644 index 99c05e7..0000000 --- a/packages/fusion/transform/src/dirname/analyzer.rs +++ /dev/null @@ -1,31 +0,0 @@ -use std::{cell::RefCell, rc::Rc}; - -use swc_core::ecma::{ - ast::*, - visit::{as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitWith}, -}; - -use super::State; -use crate::Config; - -pub fn analyzer(config: Rc, state: Rc>) -> impl VisitMut + Fold { - as_folder(AsAnalyzer { config, state }) -} - -struct AsAnalyzer { - config: Rc, - state: Rc>, -} - -impl VisitMut for AsAnalyzer { - noop_visit_mut_type!(); -} - -struct Analyzer<'a> { - config: &'a Config, - state: &'a mut State, -} - -impl Visit for Analyzer<'_> { - noop_visit_type!(); -} diff --git a/packages/fusion/transform/src/dirname/mod.rs b/packages/fusion/transform/src/dirname/mod.rs deleted file mode 100644 index 772ba50..0000000 --- a/packages/fusion/transform/src/dirname/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::cell::RefCell; - -use swc_core::{ - common::{collections::AHashMap, SyntaxContext}, - ecma::ast::*, -}; - -pub use self::analyzer::{analyzer}; - -mod analyzer; - -/// This is created once per file. -#[derive(Debug, Default)] -pub struct State { - -} - -impl State { -} diff --git a/packages/fusion/transform/src/split/analyzer.rs b/packages/fusion/transform/src/split/analyzer.rs deleted file mode 100644 index 99c05e7..0000000 --- a/packages/fusion/transform/src/split/analyzer.rs +++ /dev/null @@ -1,31 +0,0 @@ -use std::{cell::RefCell, rc::Rc}; - -use swc_core::ecma::{ - ast::*, - visit::{as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitWith}, -}; - -use super::State; -use crate::Config; - -pub fn analyzer(config: Rc, state: Rc>) -> impl VisitMut + Fold { - as_folder(AsAnalyzer { config, state }) -} - -struct AsAnalyzer { - config: Rc, - state: Rc>, -} - -impl VisitMut for AsAnalyzer { - noop_visit_mut_type!(); -} - -struct Analyzer<'a> { - config: &'a Config, - state: &'a mut State, -} - -impl Visit for Analyzer<'_> { - noop_visit_type!(); -} diff --git a/packages/fusion/transform/src/split/mod.rs b/packages/fusion/transform/src/split/mod.rs deleted file mode 100644 index 772ba50..0000000 --- a/packages/fusion/transform/src/split/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::cell::RefCell; - -use swc_core::{ - common::{collections::AHashMap, SyntaxContext}, - ecma::ast::*, -}; - -pub use self::analyzer::{analyzer}; - -mod analyzer; - -/// This is created once per file. -#[derive(Debug, Default)] -pub struct State { - -} - -impl State { -} diff --git a/packages/fusion/transform/src/visitors/split.rs b/packages/fusion/transform/src/visitors/split.rs index 90d3599..995ff3e 100644 --- a/packages/fusion/transform/src/visitors/split.rs +++ b/packages/fusion/transform/src/visitors/split.rs @@ -1,6 +1,6 @@ use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; use swc_core::{ - common::{FileName, DUMMY_SP}, + common::{errors::HANDLER, FileName, DUMMY_SP}, ecma::{ ast::*, visit::{as_folder, noop_visit_mut_type, Fold, VisitMut}, @@ -21,64 +21,60 @@ impl VisitMut for DisplayNameAndId { fn visit_mut_call_expr(&mut self, call_expr: &mut CallExpr) { match &call_expr.callee { - Callee::Import(_) => { - match call_expr.args.first() { - Some(arg) => { - match arg { - ExprOrSpread { expr, .. } => { - match &**expr { - &Expr::Lit(ref lit) => match lit { - Lit::Str(lit_str) => { - let obj_ident = - Expr::Ident(Ident::new("Object".into(), DUMMY_SP)); - let define_props_ident = MemberProp::Ident(Ident::new( - "defineProperties".into(), - DUMMY_SP, - )); - let new_callee = Expr::Member(MemberExpr { - span: DUMMY_SP, - obj: Box::new(obj_ident), - prop: define_props_ident, - }); - let import_arg = Expr::Lit(Lit::Str(Str { - value: lit_str.value.clone(), - span: DUMMY_SP, - raw: Default::default(), - })); + Callee::Import(_) => match call_expr.args.first() { + Some(arg) => match arg { + ExprOrSpread { expr, .. } => match &**expr { + &Expr::Lit(ref lit) => match lit { + Lit::Str(lit_str) => { + let obj_ident = Expr::Ident(Ident::new("Object".into(), DUMMY_SP)); + let define_props_ident = MemberProp::Ident(Ident::new( + "defineProperties".into(), + DUMMY_SP, + )); + let new_callee = Expr::Member(MemberExpr { + span: DUMMY_SP, + obj: Box::new(obj_ident), + prop: define_props_ident, + }); + let import_arg = Expr::Lit(Lit::Str(Str { + value: lit_str.value.clone(), + span: DUMMY_SP, + raw: Default::default(), + })); - let import_callee = - Expr::Ident(Ident::new("import".into(), DUMMY_SP)); - let import_call = Expr::Call(CallExpr { - span: DUMMY_SP, - callee: Callee::Expr(Box::new(import_callee)), - args: vec![ExprOrSpread { - spread: None, - expr: Box::new(import_arg.clone()), - }], - type_args: Default::default(), - }); + let import_callee = + Expr::Ident(Ident::new("import".into(), DUMMY_SP)); + let import_call = Expr::Call(CallExpr { + span: DUMMY_SP, + callee: Callee::Expr(Box::new(import_callee)), + args: vec![ExprOrSpread { + spread: None, + expr: Box::new(import_arg.clone()), + }], + type_args: Default::default(), + }); - let encoded_file_name = utf8_percent_encode( - &self.file_name.to_string(), - NON_ALPHANUMERIC, - ) - .to_string(); + let encoded_file_name = utf8_percent_encode( + &self.file_name.to_string(), + NON_ALPHANUMERIC, + ) + .to_string(); - let encoded_import = utf8_percent_encode( - &lit_str.value.clone().to_string(), - NON_ALPHANUMERIC, - ) - .to_string(); + let encoded_import = utf8_percent_encode( + &lit_str.value.clone().to_string(), + NON_ALPHANUMERIC, + ) + .to_string(); - let module_id = format!( - "{}{}{}{}", - "virtual:fusion-vite-split-loader?importer=", - encoded_file_name, - "&specifier=", - encoded_import - ); + let module_id = format!( + "{}{}{}{}", + "virtual:fusion-vite-split-loader?importer=", + encoded_file_name, + "&specifier=", + encoded_import + ); - let obj_lit = Expr::Object(ObjectLit { + let obj_lit = Expr::Object(ObjectLit { span: DUMMY_SP, props: vec![ PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { @@ -141,34 +137,39 @@ impl VisitMut for DisplayNameAndId { ], }); - let new_args = vec![ - ExprOrSpread { - spread: None, - expr: Box::new(import_call), - }, - ExprOrSpread { - spread: None, - expr: Box::new(obj_lit), - }, - ]; - - *call_expr = CallExpr { - span: call_expr.span, - callee: Callee::Expr(Box::new(new_callee)), - args: new_args, - type_args: Default::default(), - }; - } - _ => {} + let new_args = vec![ + ExprOrSpread { + spread: None, + expr: Box::new(import_call), }, - _ => {} - } + ExprOrSpread { + spread: None, + expr: Box::new(obj_lit), + }, + ]; + + *call_expr = CallExpr { + span: call_expr.span, + callee: Callee::Expr(Box::new(new_callee)), + args: new_args, + type_args: Default::default(), + }; } - } - } - _ => {} - } - } + _ => HANDLER.with(|handler| { + handler.err(&format!( + "Only string literal is supported in dynamic import" + )); + }), + }, + _ => HANDLER.with(|handler| { + handler.err(&format!( + "Only string literal is supported in dynamic import" + )); + }), + }, + }, + _ => {} + }, _ => (), } }