diff --git a/src/core/plugins/oas31/index.js b/src/core/plugins/oas31/index.js
index 90c10d6a..2b235c92 100644
--- a/src/core/plugins/oas31/index.js
+++ b/src/core/plugins/oas31/index.js
@@ -52,6 +52,7 @@ import {
import { selectLicenseUrl as selectOAS31LicenseUrl } from "./selectors"
import JSONSchema202012KeywordExample from "./json-schema-2020-12-extensions/components/keywords/Example"
import JSONSchema202012KeywordXml from "./json-schema-2020-12-extensions/components/keywords/Xml"
+import JSONSchema202012KeywordDiscriminator from "./json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator"
import JSONSchema202012KeywordDescriptionWrapper from "./json-schema-2020-12-extensions/wrap-components/keywords/Description"
import JSONSchema202012KeywordDefaultWrapper from "./json-schema-2020-12-extensions/wrap-components/keywords/Default"
import { makeIsExpandable } from "./json-schema-2020-12-extensions/fn"
@@ -86,6 +87,7 @@ const OAS31Plugin = ({ getSystem }) => {
OAS31Models: Models,
JSONSchema202012KeywordExample,
JSONSchema202012KeywordXml,
+ JSONSchema202012KeywordDiscriminator,
},
wrapComponents: {
InfoContainer: InfoWrapper,
diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx
new file mode 100644
index 00000000..21c13b85
--- /dev/null
+++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx
@@ -0,0 +1,76 @@
+/**
+ * @prettier
+ */
+import React, { useCallback, useState } from "react"
+import PropTypes from "prop-types"
+import classNames from "classnames"
+
+import DiscriminatorMapping from "./DiscriminatorMapping"
+
+const Discriminator = ({ schema, getSystem }) => {
+ const discriminator = schema?.discriminator || {}
+ const { fn, getComponent } = getSystem()
+ const { useIsExpandedDeeply, useComponent } = fn.jsonSchema202012
+ const isExpandedDeeply = useIsExpandedDeeply()
+ const [expanded, setExpanded] = useState(isExpandedDeeply)
+ const [expandedDeeply, setExpandedDeeply] = useState(false)
+ const Accordion = useComponent("Accordion")
+ const ExpandDeepButton = useComponent("ExpandDeepButton")
+ const JSONSchemaDeepExpansionContext = getComponent(
+ "JSONSchema202012DeepExpansionContext"
+ )()
+
+ /**
+ * Event handlers.
+ */
+ const handleExpansion = useCallback(() => {
+ setExpanded((prev) => !prev)
+ }, [])
+ const handleExpansionDeep = useCallback((e, expandedDeepNew) => {
+ setExpanded(expandedDeepNew)
+ setExpandedDeeply(expandedDeepNew)
+ }, [])
+
+ /**
+ * Rendering.
+ */
+ if (Object.keys(discriminator).length === 0) {
+ return null
+ }
+
+ return (
+
+
+
+
+ Discriminator
+
+
+
+ {discriminator.propertyName && (
+
+ {discriminator.propertyName}
+
+ )}
+
+ {expanded && (
+ -
+
+
+ )}
+
+
+
+ )
+}
+
+Discriminator.propTypes = {
+ schema: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]),
+ getSystem: PropTypes.func.isRequired,
+}
+
+export default Discriminator
diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx
new file mode 100644
index 00000000..e71105ea
--- /dev/null
+++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx
@@ -0,0 +1,36 @@
+/**
+ * @prettier
+ */
+import React from "react"
+import PropTypes from "prop-types"
+
+const DiscriminatorMapping = ({ discriminator }) => {
+ const mapping = discriminator?.mapping || {}
+
+ if (Object.keys(mapping).length === 0) {
+ return null
+ }
+
+ return Object.entries(mapping).map(([key, value]) => (
+
+
+ {key}
+
+
+ {value}
+
+
+ ))
+}
+
+DiscriminatorMapping.propTypes = {
+ discriminator: PropTypes.shape({
+ mapping: PropTypes.any,
+ }),
+}
+
+DiscriminatorMapping.defaultProps = {
+ mapping: undefined,
+}
+
+export default DiscriminatorMapping
diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx
index 44c1f5a1..9cc126f6 100644
--- a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx
+++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx
@@ -12,7 +12,7 @@ const Example = ({ schema, getSystem }) => {
return (
-
+
Example
diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx
index 834a1ee5..1b15dbbf 100644
--- a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx
+++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx
@@ -76,7 +76,8 @@ const Xml = ({ schema, getSystem }) => {
)}
-
+
+
{xml.namespace && (
@@ -87,7 +88,8 @@ const Xml = ({ schema, getSystem }) => {
)}
-
+
+
{xml.prefix && (
diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx
index d7f40504..92c46ff9 100644
--- a/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx
+++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx
@@ -7,14 +7,18 @@ import { createOnlyOAS31ComponentWrapper } from "../../../fn"
const DefaultWrapper = createOnlyOAS31ComponentWrapper(
({ schema, getSystem, originalComponent: KeywordDefault }) => {
const { getComponent } = getSystem()
- const KeywordExample = getComponent("JSONSchema202012KeywordExample")
+ const KeywordDiscriminator = getComponent(
+ "JSONSchema202012KeywordDiscriminator"
+ )
const KeywordXml = getComponent("JSONSchema202012KeywordXml")
+ const KeywordExample = getComponent("JSONSchema202012KeywordExample")
return (
<>
-
+
+
>
)
}