diff --git a/packages/openapi2-parser/lib/parser.js b/packages/openapi2-parser/lib/parser.js index 9edd2a49b..4d3e4959e 100644 --- a/packages/openapi2-parser/lib/parser.js +++ b/packages/openapi2-parser/lib/parser.js @@ -188,6 +188,15 @@ class Parser { annotation.attributes.set('sourceMap', [ new SourceMap([location]), ]); + } else { + // Some validation errors contain `in '/some/path'`, + // we can extract path to get source map + const matchesPath = message.match(/in '\/(.*?)'/); + + if (matchesPath) { + const path = matchesPath[1].split('/'); + this.createSourceMap(annotation, path, true); + } } return done(null, this.result); diff --git a/packages/openapi2-parser/test/fixtures/swagger-error.json b/packages/openapi2-parser/test/fixtures/swagger-error.json new file mode 100644 index 000000000..90725a459 --- /dev/null +++ b/packages/openapi2-parser/test/fixtures/swagger-error.json @@ -0,0 +1,87 @@ +{ + "element": "parseResult", + "content": [ + { + "element": "annotation", + "meta": { + "classes": { + "element": "array", + "content": [ + { + "element": "string", + "content": "error" + } + ] + }, + "links": { + "element": "array", + "content": [ + { + "element": "link", + "attributes": { + "relation": { + "element": "string", + "content": "origin" + }, + "href": { + "element": "string", + "content": "http://docs.apiary.io/validations/swagger#swagger-validation" + } + } + } + ] + } + }, + "attributes": { + "code": { + "element": "number", + "content": 4 + }, + "sourceMap": { + "element": "array", + "content": [ + { + "element": "sourceMap", + "content": [ + { + "element": "array", + "content": [ + { + "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 2 + } + }, + "content": 98 + }, + { + "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 0 + } + }, + "content": 43 + } + ] + } + ] + } + ] + } + }, + "content": "Validation failed. Property 'foo' listed as required but does not exist in '/definitions/test'" + } + ] +} \ No newline at end of file diff --git a/packages/openapi2-parser/test/fixtures/swagger-error.sourcemap.json b/packages/openapi2-parser/test/fixtures/swagger-error.sourcemap.json new file mode 100644 index 000000000..90725a459 --- /dev/null +++ b/packages/openapi2-parser/test/fixtures/swagger-error.sourcemap.json @@ -0,0 +1,87 @@ +{ + "element": "parseResult", + "content": [ + { + "element": "annotation", + "meta": { + "classes": { + "element": "array", + "content": [ + { + "element": "string", + "content": "error" + } + ] + }, + "links": { + "element": "array", + "content": [ + { + "element": "link", + "attributes": { + "relation": { + "element": "string", + "content": "origin" + }, + "href": { + "element": "string", + "content": "http://docs.apiary.io/validations/swagger#swagger-validation" + } + } + } + ] + } + }, + "attributes": { + "code": { + "element": "number", + "content": 4 + }, + "sourceMap": { + "element": "array", + "content": [ + { + "element": "sourceMap", + "content": [ + { + "element": "array", + "content": [ + { + "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 2 + } + }, + "content": 98 + }, + { + "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 0 + } + }, + "content": 43 + } + ] + } + ] + } + ] + } + }, + "content": "Validation failed. Property 'foo' listed as required but does not exist in '/definitions/test'" + } + ] +} \ No newline at end of file diff --git a/packages/openapi2-parser/test/fixtures/swagger-error.yaml b/packages/openapi2-parser/test/fixtures/swagger-error.yaml new file mode 100644 index 000000000..a90a7d0ef --- /dev/null +++ b/packages/openapi2-parser/test/fixtures/swagger-error.yaml @@ -0,0 +1,9 @@ +swagger: '2.0' +info: + title: Swagger Validation Errors + version: 1.0.0 +paths: {} +definitions: + test: + type: object + required: [foo]