Skip to content

Commit 2d144d3

Browse files
authored
fix(plugins): keep ui_extensions driver filter when parsing plugin manifests (#424)
UIExtensionEntry was missing the driver field, so serde silently dropped it while deserializing plugin manifests. The frontend then received entries without a driver filter and rendered every connection_content contribution for every driver, letting plugins overwrite each other's connection state in the new-connection modal.
1 parent 471b73e commit 2d144d3

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

src-tauri/src/drivers/driver_trait.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ pub struct UIExtensionEntry {
149149
/// Ordering weight (lower = earlier).
150150
#[serde(skip_serializing_if = "Option::is_none")]
151151
pub order: Option<u32>,
152+
/// If set, the contribution is only rendered when the active driver
153+
/// matches this identifier (e.g. `"wordpress"`).
154+
#[serde(skip_serializing_if = "Option::is_none")]
155+
pub driver: Option<String>,
152156
}
153157

154158
/// A single user-configurable setting declared in a plugin's manifest.

src-tauri/src/plugins/tests.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::fs;
33
use tempfile::tempdir;
44

55
use super::installer::read_plugin_info_from_dir;
6+
use super::manager::ConfigManifest;
67

78
#[test]
89
fn reads_installed_plugin_info_from_manifest() {
@@ -27,6 +28,36 @@ fn reads_installed_plugin_info_from_manifest() {
2728
assert_eq!(plugin.description, "Query Sheets");
2829
}
2930

31+
#[test]
32+
fn preserves_ui_extension_driver_filter_from_manifest() {
33+
let manifest: ConfigManifest = serde_json::from_str(
34+
r#"{
35+
"id": "wordpress",
36+
"name": "WordPress",
37+
"version": "1.0.0",
38+
"description": "WordPress driver",
39+
"ui_extensions": [
40+
{
41+
"slot": "connection-modal.connection_content",
42+
"module": "ui/dist/index.js",
43+
"driver": "wordpress"
44+
},
45+
{
46+
"slot": "data-grid.toolbar.actions",
47+
"module": "ui/dist/index.js",
48+
"order": 10
49+
}
50+
]
51+
}"#,
52+
)
53+
.expect("parse manifest");
54+
55+
let entries = manifest.ui_extensions.expect("ui_extensions present");
56+
assert_eq!(entries[0].driver.as_deref(), Some("wordpress"));
57+
assert_eq!(entries[1].driver, None);
58+
assert_eq!(entries[1].order, Some(10));
59+
}
60+
3061
#[test]
3162
fn returns_error_for_invalid_manifest() {
3263
let dir = tempdir().expect("temp dir");

0 commit comments

Comments
 (0)