From 91ba415632ec767bde02a00b647a73091c1eb25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Thu, 16 Mar 2023 17:15:27 +0100 Subject: [PATCH] refactor(oas31): consolidate plugin selectors (#8477) Refs #8474 --- src/core/plugins/oas31/components/info.jsx | 1 + src/core/plugins/oas31/components/license.jsx | 9 ++-- src/core/plugins/oas31/helpers.js | 12 +++++ src/core/plugins/oas31/index.js | 38 +++++++++------ src/core/plugins/oas31/selectors.js | 43 +++++++---------- .../oas31/spec-extensions/selectors.js | 48 ++++++++++++------- .../oas31/spec-extensions/wrap-selectors.js | 23 +++++++-- 7 files changed, 108 insertions(+), 66 deletions(-) diff --git a/src/core/plugins/oas31/components/info.jsx b/src/core/plugins/oas31/components/info.jsx index 048be5dd..3eb72df9 100644 --- a/src/core/plugins/oas31/components/info.jsx +++ b/src/core/plugins/oas31/components/info.jsx @@ -4,6 +4,7 @@ import React from "react" import PropTypes from "prop-types" import ImPropTypes from "react-immutable-proptypes" + import { sanitizeUrl } from "core/utils" import { safeBuildUrl } from "core/utils/url" diff --git a/src/core/plugins/oas31/components/license.jsx b/src/core/plugins/oas31/components/license.jsx index bf516631..931f6d3d 100644 --- a/src/core/plugins/oas31/components/license.jsx +++ b/src/core/plugins/oas31/components/license.jsx @@ -6,9 +6,10 @@ import PropTypes from "prop-types" import { sanitizeUrl } from "core/utils" -const License = ({ getComponent, oas31Selectors }) => { - const name = oas31Selectors.selectLicenseNameField() - const url = oas31Selectors.selectLicenseUrl() +const License = ({ getComponent, specSelectors }) => { + const name = specSelectors.selectLicenseNameField() + const url = specSelectors.selectLicenseUrl() + const Link = getComponent("Link") return ( @@ -28,7 +29,7 @@ const License = ({ getComponent, oas31Selectors }) => { License.propTypes = { getComponent: PropTypes.func.isRequired, - oas31Selectors: PropTypes.shape({ + specSelectors: PropTypes.shape({ selectLicenseNameField: PropTypes.func.isRequired, selectLicenseUrl: PropTypes.func.isRequired, }).isRequired, diff --git a/src/core/plugins/oas31/helpers.js b/src/core/plugins/oas31/helpers.js index 3c0a11f3..ac7fd3e3 100644 --- a/src/core/plugins/oas31/helpers.js +++ b/src/core/plugins/oas31/helpers.js @@ -8,3 +8,15 @@ export const isOAS31 = (jsSpec) => { typeof oasVersion === "string" && /^3\.1\.(?:[1-9]\d*|0)$/.test(oasVersion) ) } + +export const onlyOAS31 = + (selector) => + () => + (system, ...args) => { + if (system.getSystem().specSelectors.isOAS31()) { + const result = selector(...args) + return typeof result === "function" ? result(system, ...args) : result + } else { + return null + } + } diff --git a/src/core/plugins/oas31/index.js b/src/core/plugins/oas31/index.js index d61a007f..39e78051 100644 --- a/src/core/plugins/oas31/index.js +++ b/src/core/plugins/oas31/index.js @@ -6,21 +6,30 @@ import License from "./components/license" import Info from "./components/info" import LicenseWrapper from "./wrap-components/license" import InfoWrapper from "./wrap-components/info" -import { isOAS31, license, webhooks } from "./spec-extensions/selectors" -import { isOAS3 } from "./spec-extensions/wrap-selectors" import { - makeSelectLicenseUrl, - selectLicenseIdentifierField, + license, + webhooks, selectLicenseNameField, selectLicenseUrlField, -} from "./selectors" + selectLicenseIdentifierField, + makeIsOAS31, + makeSelectLicenseUrl, +} from "./spec-extensions/selectors" +import { + isOAS3 as isOAS3Wrapper, + selectLicenseUrl as selectLicenseUrlWrapper, +} from "./spec-extensions/wrap-selectors" +import { makeSelectLicenseUrl as makeOAS31SelectLicenseUrl } from "./selectors" const OAS31Plugin = () => { return { afterLoad(system) { const oas31Selectors = this.statePlugins.oas31.selectors + const specSelectors = this.statePlugins.spec.selectors - oas31Selectors.selectLicenseUrl = makeSelectLicenseUrl(system) + specSelectors.selectLicenseUrl = makeSelectLicenseUrl(system) + specSelectors.isOAS31 = makeIsOAS31(system) + oas31Selectors.selectLicenseUrl = makeOAS31SelectLicenseUrl(system) }, components: { Webhooks, @@ -34,20 +43,19 @@ const OAS31Plugin = () => { statePlugins: { spec: { selectors: { - isOAS31, license, - webhooks, - }, - wrapSelectors: { - isOAS3, - }, - }, - oas31: { - selectors: { selectLicenseNameField, selectLicenseUrlField, selectLicenseIdentifierField, + webhooks, }, + wrapSelectors: { + isOAS3: isOAS3Wrapper, + selectLicenseUrl: selectLicenseUrlWrapper, + }, + }, + oas31: { + selectors: {}, }, }, } diff --git a/src/core/plugins/oas31/selectors.js b/src/core/plugins/oas31/selectors.js index fe6a2f87..f9d19522 100644 --- a/src/core/plugins/oas31/selectors.js +++ b/src/core/plugins/oas31/selectors.js @@ -4,34 +4,25 @@ 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") -} +import { onlyOAS31 } from "./helpers" 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 }) - } + onlyOAS31( + createSelector( + () => system.specSelectors.url(), + () => system.oas3Selectors.selectedServer(), + () => system.specSelectors.selectLicenseUrlField(), + () => system.specSelectors.selectLicenseIdentifierField(), + (specUrl, selectedServer, url, identifier) => { + if (url) { + return safeBuildUrl(url, specUrl, { selectedServer }) + } - if (identifier) { - return `https://spdx.org/licenses/${identifier}.html` - } + if (identifier) { + return `https://spdx.org/licenses/${identifier}.html` + } - return undefined - } + return undefined + } + ) ) diff --git a/src/core/plugins/oas31/spec-extensions/selectors.js b/src/core/plugins/oas31/spec-extensions/selectors.js index d00d627c..b232dcbb 100644 --- a/src/core/plugins/oas31/spec-extensions/selectors.js +++ b/src/core/plugins/oas31/spec-extensions/selectors.js @@ -2,27 +2,15 @@ * @prettier */ import { Map } from "immutable" +import { createSelector } from "reselect" -import { isOAS31 as isOAS31Helper } from "../helpers" +import { safeBuildUrl } from "core/utils/url" +import { isOAS31 as isOAS31Helper, onlyOAS31 } from "../helpers" const map = Map() -export const isOAS31 = () => (system) => { - const spec = system.specSelectors.specJson() - return isOAS31Helper(spec) -} - -const onlyOAS31 = - (selector) => - () => - (system, ...args) => { - if (system.getSystem().specSelectors.isOAS31()) { - const result = selector(...args) - return typeof result === "function" ? result(system, ...args) : result - } else { - return null - } - } +export const makeIsOAS31 = (system) => + createSelector(() => system.specSelectors.specJson(), isOAS31Helper) export const webhooks = onlyOAS31(() => (system) => { return system.specSelectors.specJson().get("webhooks", map) @@ -31,3 +19,29 @@ export const webhooks = onlyOAS31(() => (system) => { export const license = () => (system) => { return system.specSelectors.info().get("license", map) } + +export const selectLicenseNameField = () => (system) => { + return system.specSelectors.license().get("name", "License") +} + +export const selectLicenseUrlField = () => (system) => { + return system.specSelectors.license().get("url") +} + +export const selectLicenseIdentifierField = onlyOAS31(() => (system) => { + return system.specSelectors.license().get("identifier") +}) + +export const makeSelectLicenseUrl = (system) => + createSelector( + () => system.specSelectors.url(), + () => system.oas3Selectors.selectedServer(), + () => system.specSelectors.selectLicenseUrlField(), + (specUrl, selectedServer, url) => { + if (url) { + return safeBuildUrl(url, specUrl, { selectedServer }) + } + + return undefined + } + ) diff --git a/src/core/plugins/oas31/spec-extensions/wrap-selectors.js b/src/core/plugins/oas31/spec-extensions/wrap-selectors.js index 482bdcb0..af207436 100644 --- a/src/core/plugins/oas31/spec-extensions/wrap-selectors.js +++ b/src/core/plugins/oas31/spec-extensions/wrap-selectors.js @@ -1,4 +1,19 @@ -export const isOAS3 = (oriSelector, system) => (state, ...args) => { - const isOAS31 = system.specSelectors.isOAS31() - return isOAS31 || oriSelector(...args) -} +/** + * @prettier + */ +export const isOAS3 = + (oriSelector, system) => + (state, ...args) => { + const isOAS31 = system.specSelectors.isOAS31() + return isOAS31 || oriSelector(...args) + } + +export const selectLicenseUrl = + (oriSelector, system) => + (state, ...args) => { + if (system.specSelectors.isOAS31()) { + return system.oas31Selectors.selectLicenseUrl() + } + + return oriSelector(...args) + }