From f783e6d51d527953227640df50934db9c2c0e35b Mon Sep 17 00:00:00 2001 From: LukeGus Date: Wed, 7 Oct 2026 16:50:51 -0500 Subject: [PATCH] fix: send plugin form uploads to the plugin's route (Support#1406, Support#1420) --- src/ui/lib/plugin-transport.ts | 5 ++++- src/ui/tests/lib/plugin-transport.test.ts | 27 +++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/ui/lib/plugin-transport.ts b/src/ui/lib/plugin-transport.ts index 9fafe1eef..a7f74a1f7 100644 --- a/src/ui/lib/plugin-transport.ts +++ b/src/ui/lib/plugin-transport.ts @@ -61,7 +61,10 @@ export function createPluginApi(pluginId: string): AxiosInstance { property === "options" || property === "post" || property === "put" || - property === "patch" + property === "patch" || + property === "postForm" || + property === "putForm" || + property === "patchForm" ) { return (url: string, ...rest: unknown[]) => (value as (...args: unknown[]) => unknown).call( diff --git a/src/ui/tests/lib/plugin-transport.test.ts b/src/ui/tests/lib/plugin-transport.test.ts index b125d2c8f..e7222e971 100644 --- a/src/ui/tests/lib/plugin-transport.test.ts +++ b/src/ui/tests/lib/plugin-transport.test.ts @@ -1,15 +1,22 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const state = vi.hoisted(() => ({ electron: false })); +const axiosMethods = vi.hoisted(() => ({ + get: vi.fn(), + postForm: vi.fn(), +})); vi.mock("@/main-axios", () => ({ - authApi: { defaults: { baseURL: "http://server:8080/" } }, + authApi: { + defaults: { baseURL: "http://server:8080/" }, + ...axiosMethods, + }, createRemoteOriginApiInstance: vi.fn(), })); vi.mock("@/lib/electron", () => ({ isElectron: () => state.electron })); vi.mock("@/lib/device-id", () => ({ getDeviceId: () => "device-1" })); -import { pluginFetch } from "@/lib/plugin-transport"; +import { createPluginApi, pluginFetch } from "@/lib/plugin-transport"; const fetchMock = vi.fn(async () => new Response("ok")); @@ -61,3 +68,19 @@ describe("pluginFetch", () => { expect(headers.get("authorization")).toBe("Bearer token-1"); }); }); + +describe("createPluginApi", () => { + it("puts the plugin's mount point in front of request and form paths", () => { + const api = createPluginApi("file-manager"); + const form = new FormData(); + api.get("/listFiles"); + api.postForm("uploadFileStream", form); + expect(axiosMethods.get).toHaveBeenCalledWith( + "/plugin-api/file-manager/listFiles", + ); + expect(axiosMethods.postForm).toHaveBeenCalledWith( + "/plugin-api/file-manager/uploadFileStream", + form, + ); + }); +});