Skip to content

Commit 335deb9

Browse files
committed
fix: crashes on some dereferencing/allOf merging cases
1 parent ce543cf commit 335deb9

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

src/services/OpenAPIParser.ts

+16-6
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,12 @@ export class OpenAPIParser {
109109
* resets visited enpoints. should be run after
110110
*/
111111
resetVisited() {
112-
for (let k in this._refCounter._counter) {
113-
if (this._refCounter._counter[k] > 0) {
112+
if (__DEV__) {
113+
// check in dev mode
114+
for (let k in this._refCounter._counter) {
115+
if (this._refCounter._counter[k] > 0) {
116+
console.warn('Not exited reference: ' + k);
117+
}
114118
}
115119
}
116120
this._refCounter = new RefCounter();
@@ -129,11 +133,12 @@ export class OpenAPIParser {
129133
deref<T extends object>(obj: OpenAPIRef | T, forceCircular: boolean = false): T {
130134
if (this.isRef(obj)) {
131135
const resolved = this.byRef<T>(obj.$ref)!;
132-
if (this._refCounter.visited(obj.$ref) && !forceCircular) {
136+
const visited = this._refCounter.visited(obj.$ref);
137+
this._refCounter.visit(obj.$ref);
138+
if (visited && !forceCircular) {
133139
// circular reference detected
134140
return Object.assign({}, resolved, { 'x-circular-ref': true });
135141
}
136-
this._refCounter.visit(obj.$ref);
137142
// deref again in case one more $ref is here
138143
if (this.isRef(resolved)) {
139144
const res = this.deref(resolved);
@@ -169,9 +174,11 @@ export class OpenAPIParser {
169174
const allOfSchemas = schema.allOf.map((subSchema, idx) => {
170175
const resolved = this.deref(subSchema, forceCircular);
171176
const subRef = subSchema.$ref || $ref + '/allOf/' + idx;
177+
const subMerged = this.mergeAllOf(resolved, subRef, forceCircular);
178+
receiver.namedParents!.push(...(subMerged.namedParents || []));
172179
return {
173180
$ref: subRef,
174-
schema: this.mergeAllOf(resolved, subRef, forceCircular),
181+
schema: subMerged,
175182
};
176183
});
177184

@@ -188,7 +195,10 @@ export class OpenAPIParser {
188195
throw new Error(`Uncopatible types in allOf at "${$ref}"`);
189196
}
190197

191-
receiver.type = subSchema.type;
198+
if (subSchema.type !== undefined) {
199+
receiver.type = subSchema.type;
200+
}
201+
192202
if (subSchema.properties !== undefined) {
193203
// TODO: merge properties contents
194204
receiver.properties = {

src/services/models/Schema.ts

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ export class SchemaModel {
6868
this.init(parser, isChild);
6969

7070
parser.exitRef(schemaOrRef);
71+
7172
for (let $ref of this.schema.namedParents || []) {
7273
// exit all the refs visited during allOf traverse
7374
parser.exitRef({ $ref });

0 commit comments

Comments
 (0)