Skip to content

Commit 68b880b

Browse files
committed
fix(openapi-fetch): fix overriding baseUrl per request without overriding default baseUrl
1 parent 82e98b4 commit 68b880b

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

packages/openapi-fetch/src/index.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ export default function createClient(clientOptions) {
5454
body,
5555
...init
5656
} = fetchOptions || {};
57+
let finalBaseUrl = baseUrl;
5758
if (localBaseUrl) {
58-
baseUrl = removeTrailingSlash(localBaseUrl);
59+
finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;
5960
}
6061

6162
let querySerializer =
@@ -94,7 +95,7 @@ export default function createClient(clientOptions) {
9495

9596
let id;
9697
let options;
97-
let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl, params, querySerializer }), requestInit);
98+
let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }), requestInit);
9899

99100
/** Add custom parameters to Request object */
100101
for (const key in init) {
@@ -108,7 +109,7 @@ export default function createClient(clientOptions) {
108109

109110
// middleware (request)
110111
options = Object.freeze({
111-
baseUrl,
112+
baseUrl: finalBaseUrl,
112113
fetch,
113114
parseAs,
114115
querySerializer,

packages/openapi-fetch/test/common/create-client.test.ts

+19
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,25 @@ describe("createClient options", () => {
3838
expect(actualURL.href).toBe("https://api.foo.bar/v3/resources");
3939
});
4040

41+
test("baseUrl per request causes no override on default baseUrl", async () => {
42+
let actualURL = new URL("https://fakeurl.example");
43+
const client = createObservedClient<paths>({ baseUrl: "https://api.foo.bar/v2/" }, async (req) => {
44+
actualURL = new URL(req.url);
45+
return Response.json([]);
46+
});
47+
48+
const localBaseUrl = "https://api.foo.bar/v3";
49+
await client.GET("/resources", { baseUrl: localBaseUrl });
50+
51+
// assert baseUrl and path mesh as expected
52+
expect(actualURL.href).toBe("https://api.foo.bar/v3/resources");
53+
54+
await client.GET("/resources");
55+
56+
// assert baseUrl and path mesh as expected
57+
expect(actualURL.href).toBe("https://api.foo.bar/v2/resources");
58+
});
59+
4160
describe("content-type", () => {
4261
const BODY_ACCEPTING_METHODS = [["PUT"], ["POST"], ["DELETE"], ["OPTIONS"], ["PATCH"]] as const;
4362
const ALL_METHODS = [...BODY_ACCEPTING_METHODS, ["GET"], ["HEAD"]] as const;

0 commit comments

Comments
 (0)