export async function validateTraffic()

in lib/validate.ts [187:303]


export async function validateTraffic(
  specPath: string,
  trafficPath: string,
  options: TrafficValidationOptions
): Promise<TrafficValidationIssue[]> {
  return validate(options, async (o) => {
    o.consoleLogLevel = log.consoleLogLevel;
    o.logFilepath = log.filepath;
    const validator = new TrafficValidator(specPath, trafficPath);
    const trafficValidationResult: TrafficValidationIssue[] = [];
    try {
      await validator.initialize();
      const result = await validator.validate();
      trafficValidationResult.push(...result);
    } catch (err) {
      const msg = `Detail error message:${(err as any)?.message}. ErrorStack:${
        (err as any)?.Stack
      }`;
      log.error(msg);
      trafficValidationResult.push({
        payloadFilePath: specPath,
        runtimeExceptions: [
          {
            code: ErrorCodeConstants.RUNTIME_ERROR,
            message: msg,
          },
        ],
      });
    }
    if (options.jsonReportPath) {
      const errorDefinitions = await loadErrorDefinitions();
      const report = {
        coveredSpecFiles: validator.operationCoverageResult.map((item) =>
          options.overrideLinkInReport
            ? `${options.specLinkPrefix}/${item.spec?.substring(
                item.spec?.indexOf("specification")
              )}`
            : `${item.spec}`
        ),
        allOperations: validator.operationCoverageResult
          .map((item) => item.totalOperations)
          .reduce((a, b) => a + b, 0),
        coveredOperations: validator.operationCoverageResult
          .map((item) => item.coveredOperations)
          .reduce((a, b) => a + b, 0),
        unCoveredOperationsList: validator.operationCoverageResult.map((item) => {
          return {
            spec: item.spec,
            operationIds: item.unCoveredOperationsList.map((opeartion) => opeartion.operationId),
          };
        }),
        passedOperationsList: validator.operationCoverageResult.map((item) => {
          return {
            spec: item.spec,
            operationIds: item.coveredOperationsList
              .map((opeartion) => opeartion.operationId)
              .filter((id) => {
                return !trafficValidationResult.some(
                  (error) => error.operationInfo?.operationId === id
                );
              }),
          };
        }),
        failedOperations: validator.operationCoverageResult
          .map((item) => item.validationFailOperations)
          .reduce((a, b) => a + b, 0),
        errors: Array.from(
          flatMap(
            trafficValidationResult,
            (item) =>
              item.errors?.map((it) => {
                const errorDef = errorDefinitions.get(it.code);
                const specFilePath = item.specFilePath || "";
                const overrideLinkInReport = options.overrideLinkInReport || false;
                const specLinkPrefix = options.specLinkPrefix || "";
                return {
                  spec: specFilePath,
                  errorCode: it.code,
                  errorLink: errorDef?.link,
                  errorMessage: it.message,
                  issueSource: it.issueSource,
                  operationId: item.operationInfo?.operationId,
                  schemaPathWithPosition: overrideLinkInReport
                    ? `${specLinkPrefix}/${specFilePath.substring(
                        specFilePath.indexOf("specification")
                      )}#L${it.source.position.line}`
                    : `${specFilePath}#L${it.source.position.line}`,
                };
              }) ?? []
          )
        ),
      };
      fs.writeFileSync(options.jsonReportPath, JSON.stringify(report, null, 2));
    }
    if (options.reportPath) {
      const generator = new ReportGenerator(
        trafficValidationResult,
        validator.operationCoverageResult,
        validator.operationUndefinedResult,
        options
      );
      await generator.generateHtmlReport();
    } else if (trafficValidationResult.length > 0) {
      if (o.pretty) {
        prettyPrintInfo(trafficValidationResult, "error");
      } else {
        for (const error of trafficValidationResult) {
          const errorInfo = JSON.stringify(error);
          log.error(errorInfo);
        }
      }
    } else {
      log.info("No errors were found.");
    }
    return trafficValidationResult;
  });
}