// This file is auto-generated by @hey-api/openapi-ts interface SerializeOptions extends SerializePrimitiveOptions, SerializerOptions {} interface SerializePrimitiveOptions { allowReserved?: boolean name: string } export interface SerializerOptions { /** * @default true */ explode: boolean style: T } export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited' export type ArraySeparatorStyle = ArrayStyle | MatrixStyle type MatrixStyle = 'label' | 'matrix' | 'simple' export type ObjectStyle = 'form' | 'deepObject' type ObjectSeparatorStyle = ObjectStyle | MatrixStyle interface SerializePrimitiveParam extends SerializePrimitiveOptions { value: string } export const separatorArrayExplode = (style: ArraySeparatorStyle) => { switch (style) { case 'label': return '.' case 'matrix': return ';' case 'simple': return ',' default: return '&' } } export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => { switch (style) { case 'form': return ',' case 'pipeDelimited': return '|' case 'spaceDelimited': return '%20' default: return ',' } } export const separatorObjectExplode = (style: ObjectSeparatorStyle) => { switch (style) { case 'label': return '.' case 'matrix': return ';' case 'simple': return ',' default: return '&' } } export const serializeArrayParam = ({ allowReserved, explode, name, style, value }: SerializeOptions & { value: unknown[] }) => { if (!explode) { const joinedValues = ( allowReserved ? value : value.map((v) => encodeURIComponent(v as string)) ).join(separatorArrayNoExplode(style)) switch (style) { case 'label': return `.${joinedValues}` case 'matrix': return `;${name}=${joinedValues}` case 'simple': return joinedValues default: return `${name}=${joinedValues}` } } const separator = separatorArrayExplode(style) const joinedValues = value .map((v) => { if (style === 'label' || style === 'simple') { return allowReserved ? v : encodeURIComponent(v as string) } return serializePrimitiveParam({ allowReserved, name, value: v as string }) }) .join(separator) return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues } export const serializePrimitiveParam = ({ allowReserved, name, value }: SerializePrimitiveParam) => { if (value === undefined || value === null) { return '' } if (typeof value === 'object') { throw new Error( 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.' ) } return `${name}=${allowReserved ? value : encodeURIComponent(value)}` } export const serializeObjectParam = ({ allowReserved, explode, name, style, value, valueOnly }: SerializeOptions & { value: Record | Date valueOnly?: boolean }) => { if (value instanceof Date) { return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}` } if (style !== 'deepObject' && !explode) { let values: string[] = [] Object.entries(value).forEach(([key, v]) => { values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)] }) const joinedValues = values.join(',') switch (style) { case 'form': return `${name}=${joinedValues}` case 'label': return `.${joinedValues}` case 'matrix': return `;${name}=${joinedValues}` default: return joinedValues } } const separator = separatorObjectExplode(style) const joinedValues = Object.entries(value) .map(([key, v]) => serializePrimitiveParam({ allowReserved, name: style === 'deepObject' ? `${name}[${key}]` : key, value: v as string }) ) .join(separator) return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues }