From 5ddd58cf3534a2990db3afc9c319a4a1bdfc1552 Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Tue, 2 Jan 2024 18:00:16 +0200 Subject: [PATCH 1/5] fix: false positive errors when validating examples with refs --- .../components.yaml | 11 ++++ .../openapi.yaml | 21 ++++++++ .../redocly.yaml | 6 +++ .../snapshot.js | 11 ++++ .../openapi.yaml | 53 +++++++++++++++++++ .../redocly.yaml | 6 +++ .../snapshot.js | 11 ++++ package-lock.json | 12 ++--- packages/core/src/rules/ajv.ts | 10 ++-- 9 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/components.yaml create mode 100644 __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/openapi.yaml create mode 100644 __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/redocly.yaml create mode 100644 __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/snapshot.js create mode 100644 __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/openapi.yaml create mode 100644 __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/redocly.yaml create mode 100644 __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/snapshot.js diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/components.yaml b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/components.yaml new file mode 100644 index 0000000000..c1a28f0b92 --- /dev/null +++ b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/components.yaml @@ -0,0 +1,11 @@ +components: + schemas: + A: + type: object + properties: + a: + type: string + b: + $ref: '#/components/schemas/B' + B: + type: string diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/openapi.yaml b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/openapi.yaml new file mode 100644 index 0000000000..5c640b6075 --- /dev/null +++ b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/openapi.yaml @@ -0,0 +1,21 @@ +openapi: 3.1.0 +components: + schemas: + C: + $ref: './components.yaml#/components/schemas/A' + D: + $ref: './components.yaml#/components/schemas/A' +paths: + /pet: + get: + responses: + 200: + content: + application/json: + example: { 'a': 'test', 'b': 'test' } + schema: + $ref: '#/components/schemas/C' + application/x+json: + example: { 'a': 'test', 'b': 'test' } + schema: + $ref: '#/components/schemas/D' diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/redocly.yaml b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/redocly.yaml new file mode 100644 index 0000000000..3516cbec1d --- /dev/null +++ b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/redocly.yaml @@ -0,0 +1,6 @@ +apis: + main: + root: ./openapi.yaml + +rules: + no-invalid-media-type-examples: error diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/snapshot.js b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/snapshot.js new file mode 100644 index 0000000000..206f349bc2 --- /dev/null +++ b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/snapshot.js @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`E2E lint no-invalid-media-type-examples-do-not-error-on-valid-cross-files 1`] = ` + +validating /openapi.yaml... +/openapi.yaml: validated in ms + +Woohoo! Your API description is valid. 🎉 + + +`; diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/openapi.yaml b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/openapi.yaml new file mode 100644 index 0000000000..71ffe21ede --- /dev/null +++ b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/openapi.yaml @@ -0,0 +1,53 @@ +openapi: 3.1.0 +paths: + /foo: + get: + responses: + '200': + content: + application/json: + schema: + type: object + properties: + id: + $ref: '#/components/schemas/foo' + examples: + ValidFoo: + value: + id: 1 + /bar: + get: + responses: + '200': + content: + application/json: + schema: + type: object + properties: + id: + $ref: '#/components/schemas/bar' + examples: + ValidBar: + value: + id: 1 + application/baz+json: + schema: + type: object + properties: + id: + $ref: '#/components/schemas/baz' + examples: + ValidBaz: + value: # + id: 3 + +components: + schemas: + commonId: + type: integer + foo: + $ref: '#/components/schemas/commonId' + bar: + $ref: '#/components/schemas/commonId' + baz: + $ref: '#/components/schemas/commonId' diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/redocly.yaml b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/redocly.yaml new file mode 100644 index 0000000000..3516cbec1d --- /dev/null +++ b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/redocly.yaml @@ -0,0 +1,6 @@ +apis: + main: + root: ./openapi.yaml + +rules: + no-invalid-media-type-examples: error diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/snapshot.js b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/snapshot.js new file mode 100644 index 0000000000..843a4fe8bf --- /dev/null +++ b/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/snapshot.js @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`E2E lint no-invalid-media-type-examples-do-not-error-on-valid 1`] = ` + +validating /openapi.yaml... +/openapi.yaml: validated in ms + +Woohoo! Your API description is valid. 🎉 + + +`; diff --git a/package-lock.json b/package-lock.json index 3694f16933..c8580b3168 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9373,9 +9373,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -20008,9 +20008,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } diff --git a/packages/core/src/rules/ajv.ts b/packages/core/src/rules/ajv.ts index b7790b484a..90f101bb0a 100644 --- a/packages/core/src/rules/ajv.ts +++ b/packages/core/src/rules/ajv.ts @@ -1,6 +1,8 @@ -import Ajv, { ValidateFunction, ErrorObject } from '@redocly/ajv/dist/2020'; +import Ajv from '@redocly/ajv/dist/2020'; import { Location, escapePointer } from '../ref-utils'; -import { ResolveFn } from '../walk'; + +import type { ValidateFunction, ErrorObject } from '@redocly/ajv/dist/2020'; +import type { ResolveFn } from '../walk'; let ajvInstance: Ajv | null = null; @@ -21,10 +23,10 @@ function getAjv(resolve: ResolveFn, allowAdditionalProperties: boolean) { allowUnionTypes: true, validateFormats: false, // TODO: fix it defaultUnevaluatedProperties: allowAdditionalProperties, - loadSchemaSync(base: string, $ref: string) { + loadSchemaSync(base: string, $ref: string, $id: string) { const resolvedRef = resolve({ $ref }, base.split('#')[0]); if (!resolvedRef || !resolvedRef.location) return false; - return { $id: resolvedRef.location.absolutePointer, ...resolvedRef.node }; + return { $id: resolvedRef.location.source.absoluteRef + '#' + $id, ...resolvedRef.node }; }, logger: false, }); From 39d50a0b21a0e7b38b5ee36f19ee27515e10ba01 Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Tue, 2 Jan 2024 20:40:21 +0200 Subject: [PATCH 2/5] chore: rename test folders --- .../components.yaml | 0 .../openapi.yaml | 0 .../redocly.yaml | 0 .../snapshot.js | 2 +- .../openapi.yaml | 0 .../redocly.yaml | 0 .../snapshot.js | 2 +- 7 files changed, 2 insertions(+), 2 deletions(-) rename __tests__/lint/{no-invalid-media-type-examples-do-not-error-on-valid-cross-files => no-invalid-media-type-examples-multiple-valid-refs-different-files}/components.yaml (100%) rename __tests__/lint/{no-invalid-media-type-examples-do-not-error-on-valid-cross-files => no-invalid-media-type-examples-multiple-valid-refs-different-files}/openapi.yaml (100%) rename __tests__/lint/{no-invalid-media-type-examples-do-not-error-on-valid-cross-files => no-invalid-media-type-examples-multiple-valid-refs-different-files}/redocly.yaml (100%) rename __tests__/lint/{no-invalid-media-type-examples-do-not-error-on-valid-cross-files => no-invalid-media-type-examples-multiple-valid-refs-different-files}/snapshot.js (63%) rename __tests__/lint/{no-invalid-media-type-examples-do-not-error-on-valid => no-invalid-media-type-examples-multiple-valid-refs}/openapi.yaml (100%) rename __tests__/lint/{no-invalid-media-type-examples-do-not-error-on-valid => no-invalid-media-type-examples-multiple-valid-refs}/redocly.yaml (100%) rename __tests__/lint/{no-invalid-media-type-examples-do-not-error-on-valid => no-invalid-media-type-examples-multiple-valid-refs}/snapshot.js (66%) diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/components.yaml b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/components.yaml similarity index 100% rename from __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/components.yaml rename to __tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/components.yaml diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/openapi.yaml b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/openapi.yaml similarity index 100% rename from __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/openapi.yaml rename to __tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/openapi.yaml diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/redocly.yaml b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/redocly.yaml similarity index 100% rename from __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/redocly.yaml rename to __tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/redocly.yaml diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/snapshot.js b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/snapshot.js similarity index 63% rename from __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/snapshot.js rename to __tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/snapshot.js index 206f349bc2..1cb5d0b959 100644 --- a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid-cross-files/snapshot.js +++ b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/snapshot.js @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`E2E lint no-invalid-media-type-examples-do-not-error-on-valid-cross-files 1`] = ` +exports[`E2E lint no-invalid-media-type-examples-multiple-valid-refs-different-files 1`] = ` validating /openapi.yaml... /openapi.yaml: validated in ms diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/openapi.yaml b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs/openapi.yaml similarity index 100% rename from __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/openapi.yaml rename to __tests__/lint/no-invalid-media-type-examples-multiple-valid-refs/openapi.yaml diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/redocly.yaml b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs/redocly.yaml similarity index 100% rename from __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/redocly.yaml rename to __tests__/lint/no-invalid-media-type-examples-multiple-valid-refs/redocly.yaml diff --git a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/snapshot.js b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs/snapshot.js similarity index 66% rename from __tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/snapshot.js rename to __tests__/lint/no-invalid-media-type-examples-multiple-valid-refs/snapshot.js index 843a4fe8bf..255b2115c7 100644 --- a/__tests__/lint/no-invalid-media-type-examples-do-not-error-on-valid/snapshot.js +++ b/__tests__/lint/no-invalid-media-type-examples-multiple-valid-refs/snapshot.js @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`E2E lint no-invalid-media-type-examples-do-not-error-on-valid 1`] = ` +exports[`E2E lint no-invalid-media-type-examples-multiple-valid-refs 1`] = ` validating /openapi.yaml... /openapi.yaml: validated in ms From 9543f9ea6997c7f71f2a5a2fd0d88d3ae1aa6019 Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Thu, 4 Jan 2024 11:22:33 +0200 Subject: [PATCH 3/5] add changeset --- .changeset/small-rules-vanish.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/small-rules-vanish.md diff --git a/.changeset/small-rules-vanish.md b/.changeset/small-rules-vanish.md new file mode 100644 index 0000000000..a81fcf78e8 --- /dev/null +++ b/.changeset/small-rules-vanish.md @@ -0,0 +1,6 @@ +--- +"@redocly/openapi-core": patch +"@redocly/cli": patch +--- + +Fixed false positive errors when validating media type examples that contain references. From 5532e555eb27aa3a5a4025200cce7b564729b54d Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Tue, 16 Jan 2024 17:20:16 +0200 Subject: [PATCH 4/5] Update .changeset/small-rules-vanish.md --- .changeset/small-rules-vanish.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/small-rules-vanish.md b/.changeset/small-rules-vanish.md index a81fcf78e8..79b8d1bd0c 100644 --- a/.changeset/small-rules-vanish.md +++ b/.changeset/small-rules-vanish.md @@ -3,4 +3,4 @@ "@redocly/cli": patch --- -Fixed false positive errors when validating media type examples that contain references. +Fixed false positive errors when validating media type examples. Now, the linter won't error on valid examples that contain references. From d764eb91bdadd7c1f47b76e6219264fee0e06627 Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Fri, 19 Jan 2024 11:21:44 +0200 Subject: [PATCH 5/5] Update .changeset/small-rules-vanish.md Co-authored-by: Lorna Jane Mitchell --- .changeset/small-rules-vanish.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/small-rules-vanish.md b/.changeset/small-rules-vanish.md index 79b8d1bd0c..d246ee9bbe 100644 --- a/.changeset/small-rules-vanish.md +++ b/.changeset/small-rules-vanish.md @@ -3,4 +3,4 @@ "@redocly/cli": patch --- -Fixed false positive errors when validating media type examples. Now, the linter won't error on valid examples that contain references. +Fixed a problem where the linter incorrectly returned an error for valid examples that contain references.