diff --git a/crates/engine/src/code_connect_tests.rs b/crates/engine/src/code_connect_tests.rs
index 50db0ea8..1ee785e6 100644
--- a/crates/engine/src/code_connect_tests.rs
+++ b/crates/engine/src/code_connect_tests.rs
@@ -255,3 +255,17 @@ fn vue_links_are_a_default_import_with_quoted_bindings() {
assert!(s.execute("codeConnect.set", &json!({"id": c, "language": "css"})).is_err(), "not a code language");
assert!(s.execute("codeConnect.set", &json!({"id": c, "language": "vue", "importPath": "a b"})).is_err(), "no spaces in a path");
}
+
+#[test]
+fn vue_layer_trees_import_connected_components_in_script_setup() {
+ let mut s = Session::new();
+ let c = card(&mut s);
+ ex(&mut s, "codeConnect.set", json!({"id": c, "language": "vue", "importPath": "./Card.vue"}));
+ let screen = idv(&ex(&mut s, "frame.create", json!({"x": 0, "y": 500, "width": 400, "height": 300, "name": "Screen"})));
+ ex(&mut s, "instance.create", json!({"component": c, "x": 20, "y": 30, "parent": screen}));
+ // A single-file component's imports belong in its `\n\n\n";
+ assert!(code.starts_with(want), "{code}");
+ assert_eq!(code.matches("import Card").count(), 1, "{code}");
+}
diff --git a/crates/engine/src/component_codegen.rs b/crates/engine/src/component_codegen.rs
index 69b1e05d..2bbb2e10 100644
--- a/crates/engine/src/component_codegen.rs
+++ b/crates/engine/src/component_codegen.rs
@@ -147,7 +147,29 @@ pub fn code(doc: &Document, id: NodeId, lang: CodeLang) -> String {
}
},
};
- crate::code_connect::with_imports(&crate::code_connect::tree_imports(doc, id, lang), code)
+ let imports = crate::code_connect::tree_imports(doc, id, lang);
+ if lang == CodeLang::Vue && !imports.is_empty() {
+ return vue_with_imports(&imports, code);
+ }
+ crate::code_connect::with_imports(&imports, code)
+}
+
+/// A Vue single-file component imports in its `\n\n{tail}")
+ }
+ None => crate::code_connect::with_imports(imports, code),
+ }
}
fn is_component(doc: &Document, id: NodeId) -> bool {