From 67ca2d76f73cbdb9c3b97299314ba82642bd06fd Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Mon, 8 Aug 2022 16:47:56 -0500 Subject: [PATCH] chore: fix circular crash Co-authored-by: Alex Varchuk --- .../__tests__/models/Schema.circular.test.ts | 40 +++++++++++++++++++ src/services/models/Schema.ts | 4 +- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/services/__tests__/models/Schema.circular.test.ts b/src/services/__tests__/models/Schema.circular.test.ts index 043fb74b..e84bf160 100644 --- a/src/services/__tests__/models/Schema.circular.test.ts +++ b/src/services/__tests__/models/Schema.circular.test.ts @@ -555,5 +555,45 @@ describe('Models', () => { packSize: `); }); + + test('should detect and recursion with nested oneOf', () => { + const spec = parseYaml(outdent` + openapi: 3.0.0 + components: + schemas: + Tag: + type: object + properties: + name: + description: Tag name + type: string + minLength: 1 + items: + oneOf: + - $ref: "#/components/schemas/Tag" + User: + type: object + properties: + pet: + oneOf: + - $ref: '#/components/schemas/Tag' + `) as any; + + parser = new OpenAPIParser(spec, undefined, opts); + const schema = new SchemaModel( + parser, + spec.components.schemas.User, + '#/components/schemas/User', + opts, + ); + + expect(printSchema(schema, circularDetailsPrinter)).toMatchInlineSnapshot(` + pet: oneOf + Tag -> + name: (Tag name) + items: oneOf + Tag -> !circular + `); + }); }); }); diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index 98bcbd0e..7ad20821 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -254,10 +254,10 @@ export class SchemaModel { title, allOf: [{ ...this.schema, oneOf: undefined, anyOf: undefined }], } as OpenAPISchema, - this.pointer + '/oneOf/' + idx, + variant.$ref || this.pointer + '/oneOf/' + idx, this.options, false, - this.refsStack, + refsStack, ); return schema;