Skip to content

Commit 46d92ce

Browse files
authored
fix(walker): support circular JSON $refs with overrides (#26)
1 parent 628627c commit 46d92ce

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"type": "object",
3+
"properties": {
4+
"order": {
5+
"$ref": "#/definitions/Order",
6+
"description": "My Order"
7+
}
8+
},
9+
"definitions": {
10+
"Cart": {
11+
"type": "object",
12+
"properties": {
13+
"order": {
14+
"$ref": "#/definitions/Order",
15+
"description": "My Order"
16+
}
17+
}
18+
},
19+
"Order": {
20+
"type": "object",
21+
"properties": {
22+
"member": {
23+
"$ref": "#/definitions/Member",
24+
"description": "Member"
25+
}
26+
}
27+
},
28+
"Member": {
29+
"type": "object",
30+
"properties": {
31+
"referredMember": {
32+
"$ref": "#/definitions/Member",
33+
"description": "Member"
34+
}
35+
}
36+
}
37+
}
38+
}

src/__tests__/__snapshots__/tree.spec.ts.snap

+30
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,36 @@ exports[`SchemaTree output should generate valid tree for references/base.json 1
12791279
"
12801280
`;
12811281

1282+
exports[`SchemaTree output should generate valid tree for references/circular-with-overrides.json 1`] = `
1283+
"└─ #
1284+
├─ types
1285+
│ └─ 0: object
1286+
├─ primaryType: object
1287+
└─ children
1288+
└─ 0
1289+
└─ #/properties/order
1290+
├─ types
1291+
│ └─ 0: object
1292+
├─ primaryType: object
1293+
└─ children
1294+
└─ 0
1295+
└─ #/properties/order/properties/member
1296+
├─ types
1297+
│ └─ 0: object
1298+
├─ primaryType: object
1299+
└─ children
1300+
└─ 0
1301+
└─ #/properties/order/properties/member/properties/referredMember
1302+
├─ types
1303+
│ └─ 0: object
1304+
├─ primaryType: object
1305+
└─ children
1306+
└─ 0
1307+
└─ #/properties/order/properties/member/properties/referredMember/properties/referredMember
1308+
└─ mirrors: #/properties/order/properties/member/properties/referredMember
1309+
"
1310+
`;
1311+
12821312
exports[`SchemaTree output should generate valid tree for references/nullish.json 1`] = `
12831313
"└─ #
12841314
├─ types

src/walker/walker.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,8 @@ export class Walker extends EventEmitter<WalkerEmitter> {
285285
return retrieved;
286286
}
287287

288+
let initialFragment: ProcessedFragment = fragment;
289+
288290
if ('$ref' in fragment) {
289291
if (typeof walkingOptions.maxRefDepth === 'number' && walkingOptions.maxRefDepth < depth) {
290292
return [new ReferenceNode(fragment, `max $ref depth limit reached`), fragment];
@@ -297,6 +299,11 @@ export class Walker extends EventEmitter<WalkerEmitter> {
297299
if (typeof fragment.description === 'string') {
298300
newFragment = { ...newFragment };
299301
Object.assign(newFragment, { description: fragment.description });
302+
} else {
303+
retrieved = this.retrieveFromFragment(newFragment, originalFragment);
304+
if (retrieved) {
305+
return retrieved;
306+
}
300307
}
301308

302309
fragment = newFragment;
@@ -331,7 +338,6 @@ export class Walker extends EventEmitter<WalkerEmitter> {
331338
}
332339
}
333340
}
334-
let initialFragment: ProcessedFragment = fragment;
335341
if (walkingOptions.mergeAllOf && SchemaCombinerName.AllOf in fragment) {
336342
try {
337343
if (Array.isArray(fragment.allOf)) {

0 commit comments

Comments
 (0)