Skip to content

Commit 5658a01

Browse files
fix: operation parameter should override pathItem parameters
1 parent 11a8e4e commit 5658a01

File tree

3 files changed

+61
-59
lines changed

3 files changed

+61
-59
lines changed

packages/rtk-query-codegen-openapi/src/generate.ts

Lines changed: 59 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,13 @@ export async function generateApi(
175175
...apiGen.enumAliases,
176176
...(hooks
177177
? [
178-
generateReactHooks({
179-
exportName: generatedApiName,
180-
operationDefinitions,
181-
endpointOverrides,
182-
config: hooks,
183-
}),
184-
]
178+
generateReactHooks({
179+
exportName: generatedApiName,
180+
operationDefinitions,
181+
endpointOverrides,
182+
config: hooks,
183+
}),
184+
]
185185
: []),
186186
],
187187
factory.createToken(ts.SyntaxKind.EndOfFileToken),
@@ -259,10 +259,12 @@ export async function generateApi(
259259
).name
260260
);
261261

262-
const parameters = supportDeepObjects([
263-
...apiGen.resolveArray(pathItem.parameters),
264-
...apiGen.resolveArray(operation.parameters),
265-
]);
262+
const operationParameters = apiGen.resolveArray(operation.parameters);
263+
const pathItemParameters = apiGen
264+
.resolveArray(pathItem.parameters)
265+
.filter((pp) => !operationParameters.some((op) => op.name === pp.name));
266+
267+
const parameters = supportDeepObjects([...pathItemParameters, ...operationParameters]);
266268

267269
const allNames = parameters.map((p) => p.name);
268270
const queryArg: QueryArgDefinitions = {};
@@ -301,7 +303,9 @@ export async function generateApi(
301303
const body = apiGen.resolve(requestBody);
302304
const schema = apiGen.getSchemaFromContent(body.content);
303305
const type = apiGen.getTypeFromSchema(schema);
304-
const schemaName = camelCase((type as any).name || getReferenceName(schema) || ("title" in schema && schema.title) || 'body');
306+
const schemaName = camelCase(
307+
(type as any).name || getReferenceName(schema) || ('title' in schema && schema.title) || 'body'
308+
);
305309
const name = generateName(schemaName in queryArg ? 'body' : schemaName, 'body');
306310

307311
queryArg[name] = {
@@ -335,19 +339,19 @@ export async function generateApi(
335339
? isFlatArg
336340
? withQueryComment({ ...queryArgValues[0].type }, queryArgValues[0], false)
337341
: factory.createTypeLiteralNode(
338-
queryArgValues.map((def) =>
339-
withQueryComment(
340-
factory.createPropertySignature(
341-
undefined,
342-
propertyName(def.name),
343-
createQuestionToken(!def.required),
344-
def.type
345-
),
346-
def,
347-
true
342+
queryArgValues.map((def) =>
343+
withQueryComment(
344+
factory.createPropertySignature(
345+
undefined,
346+
propertyName(def.name),
347+
createQuestionToken(!def.required),
348+
def.type
349+
),
350+
def,
351+
true
352+
)
348353
)
349354
)
350-
)
351355
: factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword)
352356
)
353357
).name
@@ -391,18 +395,18 @@ export async function generateApi(
391395
return parameters.length === 0
392396
? undefined
393397
: factory.createPropertyAssignment(
394-
factory.createIdentifier(propertyName),
395-
factory.createObjectLiteralExpression(
396-
parameters.map(
397-
(param) =>
398-
createPropertyAssignment(
399-
param.originalName,
400-
isFlatArg ? rootObject : accessProperty(rootObject, param.name)
401-
),
402-
true
398+
factory.createIdentifier(propertyName),
399+
factory.createObjectLiteralExpression(
400+
parameters.map(
401+
(param) =>
402+
createPropertyAssignment(
403+
param.originalName,
404+
isFlatArg ? rootObject : accessProperty(rootObject, param.name)
405+
),
406+
true
407+
)
403408
)
404-
)
405-
);
409+
);
406410
}
407411

408412
return factory.createArrowFunction(
@@ -423,17 +427,17 @@ export async function generateApi(
423427
isQuery && verb.toUpperCase() === 'GET'
424428
? undefined
425429
: factory.createPropertyAssignment(
426-
factory.createIdentifier('method'),
427-
factory.createStringLiteral(verb.toUpperCase())
428-
),
430+
factory.createIdentifier('method'),
431+
factory.createStringLiteral(verb.toUpperCase())
432+
),
429433
bodyParameter === undefined
430434
? undefined
431435
: factory.createPropertyAssignment(
432-
factory.createIdentifier('body'),
433-
isFlatArg
434-
? rootObject
435-
: factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(bodyParameter.name))
436-
),
436+
factory.createIdentifier('body'),
437+
isFlatArg
438+
? rootObject
439+
: factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(bodyParameter.name))
440+
),
437441
createObjectLiteralProperty(pickParams('cookie'), 'cookies'),
438442
createObjectLiteralProperty(pickParams('header'), 'headers'),
439443
createObjectLiteralProperty(pickParams('query'), 'params'),
@@ -445,12 +449,12 @@ export async function generateApi(
445449
}
446450

