75 lines
2.7 KiB
JavaScript
75 lines
2.7 KiB
JavaScript
export const validate2And3ParametersHaveUniqueNameAndInCombinations = () => (system) => {
|
|
return system.validateSelectors
|
|
.allParameterArrays()
|
|
.then(nodes => {
|
|
return nodes.reduce((acc, node) => {
|
|
const parameters = node.node || []
|
|
|
|
const seen = []
|
|
|
|
parameters.forEach((param, i) => {
|
|
const { name: paramName, in: paramIn } = param
|
|
|
|
if(!paramName || !paramIn) {
|
|
// name or in is missing, so we can't match the param to anything else
|
|
return
|
|
}
|
|
const key = `${paramName}::${paramIn}`
|
|
if(seen.indexOf(key) > -1) {
|
|
acc.push({
|
|
level: "error",
|
|
message: "Sibling parameters must have unique name + in values",
|
|
path: [
|
|
...node.path,
|
|
(param.__i || i).toString()
|
|
]
|
|
})
|
|
}
|
|
seen.push(key)
|
|
})
|
|
|
|
return acc
|
|
}, [])
|
|
})
|
|
}
|
|
|
|
export const validate2And3PathParameterIsDefinedInPath = () => (system) => {
|
|
const refArray = []
|
|
return system.validateSelectors
|
|
.allParameters()
|
|
.then(nodes => {
|
|
return nodes.reduce((acc, node) => {
|
|
const parameter = node.node || {}
|
|
const path = node.path
|
|
const isFromPath = path[0] === "paths" ? true : false
|
|
const pathString = path[1]
|
|
const paramName = parameter.name
|
|
const paramInPath = `{${paramName}}`
|
|
const ref = parameter.$ref
|
|
const pathStringIncludesParamInPath = pathString && !pathString.toUpperCase().includes("" + paramInPath.toUpperCase())
|
|
if (parameter.in === "path") {
|
|
if (isFromPath && pathStringIncludesParamInPath) {
|
|
acc.push({
|
|
message: `Path parameter "${paramName}" must have the corresponding ${paramInPath} segment in the "${pathString}" path`,
|
|
path: [...node.path, "name"],
|
|
level: "error"
|
|
})
|
|
} else {
|
|
const paramReference = refArray.find(({ referenceParamName }) => referenceParamName === node.key)
|
|
if (paramReference && paramReference.pathString && !paramReference.pathString.toUpperCase().includes("" + paramInPath.toUpperCase())) {
|
|
acc.push({
|
|
message: `Path parameter "${paramName}" must have the corresponding ${paramInPath} segment in the "${paramReference.pathString}" path`,
|
|
path: [...paramReference.node.path, "name"],
|
|
level: "error"
|
|
})
|
|
}
|
|
}
|
|
} else if (ref !== undefined) {
|
|
const refStrings = ref.split("/")
|
|
refArray.push({referenceParamName:refStrings[refStrings.length-1], pathString:pathString, node: node})
|
|
}
|
|
|
|
return acc
|
|
}, [])
|
|
})
|
|
} |