Skip to content

Commit 48ef5c5

Browse files
committed
feat(openapi-fetch): add support for pathSerializer option
- Introduced `pathSerializer` to `ClientOptions` for enhanced path handling. - Updated `createClient` function to utilize `pathSerializer` from options. - Modified `createFinalURL` to apply the provided `pathSerializer`.
1 parent 0f22be2 commit 48ef5c5

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

packages/openapi-fetch/src/index.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export interface ClientOptions extends Omit<RequestInit, "headers"> {
2323
querySerializer?: QuerySerializer<unknown> | QuerySerializerOptions;
2424
/** global bodySerializer */
2525
bodySerializer?: BodySerializer<unknown>;
26+
/** global pathSerializer */
27+
pathSerializer?: PathSerializer;
2628
headers?: HeadersOptions;
2729
/** RequestInit extension object to pass as 2nd argument to fetch when supported (defaults to undefined) */
2830
requestInitExt?: Record<string, unknown>;
@@ -64,6 +66,8 @@ export type QuerySerializerOptions = {
6466

6567
export type BodySerializer<T> = (body: OperationRequestBodyContent<T>) => any;
6668

69+
export type PathSerializer = (pathname: string, pathParams: Record<string, unknown>) => string;
70+
6771
type BodyType<T = unknown> = {
6872
json: T;
6973
text: Awaited<ReturnType<Response["text"]>>;
@@ -117,6 +121,7 @@ export type RequestOptions<T> = ParamsOption<T> &
117121
baseUrl?: string;
118122
querySerializer?: QuerySerializer<T> | QuerySerializerOptions;
119123
bodySerializer?: BodySerializer<T>;
124+
pathSerializer?: PathSerializer;
120125
parseAs?: ParseAs;
121126
fetch?: ClientOptions["fetch"];
122127
headers?: HeadersOptions;
@@ -128,6 +133,7 @@ export type MergedOptions<T = unknown> = {
128133
parseAs: ParseAs;
129134
querySerializer: QuerySerializer<T>;
130135
bodySerializer: BodySerializer<T>;
136+
pathSerializer: PathSerializer;
131137
fetch: typeof globalThis.fetch;
132138
};
133139

@@ -324,6 +330,7 @@ export declare function createFinalURL<O>(
324330
path?: Record<string, unknown>;
325331
};
326332
querySerializer: QuerySerializer<O>;
333+
pathSerializer: PathSerializer;
327334
},
328335
): string;
329336

packages/openapi-fetch/src/index.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export default function createClient(clientOptions) {
2828
fetch: baseFetch = globalThis.fetch,
2929
querySerializer: globalQuerySerializer,
3030
bodySerializer: globalBodySerializer,
31+
pathSerializer: globalPathSerializer,
3132
headers: baseHeaders,
3233
requestInitExt = undefined,
3334
...baseOptions
@@ -51,6 +52,7 @@ export default function createClient(clientOptions) {
5152
parseAs = "json",
5253
querySerializer: requestQuerySerializer,
5354
bodySerializer = globalBodySerializer ?? defaultBodySerializer,
55+
pathSerializer: requestPathSerializer,
5456
body,
5557
middleware: requestMiddlewares = [],
5658
...init
@@ -74,6 +76,8 @@ export default function createClient(clientOptions) {
7476
});
7577
}
7678

79+
const pathSerializer = requestPathSerializer || globalPathSerializer || defaultPathSerializer;
80+
7781
const serializedBody =
7882
body === undefined
7983
? undefined
@@ -114,7 +118,7 @@ export default function createClient(clientOptions) {
114118
let id;
115119
let options;
116120
let request = new Request(
117-
createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),
121+
createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer, pathSerializer }),
118122
requestInit,
119123
);
120124
let response;
@@ -136,6 +140,7 @@ export default function createClient(clientOptions) {
136140
parseAs,
137141
querySerializer,
138142
bodySerializer,
143+
pathSerializer,
139144
});
140145
for (const m of finalMiddlewares) {
141146
if (m && typeof m === "object" && typeof m.onRequest === "function") {
@@ -619,7 +624,7 @@ export function defaultBodySerializer(body, headers) {
619624
export function createFinalURL(pathname, options) {
620625
let finalURL = `${options.baseUrl}${pathname}`;
621626
if (options.params?.path) {
622-
finalURL = defaultPathSerializer(finalURL, options.params.path);
627+
finalURL = options.pathSerializer(finalURL, options.params.path);
623628
}
624629
let search = options.querySerializer(options.params.query ?? {});
625630
if (search.startsWith("?")) {

0 commit comments

Comments
 (0)