447451
// eslint-disable-next-line no-empty-pattern
448-
function generateQueryEndpointProps({ }: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {
452+
function generateQueryEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {
449453
return {}; /* TODO needs implementation - skip for now */
450454
}
451455

452456
// eslint-disable-next-line no-empty-pattern
453-
function generateMutationEndpointProps({ }: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {
457+
function generateMutationEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {
454458
return {}; /* TODO needs implementation - skip for now */
455459
}
456460
}
@@ -480,16 +484,16 @@ function generatePathExpression(
480484

481485
return expressions.length
482486
? factory.createTemplateExpression(
483-
factory.createTemplateHead(head),
484-
expressions.map(([prop, literal], index) =>
485-
factory.createTemplateSpan(
486-
isFlatArg ? rootObject : accessProperty(rootObject, prop),
487-
index === expressions.length - 1
488-
? factory.createTemplateTail(literal)
489-
: factory.createTemplateMiddle(literal)
487+
factory.createTemplateHead(head),
488+
expressions.map(([prop, literal], index) =>
489+
factory.createTemplateSpan(
490+
isFlatArg ? rootObject : accessProperty(rootObject, prop),
491+
index === expressions.length - 1
492+
? factory.createTemplateTail(literal)
493+
: factory.createTemplateMiddle(literal)
494+
)
490495
)
491496
)
492-
)
493497
: factory.createNoSubstitutionTemplateLiteral(head);
494498
}
495499

@@ -500,13 +504,13 @@ type QueryArgDefinition = {
500504
required?: boolean;
501505
param?: OpenAPIV3.ParameterObject;
502506
} & (
503-
| {
507+
| {
504508
origin: 'param';
505509
param: OpenAPIV3.ParameterObject;
506510
}
507-
| {
511+
| {
508512
origin: 'body';
509513
body: OpenAPIV3.RequestBodyObject;
510514
}
511-
);
515+
);
512516
type QueryArgDefinitions = Record<string, QueryArgDefinition>;

packages/rtk-query-codegen-openapi/test/__snapshots__/generateEndpoints.test.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,15 +566,15 @@ import { api } from './fixtures/emptyApi';
566566
const injectedRtkApi = api.injectEndpoints({
567567
endpoints: (build) => ({
568568
getUsersById: build.query<GetUsersByIdApiResponse, GetUsersByIdApiArg>({
569-
query: (queryArg) => ({ url: \`/users/\${queryArg.pathId}\` }),
569+
query: (queryArg) => ({ url: \`/users/\${queryArg.id}\` }),
570570
}),
571571
}),
572572
overrideExisting: false,
573573
});
574574
export { injectedRtkApi as enhancedApi };
575575
export type GetUsersByIdApiResponse = unknown;
576576
export type GetUsersByIdApiArg = {
577-
pathId: number;
577+
id: number;
578578
};
579579

580580
`;

packages/rtk-query-codegen-openapi/test/generateEndpoints.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,10 +388,8 @@ describe('openapi spec', () => {
388388
describe('query parameters', () => {
389389
it('parameters overrided in swagger should also be overrided in the code', async () => {
390390
const api = await generateEndpoints({
391-
unionUndefined: true,
392391
schemaFile: './fixtures/parameterOverride.yaml',
393392
apiFile: './fixtures/emptyApi.ts',
394-
mergeReadWriteOnly: true,
395393
});
396394
expect(api).toMatchSnapshot();
397395
});

0 commit comments

Comments
 (0)