Skip to content

Commit ff4b40f

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 99c346e commit ff4b40f

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;
@@ -127,6 +132,7 @@ export type MergedOptions<T = unknown> = {
127132
parseAs: ParseAs;
128133
querySerializer: QuerySerializer<T>;
129134
bodySerializer: BodySerializer<T>;
135+
pathSerializer: PathSerializer;
130136
fetch: typeof globalThis.fetch;
131137
};
132138

@@ -323,6 +329,7 @@ export declare function createFinalURL<O>(
323329
path?: Record<string, unknown>;
324330
};
325331
querySerializer: QuerySerializer<O>;
332+
pathSerializer: PathSerializer;
326333
},
327334
): string;
328335

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
...init
5658
} = fetchOptions || {};
@@ -73,6 +75,8 @@ export default function createClient(clientOptions) {
7375
});
7476
}
7577

78+
const pathSerializer = requestPathSerializer || globalPathSerializer || defaultPathSerializer;
79+
7680
const serializedBody =
7781
body === undefined
7882
? undefined
@@ -110,7 +114,7 @@ export default function createClient(clientOptions) {
110114
let id;
111115
let options;
112116
let request = new CustomRequest(
113-
createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),
117+
createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer, pathSerializer }),
114118
requestInit,
115119
);
116120
let response;
@@ -132,6 +136,7 @@ export default function createClient(clientOptions) {
132136
parseAs,
133137
querySerializer,
134138
bodySerializer,
139+
pathSerializer,
135140
});
136141
for (const m of middlewares) {
137142
if (m && typeof m === "object" && typeof m.onRequest === "function") {
@@ -615,7 +620,7 @@ export function defaultBodySerializer(body, headers) {
615620
export function createFinalURL(pathname, options) {
616621
let finalURL = `${options.baseUrl}${pathname}`;
617622
if (options.params?.path) {
618-
finalURL = defaultPathSerializer(finalURL, options.params.path);
623+
finalURL = options.pathSerializer(finalURL, options.params.path);
619624
}
620625
let search = options.querySerializer(options.params.query ?? {});
621626
if (search.startsWith("?")) {

0 commit comments

Comments
 (0)