Skip to content

Commit 6421141

Browse files
committed
fix: default to empty object when all operation arguments are optional
1 parent b5d50c9 commit 6421141

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/schema-to-typescript/common/operation-methods.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
import {attachJsDocComment, extractJsDoc, JsDocRenderConfig, renderJsDoc} from '../../utils/jsdoc';
4545
import {isJsonMediaType, isWildcardMediaType} from '../../utils/media-types';
4646
import {applyEntityNameCase} from '../../utils/string-utils';
47-
import {getUserFreiendlySchemaName, mergeTypes} from '../../utils/type-utils';
47+
import {getUserFreiendlySchemaName, isAssignableToEmptyObject, mergeTypes} from '../../utils/type-utils';
4848
import {objectPropertyKey, valueToAstExpression} from '../common';
4949
import {
5050
OpenApiClientCustomizableBinaryType,
@@ -620,7 +620,13 @@ export function generateOperationMethods({
620620
const operationMethod = classMethod(
621621
'method',
622622
identifier(operationName),
623-
argument.properties.length > 0 ? [argument] : [],
623+
argument.properties.length > 0
624+
? [
625+
isAssignableToEmptyObject(argument.typeAnnotation.typeAnnotation)
626+
? assignmentPattern(argument, objectExpression([]))
627+
: argument
628+
]
629+
: [],
624630
blockStatement([
625631
returnStatement(
626632
operationReturn.wrapResultExpression(

src/utils/type-utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ import {
33
isIdentifier,
44
isNumericLiteral,
55
isStringLiteral,
6+
isTSCallSignatureDeclaration,
7+
isTSConstructSignatureDeclaration,
68
isTSIntersectionType,
79
isTSLiteralType,
10+
isTSMethodSignature,
811
isTSPropertySignature,
912
isTSTypeLiteral,
1013
isTSUnionType,
@@ -273,3 +276,21 @@ export function simplifyIntersectionTypeIfPossible(intersection: TSIntersectionT
273276
}
274277
return intersection;
275278
}
279+
280+
export function isAssignableToEmptyObject(type: TSType): boolean {
281+
if (isTSTypeLiteral(type)) {
282+
for (const member of type.members) {
283+
if (isTSCallSignatureDeclaration(member) || isTSConstructSignatureDeclaration(member)) {
284+
return false;
285+
} else if ((isTSMethodSignature(member) || isTSPropertySignature(member)) && !member.optional) {
286+
return false;
287+
}
288+
}
289+
return true;
290+
} else if (isTSIntersectionType(type)) {
291+
return type.types.every(isAssignableToEmptyObject);
292+
} else if (isTSUnionType(type)) {
293+
return type.types.some(isAssignableToEmptyObject);
294+
}
295+
return false;
296+
}

0 commit comments

Comments
 (0)