Skip to content

Expose original OAS 3.1 $ref fields in resolver meta patches #4201

Description

@adrianodpdiaz

Content & configuration

Swagger/OpenAPI definition:

openapi: 3.1.0
info:
  title: Example
  version: 1.0.0
paths: {}
components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: string

    UserList:
      type: object
      properties:
        users:
          type: array
          items:
            $ref: "#/components/schemas/User"

    UserListWithDescription:
      type: object
      properties:
        users:
          type: array
          items:
            $ref: "#/components/schemas/User"
            description: Users returned by this operation

Swagger-Client usage:

SwaggerClient.resolveSubtree(spec, ["components", "schemas", "UserList"])

Is your feature request related to a problem?

Swagger Client adds $$ref to resolved OAS 3.1 schemas, but $$ref does not tell consumers whether the original schema was only a $ref, or a $ref with sibling keywords.

That matters for renderers like Swagger UI. A plain ref can safely be shown as a reference to User, but this is different:

items:
  $ref: "#/components/schemas/User"
  description: Users returned by this operation

In OAS 3.1, sibling keywords are part of the schema. After resolution, both cases may still have $$ref, so downstream code cannot reliably tell them apart.

Describe the solution you'd like

Today, the resolved plain object only exposes $$ref as the ref-related meta patch:

{
  type: "object",
  properties: {
    id: { type: "string" }
  },
  $$ref: "https://swagger.io/#/components/schemas/User"
}

That output is the same shape whether the original schema was just:

$ref: "#/components/schemas/User"

or had sibling keywords:

$ref: "#/components/schemas/User"
description: Users returned by this operation

It would be helpful to also expose the original ref fields in the resolved plain object when allowMetaPatches is enabled.

For example:

{
  type: "object",
  properties: {
    id: { type: "string" }
  },
  $$ref: "https://swagger.io/#/components/schemas/User",
  $$refFields: {
    $ref: "#/components/schemas/User"
  }
}

And when the original schema had siblings:

{
  type: "object",
  description: "Users returned by this operation",
  properties: {
    id: { type: "string" }
  },
  $$ref: "https://swagger.io/#/components/schemas/User",
  $$refFields: {
    $ref: "#/components/schemas/User",
    description: "Users returned by this operation"
  }
}

The property name does not need to be $$refFields; any clear internal meta field would work.

Describe alternatives you've considered

Swagger UI can infer from $$ref, but that is not reliable enough for OAS 3.1.

Swagger UI can always use $$ref as a label hint, but that can be misleading when the original schema had siblings.

Additional context

The OAS 3.1 dereference strategy already keeps ref-fields as ApiDOM metadata internally. This request is to expose that information, or a small equivalent, through allowMetaPatches.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions