Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Add support for Open API discriminator on anyOf/oneOf #3593

Merged
merged 3 commits into from
Apr 12, 2023

Conversation

heath-freenome
Copy link
Member

@heath-freenome heath-freenome commented Apr 11, 2023

Reasons for making this change

Fixes #3512 by updating the getFirstMatchingOption() and getClosestMatchingOption() to take an optional discriminator property to use for drilling into one-of Objects to simplify selection detection and using that in MultiSchemaField by passing the propertyName of a discriminator if it exists.
Fixes #2044 Fixing the toIdSchema() generation to use the getSchemaType() function rather than just using schema.type

  • In @rjsf/utils, updated the SchemaUtilsType, its associated class implementation and several functions to fix both bug as follows:
    • Updated SchemaUtilsType to add an optional discriminatorField?: string parameter to the get(First|Closest|)MatchingOption() functions
    • Updated createSchemaUtils() to take the new discriminatorField parameter and forward it onto the underlying function `get(First|Closest|)MatchingOption() implementations
    • Updated the getClosestMatchingOption() and getFirstMatchingOption() to pass the new discriminatorField to the getMatchingOption() function
    • Updated getMatchingOption() to use discriminatorField when it is present in the options object properties to drill into the object to detect if that one field is valid
    • Also updated the toIdSchemaInternal() function to use getSchemaType(schema) === 'object' rather than schema.type === 'object' to get the proper pathing for ids
  • In @rjsf/core, updated the MultiSchemaField, to get the discriminator.propertyName value for a anyOf/oneOf object and pass it into getClosestMatchingOption()
    • Updated the oneOf and anyOf tests to verify the discriminator property works
    • Also updated the oneOf and form tests to update the few ids that were fixed by the toIdSchema() fix
    • Moved a test that was once just in the bootstrap-4 theme related to additionalProperties being defined as true for a non-object type schema
  • In the other themes, updated the snapshots to include the new test that was moved from bootstrap-4 into the objectTests
    • Updated bootstrap-4 to delete the AdditionalProperties.test.tsx and its associated snapshot since it was moved to core
  • Updated the utility-functions documentation to add the new discriminatorField prop to the get(First|Closest|)MatchingOption() functions
  • Updated the CHANGELOG.md file accordingly

Checklist

  • I'm updating documentation
  • I'm adding or updating code
    • I've added and/or updated tests. I've run npm run test:update to update snapshots, if needed.
    • I've updated docs if needed
    • I've updated the changelog with a description of the PR
  • I'm adding a new feature
    • I've updated the playground with an example use of the feature

Fixes rjsf-team#3512 by updating the `getFirstMatchingOption()` and `getClosestMatchingOption()` to take an optional discriminator property to use for drilling into one-of Objects to simplify selection detection
Fixes rjsf-team#2044 Fixing the `toIdSchema()` generation to use the `getSchemaType()` function rather than just using `schema.type`

- In `@rjsf/utils`, updated the `SchemaUtilsType`, its associated class implementation and several functions to fix both bug as follows:
  - Updated `SchemaUtilsType` to add an optional `discriminatorField?: string` parameter to the `get(First|Closest|)MatchingOption()` functions
  - Updated `createSchemaUtils()` to take the new `discriminatorField` parameter and forward it onto the underlying function `get(First|Closest|)MatchingOption() implementations
  - Updated the `getClosestMatchingOption()` and `getFirstMatchingOption()` to pass the new `discriminatorField` to the `getMatchingOption()` function
  - Updated `getMatchingOption()` to use `discriminatorField` when it is present in the `options` object properties to drill into the object to detect if that one field is valid
  - Also updated the `toIdSchemaInternal()` function to use `getSchemaType(schema) === 'object'` rather than `schema.type === 'object'` to get the proper pathing for ids
- In `@rjsf/core`, updated the `MultiSchemaField`, to get the `discriminator.propertyName` value for a `anyOf/oneOf` object and pass it into `getClosestMatchingOption()`
  - Updated the `oneOf` and `anyOf` tests to verify the `discriminator` property works
  - Also updated the `oneOf` and `form` tests to update the few ids that were fixed by the `toIdSchema()` fix
  - Moved a test that was once just in the `bootstrap-4` theme related to `additionalProperties` being defined as true for a non-object type schema
- In the other themes, updated the snapshots to include the new test that was moved from `bootstrap-4` into the `objectTests`
  - Updated `bootstrap-4` to delete the `AdditionalProperties.test.tsx` and its associated snapshot since it was moved to `core`
- Updated the `utility-functions` documentation to add the new `discriminatorField` prop to the `get(First|Closest|)MatchingOption()` functions
- Updated the `CHANGELOG.md` file accordingly
…xxx` by using `getSchemaType(schema)` instead of `schema.type` for classnames
CHANGELOG.md Show resolved Hide resolved
Co-authored-by: Nick Grosenbacher <[email protected]>
@heath-freenome heath-freenome merged commit dc070e6 into rjsf-team:main Apr 12, 2023
@heath-freenome heath-freenome deleted the fix-3512 branch April 12, 2023 04:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add openAPI discriminator support When type is an array, child id schema is lost
2 participants