From 990d1f288ec76f1924af77db867f8d49a1a7b451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Thu, 16 Mar 2023 15:54:59 +0100 Subject: [PATCH] refactor(oas31): change License component to be smart (#8476) Refs #8474 --- .../plugins/oas3/spec-extensions/selectors.js | 5 +- .../oas3/spec-extensions/wrap-selectors.js | 6 +- src/core/plugins/oas31/components/license.jsx | 65 +++++++------------ src/core/plugins/oas31/index.js | 21 +++++- src/core/plugins/oas31/selectors.js | 37 +++++++++++ .../oas31/spec-extensions/selectors.js | 10 ++- .../plugins/oas31/wrap-components/license.jsx | 4 +- 7 files changed, 98 insertions(+), 50 deletions(-) create mode 100644 src/core/plugins/oas31/selectors.js 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