Skip to content

Commit f10ceb8

Browse files
committed
migrate to allof-merge library to improve merging
1 parent 6c6071e commit f10ceb8

File tree

8 files changed

+1352
-1370
lines changed

8 files changed

+1352
-1370
lines changed

packages/docusaurus-plugin-openapi-docs/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@
4242
"@docusaurus/utils": "^3.5.0",
4343
"@docusaurus/utils-validation": "^3.5.0",
4444
"@redocly/openapi-core": "^1.10.5",
45+
"allof-merge": "^0.6.6",
4546
"chalk": "^4.1.2",
4647
"clsx": "^1.1.1",
4748
"fs-extra": "^9.0.1",
4849
"json-pointer": "^0.6.2",
49-
"json-schema-merge-allof": "^0.8.1",
5050
"json5": "^2.2.3",
5151
"lodash": "^4.17.20",
5252
"mustache": "^4.2.0",

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

+28-60
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* LICENSE file in the root directory of this source tree.
66
* ========================================================================== */
77

8+
// eslint-disable-next-line import/no-extraneous-dependencies
9+
import { merge } from "allof-merge";
810
import clsx from "clsx";
911
import isEmpty from "lodash/isEmpty";
1012

@@ -19,41 +21,18 @@ import { getQualifierMessage, getSchemaName } from "./schema";
1921
import { create, guard } from "./utils";
2022
import { SchemaObject } from "../openapi/types";
2123

22-
const jsonSchemaMergeAllOf = require("json-schema-merge-allof");
23-
2424
let SCHEMA_TYPE: "request" | "response";
2525

