OpenAPITools / OpenAPITools/openapi-generator
[BUG][typescript-angular] UniqueItems and `queryParamObjectFormat=json` are incompatible
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 26.8k
- Forks
- 7.7k
- PR merge metrics
- PR metrics pending
Description
Bug Report Checklist
- Have you provided a full/minimal spec to reproduce the issue?
- Have you validated the input using an OpenAPI validator (example)?
- Have you tested with the latest master to confirm the issue still exists?
- Have you searched for related issues/PRs?
- What's the actual output vs expected output?
- [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description
When queryParamObjectFormat=json is set the function addToHttpParamsRecursive does not handle Set types correctly.
if (typeof value === "object") {
httpParams = httpParams.append(key, JSON.stringify(value));
} else if (key != null) {
httpParams = httpParams.append(key, value);
} else {
throw Error("key may not be null if value is not object or array");
}
That's because a Set is an object
typeof new Set() // -> 'object'
Now that I think about it an Array is also an object. But it JSON.stringifys better.
JSON.stringify([1,2]) // -> '[1,2]'
JSON.stringify(new Set([1,2])) // -> '{}'
openapi-generator version
6.1.0
OpenAPI declaration file content or url
https://github.com/snebjorn/openapi-gen-bug/blob/master/object-format-json-bug.json
{
"openapi": "3.0.0",
"info": {
"title": "",
"version": ""
},
"paths": {
"/Foos": {
"get": {
"parameters": [
{
"name": "$select",
"in": "query",
"explode": false,
"schema": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"enum": ["Foo", "Bar"]
}
}
}
],
"responses": {
"200": {
"description": ""
}
}
}
}
}
}
Generation Details
additionalProperties:
queryParamObjectFormat: json
Steps to reproduce
- Clone https://github.com/snebjorn/openapi-gen-bug
- Run yarn install
- Run yarn gen
- Observe erroneous logic in
addToHttpParamsRecursivehttps://github.com/snebjorn/openapi-gen-bug/blob/c68a099cdfc29956c7c5c560dc4025722dac5323/output-6.1.0/object-format-json-bug/api/default.service.ts#L62
Related issues/PRs
None found
Suggest a fix
Not sure. Seems that whole section needs a long hard look
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Clone the linked reproduction, run yarn install and yarn gen, then inspect output-6.1.0/object-format-json-bug/api/default.service.ts around addToHttpParamsRecursive. Trace how uniqueItems arrays become Set values when queryParamObjectFormat=json is enabled. Done means the generated client serializes those query parameters correctly instead of producing an empty JSON object.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- angular, openapi, typescript
- Domain
- api, tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100