fix(normalizer): prevent nullable state leaking across shared schema refs
Merged
KA
3mo ago+169+169+012345678901234567890123456789-49-49-01234567890123456789
Description
Fixes #23340.
When simplifying an OpenAPI 3.1 oneOf/anyOf containing null and a single $ref, the normalizer applied nullable metadata directly to the referenced schema instance.
Because the parser may reuse that schema instance elsewhere, the nullable state could leak into unrelated properties. For example, a required non-nullable ContentType property was generated as ContentType | null.
This change:
- Clones the remaining
$refschema before applying parent metadata. - Keeps the nullable state local to the simplified
oneOf/anyOf. - Adds a unit test confirming the shared schema is not mutated.
- Adds a TypeScript Axios regression test using a minimal OpenAPI 3.1 specification.
- Updates affected generated samples.
- Adds Javadoc to
cloneSchemaexplaining its purpose, parameters, and return value.
PR checklist
- Read the contribution guidelines.
- Run the following to build the project and update samples:
(For Windows users, please run the script in WSL)./mvnw clean package || exit ./bin/generate-samples.sh ./bin/configs/*.yaml || exit ./bin/utils/export_docs_generators.sh || exit
Commit all changed files.
This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
These must match the expectations made by your contribution.
You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example./bin/generate-samples.sh bin/configs/java*.
IMPORTANT: Do NOT purge/delete any folders/files (e.g. tests) when regenerating the samples as manually written tests may be removed. - If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.
@TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @KannaKim (2026/07)
Summary by cubic
Fixes a normalization bug where nullable from oneOf/anyOf with null + $ref mutated a shared schema, causing unrelated properties to become nullable in generated clients.
- Bug Fixes
- Clone the remaining
$refbefore applying parent metadata when simplifyingoneOf/anyOf(OpenAPI 3.1), keepingnullablelocal to that union. - Add unit coverage in
ModelUtilsTestand atypescript-axiosregression test using3_1/issue_23340.yamlto ensure no nullability leak. - Document
cloneSchemawith Javadoc and update affected samples (Go, Ruby, TypeScript, Java petstore).
- Clone the remaining