2626
/**
2727
* Returns a merged representation of allOf array of schemas.
2828
*/
29-
export function mergeAllOf(allOf: SchemaObject[]) {
30-
const mergedSchemas = jsonSchemaMergeAllOf(allOf, {
31-
resolvers: {
32-
readOnly: function () {
33-
return true;
34-
},
35-
writeOnly: function () {
36-
return true;
37-
},
38-
example: function () {
39-
return true;
40-
},
41-
"x-examples": function () {
42-
return true;
43-
},
44-
},
45-
ignoreAdditionalProperties: true,
46-
});
47-
48-
const mergedRequired = allOf.reduce((acc, cur) => {
49-
if (Array.isArray(cur.required)) {
50-
const next = [...acc, ...cur.required];
51-
return next;
52-
}
53-
return acc;
54-
}, [] as any);
29+
export function mergeAllOf(allOf: SchemaObject) {
30+
const onMergeError = (msg: string) => {
31+
console.warn(msg);
32+
};
5533

56-
return { mergedSchemas, mergedRequired };
34+
const mergedSchemas = merge(allOf, { onMergeError });
35+
return mergedSchemas;
5736
}
5837

5938
/**
@@ -271,10 +250,7 @@ function createItems(schema: SchemaObject) {
271250

272251
if (schema.items?.allOf !== undefined) {
273252
// TODO: figure out if and how we should pass merged required array
274-
const {
275-
mergedSchemas,
276-
}: { mergedSchemas: SchemaObject; mergedRequired: string[] | boolean } =
277-
mergeAllOf(schema.items?.allOf);
253+
const mergedSchemas = mergeAllOf(schema.items) as SchemaObject;
278254

279255
// Handles combo anyOf/oneOf + properties
280256
if (
@@ -684,60 +660,52 @@ function createEdges({
684660
}
685661

686662
if (schema.allOf !== undefined) {
687-
const { mergedSchemas }: { mergedSchemas: SchemaObject } = mergeAllOf(
688-
schema.allOf
689-
);
690-
delete schema.allOf;
691-
const combinedSchemas = { ...schema, ...mergedSchemas };
663+
const mergedSchemas = mergeAllOf(schema) as SchemaObject;
692664

693665
if (SCHEMA_TYPE === "request") {
694-
if (combinedSchemas.readOnly && combinedSchemas.readOnly === true) {
666+
if (mergedSchemas.readOnly && mergedSchemas.readOnly === true) {
695667
return undefined;
696668
}
697669
}
698670

699671
if (SCHEMA_TYPE === "response") {
700-
if (combinedSchemas.writeOnly && combinedSchemas.writeOnly === true) {
672+
if (mergedSchemas.writeOnly && mergedSchemas.writeOnly === true) {
701673
return undefined;
702674
}
703675
}
704676

705-
const mergedSchemaName = getSchemaName(combinedSchemas);
706-
707-
if (name === "eventName") {
708-
console.log(mergedSchemaName, combinedSchemas);
709-
}
677+
const mergedSchemaName = getSchemaName(mergedSchemas);
710678

711679
if (
712-
combinedSchemas.oneOf !== undefined ||
713-
combinedSchemas.anyOf !== undefined
680+
mergedSchemas.oneOf !== undefined ||
681+
mergedSchemas.anyOf !== undefined
714682
) {
715683
return createDetailsNode(
716684
name,
717685
mergedSchemaName,
718-
combinedSchemas,
686+
mergedSchemas,
719687
required,
720-
combinedSchemas.nullable
688+
mergedSchemas.nullable
721689
);
722690
}
723691

724-
if (combinedSchemas.properties !== undefined) {
692+
if (mergedSchemas.properties !== undefined) {
725693
return createDetailsNode(
726694
name,
727695
mergedSchemaName,
728-
combinedSchemas,
696+
mergedSchemas,
729697
required,
730-
combinedSchemas.nullable
698+
mergedSchemas.nullable
731699
);
732700
}
733701

734-
if (combinedSchemas.additionalProperties !== undefined) {
702+
if (mergedSchemas.additionalProperties !== undefined) {
735703
return createDetailsNode(
736704
name,
737705
mergedSchemaName,
738-
combinedSchemas,
706+
mergedSchemas,
739707
required,
740-
combinedSchemas.nullable
708+
mergedSchemas.nullable
741709
);
742710
}
743711

@@ -746,9 +714,9 @@ function createEdges({
746714
return createDetailsNode(
747715
name,
748716
mergedSchemaName,
749-
combinedSchemas,
717+
mergedSchemas,
750718
required,
751-
combinedSchemas.nullable
719+
mergedSchemas.nullable
752720
);
753721
}
754722

@@ -757,8 +725,8 @@ function createEdges({
757725
name,
758726
required: Array.isArray(required) ? required.includes(name) : required,
759727
schemaName: mergedSchemaName,
760-
qualifierMessage: getQualifierMessage(combinedSchemas),
761-
schema: combinedSchemas,
728+
qualifierMessage: getQualifierMessage(mergedSchemas),
729+
schema: mergedSchemas,
762730
});
763731
}
764732

@@ -815,7 +783,7 @@ export function createNodes(
815783
}
816784

817785
if (schema.allOf !== undefined) {
818-
const { mergedSchemas } = mergeAllOf(schema.allOf);
786+
const mergedSchemas = mergeAllOf(schema) as SchemaObject;
819787

820788
if (
821789
mergedSchemas.oneOf !== undefined ||

packages/docusaurus-plugin-openapi-docs/src/openapi/createRequestExample.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ function sampleRequestFromProp(name: string, prop: any, obj: any): any {
6666
} else if (prop.anyOf) {
6767
obj[name] = sampleRequestFromSchema(prop.anyOf[0]);
6868
} else if (prop.allOf) {
69-
const { mergedSchemas }: { mergedSchemas: SchemaObject } = mergeAllOf(
70-
prop.allOf
71-
);
69+
const mergedSchemas = mergeAllOf(prop.allOf) as SchemaObject;
7270
sampleRequestFromProp(name, mergedSchemas, obj);
7371
} else {
7472
obj[name] = sampleRequestFromSchema(prop);
@@ -107,8 +105,7 @@ export const sampleRequestFromSchema = (schema: SchemaObject = {}): any => {
107105
}
108106

109107
if (allOf) {
110-
const { mergedSchemas }: { mergedSchemas: SchemaObject } =
111-
mergeAllOf(allOf);
108+
const mergedSchemas = mergeAllOf(allOf) as SchemaObject;
112109
if (mergedSchemas.properties) {
113110
for (const [key, value] of Object.entries(mergedSchemas.properties)) {
114111
if ((value.readOnly && value.readOnly === true) || value.deprecated) {

packages/docusaurus-plugin-openapi-docs/src/openapi/createResponseExample.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ function sampleResponseFromProp(name: string, prop: any, obj: any): any {
6666
} else if (prop.anyOf) {
6767
obj[name] = sampleResponseFromSchema(prop.anyOf[0]);
6868
} else if (prop.allOf) {
69-
const { mergedSchemas }: { mergedSchemas: SchemaObject } = mergeAllOf(
70-
prop.allOf
71-
);
69+
const mergedSchemas = mergeAllOf(prop) as SchemaObject;
7270
sampleResponseFromProp(name, mergedSchemas, obj);
7371
} else {
7472
obj[name] = sampleResponseFromSchema(prop);
@@ -87,8 +85,7 @@ export const sampleResponseFromSchema = (schema: SchemaObject = {}): any => {
8785
}
8886

8987
if (allOf) {
90-
const { mergedSchemas }: { mergedSchemas: SchemaObject } =
91-
mergeAllOf(allOf);
88+
const mergedSchemas = mergeAllOf(allOf) as SchemaObject;
9289
if (mergedSchemas.properties) {
9390
for (const [key, value] of Object.entries(mergedSchemas.properties)) {
9491
if (

packages/docusaurus-theme-openapi-docs/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"@docusaurus/theme-common": "^3.5.0",
4040
"@hookform/error-message": "^2.0.1",
4141
"@reduxjs/toolkit": "^1.7.1",
42+
"allof-merge": "^0.6.6",
4243
"clsx": "^1.1.1",
4344
"copy-text-to-clipboard": "^3.1.0",
4445
"crypto-js": "^4.1.1",

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ const ResponseSchemaComponent: React.FC<Props> = ({
104104
)}
105105
</div>
106106
<ul style={{ marginLeft: "1rem" }}>
107-
<SchemaNode schema={firstBody} schemaType="request" />
107+
<SchemaNode schema={firstBody} schemaType="response" />
108108
</ul>
109109
</Details>
110110
</TabItem>

0 commit comments

Comments
 (0)