export async function runSpectral()

in packages/azure-openapi-validator/autorest/src/spectral-plugin-utils.ts [78:151]


export async function runSpectral(
  sendMessage: (m: Message) => void,
  spectral: Spectral,
  rulesetPayload: SpectralRulesetPayload,
  openApiSpecFilePath: string,
  openApiSpecYml: any
) {
  const mergedResults = []
  const convertSeverity = (severity: number) => {
    switch (severity) {
      case 0:
        return "error"
      case 1:
        return "warning"
      case 2:
        return "info"
      default:
        return "info"
    }
  }
  const convertRange = (range: any) => {
    return {
      start: {
        line: range.start.line + 1,
        column: range.start.character,
      },
      end: {
        line: range.end.line + 1,
        column: range.end.character,
      },
    }
  }

  // this function is added temporarily , should be remove after the autorest fix this issues.
  const removeXmsExampleFromPath = (paths: JsonPath) => {
    const index = paths.findIndex((item) => item === "x-ms-examples")
    if (index !== -1 && paths.length > index + 2) {
      return paths.slice(0, index + 2)
    }
    return paths
  }

  const formatAsLintResultMessage = (result: ISpectralDiagnostic, spec: string): LintResultMessage => {
    return {
      type: convertSeverity(result.severity),
      category: "",
      code: result.code,
      message: result.message,
      jsonpath: result.path && result.path.length ? removeXmsExampleFromPath(result.path) : [],
      sources: [`${spec}`],
      location: {
        line: result.range.start.line + 1,
        column: result.range.start.character,
      },
      range: convertRange(result.range),
      rpcGuidelineCode: rulesetPayload.rules[result.code]?.rpcGuidelineCode ?? "",
    } as LintResultMessage
  }

  // Newest source of spectral.run as of 2/23/2024
  // https://github.com/stoplightio/spectral/blob/ffa6ebeabbaa0441c8c967ef4e11a7a0a8c66aac/packages/core/src/spectral.ts#L79
  // Note: version used in this code is likely older than newest.
  const results: ISpectralDiagnostic[] = await spectral.run(openApiSpecYml)

  mergedResults.push(
    ...results.map((result: ISpectralDiagnostic) => formatAsLintResultMessage(result, createFileOrFolderUri(openApiSpecFilePath)))
  )

  for (const message of mergedResults) {
    sendMessage(convertLintMsgToAutoRestMsg(message))
  }

  return mergedResults
}