feat: harden plugin api for separate repos, signed updates and generic external login

This commit is contained in:
LukeGus committed 2026-09-29 18:11:59 -05:00
1 parent fb9c168b6b
commit 80944301dd
310 files changed
+6577 -4927

No files matched your search

@@ -23,7 +23,6 @@ vi.mock(
vi.mock("@termix/plugin-sdk/ui", () => ({
useIsMobile: () => false,
useTabsSafe: () => ({ previewTerminalTheme: null }),
}));
import { TerminalTabContent } from "../../../src/frontend/terminal/TerminalTabContent";
@@ -56,8 +56,22 @@ vi.mock("@termix/plugin-sdk/frontend", async (importOriginal) => ({
slotId === "terminal.toolbar" ? slots.toolbar : [],
useHostActions: () => slots.hostActions,
useTabs: () => slots.tabs,
usePluginUiPreferences: () => ({
values: uiPrefs.values,
set: uiPrefs.set,
}),
}));
const uiPrefs = vi.hoisted(() => {
const values: Record<string, unknown> = {};
return {
values,
set: vi.fn((key: string, value: unknown) => {
values[key] = value;
}),
};
});
vi.mock("@termix/plugin-sdk/ui", async (importOriginal) => ({
...(await importOriginal<Record<string, unknown>>()),
useIsMobile: () => mobileApi.isMobile,
@@ -111,6 +125,8 @@ function renderToolbar(
// jsdom lacks the pointer APIs Radix Select needs to open its popup.
beforeEach(() => {
for (const key of Object.keys(uiPrefs.values)) delete uiPrefs.values[key];
uiPrefs.set.mockClear();
Element.prototype.hasPointerCapture ??= () => false;
Element.prototype.setPointerCapture ??= () => {};
Element.prototype.releasePointerCapture ??= () => {};
@@ -406,9 +422,7 @@ describe("TerminalToolbar Phase 1", () => {
screen.getByRole("option", { name: "Expanded with metrics" }),
);
await waitFor(() =>
expect(localStorage.getItem("termix-terminal-toolbar-density")).toBe(
"expanded",
),
expect(uiPrefs.set).toHaveBeenCalledWith("toolbarDensity", "expanded"),
);
});
@@ -561,7 +575,7 @@ describe("TerminalToolbar Phase 1", () => {
});
expect(collapsedMover).toBeVisible();
expect(
container.querySelector(".terminal-toolbar-collapsed-shell"),
container.querySelector("[data-toolbar-collapsed]"),
).toBeInTheDocument();
collapsedMover.focus();
expect(toolbar).toHaveClass("focus-within:opacity-100");
@@ -1018,12 +1032,21 @@ describe("TerminalToolbar Phase 1", () => {
});
it("uses the host display mode without overwriting the saved one", () => {
localStorage.setItem("termix-terminal-toolbar-density", "labeled");
uiPrefs.values.toolbarDensity = "labeled";
uiPrefs.set.mockClear();
renderToolbar({ host: withSettings({ terminalToolbarDisplay: "icon" }) });
expect(screen.queryByText("Upload image")).toBeNull();
expect(localStorage.getItem("termix-terminal-toolbar-density")).toBe(
"labeled",
);
expect(uiPrefs.set).not.toHaveBeenCalled();
});
it("moves a density saved in this browser into the plugin preferences", () => {
localStorage.setItem("termix-terminal-toolbar-density", "icon");
uiPrefs.set.mockClear();
renderToolbar();
expect(uiPrefs.set).toHaveBeenCalledWith("toolbarDensity", "icon");
expect(
localStorage.getItem("termix-terminal-toolbar-density"),
).toBeNull();
});
it("stays fully visible when fading is off", () => {