visitPaths()

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 };
      }
    }
  }