From 8cb6eb7eeebfef11c04094e43ced1cec30987e2d Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Thu, 6 Aug 2020 15:33:19 +0200 Subject: [PATCH 1/8] feat(oas3): add format link --- packages/openapi3-parser/CHANGELOG.md | 4 ++++ packages/openapi3-parser/lib/parser.js | 18 +++++++++++++++++- .../openapi3-parser/test/unit/parser-test.js | 15 +++++++++++++-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/openapi3-parser/CHANGELOG.md b/packages/openapi3-parser/CHANGELOG.md index cfe3fff11..0f865c891 100644 --- a/packages/openapi3-parser/CHANGELOG.md +++ b/packages/openapi3-parser/CHANGELOG.md @@ -8,6 +8,10 @@ This can dramatically increase the performance when dealing with documents which use many unsupported features. +### Enhancements + +- added a Link element to the specific format/version in the parse result. + ### Bug Fixes - Return a warning when parsing a document with a 'Media Type Object' diff --git a/packages/openapi3-parser/lib/parser.js b/packages/openapi3-parser/lib/parser.js index 4e333dad4..93a3766ef 100644 --- a/packages/openapi3-parser/lib/parser.js +++ b/packages/openapi3-parser/lib/parser.js @@ -126,7 +126,7 @@ function parse(source, context) { R.unless(isObjectOrAnnotation, createError(context.namespace, 'Source document is not an object')), R.unless(isAnnotation, parseOpenAPIObject(context))); - return R.chain( + const parseResult = R.chain( R.pipe( parseDocument, deduplicateUnsupportedAnnotations(context.namespace), @@ -134,6 +134,22 @@ function parse(source, context) { ), document ); + + if (!isAnnotation(parseResult.content[0])) { + const formatVersion = (/3\.\d+\.\d+/).exec(source)[0]; + const formatLink = `https://spec.openapis.org/oas/v${formatVersion}`; + + const { Link } = context.namespace.elements; + const link = new Link(); + + link.title = `OpenAPI ${formatVersion}`; + link.relation = 'via'; + link.href = formatLink; + + parseResult.links.push(link); + } + + return parseResult; } module.exports = parse; diff --git a/packages/openapi3-parser/test/unit/parser-test.js b/packages/openapi3-parser/test/unit/parser-test.js index 2837c8eed..726447dec 100644 --- a/packages/openapi3-parser/test/unit/parser-test.js +++ b/packages/openapi3-parser/test/unit/parser-test.js @@ -2,10 +2,10 @@ const { Fury } = require('@apielements/core'); const { expect } = require('./chai'); const parse = require('../../lib/parser'); +const Context = require('../../lib/context'); const { minim: namespace } = new Fury(); - -const Context = require('../../lib/context'); +const { Link } = namespace.elements; describe('#parse', () => { let context; @@ -40,4 +40,15 @@ describe('#parse', () => { expect(parseResult.length).to.equal(1); expect(parseResult.api.title.toValue()).to.equal('My API'); }); + + it('add the format link', () => { + const source = 'openapi: "3.0.0"\ninfo: {title: My API, version: 1.0.0}\npaths: {}\n'; + const parseResult = parse(source, context); + + const link = parseResult.links.get(0); + expect(link).to.be.instanceof(Link); + expect(link.relation.toValue()).to.equal('via'); + expect(link.title.toValue()).to.equal('OpenAPI 3.0.0'); + expect(link.href.toValue()).to.equal('https://spec.openapis.org/oas/v3.0.0'); + }); }); From b7ebf796bd6df267d8d30a40cdcedcfb0074ec74 Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Thu, 6 Aug 2020 15:35:17 +0200 Subject: [PATCH 2/8] chore(oas3): add format link to fixtures --- .../fixtures/auth-scheme-does-not-exist.json | 26 +++++++++++++++++++ .../auth-scheme-does-not-exist.sourcemap.json | 26 +++++++++++++++++++ .../fixtures/auth-scheme-global.json | 26 +++++++++++++++++++ .../auth-scheme-global.sourcemap.json | 26 +++++++++++++++++++ .../integration/fixtures/auth-scheme.json | 26 +++++++++++++++++++ .../fixtures/auth-scheme.sourcemap.json | 26 +++++++++++++++++++ .../media-type-object-examples.json | 26 +++++++++++++++++++ .../media-type-object-schema-multiple.json | 26 +++++++++++++++++++ .../components/media-type-object-schema.json | 26 +++++++++++++++++++ .../operation-object-requestBody.json | 26 +++++++++++++++++++ .../path-item-object-parameters-alias.json | 26 +++++++++++++++++++ .../path-item-object-parameters-multiple.json | 26 +++++++++++++++++++ ...ject-parameters-unsupported-parameter.json | 26 +++++++++++++++++++ .../path-item-object-parameters.json | 26 +++++++++++++++++++ .../response-object-headers-multiple.json | 26 +++++++++++++++++++ .../components/response-object-headers.json | 26 +++++++++++++++++++ .../responses-object-response-multiple.json | 26 +++++++++++++++++++ ...esponses-object-response-with-headers.json | 26 +++++++++++++++++++ ...responses-object-response-with-schema.json | 26 +++++++++++++++++++ .../components/responses-object-response.json | 26 +++++++++++++++++++ .../fixtures/components/schema-alias.json | 26 +++++++++++++++++++ .../components/schema-object-circular.json | 26 +++++++++++++++++++ .../integration/fixtures/messageBody.json | 26 +++++++++++++++++++ .../test/integration/fixtures/petstore.json | 26 +++++++++++++++++++ .../fixtures/petstore.sourcemap.json | 26 +++++++++++++++++++ .../fixtures/regression/dredd-1685.json | 26 +++++++++++++++++++ 26 files changed, 676 insertions(+) diff --git a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.json b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.json index 923a7a5a4..d8a05b983 100644 --- a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.json +++ b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.sourcemap.json b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.sourcemap.json index 8501f67e9..3d727a8dc 100644 --- a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.sourcemap.json +++ b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-does-not-exist.sourcemap.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.json b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.json index c88a4ee9c..15f80bea8 100644 --- a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.json +++ b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.sourcemap.json b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.sourcemap.json index 8c3555125..cb6259f24 100644 --- a/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.sourcemap.json +++ b/packages/openapi3-parser/test/integration/fixtures/auth-scheme-global.sourcemap.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/auth-scheme.json b/packages/openapi3-parser/test/integration/fixtures/auth-scheme.json index fd1d82a10..98b4e43c5 100644 --- a/packages/openapi3-parser/test/integration/fixtures/auth-scheme.json +++ b/packages/openapi3-parser/test/integration/fixtures/auth-scheme.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/auth-scheme.sourcemap.json b/packages/openapi3-parser/test/integration/fixtures/auth-scheme.sourcemap.json index 3175f5ab2..58e9e7863 100644 --- a/packages/openapi3-parser/test/integration/fixtures/auth-scheme.sourcemap.json +++ b/packages/openapi3-parser/test/integration/fixtures/auth-scheme.sourcemap.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-examples.json b/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-examples.json index 8affb954e..cf2d6b408 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-examples.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-examples.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema-multiple.json b/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema-multiple.json index e25854522..dba9056d2 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema-multiple.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema-multiple.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema.json b/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema.json index 1f2af80c3..8f1d91151 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/media-type-object-schema.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/operation-object-requestBody.json b/packages/openapi3-parser/test/integration/fixtures/components/operation-object-requestBody.json index e36f47010..aca7798fd 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/operation-object-requestBody.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/operation-object-requestBody.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-alias.json b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-alias.json index 97906adc8..cb81dc154 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-alias.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-alias.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-multiple.json b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-multiple.json index 18b37e317..7404d24f1 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-multiple.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-multiple.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-unsupported-parameter.json b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-unsupported-parameter.json index ee553bd01..e2ae493f9 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-unsupported-parameter.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters-unsupported-parameter.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters.json b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters.json index 825604169..a6b2e8a0e 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/path-item-object-parameters.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers-multiple.json b/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers-multiple.json index 6db5bfc87..67e78114c 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers-multiple.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers-multiple.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers.json b/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers.json index 8b8ece3ae..d8f0f2e1e 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/response-object-headers.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-multiple.json b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-multiple.json index 26a9e2a42..3c41f5b11 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-multiple.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-multiple.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-headers.json b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-headers.json index fc6f3162c..0bec39c3a 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-headers.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-headers.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-schema.json b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-schema.json index f93ed1a49..82f66c777 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-schema.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response-with-schema.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response.json b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response.json index 4dc22083a..84cfb6241 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/responses-object-response.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/schema-alias.json b/packages/openapi3-parser/test/integration/fixtures/components/schema-alias.json index 1947f98df..3f923bb29 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/schema-alias.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/schema-alias.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/components/schema-object-circular.json b/packages/openapi3-parser/test/integration/fixtures/components/schema-object-circular.json index 8b056ae76..8713c79e6 100644 --- a/packages/openapi3-parser/test/integration/fixtures/components/schema-object-circular.json +++ b/packages/openapi3-parser/test/integration/fixtures/components/schema-object-circular.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/messageBody.json b/packages/openapi3-parser/test/integration/fixtures/messageBody.json index cf0b53356..42e04cf2f 100644 --- a/packages/openapi3-parser/test/integration/fixtures/messageBody.json +++ b/packages/openapi3-parser/test/integration/fixtures/messageBody.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.1" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.1" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/petstore.json b/packages/openapi3-parser/test/integration/fixtures/petstore.json index ab58b6e42..1edf876b2 100644 --- a/packages/openapi3-parser/test/integration/fixtures/petstore.json +++ b/packages/openapi3-parser/test/integration/fixtures/petstore.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/petstore.sourcemap.json b/packages/openapi3-parser/test/integration/fixtures/petstore.sourcemap.json index e4fa50a63..ecd88bd88 100644 --- a/packages/openapi3-parser/test/integration/fixtures/petstore.sourcemap.json +++ b/packages/openapi3-parser/test/integration/fixtures/petstore.sourcemap.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", diff --git a/packages/openapi3-parser/test/integration/fixtures/regression/dredd-1685.json b/packages/openapi3-parser/test/integration/fixtures/regression/dredd-1685.json index 31273df0d..e3c5ff1a6 100644 --- a/packages/openapi3-parser/test/integration/fixtures/regression/dredd-1685.json +++ b/packages/openapi3-parser/test/integration/fixtures/regression/dredd-1685.json @@ -1,5 +1,31 @@ { "element": "parseResult", + "meta": { + "links": { + "element": "array", + "content": [ + { + "element": "link", + "meta": { + "title": { + "element": "string", + "content": "OpenAPI 3.0.0" + } + }, + "attributes": { + "relation": { + "element": "string", + "content": "via" + }, + "href": { + "element": "string", + "content": "https://spec.openapis.org/oas/v3.0.0" + } + } + } + ] + } + }, "content": [ { "element": "category", From 277239252ac8d6a6a627a43f073401fb31310fc4 Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Thu, 13 Aug 2020 15:22:43 +0200 Subject: [PATCH 3/8] docs(oas3): adjust changelog --- packages/openapi3-parser/CHANGELOG.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/openapi3-parser/CHANGELOG.md b/packages/openapi3-parser/CHANGELOG.md index 0f865c891..01e6264f9 100644 --- a/packages/openapi3-parser/CHANGELOG.md +++ b/packages/openapi3-parser/CHANGELOG.md @@ -1,5 +1,11 @@ # API Elements: OpenAPI 3 Parser Changelog +## Unreleased + +### Enhancements + +- added a Link element to the specific format/version in the parse result. + ## 0.15.0 (2020-08-06) ### Enhancements @@ -8,10 +14,6 @@ This can dramatically increase the performance when dealing with documents which use many unsupported features. -### Enhancements - -- added a Link element to the specific format/version in the parse result. - ### Bug Fixes - Return a warning when parsing a document with a 'Media Type Object' From 01b612140df2b443932fc738db82a04368e9e467 Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Thu, 13 Aug 2020 16:40:53 +0200 Subject: [PATCH 4/8] fix(oas3): improve regex expression --- packages/openapi3-parser/lib/parser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi3-parser/lib/parser.js b/packages/openapi3-parser/lib/parser.js index 93a3766ef..f840e1032 100644 --- a/packages/openapi3-parser/lib/parser.js +++ b/packages/openapi3-parser/lib/parser.js @@ -136,7 +136,7 @@ function parse(source, context) { ); if (!isAnnotation(parseResult.content[0])) { - const formatVersion = (/3\.\d+\.\d+/).exec(source)[0]; + const formatVersion = (/(?<=(["']?)openapi\1\s*:\s*(["']?))(3\.\d+\.\d+)/).exec(source)[0]; const formatLink = `https://spec.openapis.org/oas/v${formatVersion}`; const { Link } = context.namespace.elements; From 48abc84718745440b7d268d55ccb291a5467f16f Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Tue, 18 Aug 2020 09:46:27 +0200 Subject: [PATCH 5/8] fix(oas3): change formatVersion function --- packages/openapi3-parser/lib/parser.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/openapi3-parser/lib/parser.js b/packages/openapi3-parser/lib/parser.js index f840e1032..e4fa732dd 100644 --- a/packages/openapi3-parser/lib/parser.js +++ b/packages/openapi3-parser/lib/parser.js @@ -3,7 +3,9 @@ const R = require('ramda'); const parseYAML = require('./parser/parseYAML'); -const { isAnnotation, isWarningAnnotation, isObject } = require('./predicates'); +const { + isAnnotation, isWarningAnnotation, isObject, isMember, hasKey, +} = require('./predicates'); const { createError } = require('./elements'); const pipeParseResult = require('./pipeParseResult'); @@ -136,9 +138,14 @@ function parse(source, context) { ); if (!isAnnotation(parseResult.content[0])) { - const formatVersion = (/(?<=(["']?)openapi\1\s*:\s*(["']?))(3\.\d+\.\d+)/).exec(source)[0]; - const formatLink = `https://spec.openapis.org/oas/v${formatVersion}`; + const formatVersion = R.pipe( + R.prop('content'), + R.find(isObject), + R.prop('content'), + R.find(R.both(isMember, hasKey('openapi'))) + )(document).toValue().value; + const formatLink = `https://spec.openapis.org/oas/v${formatVersion}`; const { Link } = context.namespace.elements; const link = new Link(); From 729dacb2aa6d0aa0923283f09a4306b624da0da2 Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Tue, 18 Aug 2020 11:27:29 +0200 Subject: [PATCH 6/8] chore(oas3): lint correction --- packages/openapi3-parser/lib/parser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi3-parser/lib/parser.js b/packages/openapi3-parser/lib/parser.js index e4fa732dd..eb8854f1b 100644 --- a/packages/openapi3-parser/lib/parser.js +++ b/packages/openapi3-parser/lib/parser.js @@ -4,7 +4,7 @@ const R = require('ramda'); const parseYAML = require('./parser/parseYAML'); const { - isAnnotation, isWarningAnnotation, isObject, isMember, hasKey, + isAnnotation, isWarningAnnotation, isObject, isMember, hasKey, } = require('./predicates'); const { createError } = require('./elements'); const pipeParseResult = require('./pipeParseResult'); From f52cd031afdfb61aa2cf685c37dd758084f49d54 Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Tue, 18 Aug 2020 15:46:44 +0200 Subject: [PATCH 7/8] fix(oas3): modify formatVersion function --- packages/openapi3-parser/lib/parser.js | 28 ++++++++++--------- .../openapi3-parser/test/unit/parser-test.js | 11 ++++++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/packages/openapi3-parser/lib/parser.js b/packages/openapi3-parser/lib/parser.js index eb8854f1b..958e7c6d7 100644 --- a/packages/openapi3-parser/lib/parser.js +++ b/packages/openapi3-parser/lib/parser.js @@ -4,7 +4,7 @@ const R = require('ramda'); const parseYAML = require('./parser/parseYAML'); const { - isAnnotation, isWarningAnnotation, isObject, isMember, hasKey, + isAnnotation, isWarningAnnotation, isObject, isMember, hasKey, isString, } = require('./predicates'); const { createError } = require('./elements'); const pipeParseResult = require('./pipeParseResult'); @@ -137,24 +137,26 @@ function parse(source, context) { document ); - if (!isAnnotation(parseResult.content[0])) { - const formatVersion = R.pipe( + const formatVersion = R.tryCatch( + R.pipe( R.prop('content'), R.find(isObject), R.prop('content'), - R.find(R.both(isMember, hasKey('openapi'))) - )(document).toValue().value; + R.find(R.both(isMember, hasKey('openapi'))), + R.path(['content', 'value']), + R.and(isString, R.prop('content')) + ), R.always('3.0.3') + )(document); - const formatLink = `https://spec.openapis.org/oas/v${formatVersion}`; - const { Link } = context.namespace.elements; - const link = new Link(); + const formatLink = `https://spec.openapis.org/oas/v${formatVersion}`; + const { Link } = context.namespace.elements; + const link = new Link(); - link.title = `OpenAPI ${formatVersion}`; - link.relation = 'via'; - link.href = formatLink; + link.title = `OpenAPI ${formatVersion}`; + link.relation = 'via'; + link.href = formatLink; - parseResult.links.push(link); - } + parseResult.links.push(link); return parseResult; } diff --git a/packages/openapi3-parser/test/unit/parser-test.js b/packages/openapi3-parser/test/unit/parser-test.js index 726447dec..df801e90d 100644 --- a/packages/openapi3-parser/test/unit/parser-test.js +++ b/packages/openapi3-parser/test/unit/parser-test.js @@ -51,4 +51,15 @@ describe('#parse', () => { expect(link.title.toValue()).to.equal('OpenAPI 3.0.0'); expect(link.href.toValue()).to.equal('https://spec.openapis.org/oas/v3.0.0'); }); + + it('add OpenAPI 3.0.3 format link when fails to parse an OAS3 document', () => { + const source = '{}{}'; + const parseResult = parse(source, context); + + const link = parseResult.links.get(0); + expect(link).to.be.instanceof(Link); + expect(link.relation.toValue()).to.equal('via'); + expect(link.title.toValue()).to.equal('OpenAPI 3.0.3'); + expect(link.href.toValue()).to.equal('https://spec.openapis.org/oas/v3.0.3'); + }); }); From 88bcb5687ef5bf41922147ee51e1824da6c01830 Mon Sep 17 00:00:00 2001 From: Marco Friso Date: Tue, 18 Aug 2020 16:09:32 +0200 Subject: [PATCH 8/8] fix(oas3): add format link when `OpenAPI` property is not a string --- packages/openapi3-parser/lib/parser.js | 2 +- packages/openapi3-parser/test/unit/parser-test.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/openapi3-parser/lib/parser.js b/packages/openapi3-parser/lib/parser.js index 958e7c6d7..26121ba3d 100644 --- a/packages/openapi3-parser/lib/parser.js +++ b/packages/openapi3-parser/lib/parser.js @@ -144,7 +144,7 @@ function parse(source, context) { R.prop('content'), R.find(R.both(isMember, hasKey('openapi'))), R.path(['content', 'value']), - R.and(isString, R.prop('content')) + R.ifElse(isString, R.prop('content'), R.always('3.0.3')) ), R.always('3.0.3') )(document); diff --git a/packages/openapi3-parser/test/unit/parser-test.js b/packages/openapi3-parser/test/unit/parser-test.js index df801e90d..10fd30b35 100644 --- a/packages/openapi3-parser/test/unit/parser-test.js +++ b/packages/openapi3-parser/test/unit/parser-test.js @@ -62,4 +62,15 @@ describe('#parse', () => { expect(link.title.toValue()).to.equal('OpenAPI 3.0.3'); expect(link.href.toValue()).to.equal('https://spec.openapis.org/oas/v3.0.3'); }); + + it('add OpenAPI 3.0.3 format link when OpenAPI property is not a string', () => { + const source = 'openapi: {"test": "3.0.0"}\ninfo: {title: My API, version: 1.0.0}\npaths: {}\n'; + const parseResult = parse(source, context); + + const link = parseResult.links.get(0); + expect(link).to.be.instanceof(Link); + expect(link.relation.toValue()).to.equal('via'); + expect(link.title.toValue()).to.equal('OpenAPI 3.0.3'); + expect(link.href.toValue()).to.equal('https://spec.openapis.org/oas/v3.0.3'); + }); });