fork of hey-api/openapi-ts because I need some additional things
at feat/skip-token 80 lines 2.4 kB view raw
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};