improve: lazy resolver (#4253)

* default to empty `ImmutableMap` when grabbing op metadata
* pass `errors` into JsonSchema components
* Account for Immutable data structure in JavaScriptonSchema...
...and create empty Lists instead of Maps by default.
* Pass ImmutableList through to JsonSchema child components
* Add lazy resolving spec state extensions
* TEMPORARY: disable conventional resolved spec
* WIP
* Use resolveSubtree in Operation display
* Freebie: short-circuit Markdown component if it is given plaintext
* NEW DEFAULT BEHAVIOR: `defaultModelsExpandDepth: 1` does not expand individual models
* Render faked Model expander to trigger resolution
* Baseline support for Editor lifecycles
* Display operation summaries before the operation is resolved
* Test migrations
* WIP
* Swagger2 TIO Body params
* a bit of cleanup
* Debounce string param inputs
* Reach into unresolved operation for deprecated flag, if available
* Fire subtree request outside of render
* Remove debugging flags
* Fix logical errors in spec statePlugins
* TODOs become TODONEs!
* Migrate deeplinking feature to non-resolved spec action
* ESLint fixes
* Reduce action dispatch volume; run resolver on next tick
* Batch resolver requests; use batch progressive results in later iterations
* Add loading states to Model and Operation views
* Preserve object order; remove dupl. import; add warning for action
* LINTER!
* Use require to load SVG
       Works around Webpack weirdness
This commit is contained in:
kyle
2018-02-23 22:25:28 -08:00
committed by GitHub
parent ecf688171f
commit ba1603a7e2
6 changed files with 105 additions and 42 deletions

View File

@@ -1,8 +1,10 @@
import YAML from "js-yaml"
import { Map } from "immutable"
import parseUrl from "url-parse"
import serializeError from "serialize-error"
import { Map } from "immutable"
import isString from "lodash/isString"
import debounce from "lodash/debounce"
import set from "lodash/set"
import { isJSONObject } from "core/utils"
// Actions conform to FSA (flux-standard-actions)
@@ -133,39 +135,48 @@ export const resolveSpec = (json, url) => ({specActions, specSelectors, errActio
})
}
export const requestResolvedSubtree = path => system => {
const {
errActions,
fn: {
resolveSubtree,
AST: { getLineNumberForPath }
},
specSelectors,
specActions,
} = system
let requestBatch = []
const specStr = specSelectors.specStr()
const debResolveSubtrees = debounce(async () => {
const system = requestBatch.system // Just a reference to the "latest" system
if(!system) {
console.error("debResolveSubtrees: don't have a system to operate on, aborting.")
return
}
const {
errActions,
errSelectors,
fn: {
resolveSubtree,
AST: { getLineNumberForPath }
},
specSelectors,
specActions,
} = system
if(!resolveSubtree) {
console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.")
return
}
const currentValue = specSelectors.specResolvedSubtree(path)
const specStr = specSelectors.specStr()
if(currentValue) {
return
}
try {
var batchResult = await requestBatch.reduce(async (prev, path) => {
const { resultMap, specWithCurrentSubtrees } = await prev
const { errors, spec } = await resolveSubtree(specWithCurrentSubtrees, path)
if(errSelectors.allErrors().size) {
errActions.clear({
type: "thrown"
})
}
return resolveSubtree(specSelectors.specJson().toJS(), path)
.then(({ spec, errors }) => {
errActions.clear({
type: "thrown"
})
if(Array.isArray(errors) && errors.length > 0) {
let preparedErrors = errors
.map(err => {
console.error(err)
err.line = err.fullPath ? getLineNumberForPath(specStr, err.fullPath) : null
err.path = err.fullPath ? err.fullPath.join(".") : null
err.level = "error"
@@ -177,9 +188,31 @@ export const requestResolvedSubtree = path => system => {
errActions.newThrownErrBatch(preparedErrors)
}
return specActions.updateResolvedSubtree(path, spec)
})
.catch(e => console.error(e))
set(resultMap, path, spec)
set(specWithCurrentSubtrees, path, spec)
return {
resultMap,
specWithCurrentSubtrees
}
}, Promise.resolve({
resultMap: (specSelectors.specResolvedSubtree([]) || Map()).toJS(),
specWithCurrentSubtrees: specSelectors.specJson().toJS()
}))
delete requestBatch.system
requestBatch = [] // Clear stack
} catch(e) {
console.error(e)
}
specActions.updateResolvedSubtree([], batchResult.resultMap)
}, 35)
export const requestResolvedSubtree = path => system => {
requestBatch.push(path)
requestBatch.system = system
debResolveSubtrees()
}
export function changeParam( path, paramName, paramIn, value, isXml ){