public static findSchemaByJsonPointer()

in lib/apiScenario/schemaSearcher.ts [12:66]


  public static findSchemaByJsonPointer(
    jsonPointer: string,
    schema: Schema,
    jsonLoader: JsonLoader,
    body?: any
  ) {
    const steps = jsonPointer.split("/");
    let curSchema: any = schema;
    let rootSchema: any = schema;
    if (isRefLike(schema)) {
      rootSchema = this.getProperties(schema, jsonLoader);
    }
    const curPaths: string[] = [];
    try {
      for (const step of steps) {
        curSchema = SchemaSearcher.getProperties(curSchema, jsonLoader);
        let found: boolean = false;
        if (step !== "") {
          // if current step is array.
          if (!isNaN(+step)) {
            if (curSchema.type === "array") {
              curSchema = curSchema.items;
            }
          }
          if (curSchema?.properties !== undefined && curSchema?.properties[step] !== undefined) {
            curSchema = curSchema.properties[step];
            found = true;
          }
        }
        curPaths.push(step);
        // If not found, find in discriminator.
        if (!found && rootSchema.discriminatorMap !== undefined) {
          let discriminatorValue = "";
          if (body !== undefined && rootSchema.discriminator !== undefined) {
            const discriminatorJsonPointer = [...curPaths, rootSchema.discriminator].join("/");
            discriminatorValue = getObjValueFromPointer(body, discriminatorJsonPointer);
          }
          if (discriminatorValue !== "") {
            const discriminatorSchemaRef = rootSchema.discriminatorMap[discriminatorValue];
            if (discriminatorSchemaRef !== undefined) {
              const discriminatorSchema = SchemaSearcher.getProperties(
                discriminatorSchemaRef as Schema,
                jsonLoader
              );
              curSchema = discriminatorSchema;
              found = true;
            }
          }
        }
      }
      return this.getProperties(curSchema, jsonLoader);
    } catch (err) {
      logger.error(err);
    }
  }