fork of hey-api/openapi-ts because I need some additional things
1import type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer';
2
3export type QuerySerializer = (query: Record<string, unknown>) => string;
4
5export type BodySerializer = (body: any) => any;
6
7type QuerySerializerOptionsObject = {
8 allowReserved?: boolean;
9 array?: Partial<SerializerOptions<ArrayStyle>>;
10 object?: Partial<SerializerOptions<ObjectStyle>>;
11};
12
13export type QuerySerializerOptions = QuerySerializerOptionsObject & {
14 /**
15 * Per-parameter serialization overrides. When provided, these settings
16 * override the global array/object settings for specific parameter names.
17 */
18 parameters?: Record<string, QuerySerializerOptionsObject>;
19};
20
21const serializeFormDataPair = (data: FormData, key: string, value: unknown): void => {
22 if (typeof value === 'string' || value instanceof Blob) {
23 data.append(key, value);
24 } else {
25 data.append(key, JSON.stringify(value));
26 }
27};
28
29const serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => {
30 if (typeof value === 'string') {
31 data.append(key, value);
32 } else {
33 data.append(key, JSON.stringify(value));
34 }
35};
36
37export const formDataBodySerializer = {
38 bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(
39 body: T,
40 ): FormData => {
41 const data = new FormData();
42
43 Object.entries(body).forEach(([key, value]) => {
44 if (value === undefined || value === null) {
45 return;
46 }
47 if (Array.isArray(value)) {
48 value.forEach((v) => serializeFormDataPair(data, key, v));
49 } else {
50 serializeFormDataPair(data, key, value);
51 }
52 });
53
54 return data;
55 },
56};
57
58export const jsonBodySerializer = {
59 bodySerializer: <T>(body: T): string =>
60 JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)),
61};
62
63export const urlSearchParamsBodySerializer = {
64 bodySerializer: <T extends Record<string, any> | Array<Record<string, any>>>(body: T): string => {
65 const data = new URLSearchParams();
66
67 Object.entries(body).forEach(([key, value]) => {
68 if (value === undefined || value === null) {
69 return;
70 }
71 if (Array.isArray(value)) {
72 value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));
73 } else {
74 serializeUrlSearchParamsPair(data, key, value);
75 }
76 });
77
78 return data.toString();
79 },
80};