From 9ed019c8aae760e5351337da54bdf7985bedcfde Mon Sep 17 00:00:00 2001 From: kriptoburak Date: Mon, 29 Jun 2026 14:49:33 +0300 Subject: [PATCH] fix: preserve server path prefixes --- src/executor/request-builder.ts | 18 +++++++++++++++--- test/executor/request-builder.test.ts | 12 ++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/executor/request-builder.ts b/src/executor/request-builder.ts index 76b5527..d336dc4 100644 --- a/src/executor/request-builder.ts +++ b/src/executor/request-builder.ts @@ -74,9 +74,21 @@ function buildUrl( path: string, query: Record, ): string { - const url = new URL(path, baseUrl); + const base = new URL(baseUrl); + base.pathname = joinUrlPaths(base.pathname, path); for (const [key, value] of Object.entries(query)) { - url.searchParams.set(key, value); + base.searchParams.set(key, value); } - return url.toString(); + return base.toString(); +} + +function joinUrlPaths(basePath: string, operationPath: string): string { + const trimmedBase = basePath.replace(/\/+$/, ""); + const trimmedOperation = operationPath.replace(/^\/+/, ""); + + if (!trimmedOperation) { + return trimmedBase || "/"; + } + + return `${trimmedBase}/${trimmedOperation}`; } diff --git a/test/executor/request-builder.test.ts b/test/executor/request-builder.test.ts index 3a8ed63..fb10fe7 100644 --- a/test/executor/request-builder.test.ts +++ b/test/executor/request-builder.test.ts @@ -25,6 +25,18 @@ describe("buildRequest", () => { expect(req.url).toContain("include=email"); }); + it("should preserve server path prefixes for absolute operation paths", () => { + const endpoint: EndpointRef = { + ...baseEndpoint, + baseUrl: "https://api.example.com/v1", + path: "/users/{userId}", + }; + + const req = buildRequest({ userId: "42" }, endpoint); + + expect(req.url).toBe("https://api.example.com/v1/users/42"); + }); + it("should skip undefined args", () => { const req = buildRequest({ userId: "42" }, baseEndpoint); expect(req.url).not.toContain("include");