diff --git a/src/core/plugins/oas3/spec-extensions/selectors.js b/src/core/plugins/oas3/spec-extensions/selectors.js
index 587a11a9..3a0ce81a 100644
--- a/src/core/plugins/oas3/spec-extensions/selectors.js
+++ b/src/core/plugins/oas3/spec-extensions/selectors.js
@@ -6,6 +6,8 @@ import { isSwagger2 as isSwagger2Helper, isOAS30 as isOAS30Helper } from "../hel
* Helpers
*/
+const map = Map()
+
export const isSwagger2 = () => (system) => {
const spec = system.getSystem().specSelectors.specJson()
return isSwagger2Helper(spec)
@@ -34,6 +36,5 @@ function onlyOAS3(selector) {
export const servers = onlyOAS3(() => (system) => {
const spec = system.specSelectors.specJson()
- return spec.get("servers", servers.mapConst)
+ return spec.get("servers", map)
})
-servers.mapConst = Map()
diff --git a/src/core/plugins/oas3/spec-extensions/wrap-selectors.js b/src/core/plugins/oas3/spec-extensions/wrap-selectors.js
index 8572fc1e..231d6c32 100644
--- a/src/core/plugins/oas3/spec-extensions/wrap-selectors.js
+++ b/src/core/plugins/oas3/spec-extensions/wrap-selectors.js
@@ -8,6 +8,9 @@ import { Map } from "immutable"
/**
* Helpers
*/
+
+const map = Map()
+
function onlyOAS3(selector) {
return (ori, system) =>
(...args) => {
@@ -31,9 +34,8 @@ const OAS3NullSelector = onlyOAS3(nullSelector)
export const definitions = onlyOAS3(() => (system) => {
const spec = system.getSystem().specSelectors.specJson()
const schemas = spec.getIn(["components", "schemas"])
- return Map.isMap(schemas) ? schemas : definitions.mapConst
+ return Map.isMap(schemas) ? schemas : map
})
-definitions.mapConst = Map()
export const hasHost = onlyOAS3(() => (system) => {
const spec = system.getSystem().specSelectors.specJson()
diff --git a/src/core/plugins/oas31/components/license.jsx b/src/core/plugins/oas31/components/license.jsx
index ae620e79..bf516631 100644
--- a/src/core/plugins/oas31/components/license.jsx
+++ b/src/core/plugins/oas31/components/license.jsx
@@ -3,50 +3,35 @@
*/
import React from "react"
import PropTypes from "prop-types"
-import { safeBuildUrl } from "core/utils/url"
+
import { sanitizeUrl } from "core/utils"
-class License extends React.Component {
- static propTypes = {
- license: PropTypes.object,
- getComponent: PropTypes.func.isRequired,
- selectedServer: PropTypes.string,
- url: PropTypes.string.isRequired,
- }
+const License = ({ getComponent, oas31Selectors }) => {
+ const name = oas31Selectors.selectLicenseNameField()
+ const url = oas31Selectors.selectLicenseUrl()
+ const Link = getComponent("Link")
- render() {
- const { license, getComponent, selectedServer, url: specUrl } = this.props
- const name = license.get("name", "License")
- const url = sanitizeUrl(
- safeBuildUrl(license.get("url"), specUrl, { selectedServer })
- )
- const identifier = license.get("identifier", "")
- const spdxURL = sanitizeUrl(`https://spdx.org/licenses/${identifier}.html`)
+ return (
+
+ {url ? (
+
+
+ {name}
+
+
+ ) : (
+
{name}
+ )}
+
+ )
+}
- const Link = getComponent("Link")
-
- return (
-
- {identifier && (
-
-
- {name}
-
-
- )}
-
- {url && !identifier && (
-
-
- {name}
-
-
- )}
-
- {!url && !identifier &&
{name}}
-
- )
- }
+License.propTypes = {
+ getComponent: PropTypes.func.isRequired,
+ oas31Selectors: PropTypes.shape({
+ selectLicenseNameField: PropTypes.func.isRequired,
+ selectLicenseUrl: PropTypes.func.isRequired,
+ }).isRequired,
}
export default License
diff --git a/src/core/plugins/oas31/index.js b/src/core/plugins/oas31/index.js
index 11cc4d1b..d61a007f 100644
--- a/src/core/plugins/oas31/index.js
+++ b/src/core/plugins/oas31/index.js
@@ -6,11 +6,22 @@ import License from "./components/license"
import Info from "./components/info"
import LicenseWrapper from "./wrap-components/license"
import InfoWrapper from "./wrap-components/info"
-import { isOAS31, webhooks } from "./spec-extensions/selectors"
+import { isOAS31, license, webhooks } from "./spec-extensions/selectors"
import { isOAS3 } from "./spec-extensions/wrap-selectors"
+import {
+ makeSelectLicenseUrl,
+ selectLicenseIdentifierField,
+ selectLicenseNameField,
+ selectLicenseUrlField,
+} from "./selectors"
const OAS31Plugin = () => {
return {
+ afterLoad(system) {
+ const oas31Selectors = this.statePlugins.oas31.selectors
+
+ oas31Selectors.selectLicenseUrl = makeSelectLicenseUrl(system)
+ },
components: {
Webhooks,
OAS31Info: Info,
@@ -24,12 +35,20 @@ const OAS31Plugin = () => {
spec: {
selectors: {
isOAS31,
+ license,
webhooks,
},
wrapSelectors: {
isOAS3,
},
},
+ oas31: {
+ selectors: {
+ selectLicenseNameField,
+ selectLicenseUrlField,
+ selectLicenseIdentifierField,
+ },
+ },
},
}
}
diff --git a/src/core/plugins/oas31/selectors.js b/src/core/plugins/oas31/selectors.js
new file mode 100644
index 00000000..fe6a2f87
--- /dev/null
+++ b/src/core/plugins/oas31/selectors.js
@@ -0,0 +1,37 @@
+/**
+ * @prettier
+ */
+import { createSelector } from "reselect"
+
+import { safeBuildUrl } from "core/utils/url"
+
+export const selectLicenseNameField = () => (system) => {
+ return system.specSelectors.license().get("name", "License")
+}
+
+export const selectLicenseUrlField = () => (system) => {
+ return system.specSelectors.license().get("url")
+}
+
+export const selectLicenseIdentifierField = () => (system) => {
+ return system.specSelectors.license().get("identifier")
+}
+
+export const makeSelectLicenseUrl = (system) =>
+ createSelector(
+ () => system.specSelectors.url(),
+ () => system.oas3Selectors.selectedServer(),
+ () => system.oas31Selectors.selectLicenseUrlField(),
+ () => system.oas31Selectors.selectLicenseIdentifierField(),
+ (specUrl, selectedServer, url, identifier) => {
+ if (url) {
+ return safeBuildUrl(url, specUrl, { selectedServer })
+ }
+
+ if (identifier) {
+ return `https://spdx.org/licenses/${identifier}.html`
+ }
+
+ return undefined
+ }
+ )
diff --git a/src/core/plugins/oas31/spec-extensions/selectors.js b/src/core/plugins/oas31/spec-extensions/selectors.js
index dadd946f..d00d627c 100644
--- a/src/core/plugins/oas31/spec-extensions/selectors.js
+++ b/src/core/plugins/oas31/spec-extensions/selectors.js
@@ -5,6 +5,8 @@ import { Map } from "immutable"
import { isOAS31 as isOAS31Helper } from "../helpers"
+const map = Map()
+
export const isOAS31 = () => (system) => {
const spec = system.specSelectors.specJson()
return isOAS31Helper(spec)
@@ -23,7 +25,9 @@ const onlyOAS31 =
}
export const webhooks = onlyOAS31(() => (system) => {
- const spec = system.specSelectors.specJson()
- return spec.get("webhooks", webhooks.mapConst)
+ return system.specSelectors.specJson().get("webhooks", map)
})
-webhooks.mapConst = Map()
+
+export const license = () => (system) => {
+ return system.specSelectors.info().get("license", map)
+}
diff --git a/src/core/plugins/oas31/wrap-components/license.jsx b/src/core/plugins/oas31/wrap-components/license.jsx
index 200da560..3d2a2bba 100644
--- a/src/core/plugins/oas31/wrap-components/license.jsx
+++ b/src/core/plugins/oas31/wrap-components/license.jsx
@@ -5,9 +5,9 @@ import React from "react"
const LicenseWrapper = (Original, system) => (props) => {
if (system.specSelectors.isOAS31()) {
- const OAS31License = system.getComponent("OAS31License")
+ const OAS31License = system.getComponent("OAS31License", true)
- return
+ return
}
return