Skip to content

Commit 219d97b

Browse files
authoredOct 30, 2023
feat: support params serializer (#999)
1 parent f38331c commit 219d97b

File tree

16 files changed

+263
-4
lines changed

16 files changed

+263
-4
lines changed
 

‎docs/src/pages/reference/configuration/output.md

+65
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,71 @@ export const customFormUrlEncodedFn = <Body>(body: Body): URLSearchParams => {
989989
};
990990
```
991991

992+
#### paramsSerializer
993+
994+
Type: `String` or `Object`.
995+
996+
Valid values: path of the paramsSerializer function or object with a path and name.
997+
998+
Use this property to add a custom params serializer to all requests that use query params.
999+
1000+
If you provide an object you can also add a default property to use an export default function.
1001+
1002+
Example:
1003+
1004+
```js
1005+
module.exports = {
1006+
petstore: {
1007+
output: {
1008+
override: {
1009+
paramsSerializer: {
1010+
path: './api/mutator/custom-params-serializer-fn.ts',
1011+
name: 'customParamsSerializerFn',
1012+
// default: true
1013+
},
1014+
},
1015+
},
1016+
},
1017+
};
1018+
```
1019+
1020+
```ts
1021+
// type signature
1022+
export const customParamsSerializerFn = (
1023+
params: Record<string, any>,
1024+
): string => {
1025+
// do your implementation to transform the params
1026+
1027+
return params;
1028+
};
1029+
```
1030+
1031+
#### paramsSerializerOptions
1032+
1033+
Type: `Object`
1034+
1035+
Use this property to add a default params serializer. Current options are: `qs`.
1036+
1037+
All options are then passed to the chosen serializer.
1038+
1039+
Example:
1040+
1041+
```js
1042+
module.exports = {
1043+
petstore: {
1044+
output: {
1045+
override: {
1046+
paramsSerializerOptions: {
1047+
qs: {
1048+
arrayFormat: 'repeat',
1049+
},
1050+
},
1051+
},
1052+
},
1053+
},
1054+
};
1055+
```
1056+
9921057
#### useDates
9931058

9941059
Type: `Boolean`

‎packages/angular/src/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ const generateImplementation = (
125125
override,
126126
formData,
127127
formUrlEncoded,
128+
paramsSerializer,
128129
}: GeneratorVerbOptions,
129130
{ route, context }: GeneratorOptions,
130131
) => {
@@ -204,6 +205,8 @@ const generateImplementation = (
204205
requestOptions: override?.requestOptions,
205206
isFormData,
206207
isFormUrlEncoded,
208+
paramsSerializer,
209+
paramsSerializerOptions: override?.paramsSerializerOptions,
207210
isAngular: true,
208211
isExactOptionalPropertyTypes,
209212
hasSignal: false,

‎packages/axios/src/index.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,29 @@ const AXIOS_DEPENDENCIES: GeneratorDependency[] = [
3636
},
3737
];
3838

39+
const PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[] = [
40+
{
41+
exports: [
42+
{
43+
name: 'qs',
44+
default: true,
45+
values: true,
46+
syntheticDefaultImport: true,
47+
},
48+
],
49+
dependency: 'qs',
50+
},
51+
];
52+
3953
const returnTypesToWrite: Map<string, (title?: string) => string> = new Map();
4054

4155
export const getAxiosDependencies: ClientDependenciesBuilder = (
4256
hasGlobalMutator,
43-
) => [...(!hasGlobalMutator ? AXIOS_DEPENDENCIES : [])];
57+
hasParamsSerializerOptions: boolean,
58+
) => [
59+
...(!hasGlobalMutator ? AXIOS_DEPENDENCIES : []),
60+
...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),
61+
];
4462

4563
const generateAxiosImplementation = (
4664
{
@@ -55,6 +73,7 @@ const generateAxiosImplementation = (
5573
override,
5674
formData,
5775
formUrlEncoded,
76+
paramsSerializer,
5877
}: GeneratorVerbOptions,
5978
{ route, context }: GeneratorOptions,
6079
) => {
@@ -141,6 +160,8 @@ const generateAxiosImplementation = (
141160
requestOptions: override?.requestOptions,
142161
isFormData,
143162
isFormUrlEncoded,
163+
paramsSerializer,
164+
paramsSerializerOptions: override?.paramsSerializerOptions,
144165
isExactOptionalPropertyTypes,
145166
hasSignal: false,
146167
});

‎packages/core/src/generators/options.ts

+21
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
GetterBody,
66
GetterQueryParam,
77
GetterResponse,
8+
ParamsSerializerOptions,
89
Verbs,
910
} from '../types';
1011
import { isObject, stringify } from '../utils';
@@ -36,13 +37,17 @@ export const generateAxiosOptions = ({
3637
headers,
3738
requestOptions,
3839
hasSignal,
40+
paramsSerializer,
41+
paramsSerializerOptions,
3942
}: {
4043
response: GetterResponse;
4144
isExactOptionalPropertyTypes: boolean;
4245
queryParams?: GeneratorSchema;
4346
headers?: GeneratorSchema;
4447
requestOptions?: object | boolean;
4548
hasSignal: boolean;
49+
paramsSerializer?: GeneratorMutator;
50+
paramsSerializerOptions?: ParamsSerializerOptions;
4651
}) => {
4752
const isRequestOptions = requestOptions !== false;
4853
if (!queryParams && !headers && !response.isBlob) {
@@ -99,6 +104,16 @@ export const generateAxiosOptions = ({
99104
}
100105
}
101106

107+
if (queryParams && (paramsSerializer || paramsSerializerOptions?.qs)) {
108+
if (paramsSerializer) {
109+
value += `\n paramsSerializer: ${paramsSerializer.name},`;
110+
} else {
111+
value += `\n paramsSerializer: (params) => qs.stringify(params, ${JSON.stringify(
112+
paramsSerializerOptions!.qs,
113+
)}),`;
114+
}
115+
}
116+
102117
return value;
103118
};
104119

@@ -115,6 +130,8 @@ export const generateOptions = ({
115130
isAngular,
116131
isExactOptionalPropertyTypes,
117132
hasSignal,
133+
paramsSerializer,
134+
paramsSerializerOptions,
118135
}: {
119136
route: string;
120137
body: GetterBody;
@@ -128,6 +145,8 @@ export const generateOptions = ({
128145
isAngular?: boolean;
129146
isExactOptionalPropertyTypes: boolean;
130147
hasSignal: boolean;
148+
paramsSerializer?: GeneratorMutator;
149+
paramsSerializerOptions?: ParamsSerializerOptions;
131150
}) => {
132151
const isBodyVerb = VERBS_WITH_BODY.includes(verb);
133152
const bodyOptions = isBodyVerb
@@ -141,6 +160,8 @@ export const generateOptions = ({
141160
requestOptions,
142161
isExactOptionalPropertyTypes,
143162
hasSignal,
163+
paramsSerializer,
164+
paramsSerializerOptions,
144165
});
145166

146167
const options = axiosOptions ? `{${axiosOptions}}` : '';

‎packages/core/src/generators/verbs-options.ts

+13
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
GeneratorVerbOptions,
2020
GeneratorVerbsOptions,
2121
NormalizedInputOptions,
22+
NormalizedMutator,
2223
NormalizedOperationOptions,
2324
NormalizedOutputOptions,
2425
NormalizedOverrideOutput,
@@ -164,6 +165,17 @@ const generateVerbOptions = async ({
164165
})
165166
: undefined;
166167

168+
const paramsSerializer =
169+
isString(override?.paramsSerializer) || isObject(override?.paramsSerializer)
170+
? await generateMutator({
171+
output: output.target,
172+
name: 'paramsSerializer',
173+
mutator: override.paramsSerializer as NormalizedMutator,
174+
workspace: context.workspace,
175+
tsconfig: context.tsconfig,
176+
})
177+
: undefined;
178+
167179
const doc = jsDoc({ description, deprecated, summary });
168180

169181
const verbOption: GeneratorVerbOptions = {
@@ -181,6 +193,7 @@ const generateVerbOptions = async ({
181193
mutator,
182194
formData,
183195
formUrlEncoded,
196+
paramsSerializer,
184197
override,
185198
doc,
186199
deprecated,

‎packages/core/src/types.ts

+20
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ export type NormalizedOutputOptions = {
5555
baseUrl?: string;
5656
};
5757

58+
export type NormalizedParamsSerializerOptions = {
59+
qs?: Record<string, any>;
60+
};
61+
5862
export type NormalizedOverrideOutput = {
5963
title?: (title: string) => string;
6064
transformer?: OutputTransformer;
@@ -74,6 +78,8 @@ export type NormalizedOverrideOutput = {
7478
header: false | ((info: InfoObject) => string[] | string);
7579
formData: boolean | NormalizedMutator;
7680
formUrlEncoded: boolean | NormalizedMutator;
81+
paramsSerializer?: NormalizedMutator;
82+
paramsSerializerOptions?: NormalizedParamsSerializerOptions;
7783
components: {
7884
schemas: {
7985
suffix: string;
@@ -133,6 +139,7 @@ export type NormalizedOperationOptions = {
133139
) => string;
134140
formData?: boolean | NormalizedMutator;
135141
formUrlEncoded?: boolean | NormalizedMutator;
142+
paramsSerializer?: NormalizedMutator;
136143
requestOptions?: object | boolean;
137144
};
138145

@@ -238,6 +245,10 @@ export type MutatorObject = {
238245

239246
export type Mutator = string | MutatorObject;
240247

248+
export type ParamsSerializerOptions = {
249+
qs?: Record<string, any>;
250+
};
251+
241252
export type OverrideOutput = {
242253
title?: (title: string) => string;
243254
transformer?: OutputTransformer;
@@ -257,6 +268,8 @@ export type OverrideOutput = {
257268
header?: boolean | ((info: InfoObject) => string[] | string);
258269
formData?: boolean | Mutator;
259270
formUrlEncoded?: boolean | Mutator;
271+
paramsSerializer?: Mutator;
272+
paramsSerializerOptions?: ParamsSerializerOptions;
260273
components?: {
261274
schemas?: {
262275
suffix?: string;
@@ -355,6 +368,7 @@ export type OperationOptions = {
355368
) => string;
356369
formData?: boolean | Mutator;
357370
formUrlEncoded?: boolean | Mutator;
371+
paramsSerializer?: Mutator;
358372
requestOptions?: object | boolean;
359373
};
360374

@@ -487,6 +501,7 @@ export type GeneratorTarget = {
487501
clientMutators?: GeneratorMutator[];
488502
formData?: GeneratorMutator[];
489503
formUrlEncoded?: GeneratorMutator[];
504+
paramsSerializer?: GeneratorMutator[];
490505
};
491506

492507
export type GeneratorTargetFull = {
@@ -501,6 +516,7 @@ export type GeneratorTargetFull = {
501516
clientMutators?: GeneratorMutator[];
502517
formData?: GeneratorMutator[];
503518
formUrlEncoded?: GeneratorMutator[];
519+
paramsSerializer?: GeneratorMutator[];
504520
};
505521

506522
export type GeneratorOperation = {
@@ -513,6 +529,7 @@ export type GeneratorOperation = {
513529
clientMutators?: GeneratorMutator[];
514530
formData?: GeneratorMutator;
515531
formUrlEncoded?: GeneratorMutator;
532+
paramsSerializer?: GeneratorMutator;
516533
operationName: string;
517534
types?: {
518535
result: (title?: string) => string;
@@ -535,6 +552,7 @@ export type GeneratorVerbOptions = {
535552
mutator?: GeneratorMutator;
536553
formData?: GeneratorMutator;
537554
formUrlEncoded?: GeneratorMutator;
555+
paramsSerializer?: GeneratorMutator;
538556
override: NormalizedOverrideOutput;
539557
deprecated?: boolean;
540558
originalOperation: OperationObject;
@@ -601,6 +619,7 @@ export type ClientTitleBuilder = (title: string) => string;
601619

602620
export type ClientDependenciesBuilder = (
603621
hasGlobalMutator: boolean,
622+
hasParamsSerializerOptions: boolean,
604623
packageJson?: PackageJson,
605624
) => GeneratorDependency[];
606625

@@ -817,6 +836,7 @@ export type GeneratorClientImports = (data: {
817836
hasSchemaDir: boolean;
818837
isAllowSyntheticDefaultImports: boolean;
819838
hasGlobalMutator: boolean;
839+
hasParamsSerializerOptions: boolean;
820840
packageJson?: PackageJson;
821841
}) => string;
822842

‎packages/core/src/writers/single-mode.ts

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const writeSingleMode = async ({
3131
clientMutators,
3232
formData,
3333
formUrlEncoded,
34+
paramsSerializer,
3435
} = generateTarget(builder, output);
3536

3637
let data = header;
@@ -60,6 +61,7 @@ export const writeSingleMode = async ({
6061
hasSchemaDir: !!output.schemas,
6162
isAllowSyntheticDefaultImports,
6263
hasGlobalMutator: !!output.override.mutator,
64+
hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,
6365
packageJson: output.packageJson,
6466
});
6567

@@ -91,6 +93,10 @@ export const writeSingleMode = async ({
9193
data += generateMutatorImports({ mutators: formUrlEncoded });
9294
}
9395

96+
if (paramsSerializer) {
97+
data += generateMutatorImports({ mutators: paramsSerializer });
98+
}
99+
94100
if (implementation.includes('NonReadonly<')) {
95101
data += getOrvalGeneratedTypes();
96102
data += '\n';

‎packages/core/src/writers/split-mode.ts

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const writeSplitMode = async ({
3131
clientMutators,
3232
formData,
3333
formUrlEncoded,
34+
paramsSerializer,
3435
} = generateTarget(builder, output);
3536

3637
let implementationData = header;
@@ -52,6 +53,7 @@ export const writeSplitMode = async ({
5253
hasSchemaDir: !!output.schemas,
5354
isAllowSyntheticDefaultImports,
5455
hasGlobalMutator: !!output.override.mutator,
56+
hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,
5557
packageJson: output.packageJson,
5658
});
5759
mswData += builder.importsMock({
@@ -103,6 +105,12 @@ export const writeSplitMode = async ({
103105
});
104106
}
105107

108+
if (paramsSerializer) {
109+
implementationData += generateMutatorImports({
110+
mutators: paramsSerializer,
111+
});
112+
}
113+
106114
if (implementation.includes('NonReadonly<')) {
107115
implementationData += getOrvalGeneratedTypes();
108116
}

‎packages/core/src/writers/split-tags-mode.ts

+8
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export const writeSplitTagsMode = async ({
3939
clientMutators,
4040
formData,
4141
formUrlEncoded,
42+
paramsSerializer,
4243
} = target;
4344

4445
let implementationData = header;
@@ -57,6 +58,7 @@ export const writeSplitTagsMode = async ({
5758
hasSchemaDir: !!output.schemas,
5859
isAllowSyntheticDefaultImports,
5960
hasGlobalMutator: !!output.override.mutator,
61+
hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,
6062
packageJson: output.packageJson,
6163
});
6264
mswData += builder.importsMock({
@@ -109,6 +111,12 @@ export const writeSplitTagsMode = async ({
109111
oneMore: true,
110112
});
111113
}
114+
if (paramsSerializer) {
115+
implementationData += generateMutatorImports({
116+
mutators: paramsSerializer,
117+
oneMore: true,
118+
});
119+
}
112120

113121
if (implementation.includes('NonReadonly<')) {
114122
implementationData += getOrvalGeneratedTypes();

‎packages/core/src/writers/tags-mode.ts

+6
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const writeTagsMode = async ({
4040
clientMutators,
4141
formData,
4242
formUrlEncoded,
43+
paramsSerializer,
4344
} = target;
4445

4546
let data = header;
@@ -63,6 +64,7 @@ export const writeTagsMode = async ({
6364
hasSchemaDir: !!output.schemas,
6465
isAllowSyntheticDefaultImports,
6566
hasGlobalMutator: !!output.override.mutator,
67+
hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,
6668
packageJson: output.packageJson,
6769
});
6870

@@ -104,6 +106,10 @@ export const writeTagsMode = async ({
104106
data += generateMutatorImports({ mutators: formUrlEncoded });
105107
}
106108

109+
if (paramsSerializer) {
110+
data += generateMutatorImports({ mutators: paramsSerializer });
111+
}
112+
107113
data += '\n\n';
108114

109115
if (implementation.includes('NonReadonly<')) {

‎packages/core/src/writers/target-tags.ts

+10
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ const generateTargetTags = (
3232
formUrlEncoded: operation.formUrlEncoded
3333
? [operation.formUrlEncoded]
3434
: [],
35+
paramsSerializer: operation.paramsSerializer
36+
? [operation.paramsSerializer]
37+
: [],
3538
implementation: operation.implementation,
3639
implementationMSW: {
3740
function: operation.implementationMSW.function,
@@ -70,6 +73,12 @@ const generateTargetTags = (
7073
formUrlEncoded: operation.formUrlEncoded
7174
? [...(currentOperation.formUrlEncoded ?? []), operation.formUrlEncoded]
7275
: currentOperation.formUrlEncoded,
76+
paramsSerializer: operation.paramsSerializer
77+
? [
78+
...(currentOperation.paramsSerializer ?? []),
79+
operation.paramsSerializer,
80+
]
81+
: currentOperation.paramsSerializer,
7382
};
7483

7584
return acc;
@@ -147,6 +156,7 @@ export const generateTargetForTags = (
147156
clientMutators: target.clientMutators,
148157
formData: target.formData,
149158
formUrlEncoded: target.formUrlEncoded,
159+
paramsSerializer: target.paramsSerializer,
150160
};
151161

152162
return acc;

‎packages/core/src/writers/target.ts

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ export const generateTarget = (
3939
if (operation.formUrlEncoded) {
4040
acc.formUrlEncoded.push(operation.formUrlEncoded);
4141
}
42+
if (operation.paramsSerializer) {
43+
acc.paramsSerializer.push(operation.paramsSerializer);
44+
}
4245

4346
if (operation.clientMutators) {
4447
acc.clientMutators.push(...operation.clientMutators);
@@ -93,6 +96,7 @@ export const generateTarget = (
9396
clientMutators: [],
9497
formData: [],
9598
formUrlEncoded: [],
99+
paramsSerializer: [],
96100
} as Required<GeneratorTargetFull>,
97101
);
98102

‎packages/orval/src/client.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,21 @@ export const generateClientImports: GeneratorClientImports = ({
5555
hasSchemaDir,
5656
isAllowSyntheticDefaultImports,
5757
hasGlobalMutator,
58+
hasParamsSerializerOptions,
5859
packageJson,
5960
}) => {
6061
const { dependencies } = getGeneratorClient(client);
6162
return generateDependencyImports(
6263
implementation,
6364
dependencies
64-
? [...dependencies(hasGlobalMutator, packageJson), ...imports]
65+
? [
66+
...dependencies(
67+
hasGlobalMutator,
68+
hasParamsSerializerOptions,
69+
packageJson,
70+
),
71+
...imports,
72+
]
6573
: imports,
6674
specsName,
6775
hasSchemaDir,
@@ -217,6 +225,7 @@ export const generateOperations = (
217225
clientMutators: client.mutators,
218226
formData: verbOption.formData,
219227
formUrlEncoded: verbOption.formUrlEncoded,
228+
paramsSerializer: verbOption.paramsSerializer,
220229
operationName: verbOption.operationName,
221230
};
222231

‎packages/orval/src/utils/options.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ export const normalizeOptions = async (
155155
outputOptions.override?.formUrlEncoded,
156156
)
157157
: outputOptions.override?.formUrlEncoded) ?? true,
158+
paramsSerializer: normalizeMutator(
159+
outputWorkspace,
160+
outputOptions.override?.paramsSerializer,
161+
),
158162
header:
159163
outputOptions.override?.header === false
160164
? false
@@ -274,7 +278,15 @@ const normalizeOperationsAndTags = (
274278
Object.entries(operationsOrTags).map(
275279
([
276280
key,
277-
{ transformer, mutator, formData, formUrlEncoded, query, ...rest },
281+
{
282+
transformer,
283+
mutator,
284+
formData,
285+
formUrlEncoded,
286+
paramsSerializer,
287+
query,
288+
...rest
289+
},
278290
]) => {
279291
return [
280292
key,
@@ -305,6 +317,14 @@ const normalizeOperationsAndTags = (
305317
: formUrlEncoded,
306318
}
307319
: {}),
320+
...(paramsSerializer
321+
? {
322+
paramsSerializer: normalizeMutator(
323+
workspace,
324+
paramsSerializer,
325+
),
326+
}
327+
: {}),
308328
},
309329
];
310330
},

‎packages/query/src/index.ts

+23
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ const AXIOS_DEPENDENCIES: GeneratorDependency[] = [
5858
},
5959
];
6060

61+
const PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[] = [
62+
{
63+
exports: [
64+
{
65+
name: 'qs',
66+
default: true,
67+
values: true,
68+
syntheticDefaultImport: true,
69+
},
70+
],
71+
dependency: 'qs',
72+
},
73+
];
74+
6175
const SVELTE_QUERY_DEPENDENCIES_V3: GeneratorDependency[] = [
6276
{
6377
exports: [
@@ -112,12 +126,14 @@ const isSvelteQueryV3 = (packageJson: PackageJson | undefined) => {
112126

113127
export const getSvelteQueryDependencies: ClientDependenciesBuilder = (
114128
hasGlobalMutator,
129+
hasParamsSerializerOptions,
115130
packageJson,
116131
) => {
117132
const hasSvelteQueryV3 = isSvelteQueryV3(packageJson);
118133

119134
return [
120135
...(!hasGlobalMutator ? AXIOS_DEPENDENCIES : []),
136+
...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),
121137
...(hasSvelteQueryV3
122138
? SVELTE_QUERY_DEPENDENCIES_V3
123139
: SVELTE_QUERY_DEPENDENCIES),
@@ -170,6 +186,7 @@ const REACT_QUERY_DEPENDENCIES: GeneratorDependency[] = [
170186

171187
export const getReactQueryDependencies: ClientDependenciesBuilder = (
172188
hasGlobalMutator,
189+
hasParamsSerializerOptions,
173190
packageJson,
174191
) => {
175192
const hasReactQuery =
@@ -181,6 +198,7 @@ export const getReactQueryDependencies: ClientDependenciesBuilder = (
181198

182199
return [
183200
...(!hasGlobalMutator ? AXIOS_DEPENDENCIES : []),
201+
...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),
184202
...(hasReactQuery && !hasReactQueryV4
185203
? REACT_QUERY_DEPENDENCIES_V3
186204
: REACT_QUERY_DEPENDENCIES),
@@ -259,12 +277,14 @@ const isVueQueryV3 = (packageJson: PackageJson | undefined) => {
259277

260278
export const getVueQueryDependencies: ClientDependenciesBuilder = (
261279
hasGlobalMutator: boolean,
280+
hasParamsSerializerOptions: boolean,
262281
packageJson,
263282
) => {
264283
const hasVueQueryV3 = isVueQueryV3(packageJson);
265284

266285
return [
267286
...(!hasGlobalMutator ? AXIOS_DEPENDENCIES : []),
287+
...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),
268288
...(hasVueQueryV3 ? VUE_QUERY_DEPENDENCIES_V3 : VUE_QUERY_DEPENDENCIES),
269289
];
270290
};
@@ -336,6 +356,7 @@ const generateQueryRequestFunction = (
336356
verb,
337357
formData,
338358
formUrlEncoded,
359+
paramsSerializer,
339360
override,
340361
}: GeneratorVerbOptions,
341362
{ route, context }: GeneratorOptions,
@@ -440,6 +461,8 @@ const generateQueryRequestFunction = (
440461
requestOptions: override?.requestOptions,
441462
isFormData,
442463
isFormUrlEncoded,
464+
paramsSerializer,
465+
paramsSerializerOptions: override?.paramsSerializerOptions,
443466
isExactOptionalPropertyTypes,
444467
hasSignal,
445468
});

‎packages/swr/src/index.ts

+23-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ const AXIOS_DEPENDENCIES: GeneratorDependency[] = [
4343
},
4444
];
4545

46+
const PARAMS_SERIALIZER_DEPENDENCIES: GeneratorDependency[] = [
47+
{
48+
exports: [
49+
{
50+
name: 'qs',
51+
default: true,
52+
values: true,
53+
syntheticDefaultImport: true,
54+
},
55+
],
56+
dependency: 'qs',
57+
},
58+
];
59+
4660
const SWR_DEPENDENCIES: GeneratorDependency[] = [
4761
{
4862
exports: [
@@ -56,7 +70,12 @@ const SWR_DEPENDENCIES: GeneratorDependency[] = [
5670

5771
export const getSwrDependencies: ClientDependenciesBuilder = (
5872
hasGlobalMutator: boolean,
59-
) => [...(!hasGlobalMutator ? AXIOS_DEPENDENCIES : []), ...SWR_DEPENDENCIES];
73+
hasParamsSerializerOptions: boolean,
74+
) => [
75+
...(!hasGlobalMutator ? AXIOS_DEPENDENCIES : []),
76+
...(hasParamsSerializerOptions ? PARAMS_SERIALIZER_DEPENDENCIES : []),
77+
...SWR_DEPENDENCIES,
78+
];
6079

6180
const generateSwrRequestFunction = (
6281
{
@@ -71,6 +90,7 @@ const generateSwrRequestFunction = (
7190
formData,
7291
formUrlEncoded,
7392
override,
93+
paramsSerializer,
7494
}: GeneratorVerbOptions,
7595
{ route, context }: GeneratorOptions,
7696
) => {
@@ -144,6 +164,8 @@ const generateSwrRequestFunction = (
144164
requestOptions: override?.requestOptions,
145165
isFormData,
146166
isFormUrlEncoded,
167+
paramsSerializer,
168+
paramsSerializerOptions: override?.paramsSerializerOptions,
147169
isExactOptionalPropertyTypes,
148170
hasSignal: false,
149171
});

0 commit comments

Comments
 (0)
Please sign in to comment.