Skip to content

Commit 318ef40

Browse files
committed
fix(shared): merge $defs instead of replacing in materializeDynamicRefBinding
When materializing a dynamic ref binding, the caller's $defs now merge with the template's $defs instead of wholesale replacing them. This preserves helper sub-schemas that the template may reference from its body alongside the anchor placeholders.
1 parent 6a7334d commit 318ef40

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

packages/shared/src/openApi/3.1.x/parser/__tests__/dynamicRef.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,38 @@ describe('materializeDynamicRefBinding', () => {
430430

431431
expect(result!.description).toBe('overridden');
432432
});
433+
434+
it('merges $defs from refSchema and caller schema', () => {
435+
mockResolveRef.mockReturnValue({
436+
$defs: {
437+
helper: { type: 'string' },
438+
placeholder: { $dynamicAnchor: 'itemType', not: {} },
439+
},
440+
type: 'object',
441+
});
442+
443+
const result = materializeDynamicRefBinding({
444+
context: createContext(),
445+
schema: {
446+
$defs: {
447+
itemType: {
448+
$dynamicAnchor: 'itemType',
449+
$ref: '#/components/schemas/User',
450+
},
451+
},
452+
$ref: '#/components/schemas/Template',
453+
},
454+
});
455+
456+
expect(result!.$defs).toEqual({
457+
helper: { type: 'string' },
458+
itemType: {
459+
$dynamicAnchor: 'itemType',
460+
$ref: '#/components/schemas/User',
461+
},
462+
placeholder: { $dynamicAnchor: 'itemType', not: {} },
463+
});
464+
});
433465
});
434466

435467
describe('shouldInlineDynamicRefTarget', () => {

packages/shared/src/openApi/3.1.x/parser/dynamicRef.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,12 @@ export function materializeDynamicRefBinding({
191191
...refSchema,
192192
...schema,
193193
};
194+
if (refSchema.$defs && schema.$defs) {
195+
materializedSchema.$defs = {
196+
...refSchema.$defs,
197+
...schema.$defs,
198+
};
199+
}
194200
delete (materializedSchema as Record<string, unknown>).$ref;
195201
delete (materializedSchema as Record<string, unknown>).$dynamicAnchor;
196202
delete (materializedSchema as Record<string, unknown>).$id;

0 commit comments

Comments
 (0)