fix: expand tags and operations predictably in multiple SwaggerUI instances (#9050)

Refs #6996

Co-authored-by: Vladimír Gorej <vladimir.gorej@smartbear.com>
This commit is contained in:
Richard Wilburn
2023-08-17 01:26:30 +12:00
committed by GitHub
parent 06d7cfd6bd
commit c06d10dc58

View File

@@ -1,11 +1,12 @@
import YAML, { JSON_SCHEMA } from "js-yaml"
import { Map } from "immutable"
import { Map as ImmutableMap } from "immutable"
import parseUrl from "url-parse"
import { serializeError } from "serialize-error"
import isString from "lodash/isString"
import debounce from "lodash/debounce"
import set from "lodash/set"
import assocPath from "lodash/fp/assocPath"
import constant from "lodash/constant"
import { paramToValue, isEmptyValue } from "core/utils"
@@ -140,13 +141,24 @@ export const resolveSpec = (json, url) => ({specActions, specSelectors, errActio
let requestBatch = []
const debResolveSubtrees = debounce(async () => {
const system = requestBatch.system // Just a reference to the "latest" system
const debResolveSubtrees = debounce(() => {
const systemPartitionedBatches = requestBatch.reduce((acc, { path, system }) => {
if (!acc.has(system)) acc.set(system, [])
acc.get(system).push(path)
return acc
}, new Map())
requestBatch = [] // clear stack
systemPartitionedBatches.forEach(async (systemRequestBatch, system) => {
if(!system) {
console.error("debResolveSubtrees: don't have a system to operate on, aborting.")
return
}
if(!system.fn.resolveSubtree) {
console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.")
return
}
const {
errActions,
errSelectors,
@@ -158,16 +170,8 @@ const debResolveSubtrees = debounce(async () => {
specSelectors,
specActions,
} = system
if(!resolveSubtree) {
console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.")
return
}
let getLineNumberForPath = AST.getLineNumberForPath ? AST.getLineNumberForPath : () => undefined
const getLineNumberForPath = AST.getLineNumberForPath ?? constant(undefined)
const specStr = specSelectors.specStr()
const {
modelPropertyMacro,
parameterMacro,
@@ -176,7 +180,7 @@ const debResolveSubtrees = debounce(async () => {
} = system.getConfigs()
try {
var batchResult = await requestBatch.reduce(async (prev, path) => {
const batchResult = await systemRequestBatch.reduce(async (prev, path) => {
let { resultMap, specWithCurrentSubtrees } = await prev
const { errors, spec } = await resolveSubtree(specWithCurrentSubtrees, path, {
baseDoc: specSelectors.url(),
@@ -239,32 +243,28 @@ const debResolveSubtrees = debounce(async () => {
specWithCurrentSubtrees
}
}, Promise.resolve({
resultMap: (specSelectors.specResolvedSubtree([]) || Map()).toJS(),
resultMap: (specSelectors.specResolvedSubtree([]) || ImmutableMap()).toJS(),
specWithCurrentSubtrees: specSelectors.specJS()
}))
delete requestBatch.system
requestBatch = [] // Clear stack
specActions.updateResolvedSubtree([], batchResult.resultMap)
} catch(e) {
console.error(e)
}
specActions.updateResolvedSubtree([], batchResult.resultMap)
})
}, 35)
export const requestResolvedSubtree = path => system => {
// poor-man's array comparison
// if this ever inadequate, this should be rewritten to use Im.List
const isPathAlreadyBatched = requestBatch
.map(arr => arr.join("@@"))
.indexOf(path.join("@@")) > -1
const isPathAlreadyBatched = requestBatch.find(({ path: batchedPath, system: batchedSystem }) => {
return batchedSystem === system && batchedPath.toString() === path.toString()
})
if(isPathAlreadyBatched) {
return
}
requestBatch.push(path)
requestBatch.system = system
requestBatch.push({ path, system })
debResolveSubtrees()
}
@@ -294,7 +294,7 @@ export const invalidateResolvedSubtreeCache = () => {
type: UPDATE_RESOLVED_SUBTREE,
payload: {
path: [],
value: Map()
value: ImmutableMap()
}
}
}
@@ -432,7 +432,7 @@ export const executeRequest = (req) =>
req.requestBody = requestBody
.map(
(val) => {
if (Map.isMap(val)) {
if (ImmutableMap.isMap(val)) {
return val.get("value")
}
return val