in packages/extensions/core/src/lib/plugins/version-param-handler.ts [76:151]
visitPaths(paths: ProxyObject<Record<string, oai.PathItem>>, nodes: Iterable<Node>) {
for (const { value: pathValue, key: pathKey, pointer: pathPointer, children: pathMember } of nodes) {
let hasApiVersion = false;
const path = this.newObject(paths, pathKey, pathPointer);
for (const { value, key, pointer, children } of pathMember) {
switch (key) {
case "get":
case "put":
case "post":
case "delete":
case "options":
case "head":
case "patch":
case "trace":
{
const operation = this.newObject(path, key, pointer);
for (const { value: v, key: k, pointer: p, children: c } of children) {
switch (k) {
case "parameters":
{
const parameters: any = this.newArray(operation, k, p);
for (const { value: paramValue, pointer: paramPointer } of c) {
if (this.apiVersionReferences.has(paramValue.$ref) || paramValue.name === "api-version") {
hasApiVersion = true;
} else {
parameters.__push__({
value: paramValue,
pointer: paramPointer,
recurse: true,
});
}
}
}
break;
default:
this.copy(operation, k, p, v);
break;
}
}
}
break;
case "parameters":
{
const externalOperation: any = this.newArray(path, key, pointer);
for (const { value: paramValue, pointer: paramPointer } of children) {
if (this.apiVersionReferences.has(paramValue.$ref) || paramValue.name === "api-version") {
hasApiVersion = true;
} else {
externalOperation.__push__({
value: paramValue,
pointer: paramPointer,
recurse: true,
});
}
}
}
break;
case "x-ms-metadata":
// defer metadata processing until we know the final value of hasApiVersion.
break;
default:
this.copy(path, key, pointer, value);
}
}
const metadata = this.newObject(path, "x-ms-metadata", `${pathPointer}/x-ms-metadata`);
for (const { value, key, pointer } of visit(pathValue["x-ms-metadata"])) {
metadata[key] = { value, pointer };
}
if (hasApiVersion) {
metadata["hasApiVersion"] = { value: true, pointer: pathPointer };
}
}
}