diff --git a/src/transpiling/mod.rs b/src/transpiling/mod.rs index 24f0529..e899e0c 100644 --- a/src/transpiling/mod.rs +++ b/src/transpiling/mod.rs @@ -285,10 +285,6 @@ pub fn fold_program( let unresolved_mark = Mark::new(); let mut passes = chain!( - Optional::new( - transforms::ImportDeclsToVarDeclsFolder, - options.var_decl_imports - ), Optional::new(transforms::StripExportsFolder, options.var_decl_imports), resolver(unresolved_mark, top_level_mark, true), proposal::decorators::decorators(proposal::decorators::Config { @@ -344,6 +340,10 @@ pub fn fold_program( ), options.transform_jsx ), + Optional::new( + transforms::ImportDeclsToVarDeclsFolder, + options.var_decl_imports + ), fixer(Some(comments)), hygiene(), ); @@ -818,6 +818,41 @@ function App() { assert_eq!(&code[..expected.len()], expected); } + #[test] + fn test_transpile_jsx_import_source_pragma_var_decl_imports() { + let specifier = + ModuleSpecifier::parse("https://deno.land/x/mod.tsx").unwrap(); + let source = r#" +/** @jsxImportSource jsx_lib */ + +function App() { + return ( +
<>
+ ); +}"#; + let module = parse_module(ParseParams { + specifier: specifier.as_str().to_string(), + text_info: SourceTextInfo::from_string(source.to_string()), + media_type: MediaType::Jsx, + capture_tokens: false, + maybe_syntax: None, + scope_analysis: true, + }) + .unwrap(); + let emit_options = EmitOptions { + var_decl_imports: true, + ..Default::default() + }; + let code = module.transpile(&emit_options).unwrap().text; + let expected = r#"/** @jsxImportSource jsx_lib */ const { "jsx": _jsx1, "Fragment": _Fragment1 } = await import("jsx_lib/jsx-runtime"); +function App() { + return /*#__PURE__*/ _jsx("div", { + children: /*#__PURE__*/ _jsx(_Fragment, {}) + }); +"#; + assert_eq!(&code[..expected.len()], expected); + } + #[test] fn test_transpile_decorators() { let specifier = diff --git a/src/transpiling/transforms.rs b/src/transpiling/transforms.rs index 5958fba..b690aea 100644 --- a/src/transpiling/transforms.rs +++ b/src/transpiling/transforms.rs @@ -1,5 +1,7 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use swc_ast::Ident; + use crate::swc::ast as swc_ast; use crate::swc::common::DUMMY_SP; use crate::swc::visit::noop_fold_type; @@ -58,7 +60,7 @@ impl Fold for ImportDeclsToVarDeclsFolder { }, specifier.local.sym.to_string(), ), - None => create_assignment(specifier.local.sym.to_string()), + None => create_assignment(specifier.local.clone()), }) } ImportSpecifier::Namespace(_) => None, @@ -69,9 +71,10 @@ impl Fold for ImportDeclsToVarDeclsFolder { .specifiers .iter() .find_map(|specifier| match specifier { - ImportSpecifier::Namespace(specifier) => { - Some(create_binding_ident(specifier.local.sym.to_string())) - } + ImportSpecifier::Namespace(specifier) => Some(BindingIdent { + id: specifier.local.clone(), + type_ann: None, + }), _ => None, }); @@ -190,13 +193,6 @@ fn create_empty_stmt() -> swc_ast::ModuleItem { ModuleItem::Stmt(Stmt::Empty(EmptyStmt { span: DUMMY_SP })) } -fn create_binding_ident(name: String) -> swc_ast::BindingIdent { - swc_ast::BindingIdent { - id: create_ident(name), - type_ann: None, - } -} - fn create_ident(name: String) -> swc_ast::Ident { swc_ast::Ident { span: DUMMY_SP, @@ -269,10 +265,10 @@ fn create_await_import_expr( })) } -fn create_assignment(key: String) -> swc_ast::ObjectPatProp { +fn create_assignment(key: Ident) -> swc_ast::ObjectPatProp { swc_ast::ObjectPatProp::Assign(swc_ast::AssignPatProp { span: DUMMY_SP, - key: create_ident(key), + key, value: None, }) }