fix(normalizer): prevent nullable state leaking across shared schema refs

Merged
KA
3mo ago
+169-49

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 $ref schema 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 cloneSchema explaining its purpose, parameters, and return value.

PR checklist

  • Read the contribution guidelines.
  • Run the following to build the project and update samples:
    ./mvnw clean package || exit
    ./bin/generate-samples.sh ./bin/configs/*.yaml || exit
    ./bin/utils/export_docs_generators.sh || exit
    
    (For Windows users, please run the script in WSL)
    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 $ref before applying parent metadata when simplifying oneOf/anyOf (OpenAPI 3.1), keeping nullable local to that union.
    • Add unit coverage in ModelUtilsTest and a typescript-axios regression test using 3_1/issue_23340.yaml to ensure no nullability leak.
    • Document cloneSchema with Javadoc and update affected samples (Go, Ruby, TypeScript, Java petstore).