From 8696d8184c25ce0332514d1bdd03339a83696558 Mon Sep 17 00:00:00 2001 From: Alex Varchuk Date: Thu, 3 Feb 2022 11:24:27 +0200 Subject: [PATCH 1/4] fix: external ref in SchemaDefinition --- src/services/OpenAPIParser.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/services/OpenAPIParser.ts b/src/services/OpenAPIParser.ts index a82b0d83dd..06efb98b03 100644 --- a/src/services/OpenAPIParser.ts +++ b/src/services/OpenAPIParser.ts @@ -191,6 +191,11 @@ export class OpenAPIParser { const { $ref, ...rest } = ref; const keys = Object.keys(rest); if (keys.length === 0) { + if (this.isRef(resolved)) { + const result = this.deref(resolved, false, mergeAsAllOf); + this.exitRef(resolved); + return result; + } return resolved; } if ( From 80e39a2c12b10e2680ceb4280f27f24f0fd0c1b6 Mon Sep 17 00:00:00 2001 From: Alex Varchuk Date: Thu, 3 Feb 2022 13:10:17 +0200 Subject: [PATCH 2/4] chore: add tests --- src/services/__tests__/OpenAPIParser.test.ts | 11 ++++ .../fixtures/3.1/schemaDefinition.json | 54 +++++++++++++++++++ src/services/__tests__/models/Schema.test.ts | 8 +++ 3 files changed, 73 insertions(+) create mode 100644 src/services/__tests__/fixtures/3.1/schemaDefinition.json diff --git a/src/services/__tests__/OpenAPIParser.test.ts b/src/services/__tests__/OpenAPIParser.test.ts index 60dea80944..7942b7b1dd 100644 --- a/src/services/__tests__/OpenAPIParser.test.ts +++ b/src/services/__tests__/OpenAPIParser.test.ts @@ -26,5 +26,16 @@ describe('Models', () => { expect(parser.shallowDeref(schemaOrRef)).toMatchSnapshot(); }); + + test('should correct resolve double $ref if no need sibling', () => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const spec = require('./fixtures/3.1/schemaDefinition.json'); + parser = new OpenAPIParser(spec, undefined, opts); + const schemaOrRef: Referenced = { + $ref: '#/components/schemas/Parent', + }; + + expect(parser.deref(schemaOrRef, false, true)).toMatchSnapshot(); + }); }); }); diff --git a/src/services/__tests__/fixtures/3.1/schemaDefinition.json b/src/services/__tests__/fixtures/3.1/schemaDefinition.json new file mode 100644 index 0000000000..9cac3b5f9a --- /dev/null +++ b/src/services/__tests__/fixtures/3.1/schemaDefinition.json @@ -0,0 +1,54 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Schema definition double $ref", + "version": "1.0.0" + }, + "servers": [ + { + "url": "example.com" + } + ], + "tags": [ + { + "name": "test", + "x-displayName": "The test Model", + "description": "\n" + } + ], + "paths": { + "/newPath": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Child" + } + } + } + }, + "responses": { + "200": { + "description": "all ok" + } + } + } + } + }, + "components": { + "schemas": { + "Parent": { + "$ref": "#/components/schemas/Child" + }, + "Child": { + "type": "object", + "properties": { + "test": { + "type": "string" + } + } + } + } + } +} diff --git a/src/services/__tests__/models/Schema.test.ts b/src/services/__tests__/models/Schema.test.ts index 460ca7c110..9b9cdafcc0 100644 --- a/src/services/__tests__/models/Schema.test.ts +++ b/src/services/__tests__/models/Schema.test.ts @@ -40,5 +40,13 @@ describe('Models', () => { expect(schema.oneOf).toHaveLength(2); expect(schema.displayType).toBe('(Array of strings or numbers) or string'); }); + + test('schemaDefinition should resolve double ref', () => { + const spec = require('../fixtures/3.1/schemaDefinition.json'); + parser = new OpenAPIParser(spec, undefined, opts); + const schema = new SchemaModel(parser, spec.components.schemas.Parent, '', opts); + expect(schema.fields).toHaveLength(1); + expect(schema.pointer).toBe('#/components/schemas/Child'); + }); }); }); From a608b5dcc2094011f511385ba83c9ddbb04a5012 Mon Sep 17 00:00:00 2001 From: Alex Varchuk Date: Thu, 3 Feb 2022 13:17:47 +0200 Subject: [PATCH 3/4] chore: add snap --- .../__snapshots__/OpenAPIParser.test.ts.snap | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap b/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap index ffbcbff54a..8b5ea0181d 100644 --- a/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap +++ b/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap @@ -1,5 +1,16 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Models Schema should correct resolve double $ref if no need sibling 1`] = ` +Object { + "properties": Object { + "test": Object { + "type": "string", + }, + }, + "type": "object", +} +`; + exports[`Models Schema should hoist oneOfs when mergin allOf 1`] = ` Object { "oneOf": Array [ From 45cb21fdad274a438ac60a787fbc71ff707d77e4 Mon Sep 17 00:00:00 2001 From: Alex Varchuk Date: Fri, 4 Feb 2022 12:38:41 +0200 Subject: [PATCH 4/4] fix: improve code after review --- src/services/OpenAPIParser.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/services/OpenAPIParser.ts b/src/services/OpenAPIParser.ts index 06efb98b03..bdc86bbebb 100644 --- a/src/services/OpenAPIParser.ts +++ b/src/services/OpenAPIParser.ts @@ -192,9 +192,7 @@ export class OpenAPIParser { const keys = Object.keys(rest); if (keys.length === 0) { if (this.isRef(resolved)) { - const result = this.deref(resolved, false, mergeAsAllOf); - this.exitRef(resolved); - return result; + return this.shallowDeref(resolved); } return resolved; }