openapi-to-postmanv2
Version:
Convert a given OpenAPI specification to Postman Collection v2.0
89 lines (83 loc) • 2.21 kB
JavaScript
class DFS {
traverse(node, getAdjacent) {
let traverseOrder = [],
stack = [],
missing = [],
visited = new Set();
stack.push(node);
while (stack.length > 0) {
node = stack.pop();
if (!visited.has(node)) {
traverseOrder.push(node);
visited.add(node);
let { graphAdj, missingNodes } = getAdjacent(node);
missing.push(...missingNodes);
for (let j = 0; j < graphAdj.length; j++) {
stack.push(graphAdj[j]);
}
}
}
missing = [
...new Set(
missing.map((obj) => {
return JSON.stringify(obj);
})
)
].map((str) => {
return JSON.parse(str);
});
return { traverseOrder, missing };
}
async traverseAndBundle(node, getAdjacentAndBundle) {
let traverseOrder = [],
stack = [],
missing = [],
visited = new Set(),
nodeContents = {},
globalReferences = {},
hrefsVisited = new Set();
stack.push(node);
while (stack.length > 0) {
node = stack.pop();
if (!visited.has(node) &&
/**
* For nodes that are fetched for remote URLs we ensure they
* aren't visited more than once
*/
(!node.href || (!hrefsVisited.has(node.href)))
) {
traverseOrder.push(node);
visited.add(node);
node.href && hrefsVisited.add(node.href);
let {
graphAdj,
missingNodes,
nodeContent,
nodeReferenceDirectory,
nodeName
} = await getAdjacentAndBundle(node, globalReferences);
nodeContents[nodeName] = nodeContent;
Object.entries(nodeReferenceDirectory).forEach(([key, data]) => {
globalReferences[key] = data;
});
missing.push(...missingNodes);
for (let j = 0; j < graphAdj.length; j++) {
stack.push(graphAdj[j]);
}
}
}
missing = [
...new Set(
missing.map((obj) => {
return JSON.stringify(obj);
})
)
].map((str) => {
return JSON.parse(str);
});
return { traverseOrder, missing, nodeContents, globalReferences };
}
}
module.exports = {
DFS
};