/**
* @prettier
*/
import React from "react"
export const isOAS31 = (jsSpec) => {
const oasVersion = jsSpec.get("openapi")
return (
typeof oasVersion === "string" && /^3\.1\.(?:[1-9]\d*|0)$/.test(oasVersion)
)
}
/**
* Creates selector that returns value of the passed
* selector when spec is OpenAPI 3.1.0., null otherwise.
*
* @param selector
* @returns {function(*, ...[*]): function(*): (*|null)}
*/
export const createOnlyOAS31Selector =
(selector) =>
(state, ...args) =>
(system) => {
if (system.getSystem().specSelectors.isOAS31()) {
const selectedValue = selector(state, ...args)
return typeof selectedValue === "function"
? selectedValue(system)
: selectedValue
} else {
return null
}
}
/**
* Creates selector wrapper that returns value of the passed
* selector when spec is OpenAPI 3.1.0., calls original selector otherwise.
*
*
* @param selector
* @returns {function(*, *): function(*, ...[*]): (*)}
*/
export const createOnlyOAS31SelectorWrapper =
(selector) =>
(oriSelector, system) =>
(state, ...args) => {
if (system.getSystem().specSelectors.isOAS31()) {
const selectedValue = selector(state, ...args)
return typeof selectedValue === "function"
? selectedValue(oriSelector, system)
: selectedValue
} else {
return oriSelector(...args)
}
}
/**
* Creates selector that provides system as the
* second argument. This allows to create memoized
* composed selectors from different plugins.
*
* @param selector
* @returns {function(*, ...[*]): function(*): *}
*/
export const createSystemSelector =
(selector) =>
(state, ...args) =>
(system) => {
const selectedValue = selector(state, system, ...args)
return typeof selectedValue === "function"
? selectedValue(system)
: selectedValue
}
/* eslint-disable react/jsx-filename-extension */
/**
* Creates component wrapper that only wraps the component
* when spec is OpenAPI 3.1.0. Otherwise, returns original
* component with passed props.
*
* @param Component
* @returns {function(*, *): function(*): *}
*/
export const createOnlyOAS31ComponentWrapper =
(Component) => (Original, system) => (props) => {
if (system.specSelectors.isOAS31()) {
return (
)
}
return
}
/* eslint-enable react/jsx-filename-extension */
/**
* Runs the fn replacement implementation when spec is OpenAPI 3.1.
* Runs the fn original implementation otherwise.
*
* @param fn
* @param system
* @returns {{[p: string]: function(...[*]): *}}
*/
export const wrapOAS31Fn = (fn, system) => {
const { fn: systemFn, specSelectors } = system
return Object.fromEntries(
Object.entries(fn).map(([name, newImpl]) => {
const oriImpl = systemFn[name]
const impl = (...args) =>
specSelectors.isOAS31()
? newImpl(...args)
: typeof oriImpl === "function"
? oriImpl(...args)
: undefined
return [name, impl]
})
)
}