Skip to content

Commit d9429c7

Browse files
authored
Expand support for nullable objects and default to any for empty/unknown schemas (#452)
1 parent 27fbac9 commit d9429c7

File tree

2 files changed

+162
-43
lines changed

2 files changed

+162
-43
lines changed

packages/docusaurus-plugin-openapi-docs/src/markdown/createRequestSchema.ts

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ function createDetailsNode(
436436
name: string,
437437
schemaName: string,
438438
schema: SchemaObject,
439-
required: string[] | boolean
439+
required: string[] | boolean,
440+
nullable: boolean | unknown
440441
): any {
441442
return create("SchemaItem", {
442443
collapsible: true,
@@ -451,15 +452,19 @@ function createDetailsNode(
451452
style: { opacity: "0.6" },
452453
children: ` ${schemaName}`,
453454
}),
454-
guard(schema.nullable && schema.nullable === true, () => [
455-
create("strong", {
456-
style: {
457-
fontSize: "var(--ifm-code-font-size)",
458-
color: "var(--openapi-nullable)",
459-
},
460-
children: " nullable",
461-
}),
462-
]),
455+
guard(
456+
(schema.nullable && schema.nullable === true) ||
457+
(nullable && nullable === true),
458+
() => [
459+
create("strong", {
460+
style: {
461+
fontSize: "var(--ifm-code-font-size)",
462+
color: "var(--openapi-nullable)",
463+
},
464+
children: " nullable",
465+
}),
466+
]
467+
),
463468
guard(
464469
Array.isArray(required)
465470
? required.includes(name)
@@ -604,7 +609,13 @@ function createEdges({
604609
}
605610

606611
if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
607-
return createDetailsNode(name, schemaName, schema, required);
612+
return createDetailsNode(
613+
name,
614+
schemaName,
615+
schema,
616+
required,
617+
schema.nullable
618+
);
608619
}
609620

610621
if (schema.allOf !== undefined) {
@@ -619,20 +630,44 @@ function createEdges({
619630
mergedSchemas.oneOf !== undefined ||
620631
mergedSchemas.anyOf !== undefined
621632
) {
622-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
633+
return createDetailsNode(
634+
name,
635+
mergedSchemaName,
636+
mergedSchemas,
637+
required,
638+
schema.nullable
639+
);
623640
}
624641

625642
if (mergedSchemas.properties !== undefined) {
626-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
643+
return createDetailsNode(
644+
name,
645+
mergedSchemaName,
646+
mergedSchemas,
647+
required,
648+
schema.nullable
649+
);
627650
}
628651

629652
if (mergedSchemas.additionalProperties !== undefined) {
630-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
653+
return createDetailsNode(
654+
name,
655+
mergedSchemaName,
656+
mergedSchemas,
657+
required,
658+
schema.nullable
659+
);
631660
}
632661

633662
// array of objects
634663
if (mergedSchemas.items?.properties !== undefined) {
635-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
664+
return createDetailsNode(
665+
name,
666+
mergedSchemaName,
667+
mergedSchemas,
668+
required,
669+
schema.nullable
670+
);
636671
}
637672

638673
if (mergedSchemas.readOnly && mergedSchemas.readOnly === true) {
@@ -650,20 +685,44 @@ function createEdges({
650685
}
651686

652687
if (schema.properties !== undefined) {
653-
return createDetailsNode(name, schemaName, schema, required);
688+
return createDetailsNode(
689+
name,
690+
schemaName,
691+
schema,
692+
required,
693+
schema.nullable
694+
);
654695
}
655696

656697
if (schema.additionalProperties !== undefined) {
657-
return createDetailsNode(name, schemaName, schema, required);
698+
return createDetailsNode(
699+
name,
700+
schemaName,
701+
schema,
702+
required,
703+
schema.nullable
704+
);
658705
}
659706

660707
// array of objects
661708
if (schema.items?.properties !== undefined) {
662-
return createDetailsNode(name, schemaName, schema, required);
709+
return createDetailsNode(
710+
name,
711+
schemaName,
712+
schema,
713+
required,
714+
schema.nullable
715+
);
663716
}
664717

665718
if (schema.items?.anyOf !== undefined || schema.items?.oneOf !== undefined) {
666-
return createDetailsNode(name, schemaName, schema, required);
719+
return createDetailsNode(
720+
name,
721+
schemaName,
722+
schema,
723+
required,
724+
schema.nullable
725+
);
667726
}
668727

669728
if (schema.readOnly && schema.readOnly === true) {
@@ -751,7 +810,7 @@ function createNodes(schema: SchemaObject): any {
751810

752811
// Unknown node/schema type should return undefined
753812
// So far, haven't seen this hit in testing
754-
return undefined;
813+
return "any";
755814
}
756815

757816
interface Props {
@@ -840,7 +899,8 @@ export function createRequestSchema({ title, body, ...rest }: Props) {
840899
}
841900

842901
const randomFirstKey = Object.keys(body.content)[0];
843-
const firstBody = body.content[randomFirstKey].schema;
902+
const firstBody: any =
903+
body.content[randomFirstKey].schema ?? body.content![randomFirstKey];
844904

845905
if (firstBody === undefined) {
846906
return undefined;

packages/docusaurus-plugin-openapi-docs/src/markdown/createResponseSchema.ts

Lines changed: 81 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,8 @@ function createDetailsNode(
442442
name: string,
443443
schemaName: string,
444444
schema: SchemaObject,
445-
required: string[] | boolean
445+
required: string[] | boolean,
446+
nullable: boolean | unknown
446447
): any {
447448
return create("SchemaItem", {
448449
collapsible: true,
@@ -457,15 +458,19 @@ function createDetailsNode(
457458
style: { opacity: "0.6" },
458459
children: ` ${schemaName}`,
459460
}),
460-
guard(schema.nullable && schema.nullable === true, () => [
461-
create("strong", {
462-
style: {
463-
fontSize: "var(--ifm-code-font-size)",
464-
color: "var(--openapi-nullable)",
465-
},
466-
children: " nullable",
467-
}),
468-
]),
461+
guard(
462+
(schema.nullable && schema.nullable === true) ||
463+
(nullable && nullable === true),
464+
() => [
465+
create("strong", {
466+
style: {
467+
fontSize: "var(--ifm-code-font-size)",
468+
color: "var(--openapi-nullable)",
469+
},
470+
children: " nullable",
471+
}),
472+
]
473+
),
469474
guard(
470475
Array.isArray(required)
471476
? required.includes(name)
@@ -610,7 +615,13 @@ function createEdges({
610615
}
611616

612617
if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
613-
return createDetailsNode(name, schemaName, schema, required);
618+
return createDetailsNode(
619+
name,
620+
schemaName,
621+
schema,
622+
required,
623+
schema.nullable
624+
);
614625
}
615626

616627
if (schema.allOf !== undefined) {
@@ -625,20 +636,44 @@ function createEdges({
625636
mergedSchemas.oneOf !== undefined ||
626637
mergedSchemas.anyOf !== undefined
627638
) {
628-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
639+
return createDetailsNode(
640+
name,
641+
mergedSchemaName,
642+
mergedSchemas,
643+
required,
644+
schema.nullable
645+
);
629646
}
630647

631648
if (mergedSchemas.properties !== undefined) {
632-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
649+
return createDetailsNode(
650+
name,
651+
mergedSchemaName,
652+
mergedSchemas,
653+
required,
654+
schema.nullable
655+
);
633656
}
634657

635658
if (mergedSchemas.additionalProperties !== undefined) {
636-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
659+
return createDetailsNode(
660+
name,
661+
mergedSchemaName,
662+
mergedSchemas,
663+
required,
664+
schema.nullable
665+
);
637666
}
638667

639668
// array of objects
640669
if (mergedSchemas.items?.properties !== undefined) {
641-
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
670+
return createDetailsNode(
671+
name,
672+
mergedSchemaName,
673+
mergedSchemas,
674+
required,
675+
schema.nullable
676+
);
642677
}
643678

644679
if (mergedSchemas.writeOnly && mergedSchemas.writeOnly === true) {
@@ -656,20 +691,44 @@ function createEdges({
656691
}
657692

658693
if (schema.properties !== undefined) {
659-
return createDetailsNode(name, schemaName, schema, required);
694+
return createDetailsNode(
695+
name,
696+
schemaName,
697+
schema,
698+
required,
699+
schema.nullable
700+
);
660701
}
661702

662703
if (schema.additionalProperties !== undefined) {
663-
return createDetailsNode(name, schemaName, schema, required);
704+
return createDetailsNode(
705+
name,
706+
schemaName,
707+
schema,
708+
required,
709+
schema.nullable
710+
);
664711
}
665712

666713
// array of objects
667714
if (schema.items?.properties !== undefined) {
668-
return createDetailsNode(name, schemaName, schema, required);
715+
return createDetailsNode(
716+
name,
717+
schemaName,
718+
schema,
719+
required,
720+
schema.nullable
721+
);
669722
}
670723

671724
if (schema.items?.anyOf !== undefined || schema.items?.oneOf !== undefined) {
672-
return createDetailsNode(name, schemaName, schema, required);
725+
return createDetailsNode(
726+
name,
727+
schemaName,
728+
schema,
729+
required,
730+
schema.nullable
731+
);
673732
}
674733

675734
if (schema.writeOnly && schema.writeOnly === true) {
@@ -702,7 +761,6 @@ function createNodes(schema: SchemaObject): any {
702761

703762
if (schema.allOf !== undefined) {
704763
const { mergedSchemas } = mergeAllOf(schema.allOf);
705-
706764
if (mergedSchemas.properties !== undefined) {
707765
nodes.push(createProperties(mergedSchemas));
708766
}
@@ -760,7 +818,7 @@ function createNodes(schema: SchemaObject): any {
760818

761819
// Unknown node/schema type should return undefined
762820
// So far, haven't seen this hit in testing
763-
return undefined;
821+
return "any";
764822
}
765823

766824
interface Props {
@@ -794,7 +852,8 @@ export function createResponseSchema({ title, body, ...rest }: Props) {
794852
children: mimeTypes.map((mimeType: any) => {
795853
const responseExamples = body.content![mimeType].examples;
796854
const responseExample = body.content![mimeType].example;
797-
const firstBody = body.content![mimeType].schema;
855+
const firstBody: any =
856+
body.content![mimeType].schema ?? body.content![mimeType];
798857

799858
if (
800859
firstBody === undefined &&

0 commit comments

Comments
 (0)