Skip to content

Commit 3ad2c71

Browse files
authored
Merge pull request #2837 from pixelmord/fix/querySerializer
fix: allow per field array parameters for serializeQuery
2 parents 0c00742 + 780dbe9 commit 3ad2c71

File tree

538 files changed

+6311
-2799
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

538 files changed

+6311
-2799
lines changed

.changeset/tiny-suns-teach.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hey-api/openapi-ts": patch
3+
---
4+
5+
feat(clients): granular query parameter serialization strategy

examples/openapi-ts-angular-common/src/client/client/utils.gen.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,8 @@ const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {
101101
};
102102

103103
export const createQuerySerializer = <T = unknown>({
104-
allowReserved,
105-
array,
106-
object,
104+
parameters = {},
105+
...args
107106
}: QuerySerializerOptions = {}) => {
108107
const querySerializer = (queryParams: T) => {
109108
const search: string[] = [];
@@ -115,29 +114,31 @@ export const createQuerySerializer = <T = unknown>({
115114
continue;
116115
}
117116

117+
const options = parameters[name] || args;
118+
118119
if (Array.isArray(value)) {
119120
const serializedArray = serializeArrayParam({
120-
allowReserved,
121+
allowReserved: options.allowReserved,
121122
explode: true,
122123
name,
123124
style: 'form',
124125
value,
125-
...array,
126+
...options.array,
126127
});
127128
if (serializedArray) search.push(serializedArray);
128129
} else if (typeof value === 'object') {
129130
const serializedObject = serializeObjectParam({
130-
allowReserved,
131+
allowReserved: options.allowReserved,
131132
explode: true,
132133
name,
133134
style: 'deepObject',
134135
value: value as Record<string, unknown>,
135-
...object,
136+
...options.object,
136137
});
137138
if (serializedObject) search.push(serializedObject);
138139
} else {
139140
const serializedPrimitive = serializePrimitiveParam({
140-
allowReserved,
141+
allowReserved: options.allowReserved,
141142
name,
142143
value: value as string,
143144
});

examples/openapi-ts-angular-common/src/client/core/bodySerializer.gen.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,19 @@ export type QuerySerializer = (query: Record<string, unknown>) => string;
1010

1111
export type BodySerializer = (body: any) => any;
1212

13-
export interface QuerySerializerOptions {
13+
type QuerySerializerOptionsObject = {
1414
allowReserved?: boolean;
15-
array?: SerializerOptions<ArrayStyle>;
16-
object?: SerializerOptions<ObjectStyle>;
17-
}
15+
array?: Partial<SerializerOptions<ArrayStyle>>;
16+
object?: Partial<SerializerOptions<ObjectStyle>>;
17+
};
18+
19+
export type QuerySerializerOptions = QuerySerializerOptionsObject & {
20+
/**
21+
* Per-parameter serialization overrides. When provided, these settings
22+
* override the global array/object settings for specific parameter names.
23+
*/
24+
parameters?: Record<string, QuerySerializerOptionsObject>;
25+
};
1826

1927
const serializeFormDataPair = (
2028
data: FormData,

examples/openapi-ts-angular/src/client/client/utils.gen.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,8 @@ const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {
101101
};
102102

103103
export const createQuerySerializer = <T = unknown>({
104-
allowReserved,
105-
array,
106-
object,
104+
parameters = {},
105+
...args
107106
}: QuerySerializerOptions = {}) => {
108107
const querySerializer = (queryParams: T) => {
109108
const search: string[] = [];
@@ -115,29 +114,31 @@ export const createQuerySerializer = <T = unknown>({
115114
continue;
116115
}
117116

117+
const options = parameters[name] || args;
118+
118119
if (Array.isArray(value)) {
119120
const serializedArray = serializeArrayParam({
120-
allowReserved,
121+
allowReserved: options.allowReserved,
121122
explode: true,
122123
name,
123124
style: 'form',
124125
value,
125-
...array,
126+
...options.array,
126127
});
127128
if (serializedArray) search.push(serializedArray);
128129
} else if (typeof value === 'object') {
129130
const serializedObject = serializeObjectParam({
130-
allowReserved,
131+
allowReserved: options.allowReserved,
131132
explode: true,
132133
name,
133134
style: 'deepObject',
134135
value: value as Record<string, unknown>,
135-
...object,
136+
...options.object,
136137
});
137138
if (serializedObject) search.push(serializedObject);
138139
} else {
139140
const serializedPrimitive = serializePrimitiveParam({
140-
allowReserved,
141+
allowReserved: options.allowReserved,
141142
name,
142143
value: value as string,
143144
});

examples/openapi-ts-angular/src/client/core/bodySerializer.gen.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,19 @@ export type QuerySerializer = (query: Record<string, unknown>) => string;
1010

1111
export type BodySerializer = (body: any) => any;
1212

13-
export interface QuerySerializerOptions {
13+
type QuerySerializerOptionsObject = {
1414
allowReserved?: boolean;
15-
array?: SerializerOptions<ArrayStyle>;
16-
object?: SerializerOptions<ObjectStyle>;
17-
}
15+
array?: Partial<SerializerOptions<ArrayStyle>>;
16+
object?: Partial<SerializerOptions<ObjectStyle>>;
17+
};
18+
19+
export type QuerySerializerOptions = QuerySerializerOptionsObject & {
20+
/**
21+
* Per-parameter serialization overrides. When provided, these settings
22+
* override the global array/object settings for specific parameter names.
23+
*/
24+
parameters?: Record<string, QuerySerializerOptionsObject>;
25+
};
1826

1927
const serializeFormDataPair = (
2028
data: FormData,

examples/openapi-ts-axios/src/client/client/utils.gen.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ import type {
1616
} from './types.gen';
1717

1818
export const createQuerySerializer = <T = unknown>({
19-
allowReserved,
20-
array,
21-
object,
19+
parameters = {},
20+
...args
2221
}: QuerySerializerOptions = {}) => {
2322
const querySerializer = (queryParams: T) => {
2423
const search: string[] = [];
@@ -30,29 +29,31 @@ export const createQuerySerializer = <T = unknown>({
3029
continue;
3130
}
3231

32+
const options = parameters[name] || args;
33+
3334
if (Array.isArray(value)) {
3435
const serializedArray = serializeArrayParam({
35-
allowReserved,
36+
allowReserved: options.allowReserved,
3637
explode: true,
3738
name,
3839
style: 'form',
3940
value,
40-
...array,
41+
...options.array,
4142
});
4243
if (serializedArray) search.push(serializedArray);
4344
} else if (typeof value === 'object') {
4445
const serializedObject = serializeObjectParam({
45-
allowReserved,
46+
allowReserved: options.allowReserved,
4647
explode: true,
4748
name,
4849
style: 'deepObject',
4950
value: value as Record<string, unknown>,
50-
...object,
51+
...options.object,
5152
});
5253
if (serializedObject) search.push(serializedObject);
5354
} else {
5455
const serializedPrimitive = serializePrimitiveParam({
55-
allowReserved,
56+
allowReserved: options.allowReserved,
5657
name,
5758
value: value as string,
5859
});

examples/openapi-ts-axios/src/client/core/bodySerializer.gen.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,19 @@ export type QuerySerializer = (query: Record<string, unknown>) => string;
1010

1111
export type BodySerializer = (body: any) => any;
1212

13-
export interface QuerySerializerOptions {
13+
type QuerySerializerOptionsObject = {
1414
allowReserved?: boolean;
15-
array?: SerializerOptions<ArrayStyle>;
16-
object?: SerializerOptions<ObjectStyle>;
17-
}
15+
array?: Partial<SerializerOptions<ArrayStyle>>;
16+
object?: Partial<SerializerOptions<ObjectStyle>>;
17+
};
18+
19+
export type QuerySerializerOptions = QuerySerializerOptionsObject & {
20+
/**
21+
* Per-parameter serialization overrides. When provided, these settings
22+
* override the global array/object settings for specific parameter names.
23+
*/
24+
parameters?: Record<string, QuerySerializerOptionsObject>;
25+
};
1826

1927
const serializeFormDataPair = (
2028
data: FormData,

examples/openapi-ts-fastify/src/client/client/utils.gen.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ import type {
1717
} from './types.gen';
1818

1919
export const createQuerySerializer = <T = unknown>({
20-
allowReserved,
21-
array,
22-
object,
20+
parameters = {},
21+
...args
2322
}: QuerySerializerOptions = {}) => {
2423
const querySerializer = (queryParams: T) => {
2524
const search: string[] = [];
@@ -31,29 +30,31 @@ export const createQuerySerializer = <T = unknown>({
3130
continue;
3231
}
3332

33+
const options = parameters[name] || args;
34+
3435
if (Array.isArray(value)) {
3536
const serializedArray = serializeArrayParam({
36-
allowReserved,
37+
allowReserved: options.allowReserved,
3738
explode: true,
3839
name,
3940
style: 'form',
4041
value,
41-
...array,
42+
...options.array,
4243
});
4344
if (serializedArray) search.push(serializedArray);
4445
} else if (typeof value === 'object') {
4546
const serializedObject = serializeObjectParam({
46-
allowReserved,
47+
allowReserved: options.allowReserved,
4748
explode: true,
4849
name,
4950
style: 'deepObject',
5051
value: value as Record<string, unknown>,
51-
...object,
52+
...options.object,
5253
});
5354
if (serializedObject) search.push(serializedObject);
5455
} else {
5556
const serializedPrimitive = serializePrimitiveParam({
56-
allowReserved,
57+
allowReserved: options.allowReserved,
5758
name,
5859
value: value as string,
5960
});

examples/openapi-ts-fastify/src/client/core/bodySerializer.gen.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,19 @@ export type QuerySerializer = (query: Record<string, unknown>) => string;
1010

1111
export type BodySerializer = (body: any) => any;
1212

13-
export interface QuerySerializerOptions {
13+
type QuerySerializerOptionsObject = {
1414
allowReserved?: boolean;
15-
array?: SerializerOptions<ArrayStyle>;
16-
object?: SerializerOptions<ObjectStyle>;
17-
}
15+
array?: Partial<SerializerOptions<ArrayStyle>>;
16+
object?: Partial<SerializerOptions<ObjectStyle>>;
17+
};
18+
19+
export type QuerySerializerOptions = QuerySerializerOptionsObject & {
20+
/**
21+
* Per-parameter serialization overrides. When provided, these settings
22+
* override the global array/object settings for specific parameter names.
23+
*/
24+
parameters?: Record<string, QuerySerializerOptionsObject>;
25+
};
1826

1927
const serializeFormDataPair = (
2028
data: FormData,

examples/openapi-ts-fetch/src/client/client/utils.gen.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ import type {
1717
} from './types.gen';
1818

1919
export const createQuerySerializer = <T = unknown>({
20-
allowReserved,
21-
array,
22-
object,
20+
parameters = {},
21+
...args
2322
}: QuerySerializerOptions = {}) => {
2423
const querySerializer = (queryParams: T) => {
2524
const search: string[] = [];
@@ -31,29 +30,31 @@ export const createQuerySerializer = <T = unknown>({
3130
continue;
3231
}
3332

33+
const options = parameters[name] || args;
34+
3435
if (Array.isArray(value)) {
3536
const serializedArray = serializeArrayParam({
36-
allowReserved,
37+
allowReserved: options.allowReserved,
3738
explode: true,
3839
name,
3940
style: 'form',
4041
value,
41-
...array,
42+
...options.array,
4243
});
4344
if (serializedArray) search.push(serializedArray);
4445
} else if (typeof value === 'object') {
4546
const serializedObject = serializeObjectParam({
46-
allowReserved,
47+
allowReserved: options.allowReserved,
4748
explode: true,
4849
name,
4950
style: 'deepObject',
5051
value: value as Record<string, unknown>,
51-
...object,
52+
...options.object,
5253
});
5354
if (serializedObject) search.push(serializedObject);
5455
} else {
5556
const serializedPrimitive = serializePrimitiveParam({
56-
allowReserved,
57+
allowReserved: options.allowReserved,
5758
name,
5859
value: value as string,
5960
});

0 commit comments

Comments
 (0)