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,
})
}