docs-util: support new query type argument (#10468)

* add support for second query argument

* more fixes
This commit is contained in:
Shahed Nasser authored and GitHub committed 2024-12-06 12:21:19 +02:00
1 parent e3459b1f2f
commit abdd4c9e99
2 files changed
+65 -20

No files matched your search

@@ -37,6 +37,12 @@ class SchemaFactory {
BigNumberValue: { BigNumberValue: {
type: "number", type: "number",
}, },
difference_due: {
type: "number",
},
refund_amount: {
type: "number",
},
File: { File: {
type: "object", type: "object",
description: "A File to upload.", description: "A File to upload.",
@@ -65,6 +65,7 @@ class OasKindGenerator extends FunctionKindGenerator {
"MedusaRequest", "MedusaRequest",
"RequestWithContext", "RequestWithContext",
"AuthenticatedMedusaRequest", "AuthenticatedMedusaRequest",
"MedusaStoreRequest",
] ]
// as it's not always possible to detect authenticated request // as it's not always possible to detect authenticated request
// use this to override the default detection logic. // use this to override the default detection logic.
@@ -1015,13 +1016,19 @@ class OasKindGenerator extends FunctionKindGenerator {
*/ */
requestSchema?: OpenApiSchema requestSchema?: OpenApiSchema
} { } {
const parameters: OpenAPIV3.ParameterObject[] = [] const queryParameters: OpenAPIV3.ParameterObject[] = []
let requestSchema: OpenApiSchema | undefined let requestSchema: OpenApiSchema | undefined
if ( if (
node.parameters[0].type && !node.parameters[0].type ||
ts.isTypeReferenceNode(node.parameters[0].type) !ts.isTypeReferenceNode(node.parameters[0].type)
) { ) {
return {
queryParameters,
requestSchema,
}
}
const requestType = this.checker.getTypeFromTypeNode( const requestType = this.checker.getTypeFromTypeNode(
node.parameters[0].type node.parameters[0].type
) as ts.TypeReference ) as ts.TypeReference
@@ -1054,7 +1061,7 @@ class OasKindGenerator extends FunctionKindGenerator {
symbol: property, symbol: property,
nodeType: propertyType, nodeType: propertyType,
} }
parameters.push( queryParameters.push(
this.getParameterObject({ this.getParameterObject({
name: propertyName, name: propertyName,
type: "query", type: "query",
@@ -1075,60 +1082,92 @@ class OasKindGenerator extends FunctionKindGenerator {
const requestTypeArguments = const requestTypeArguments =
requestType.typeArguments || requestType.aliasTypeArguments requestType.typeArguments || requestType.aliasTypeArguments
if (requestTypeArguments?.length === 1) { if (!requestTypeArguments || requestTypeArguments.length < 2) {
const zodObjectTypeName = getCorrectZodTypeName({ return {
queryParameters,
requestSchema,
}
}
// Not all routes support a second type argument yet,
// so the query param may be passed in the first type argument
const hasQueryParams = requestTypeArguments[1].getProperties().length > 0
// Not all routes support a second type argument yet,
// so we have to support routes that pass the query parameters type
// in the first type argument
const isQuery = methodName === "get"
const zodObjectRequestBodyTypeName = getCorrectZodTypeName({
typeReferenceNode: node.parameters[0].type, typeReferenceNode: node.parameters[0].type,
itemType: requestTypeArguments[0], itemType: requestTypeArguments[0],
}) })
const isQuery = methodName === "get" const zodObjectQueryTypeName = getCorrectZodTypeName({
const parameterSchema = this.typeToSchema({ typeReferenceNode: node.parameters[0].type,
itemType: requestTypeArguments[1],
})
const requestBodyParameterSchema = this.typeToSchema({
itemType: requestTypeArguments[0], itemType: requestTypeArguments[0],
descriptionOptions: { descriptionOptions: {
parentName: tagName, parentName: tagName,
rawParentName: this.checker.typeToString(requestTypeArguments[0]), rawParentName: this.checker.typeToString(requestTypeArguments[0]),
}, },
zodObjectTypeName: zodObjectTypeName, zodObjectTypeName: zodObjectRequestBodyTypeName,
context: isQuery ? "query" : "request", context: isQuery ? "query" : "request",
saveSchema: !forUpdate, saveSchema: !forUpdate,
}) })
const queryParameterSchema = hasQueryParams
? this.typeToSchema({
itemType: requestTypeArguments[1],
descriptionOptions: {
parentName: tagName,
rawParentName: this.checker.typeToString(requestTypeArguments[1]),
},
zodObjectTypeName: zodObjectQueryTypeName,
context: "query",
saveSchema: !forUpdate,
})
: requestBodyParameterSchema
// If function is a GET function, add the type parameter to the // If function is a GET function, add the type parameter to the
// query parameters instead of request parameters. // query parameters instead of request parameters.
if (isQuery) { if (
if (parameterSchema.type === "object" && parameterSchema.properties) { (isQuery || hasQueryParams) &&
Object.entries(parameterSchema.properties).forEach( queryParameterSchema.type === "object" &&
queryParameterSchema.properties
) {
Object.entries(queryParameterSchema.properties).forEach(
([key, propertySchema]) => { ([key, propertySchema]) => {
if ("$ref" in propertySchema) { if ("$ref" in propertySchema) {
return return
} }
// check if parameter is already added // check if parameter is already added
const isAdded = parameters.some((param) => param.name === key) const isAdded = queryParameters.some((param) => param.name === key)
if (isAdded) { if (isAdded) {
return return
} }
parameters.push( queryParameters.push(
this.getParameterObject({ this.getParameterObject({
name: key, name: key,
type: "query", type: "query",
description: propertySchema.description, description: propertySchema.description,
required: parameterSchema.required?.includes(key) || false, required: queryParameterSchema.required?.includes(key) || false,
schema: propertySchema, schema: propertySchema,
}) })
) )
} }
) )
} }
} else if (methodName !== "delete") {
requestSchema = parameterSchema if (methodName !== "delete" && methodName !== "get") {
} requestSchema = requestBodyParameterSchema
}
} }
return { return {
queryParameters: parameters, queryParameters,
requestSchema, requestSchema,
} }
} }