diff --git a/package-lock.json b/package-lock.json index 11a813b..4455ebc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,22 @@ "url-template": "^2.0.8" } }, + "@stoplight/fast-safe-stringify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@stoplight/fast-safe-stringify/-/fast-safe-stringify-2.1.2.tgz", + "integrity": "sha512-ayw3qQ9KNn2K5q6ggrLclh+rdZsSLwYIUz3uAer1NzaCpalJLR4g32G845ylgq7Xy2AunMHnNfD3FC3s0rUcsA==" + }, + "@stoplight/json": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-1.5.0.tgz", + "integrity": "sha512-f9kgxIusy+pO4Y2aPwgiFHXpm64Fmwli3a5tFAfz3iyRra8SiIlRxDJYkpQBFS/qxZP4VUjBAiVEGyudpOi1gQ==", + "requires": { + "@stoplight/fast-safe-stringify": "2.1.2", + "@stoplight/types": "3.x.x", + "json-source-map": "0.4.0", + "lodash": "4.x.x" + } + }, "@stoplight/spectral": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@stoplight/spectral/-/spectral-1.0.2.tgz", @@ -294,6 +310,11 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-source-map": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.4.0.tgz", + "integrity": "sha1-7qg3/jzi8r/VsTaHd5QGNUQjw1U=" + }, "jsonpath": { "version": "git://github.com/stoplightio/jsonpath.git#fe90d42805afb6dcfa7ca75f2503aa71f62f9a06", "from": "git://github.com/stoplightio/jsonpath.git#fe90d42", diff --git a/package.json b/package.json index 2d4e0fb..0685de0 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ }, "dependencies": { "@octokit/rest": "^16.15.0", + "@stoplight/json": "^1.5.0", "@stoplight/spectral": "^1.0.2", "@types/node": "^11.9.4", "funfix": "^7.0.1", diff --git a/src/index.ts b/src/index.ts index e9b692c..605cbda 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,9 @@ import * as Octokit from '@octokit/rest' import { Spectral } from '@stoplight/spectral' import { join } from 'path' +import { pathToPointer } from "@stoplight/json"; +import { parseWithPointers } from "@stoplight/json/parseWithPointers"; +import { readFileSync } from 'fs' import { oas2Functions, oas2Rules } from '@stoplight/spectral/rulesets/oas2'; import { oas3Functions, oas3Rules } from '@stoplight/spectral/rulesets/oas3'; import { ValidationSeverity } from '@stoplight/types/validations'; @@ -26,20 +29,26 @@ if (!GITHUB_EVENT_PATH || !GITHUB_TOKEN || !GITHUB_SHA || !GITHUB_WORKSPACE || ! spectral.addRules(oas3Rules()); - const payload = require(join(GITHUB_WORKSPACE, SPECTRAL_FILE_PATH)) - const { results } = spectral.run(payload); + const fileContent = readFileSync(join(GITHUB_WORKSPACE, SPECTRAL_FILE_PATH), { encoding: 'utf8' }) + const parsed = parseWithPointers(fileContent); + const { results } = spectral.run(parsed.data); // @ts-ignore - const annotations: Octokit.ChecksListAnnotationsParams[] = results.map(validationResult => ({ - annotation_level: validationResult.severity === ValidationSeverity.Error ? 'failure' : validationResult.severity === ValidationSeverity.Warn ? 'warning' : 'notice', - message: validationResult.summary, - title: validationResult.name, - start_line: validationResult.location ? validationResult.location.start.line : 0, - end_line: validationResult.location && validationResult.location.end ? validationResult.location.end.line : 0, - start_column: validationResult.location ? validationResult.location.start.column : undefined, - end_column: validationResult.location && validationResult.location.end && validationResult.location.end.column ? validationResult.location.end.column : undefined, - path: join(GITHUB_WORKSPACE, SPECTRAL_FILE_PATH), - })); + const annotations: Octokit.ChecksListAnnotationsParams[] = results.map(validationResult => { + const path = pathToPointer(validationResult.path as string[]).slice(1); + const position = parsed.pointers[path]; + + return { + annotation_level: validationResult.severity === ValidationSeverity.Error ? 'failure' : validationResult.severity === ValidationSeverity.Warn ? 'warning' : 'notice', + message: validationResult.summary, + title: validationResult.name, + start_line: position ? position.start.line : 0, + end_line: position && position.end ? position.end.line : 0, + start_column: position && position.start.column ? position.start.column : undefined, + end_column: position && position.end && position.end.column ? position.end.column : undefined, + path: join(GITHUB_WORKSPACE, SPECTRAL_FILE_PATH), + } + }); // @ts-ignore return octokit.checks.update({