summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app/App.test.ts17
-rw-r--r--src/app/plugin-host.svelte.ts6
2 files changed, 23 insertions, 0 deletions
diff --git a/src/app/App.test.ts b/src/app/App.test.ts
index 94b9c0c..026c5c7 100644
--- a/src/app/App.test.ts
+++ b/src/app/App.test.ts
@@ -87,6 +87,23 @@ function fakeFetchImpl(): typeof fetch {
status: 200,
});
}
+ if (/\/plugins\/[^/]+\/frontend/.test(url)) {
+ // plan 03 frontend module (no fixtures declare one) — the plain 404
+ // the route returns for unknown/unloaded/frontend-less plugins.
+ return new Response(JSON.stringify({ error: "No frontend module for this plugin" }), {
+ status: 404,
+ });
+ }
+ if (/\/plugins(\?.*)?$/.test(url)) {
+ // Valid EMPTY list (plan 03): the plugin host's boot
+ // `extensions-changed`/workspace syncs read this — a shapeless
+ // fallback body would be cast to PluginListResponse and crash the
+ // diff (`list.loaded` not iterable).
+ return new Response(
+ JSON.stringify({ loaded: [], disabledWithReason: [], discovered: [], missing: [] }),
+ { status: 200 },
+ );
+ }
return new Response(JSON.stringify({ chunks: [], latestSeq: 0 }), { status: 200 });
};
}
diff --git a/src/app/plugin-host.svelte.ts b/src/app/plugin-host.svelte.ts
index 9e53bc1..729a8aa 100644
--- a/src/app/plugin-host.svelte.ts
+++ b/src/app/plugin-host.svelte.ts
@@ -122,6 +122,12 @@ export function createPluginHost(opts: PluginHostOptions): PluginHost {
opts.http.workspacePlugins(workspaceId),
]);
if (list === null) return;
+ // Shape guard at the outermost edge (asymmetric testing: the shell
+ // guards, the pure diff stays trusting): a malformed-but-200
+ // `/plugins` response (wrong shape, contract drift, a test fake that
+ // doesn't model the route) must fail SOFT exactly like `null` — keep
+ // the current imported set, never throw from the fire-and-forget sync.
+ if (!Array.isArray(list.loaded)) return;
const candidates = frontendCandidates(list, {
workspaceId,
usableIds: usablePluginIds(workspace?.plugins ?? []),