docusaurus-plugin-openapi-docs 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/lib/index.js +3 -3
- package/lib/markdown/createSchemaDetails.js +325 -132
- package/lib/markdown/index.js +1 -0
- package/lib/markdown/schema.js +25 -9
- package/lib/markdown/utils.d.ts +1 -1
- package/lib/markdown/utils.js +4 -1
- package/lib/openapi/openapi.d.ts +5 -5
- package/lib/openapi/openapi.js +27 -23
- package/lib/openapi/openapi.test.js +1 -1
- package/lib/openapi/types.d.ts +2 -1
- package/lib/openapi/utils/loadAndResolveSpec.d.ts +2 -0
- package/lib/openapi/utils/loadAndResolveSpec.js +112 -0
- package/lib/openapi/utils/services/OpenAPIParser.d.ts +52 -0
- package/lib/openapi/utils/services/OpenAPIParser.js +342 -0
- package/lib/openapi/utils/services/RedocNormalizedOptions.d.ts +100 -0
- package/lib/openapi/utils/services/RedocNormalizedOptions.js +170 -0
- package/lib/openapi/utils/types/index.d.ts +2 -0
- package/lib/openapi/utils/types/index.js +23 -0
- package/lib/openapi/utils/types/open-api.d.ts +305 -0
- package/lib/openapi/utils/types/open-api.js +8 -0
- package/lib/openapi/utils/utils/JsonPointer.d.ts +51 -0
- package/lib/openapi/utils/utils/JsonPointer.js +95 -0
- package/lib/openapi/utils/utils/helpers.d.ts +43 -0
- package/lib/openapi/utils/utils/helpers.js +230 -0
- package/lib/openapi/utils/utils/index.d.ts +3 -0
- package/lib/openapi/utils/utils/index.js +25 -0
- package/lib/openapi/utils/utils/openapi.d.ts +40 -0
- package/lib/openapi/utils/utils/openapi.js +605 -0
- package/lib/options.js +1 -1
- package/lib/sidebars/index.js +9 -5
- package/lib/types.d.ts +1 -1
- package/package.json +16 -11
- package/src/index.ts +3 -3
- package/src/markdown/createSchemaDetails.ts +405 -159
- package/src/markdown/index.ts +1 -0
- package/src/markdown/schema.ts +28 -8
- package/src/markdown/utils.ts +5 -2
- package/src/openapi/openapi.test.ts +1 -1
- package/src/openapi/openapi.ts +39 -29
- package/src/openapi/types.ts +2 -1
- package/src/openapi/utils/loadAndResolveSpec.ts +123 -0
- package/src/openapi/utils/services/OpenAPIParser.ts +433 -0
- package/src/openapi/utils/services/RedocNormalizedOptions.ts +330 -0
- package/src/openapi/utils/types/index.ts +10 -0
- package/src/openapi/utils/types/open-api.ts +303 -0
- package/src/openapi/utils/utils/JsonPointer.ts +99 -0
- package/src/openapi/utils/utils/helpers.ts +239 -0
- package/src/openapi/utils/utils/index.ts +11 -0
- package/src/openapi/utils/utils/openapi.ts +771 -0
- package/src/options.ts +1 -1
- package/src/sidebars/index.ts +11 -6
- package/src/types.ts +1 -1
- package/lib/openapi/utils/loadAndBundleSpec.d.ts +0 -3
- package/lib/openapi/utils/loadAndBundleSpec.js +0 -44
- package/src/openapi/utils/loadAndBundleSpec.ts +0 -62
package/README.md
CHANGED
|
@@ -81,6 +81,7 @@ Here is an example of properly configuring your `docusaurus.config.js` file for
|
|
|
81
81
|
'docusaurus-plugin-openapi-docs',
|
|
82
82
|
{
|
|
83
83
|
id: "apiDocs",
|
|
84
|
+
docsPluginId: "classic",
|
|
84
85
|
config: {
|
|
85
86
|
petstore: { // Note: petstore key is treated as the <id> and can be used to specify an API doc instance when using CLI commands
|
|
86
87
|
specPath: "examples/petstore.yaml", // Path to designated spec file
|
|
@@ -107,10 +108,10 @@ Here is an example of properly configuring your `docusaurus.config.js` file for
|
|
|
107
108
|
|
|
108
109
|
The `docusaurus-plugin-openapi-docs` plugin can be configured with the following options:
|
|
109
110
|
|
|
110
|
-
| Name
|
|
111
|
-
|
|
|
112
|
-
| `id`
|
|
113
|
-
| `
|
|
111
|
+
| Name | Type | Default | Description |
|
|
112
|
+
| -------------- | -------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
113
|
+
| `id` | `string` | `null` | A unique document id. |
|
|
114
|
+
| `docsPluginId` | `string` | `null` | The ID associated with the `plugin-content-docs` or `preset` instance used to render the OpenAPI docs (e.g. "your-plugin-id", "classic", "default"). |
|
|
114
115
|
|
|
115
116
|
### config
|
|
116
117
|
|
package/lib/index.js
CHANGED
|
@@ -54,13 +54,13 @@ function getDocsData(dataArray, filter) {
|
|
|
54
54
|
}
|
|
55
55
|
exports.getDocsData = getDocsData;
|
|
56
56
|
function pluginOpenAPIDocs(context, options) {
|
|
57
|
-
const { config,
|
|
57
|
+
const { config, docsPluginId } = options;
|
|
58
58
|
const { siteDir, siteConfig } = context;
|
|
59
59
|
// Get routeBasePath and path from plugin-content-docs or preset
|
|
60
60
|
const presets = siteConfig.presets;
|
|
61
61
|
const plugins = siteConfig.plugins;
|
|
62
62
|
const presetsPlugins = presets.concat(plugins);
|
|
63
|
-
const docData = getDocsData(presetsPlugins,
|
|
63
|
+
const docData = getDocsData(presetsPlugins, docsPluginId);
|
|
64
64
|
const docRouteBasePath = docData ? docData.routeBasePath : undefined;
|
|
65
65
|
const docPath = docData ? (docData.path ? docData.path : "docs") : undefined;
|
|
66
66
|
async function generateApiDocs(options) {
|
|
@@ -69,7 +69,7 @@ function pluginOpenAPIDocs(context, options) {
|
|
|
69
69
|
? specPath
|
|
70
70
|
: path_1.default.resolve(siteDir, specPath);
|
|
71
71
|
try {
|
|
72
|
-
const openapiFiles = await (0, openapi_1.readOpenapiFiles)(contentPath,
|
|
72
|
+
const openapiFiles = await (0, openapi_1.readOpenapiFiles)(contentPath, options);
|
|
73
73
|
const [loadedApi, tags] = await (0, openapi_1.processOpenapiFiles)(openapiFiles, sidebarOptions);
|
|
74
74
|
if (!fs_1.default.existsSync(outputDir)) {
|
|
75
75
|
try {
|
|
@@ -12,11 +12,12 @@ const createDetails_1 = require("./createDetails");
|
|
|
12
12
|
const createDetailsSummary_1 = require("./createDetailsSummary");
|
|
13
13
|
const schema_1 = require("./schema");
|
|
14
14
|
const utils_1 = require("./utils");
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
const jsonSchemaMergeAllOf = require("json-schema-merge-allof");
|
|
16
|
+
/**
|
|
17
|
+
* Returns a merged representation of allOf array of schemas.
|
|
18
|
+
*/
|
|
19
|
+
function mergeAllOf(allOf) {
|
|
20
|
+
const mergedSchemas = jsonSchemaMergeAllOf(allOf, {
|
|
20
21
|
resolvers: {
|
|
21
22
|
readOnly: function () {
|
|
22
23
|
return true;
|
|
@@ -26,9 +27,6 @@ function resolveAllOf(allOf) {
|
|
|
26
27
|
},
|
|
27
28
|
},
|
|
28
29
|
});
|
|
29
|
-
if (mergedSchemas.properties) {
|
|
30
|
-
properties = mergedSchemas.properties;
|
|
31
|
-
}
|
|
32
30
|
const required = allOf.reduce((acc, cur) => {
|
|
33
31
|
if (Array.isArray(cur.required)) {
|
|
34
32
|
const next = [...acc, ...cur.required];
|
|
@@ -36,153 +34,344 @@ function resolveAllOf(allOf) {
|
|
|
36
34
|
}
|
|
37
35
|
return acc;
|
|
38
36
|
}, []);
|
|
39
|
-
return {
|
|
37
|
+
return { mergedSchemas, required };
|
|
40
38
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
39
|
+
/**
|
|
40
|
+
* For handling nested anyOf/oneOf.
|
|
41
|
+
*/
|
|
42
|
+
function createAnyOneOf(schema) {
|
|
43
|
+
const type = schema.oneOf ? "oneOf" : "anyOf";
|
|
44
|
+
return (0, utils_1.create)("li", {
|
|
45
|
+
children: [
|
|
46
|
+
(0, utils_1.create)("div", {
|
|
47
|
+
children: [
|
|
48
|
+
(0, utils_1.create)("span", {
|
|
49
|
+
className: "badge badge--info",
|
|
50
|
+
children: type,
|
|
51
|
+
}),
|
|
52
|
+
(0, utils_1.create)("SchemaTabs", {
|
|
53
|
+
children: schema[type].map((anyOneSchema, index) => {
|
|
54
|
+
const label = anyOneSchema.title
|
|
55
|
+
? anyOneSchema.title
|
|
56
|
+
: `MOD${index + 1}`;
|
|
57
|
+
const anyOneChildren = [];
|
|
58
|
+
if (anyOneSchema.properties !== undefined) {
|
|
59
|
+
anyOneChildren.push(createProperties(anyOneSchema));
|
|
60
|
+
}
|
|
61
|
+
if (anyOneSchema.allOf !== undefined) {
|
|
62
|
+
anyOneChildren.push(createNodes(anyOneSchema));
|
|
63
|
+
}
|
|
64
|
+
if (anyOneSchema.items !== undefined) {
|
|
65
|
+
anyOneChildren.push(createItems(anyOneSchema));
|
|
66
|
+
}
|
|
67
|
+
if (anyOneSchema.type === "string" ||
|
|
68
|
+
anyOneSchema.type === "number" ||
|
|
69
|
+
anyOneSchema.type === "integer" ||
|
|
70
|
+
anyOneSchema.type === "boolean") {
|
|
71
|
+
anyOneChildren.push(createNodes(anyOneSchema));
|
|
72
|
+
}
|
|
73
|
+
if (anyOneChildren.length) {
|
|
74
|
+
return (0, utils_1.create)("TabItem", {
|
|
75
|
+
label: label,
|
|
76
|
+
value: `${index}-item-properties`,
|
|
77
|
+
children: anyOneChildren,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
81
|
}),
|
|
82
|
+
}),
|
|
83
|
+
],
|
|
84
|
+
}),
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function createProperties(schema) {
|
|
89
|
+
return Object.entries(schema.properties).map(([key, val]) => createEdges({
|
|
90
|
+
name: key,
|
|
91
|
+
schema: val,
|
|
92
|
+
required: Array.isArray(schema.required)
|
|
93
|
+
? schema.required.includes(key)
|
|
94
|
+
: false,
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
function createAdditionalProperties(schema) {
|
|
98
|
+
// TODO?:
|
|
99
|
+
// {
|
|
100
|
+
// description: 'Integration configuration. See \n' +
|
|
101
|
+
// '[Integration Configurations](https://prisma.pan.dev/api/cloud/api-integration-config/).\n',
|
|
102
|
+
// example: { webhookUrl: 'https://hooks.slack.com/abcdef' },
|
|
103
|
+
// externalDocs: { url: 'https://prisma.pan.dev/api/cloud/api-integration-config' },
|
|
104
|
+
// type: 'object'
|
|
105
|
+
// }
|
|
106
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
107
|
+
// TODO?:
|
|
108
|
+
// {
|
|
109
|
+
// items: {
|
|
110
|
+
// properties: {
|
|
111
|
+
// aliasField: [Object],
|
|
112
|
+
// displayName: [Object],
|
|
113
|
+
// fieldName: [Object],
|
|
114
|
+
// maxLength: [Object],
|
|
115
|
+
// options: [Object],
|
|
116
|
+
// redlockMapping: [Object],
|
|
117
|
+
// required: [Object],
|
|
118
|
+
// type: [Object],
|
|
119
|
+
// typeaheadUri: [Object],
|
|
120
|
+
// value: [Object]
|
|
121
|
+
// },
|
|
122
|
+
// type: 'object'
|
|
123
|
+
// },
|
|
124
|
+
// type: 'array'
|
|
125
|
+
// }
|
|
126
|
+
if (((_a = schema.additionalProperties) === null || _a === void 0 ? void 0 : _a.type) === "string" ||
|
|
127
|
+
((_b = schema.additionalProperties) === null || _b === void 0 ? void 0 : _b.type) === "object" ||
|
|
128
|
+
((_c = schema.additionalProperties) === null || _c === void 0 ? void 0 : _c.type) === "boolean" ||
|
|
129
|
+
((_d = schema.additionalProperties) === null || _d === void 0 ? void 0 : _d.type) === "integer" ||
|
|
130
|
+
((_e = schema.additionalProperties) === null || _e === void 0 ? void 0 : _e.type) === "number") {
|
|
131
|
+
const type = (_f = schema.additionalProperties) === null || _f === void 0 ? void 0 : _f.type;
|
|
132
|
+
const additionalProperties = (_g = schema.additionalProperties) === null || _g === void 0 ? void 0 : _g.additionalProperties;
|
|
133
|
+
if (additionalProperties !== undefined) {
|
|
134
|
+
const type = (_j = (_h = schema.additionalProperties) === null || _h === void 0 ? void 0 : _h.additionalProperties) === null || _j === void 0 ? void 0 : _j.type;
|
|
135
|
+
const format = (_l = (_k = schema.additionalProperties) === null || _k === void 0 ? void 0 : _k.additionalProperties) === null || _l === void 0 ? void 0 : _l.format;
|
|
136
|
+
return (0, utils_1.create)("li", {
|
|
137
|
+
children: (0, utils_1.create)("div", {
|
|
138
|
+
children: [
|
|
139
|
+
(0, utils_1.create)("code", { children: `property name*` }),
|
|
140
|
+
(0, utils_1.guard)(type, (type) => (0, utils_1.create)("span", {
|
|
141
|
+
style: { opacity: "0.6" },
|
|
142
|
+
children: ` ${type}`,
|
|
143
|
+
})),
|
|
144
|
+
(0, utils_1.guard)(format, (format) => (0, utils_1.create)("span", {
|
|
145
|
+
style: { opacity: "0.6" },
|
|
146
|
+
children: ` (${format})`,
|
|
147
|
+
})),
|
|
148
|
+
(0, utils_1.guard)((0, schema_1.getQualifierMessage)(schema.additionalProperties), (message) => (0, utils_1.create)("div", {
|
|
149
|
+
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
150
|
+
children: (0, createDescription_1.createDescription)(message),
|
|
151
|
+
})),
|
|
82
152
|
],
|
|
83
153
|
}),
|
|
84
|
-
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return (0, utils_1.create)("li", {
|
|
157
|
+
children: (0, utils_1.create)("div", {
|
|
158
|
+
children: [
|
|
159
|
+
(0, utils_1.create)("code", { children: `property name*` }),
|
|
160
|
+
(0, utils_1.guard)(type, (type) => (0, utils_1.create)("span", {
|
|
161
|
+
style: { opacity: "0.6" },
|
|
162
|
+
children: ` ${type}`,
|
|
163
|
+
})),
|
|
164
|
+
(0, utils_1.guard)((0, schema_1.getQualifierMessage)(schema.additionalProperties), (message) => (0, utils_1.create)("div", {
|
|
165
|
+
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
166
|
+
children: (0, createDescription_1.createDescription)(message),
|
|
167
|
+
})),
|
|
168
|
+
],
|
|
169
|
+
}),
|
|
85
170
|
});
|
|
86
171
|
}
|
|
172
|
+
return Object.entries(schema.additionalProperties).map(([key, val]) => createEdges({
|
|
173
|
+
name: key,
|
|
174
|
+
schema: val,
|
|
175
|
+
required: Array.isArray(schema.required)
|
|
176
|
+
? schema.required.includes(key)
|
|
177
|
+
: false,
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
// TODO: figure out how to handle array of objects
|
|
181
|
+
function createItems(schema) {
|
|
182
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
183
|
+
if (((_a = schema.items) === null || _a === void 0 ? void 0 : _a.properties) !== undefined) {
|
|
184
|
+
return createProperties(schema.items);
|
|
185
|
+
}
|
|
186
|
+
if (((_b = schema.items) === null || _b === void 0 ? void 0 : _b.additionalProperties) !== undefined) {
|
|
187
|
+
return createAdditionalProperties(schema.items);
|
|
188
|
+
}
|
|
189
|
+
if (((_c = schema.items) === null || _c === void 0 ? void 0 : _c.oneOf) !== undefined || ((_d = schema.items) === null || _d === void 0 ? void 0 : _d.anyOf) !== undefined) {
|
|
190
|
+
return createAnyOneOf(schema.items);
|
|
191
|
+
}
|
|
192
|
+
if (((_e = schema.items) === null || _e === void 0 ? void 0 : _e.allOf) !== undefined) {
|
|
193
|
+
const { mergedSchemas } = mergeAllOf((_f = schema.items) === null || _f === void 0 ? void 0 : _f.allOf);
|
|
194
|
+
// Handles combo anyOf/oneOf + properties
|
|
195
|
+
if ((mergedSchemas.oneOf !== undefined ||
|
|
196
|
+
mergedSchemas.anyOf !== undefined) &&
|
|
197
|
+
mergedSchemas.properties) {
|
|
198
|
+
return (0, utils_1.create)("div", {
|
|
199
|
+
children: [
|
|
200
|
+
createAnyOneOf(mergedSchemas),
|
|
201
|
+
createProperties(mergedSchemas),
|
|
202
|
+
],
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Handles only anyOf/oneOf
|
|
206
|
+
if (mergedSchemas.oneOf !== undefined ||
|
|
207
|
+
mergedSchemas.anyOf !== undefined) {
|
|
208
|
+
return (0, utils_1.create)("div", {
|
|
209
|
+
children: [
|
|
210
|
+
createAnyOneOf(mergedSchemas),
|
|
211
|
+
createProperties(mergedSchemas),
|
|
212
|
+
],
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (((_g = schema.items) === null || _g === void 0 ? void 0 : _g.type) === "string" ||
|
|
217
|
+
((_h = schema.items) === null || _h === void 0 ? void 0 : _h.type) === "number" ||
|
|
218
|
+
((_j = schema.items) === null || _j === void 0 ? void 0 : _j.type) === "integer" ||
|
|
219
|
+
((_k = schema.items) === null || _k === void 0 ? void 0 : _k.type) === "boolean") {
|
|
220
|
+
return createNodes(schema.items);
|
|
221
|
+
}
|
|
222
|
+
// TODO: clean this up or eliminate it?
|
|
223
|
+
return Object.entries(schema.items).map(([key, val]) => createEdges({
|
|
224
|
+
name: key,
|
|
225
|
+
schema: val,
|
|
226
|
+
required: Array.isArray(schema.required)
|
|
227
|
+
? schema.required.includes(key)
|
|
228
|
+
: false,
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
function createDetailsNode(name, schemaName, schema, required) {
|
|
232
|
+
return (0, utils_1.create)("SchemaItem", {
|
|
233
|
+
collapsible: true,
|
|
234
|
+
className: "schemaItem",
|
|
235
|
+
children: [
|
|
236
|
+
(0, createDetails_1.createDetails)({
|
|
237
|
+
children: [
|
|
238
|
+
(0, createDetailsSummary_1.createDetailsSummary)({
|
|
239
|
+
children: [
|
|
240
|
+
(0, utils_1.create)("strong", { children: name }),
|
|
241
|
+
(0, utils_1.create)("span", {
|
|
242
|
+
style: { opacity: "0.6" },
|
|
243
|
+
children: ` ${schemaName}`,
|
|
244
|
+
}),
|
|
245
|
+
(0, utils_1.guard)(required, () => [
|
|
246
|
+
(0, utils_1.create)("strong", {
|
|
247
|
+
style: {
|
|
248
|
+
fontSize: "var(--ifm-code-font-size)",
|
|
249
|
+
color: "var(--openapi-required)",
|
|
250
|
+
},
|
|
251
|
+
children: " required",
|
|
252
|
+
}),
|
|
253
|
+
]),
|
|
254
|
+
],
|
|
255
|
+
}),
|
|
256
|
+
(0, utils_1.create)("div", {
|
|
257
|
+
style: { marginLeft: "1rem" },
|
|
258
|
+
children: [
|
|
259
|
+
(0, utils_1.guard)((0, schema_1.getQualifierMessage)(schema), (message) => (0, utils_1.create)("div", {
|
|
260
|
+
style: { marginTop: ".5rem", marginBottom: ".5rem" },
|
|
261
|
+
children: (0, createDescription_1.createDescription)(message),
|
|
262
|
+
})),
|
|
263
|
+
(0, utils_1.guard)(schema.description, (description) => (0, utils_1.create)("div", {
|
|
264
|
+
style: { marginTop: ".5rem", marginBottom: ".5rem" },
|
|
265
|
+
children: (0, createDescription_1.createDescription)(description),
|
|
266
|
+
})),
|
|
267
|
+
createNodes(schema),
|
|
268
|
+
],
|
|
269
|
+
}),
|
|
270
|
+
],
|
|
271
|
+
}),
|
|
272
|
+
],
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Creates the edges or "leaves" of a schema tree. Edges can branch into sub-nodes with createDetails().
|
|
277
|
+
*/
|
|
278
|
+
function createEdges({ name, schema, required }) {
|
|
279
|
+
var _a;
|
|
280
|
+
const schemaName = (0, schema_1.getSchemaName)(schema);
|
|
281
|
+
if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
|
|
282
|
+
return createDetailsNode(name, schemaName, schema, required);
|
|
283
|
+
}
|
|
284
|
+
if (schema.allOf !== undefined) {
|
|
285
|
+
const { mergedSchemas, required, } = mergeAllOf(schema.allOf);
|
|
286
|
+
const mergedSchemaName = (0, schema_1.getSchemaName)(mergedSchemas);
|
|
287
|
+
if (mergedSchemas.oneOf !== undefined ||
|
|
288
|
+
mergedSchemas.anyOf !== undefined) {
|
|
289
|
+
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
|
|
290
|
+
}
|
|
291
|
+
if (mergedSchemas.properties !== undefined) {
|
|
292
|
+
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
|
|
293
|
+
}
|
|
294
|
+
if (mergedSchemas.additionalProperties !== undefined) {
|
|
295
|
+
return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
|
|
296
|
+
}
|
|
297
|
+
return (0, utils_1.create)("SchemaItem", {
|
|
298
|
+
collapsible: false,
|
|
299
|
+
name,
|
|
300
|
+
required,
|
|
301
|
+
schemaDescription: mergedSchemas.description,
|
|
302
|
+
schemaName: schemaName,
|
|
303
|
+
qualifierMessage: (0, schema_1.getQualifierMessage)(schema),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
if (schema.properties !== undefined) {
|
|
307
|
+
return createDetailsNode(name, schemaName, schema, required);
|
|
308
|
+
}
|
|
309
|
+
if (schema.additionalProperties !== undefined) {
|
|
310
|
+
return createDetailsNode(name, schemaName, schema, required);
|
|
311
|
+
}
|
|
312
|
+
// array of objects
|
|
313
|
+
if (((_a = schema.items) === null || _a === void 0 ? void 0 : _a.properties) !== undefined) {
|
|
314
|
+
return createDetailsNode(name, schemaName, schema, required);
|
|
315
|
+
}
|
|
316
|
+
// primitives and array of non-objects
|
|
87
317
|
return (0, utils_1.create)("SchemaItem", {
|
|
88
318
|
collapsible: false,
|
|
89
319
|
name,
|
|
90
320
|
required,
|
|
91
321
|
schemaDescription: schema.description,
|
|
92
|
-
schemaName:
|
|
322
|
+
schemaName: schemaName,
|
|
93
323
|
qualifierMessage: (0, schema_1.getQualifierMessage)(schema),
|
|
94
324
|
});
|
|
95
325
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
schema: val,
|
|
103
|
-
required: Array.isArray(schema.required)
|
|
104
|
-
? schema.required.includes(key)
|
|
105
|
-
: false,
|
|
106
|
-
})),
|
|
107
|
-
});
|
|
326
|
+
/**
|
|
327
|
+
* Creates a hierarchical level of a schema tree. Nodes produce edges that can branch into sub-nodes with edges, recursively.
|
|
328
|
+
*/
|
|
329
|
+
function createNodes(schema) {
|
|
330
|
+
if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
|
|
331
|
+
return createAnyOneOf(schema);
|
|
108
332
|
}
|
|
109
|
-
// TODO: This can be a bit complicated types can be missmatched and there can be nested allOfs which need to be resolved before merging properties
|
|
110
333
|
if (schema.allOf !== undefined) {
|
|
111
|
-
const {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
name: key,
|
|
123
|
-
schema: val,
|
|
124
|
-
required: Array.isArray(required)
|
|
125
|
-
? required.includes(key)
|
|
126
|
-
: false,
|
|
127
|
-
})),
|
|
128
|
-
}),
|
|
129
|
-
],
|
|
130
|
-
});
|
|
334
|
+
const { mergedSchemas } = mergeAllOf(schema.allOf);
|
|
335
|
+
// allOf seems to always result in properties
|
|
336
|
+
if (mergedSchemas.properties !== undefined) {
|
|
337
|
+
return createProperties(mergedSchemas);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (schema.properties !== undefined) {
|
|
341
|
+
return createProperties(schema);
|
|
342
|
+
}
|
|
343
|
+
if (schema.additionalProperties !== undefined) {
|
|
344
|
+
return createAdditionalProperties(schema);
|
|
131
345
|
}
|
|
132
|
-
// array
|
|
346
|
+
// TODO: figure out how to handle array of objects
|
|
133
347
|
if (schema.items !== undefined) {
|
|
134
|
-
return
|
|
348
|
+
return createItems(schema);
|
|
135
349
|
}
|
|
136
350
|
// primitive
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
function createRowsRoot({ schema }) {
|
|
140
|
-
// object
|
|
141
|
-
if (schema.properties !== undefined) {
|
|
142
|
-
return Object.entries(schema.properties).map(([key, val]) => createRow({
|
|
143
|
-
name: key,
|
|
144
|
-
schema: val,
|
|
145
|
-
required: Array.isArray(schema.required)
|
|
146
|
-
? schema.required.includes(key)
|
|
147
|
-
: false,
|
|
148
|
-
}));
|
|
149
|
-
}
|
|
150
|
-
// TODO: This can be a bit complicated types can be missmatched and there can be nested allOfs which need to be resolved before merging properties
|
|
151
|
-
if (schema.allOf !== undefined) {
|
|
152
|
-
const { properties, required } = resolveAllOf(schema.allOf);
|
|
153
|
-
return Object.entries(properties).map(([key, val]) => createRow({
|
|
154
|
-
name: key,
|
|
155
|
-
schema: val,
|
|
156
|
-
required: Array.isArray(required) ? required.includes(key) : false,
|
|
157
|
-
}));
|
|
158
|
-
}
|
|
159
|
-
// array
|
|
160
|
-
if (schema.items !== undefined) {
|
|
351
|
+
if (schema.type !== undefined) {
|
|
161
352
|
return (0, utils_1.create)("li", {
|
|
162
353
|
children: (0, utils_1.create)("div", {
|
|
163
|
-
children: [
|
|
354
|
+
children: [
|
|
355
|
+
(0, utils_1.create)("strong", { children: schema.type }),
|
|
356
|
+
(0, utils_1.guard)(schema.format, (format) => (0, utils_1.create)("span", {
|
|
357
|
+
style: { opacity: "0.6" },
|
|
358
|
+
children: ` ${format}`,
|
|
359
|
+
})),
|
|
360
|
+
(0, utils_1.guard)((0, schema_1.getQualifierMessage)(schema), (message) => (0, utils_1.create)("div", {
|
|
361
|
+
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
362
|
+
children: (0, createDescription_1.createDescription)(message),
|
|
363
|
+
})),
|
|
364
|
+
(0, utils_1.guard)(schema.description, (description) => (0, utils_1.create)("div", {
|
|
365
|
+
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
366
|
+
children: (0, createDescription_1.createDescription)(description),
|
|
367
|
+
})),
|
|
368
|
+
],
|
|
164
369
|
}),
|
|
165
370
|
});
|
|
166
371
|
}
|
|
167
|
-
//
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
children: [
|
|
171
|
-
(0, utils_1.create)("span", {
|
|
172
|
-
style: { opacity: "0.6" },
|
|
173
|
-
children: ` ${schema.type}`,
|
|
174
|
-
}),
|
|
175
|
-
(0, utils_1.guard)((0, schema_1.getQualifierMessage)(schema), (message) => (0, utils_1.create)("div", {
|
|
176
|
-
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
177
|
-
children: (0, createDescription_1.createDescription)(message),
|
|
178
|
-
})),
|
|
179
|
-
(0, utils_1.guard)(schema.description, (description) => (0, utils_1.create)("div", {
|
|
180
|
-
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
181
|
-
children: (0, createDescription_1.createDescription)(description),
|
|
182
|
-
})),
|
|
183
|
-
],
|
|
184
|
-
}),
|
|
185
|
-
});
|
|
372
|
+
// Unknown node/schema type should return undefined
|
|
373
|
+
// So far, haven't seen this hit in testing
|
|
374
|
+
return undefined;
|
|
186
375
|
}
|
|
187
376
|
function createSchemaDetails({ title, body, ...rest }) {
|
|
188
377
|
if (body === undefined ||
|
|
@@ -191,7 +380,6 @@ function createSchemaDetails({ title, body, ...rest }) {
|
|
|
191
380
|
Object.keys(body.content).length === 0) {
|
|
192
381
|
return undefined;
|
|
193
382
|
}
|
|
194
|
-
// TODO:
|
|
195
383
|
// NOTE: We just pick a random content-type.
|
|
196
384
|
// How common is it to have multiple?
|
|
197
385
|
const randomFirstKey = Object.keys(body.content)[0];
|
|
@@ -205,6 +393,7 @@ function createSchemaDetails({ title, body, ...rest }) {
|
|
|
205
393
|
return undefined;
|
|
206
394
|
}
|
|
207
395
|
}
|
|
396
|
+
// Root-level schema dropdown
|
|
208
397
|
return (0, createDetails_1.createDetails)({
|
|
209
398
|
"data-collapsed": false,
|
|
210
399
|
open: true,
|
|
@@ -214,6 +403,10 @@ function createSchemaDetails({ title, body, ...rest }) {
|
|
|
214
403
|
style: { textAlign: "left" },
|
|
215
404
|
children: [
|
|
216
405
|
(0, utils_1.create)("strong", { children: `${title}` }),
|
|
406
|
+
(0, utils_1.guard)(firstBody.type === "array", (format) => (0, utils_1.create)("span", {
|
|
407
|
+
style: { opacity: "0.6" },
|
|
408
|
+
children: ` array`,
|
|
409
|
+
})),
|
|
217
410
|
(0, utils_1.guard)(body.required, () => [
|
|
218
411
|
(0, utils_1.create)("strong", {
|
|
219
412
|
style: {
|
|
@@ -238,7 +431,7 @@ function createSchemaDetails({ title, body, ...rest }) {
|
|
|
238
431
|
}),
|
|
239
432
|
(0, utils_1.create)("ul", {
|
|
240
433
|
style: { marginLeft: "1rem" },
|
|
241
|
-
children:
|
|
434
|
+
children: createNodes(firstBody),
|
|
242
435
|
}),
|
|
243
436
|
],
|
|
244
437
|
});
|
package/lib/markdown/index.js
CHANGED
|
@@ -24,6 +24,7 @@ function createApiPageMD({ title, api: { deprecated, "x-deprecated-description":
|
|
|
24
24
|
`import ParamsItem from "@theme/ParamsItem";\n`,
|
|
25
25
|
`import SchemaItem from "@theme/SchemaItem"\n`,
|
|
26
26
|
`import ApiTabs from "@theme/ApiTabs";\n`,
|
|
27
|
+
`import SchemaTabs from "@theme/SchemaTabs";\n`,
|
|
27
28
|
`import TabItem from "@theme/TabItem";\n\n`,
|
|
28
29
|
`## ${(0, lodash_1.escape)(title)}\n\n`,
|
|
29
30
|
(0, createDeprecationNotice_1.createDeprecationNotice)({ deprecated, description: deprecatedDescription }),
|
package/lib/markdown/schema.js
CHANGED
|
@@ -8,22 +8,34 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.getQualifierMessage = exports.getSchemaName = void 0;
|
|
10
10
|
function prettyName(schema, circular) {
|
|
11
|
-
var _a, _b, _c;
|
|
12
|
-
if (schema.$ref) {
|
|
13
|
-
return schema.$ref.replace("#/components/schemas/", "") + circular
|
|
14
|
-
? " (circular)"
|
|
15
|
-
: "";
|
|
16
|
-
}
|
|
11
|
+
var _a, _b, _c, _d, _e;
|
|
17
12
|
if (schema.format) {
|
|
18
13
|
return schema.format;
|
|
19
14
|
}
|
|
20
15
|
if (schema.allOf) {
|
|
16
|
+
if (typeof schema.allOf[0] === "string") {
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
if (schema.allOf[0].includes("circular")) {
|
|
19
|
+
return schema.allOf[0];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return "object";
|
|
23
|
+
}
|
|
24
|
+
if (schema.oneOf) {
|
|
25
|
+
return "object";
|
|
26
|
+
}
|
|
27
|
+
if (schema.anyOf) {
|
|
21
28
|
return "object";
|
|
22
29
|
}
|
|
23
30
|
if (schema.type === "object") {
|
|
24
31
|
return (_b = (_a = schema.xml) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : schema.type;
|
|
32
|
+
// return schema.type;
|
|
33
|
+
}
|
|
34
|
+
if (schema.type === "array") {
|
|
35
|
+
return (_d = (_c = schema.xml) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : schema.type;
|
|
36
|
+
// return schema.type;
|
|
25
37
|
}
|
|
26
|
-
return (
|
|
38
|
+
return (_e = schema.title) !== null && _e !== void 0 ? _e : schema.type;
|
|
27
39
|
}
|
|
28
40
|
function getSchemaName(schema, circular) {
|
|
29
41
|
var _a;
|
|
@@ -35,8 +47,6 @@ function getSchemaName(schema, circular) {
|
|
|
35
47
|
exports.getSchemaName = getSchemaName;
|
|
36
48
|
function getQualifierMessage(schema) {
|
|
37
49
|
// TODO:
|
|
38
|
-
// - maxItems
|
|
39
|
-
// - minItems
|
|
40
50
|
// - uniqueItems
|
|
41
51
|
// - maxProperties
|
|
42
52
|
// - minProperties
|
|
@@ -92,6 +102,12 @@ function getQualifierMessage(schema) {
|
|
|
92
102
|
if (schema.enum) {
|
|
93
103
|
qualifierGroups.push(`[${schema.enum.map((e) => `\`${e}\``).join(", ")}]`);
|
|
94
104
|
}
|
|
105
|
+
if (schema.minItems) {
|
|
106
|
+
qualifierGroups.push(`items >= ${schema.minItems}`);
|
|
107
|
+
}
|
|
108
|
+
if (schema.maxItems) {
|
|
109
|
+
qualifierGroups.push(`items <= ${schema.maxItems}`);
|
|
110
|
+
}
|
|
95
111
|
if (qualifierGroups.length === 0) {
|
|
96
112
|
return undefined;
|
|
97
113
|
}
|
package/lib/markdown/utils.d.ts
CHANGED