Skip to content

Commit e83c437

Browse files
authored
Support discriminator with no parent/shared properties (#1040)
* add new discriminator test * merge discriminator property from sub schema to parent if not defined
1 parent 3b9509a commit e83c437

File tree

2 files changed

+59
-11
lines changed

2 files changed

+59
-11
lines changed

demo/examples/tests/discriminator.yaml

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,32 @@ paths:
233233
schema:
234234
$ref: "#/components/schemas/BaseSharedMapping"
235235

236+
/discriminator-mapping-no-properties:
237+
get:
238+
tags:
239+
- discriminator
240+
summary: Discriminator with Mapping and No Shared Properties
241+
description: |
242+
Schema:
243+
```yaml
244+
type: object
245+
discriminator:
246+
propertyName: type
247+
mapping:
248+
typeA: "#/components/schemas/TypeA"
249+
typeB: "#/components/schemas/TypeB"
250+
oneOf:
251+
- $ref: '#/components/schemas/TypeA'
252+
- $ref: '#/components/schemas/TypeB'
253+
```
254+
responses:
255+
"200":
256+
description: Successful response
257+
content:
258+
application/json:
259+
schema:
260+
$ref: "#/components/schemas/BaseSharedMappingNoProperties"
261+
236262
/discriminator-allof-mapping:
237263
get:
238264
tags:
@@ -401,6 +427,17 @@ components:
401427
- $ref: "#/components/schemas/TypeA"
402428
- $ref: "#/components/schemas/TypeB"
403429

430+
BaseSharedMappingNoProperties:
431+
type: object
432+
discriminator:
433+
propertyName: type
434+
mapping:
435+
typeA: "#/components/schemas/TypeA"
436+
typeB: "#/components/schemas/TypeB"
437+
oneOf:
438+
- $ref: "#/components/schemas/TypeA"
439+
- $ref: "#/components/schemas/TypeB"
440+
404441
BaseAllOfMapping:
405442
type: object
406443
discriminator:
@@ -409,7 +446,8 @@ components:
409446
typeA: "#/components/schemas/TypeA"
410447
typeB: "#/components/schemas/TypeB"
411448
properties:
412-
type: string
449+
type:
450+
type: string
413451
allOf:
414452
- oneOf:
415453
- $ref: "#/components/schemas/TypeA"

packages/docusaurus-theme-openapi-docs/src/theme/Schema/index.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,10 @@ const DiscriminatorNode: React.FC<DiscriminatorNodeProps> = ({
317317
let discriminatedSchemas: any = {};
318318
let inferredMapping: any = {};
319319

320-
const discriminatorProperty = schema.properties![discriminator.propertyName];
320+
// default to empty object if no parent-level properties exist
321+
const discriminatorProperty = schema.properties
322+
? schema.properties![discriminator.propertyName]
323+
: {};
321324

322325
if (schema.allOf) {
323326
const mergedSchemas = mergeAllOf(schema) as SchemaObject;
@@ -350,21 +353,28 @@ const DiscriminatorNode: React.FC<DiscriminatorNodeProps> = ({
350353

351354
const subProperties = subSchema.properties || mergedSubSchema.properties;
352355
if (subProperties[discriminator.propertyName]) {
353-
schema.properties![discriminator.propertyName] = {
354-
...schema.properties![discriminator.propertyName],
355-
...subProperties[discriminator.propertyName],
356-
};
357-
if (subSchema.required && !schema.required) {
358-
schema.required = subSchema.required;
356+
if (schema.properties) {
357+
schema.properties![discriminator.propertyName] = {
358+
...schema.properties![discriminator.propertyName],
359+
...subProperties[discriminator.propertyName],
360+
};
361+
if (subSchema.required && !schema.required) {
362+
schema.required = subSchema.required;
363+
}
364+
// Avoid duplicating property
365+
delete subProperties[discriminator.propertyName];
366+
} else {
367+
schema.properties = {};
368+
schema.properties[discriminator.propertyName] =
369+
subProperties[discriminator.propertyName];
370+
// Avoid duplicating property
371+
delete subProperties[discriminator.propertyName];
359372
}
360-
// Avoid duplicating property
361-
delete subProperties[discriminator.propertyName];
362373
}
363374
});
364375

365376
const name = discriminator.propertyName;
366377
const schemaName = getSchemaName(discriminatorProperty);
367-
368378
// Default case for discriminator without oneOf/anyOf/allOf
369379
return (
370380
<PropertyDiscriminator

0 commit comments

Comments
 (0)