diff --git a/app/assets/javascripts/discourse/app/lib/plugin-connectors.js b/app/assets/javascripts/discourse/app/lib/plugin-connectors.js
index f3c8f7eda44..9a9115aab65 100644
--- a/app/assets/javascripts/discourse/app/lib/plugin-connectors.js
+++ b/app/assets/javascripts/discourse/app/lib/plugin-connectors.js
@@ -31,6 +31,11 @@ export function extraConnectorComponent(outletName, klass) {
if (!hasInternalComponentManager(klass)) {
throw new Error("klass is not an Ember component");
}
+ if (!getComponentTemplate(klass)) {
+ throw new Error(
+ "connector component has no associated template. Ensure the template is colocated or authored with gjs."
+ );
+ }
if (outletName.includes("/")) {
throw new Error("invalid outlet name");
}
diff --git a/app/assets/javascripts/discourse/tests/integration/components/plugin-outlet-test.gjs b/app/assets/javascripts/discourse/tests/integration/components/plugin-outlet-test.gjs
index 1e3c14b480e..6f41ab0f6c0 100644
--- a/app/assets/javascripts/discourse/tests/integration/components/plugin-outlet-test.gjs
+++ b/app/assets/javascripts/discourse/tests/integration/components/plugin-outlet-test.gjs
@@ -466,6 +466,22 @@ module(
await render(hbs``);
assert.dom(".gjs-test").hasText("Hello world from gjs");
});
+
+ test("throws errors for invalid components", function (assert) {
+ assert.throws(() => {
+ extraConnectorComponent("test-name/blah",
+ hello world
+ );
+ }, /invalid outlet name/);
+
+ assert.throws(() => {
+ extraConnectorComponent("test-name", {});
+ }, /klass is not an Ember component/);
+
+ assert.throws(() => {
+ extraConnectorComponent("test-name", class extends Component {});
+ }, /connector component has no associated template/);
+ });
}
);