fork of hey-api/openapi-ts because I need some additional things
1// This file is auto-generated by @hey-api/openapi-ts
2
3interface SerializeOptions<T> extends SerializePrimitiveOptions, SerializerOptions<T> {}
4
5interface SerializePrimitiveOptions {
6 allowReserved?: boolean
7 name: string
8}
9
10export interface SerializerOptions<T> {
11 /**
12 * @default true
13 */
14 explode: boolean
15 style: T
16}
17
18export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'
19export type ArraySeparatorStyle = ArrayStyle | MatrixStyle
20type MatrixStyle = 'label' | 'matrix' | 'simple'
21export type ObjectStyle = 'form' | 'deepObject'
22type ObjectSeparatorStyle = ObjectStyle | MatrixStyle
23
24interface SerializePrimitiveParam extends SerializePrimitiveOptions {
25 value: string
26}
27
28export const separatorArrayExplode = (style: ArraySeparatorStyle) => {
29 switch (style) {
30 case 'label':
31 return '.'
32 case 'matrix':
33 return ';'
34 case 'simple':
35 return ','
36 default:
37 return '&'
38 }
39}
40
41export const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {
42 switch (style) {
43 case 'form':
44 return ','
45 case 'pipeDelimited':
46 return '|'
47 case 'spaceDelimited':
48 return '%20'
49 default:
50 return ','
51 }
52}
53
54export const separatorObjectExplode = (style: ObjectSeparatorStyle) => {
55 switch (style) {
56 case 'label':
57 return '.'
58 case 'matrix':
59 return ';'
60 case 'simple':
61 return ','
62 default:
63 return '&'
64 }
65}
66
67export const serializeArrayParam = ({
68 allowReserved,
69 explode,
70 name,
71 style,
72 value
73}: SerializeOptions<ArraySeparatorStyle> & {
74 value: unknown[]
75}) => {
76 if (!explode) {
77 const joinedValues = (
78 allowReserved ? value : value.map((v) => encodeURIComponent(v as string))
79 ).join(separatorArrayNoExplode(style))
80 switch (style) {
81 case 'label':
82 return `.${joinedValues}`
83 case 'matrix':
84 return `;${name}=${joinedValues}`
85 case 'simple':
86 return joinedValues
87 default:
88 return `${name}=${joinedValues}`
89 }
90 }
91
92 const separator = separatorArrayExplode(style)
93 const joinedValues = value
94 .map((v) => {
95 if (style === 'label' || style === 'simple') {
96 return allowReserved ? v : encodeURIComponent(v as string)
97 }
98
99 return serializePrimitiveParam({
100 allowReserved,
101 name,
102 value: v as string
103 })
104 })
105 .join(separator)
106 return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues
107}
108
109export const serializePrimitiveParam = ({
110 allowReserved,
111 name,
112 value
113}: SerializePrimitiveParam) => {
114 if (value === undefined || value === null) {
115 return ''
116 }
117
118 if (typeof value === 'object') {
119 throw new Error(
120 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.'
121 )
122 }
123
124 return `${name}=${allowReserved ? value : encodeURIComponent(value)}`
125}
126
127export const serializeObjectParam = ({
128 allowReserved,
129 explode,
130 name,
131 style,
132 value,
133 valueOnly
134}: SerializeOptions<ObjectSeparatorStyle> & {
135 value: Record<string, unknown> | Date
136 valueOnly?: boolean
137}) => {
138 if (value instanceof Date) {
139 return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`
140 }
141
142 if (style !== 'deepObject' && !explode) {
143 let values: string[] = []
144 Object.entries(value).forEach(([key, v]) => {
145 values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)]
146 })
147 const joinedValues = values.join(',')
148 switch (style) {
149 case 'form':
150 return `${name}=${joinedValues}`
151 case 'label':
152 return `.${joinedValues}`
153 case 'matrix':
154 return `;${name}=${joinedValues}`
155 default:
156 return joinedValues
157 }
158 }
159
160 const separator = separatorObjectExplode(style)
161 const joinedValues = Object.entries(value)
162 .map(([key, v]) =>
163 serializePrimitiveParam({
164 allowReserved,
165 name: style === 'deepObject' ? `${name}[${key}]` : key,
166 value: v as string
167 })
168 )
169 .join(separator)
170 return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues
171}