docusaurus-theme-openapi-docs 0.0.0-1105 → 0.0.0-1106
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/lib/markdown/schema.js +47 -5
- package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamMultiSelectFormItem.js +2 -1
- package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamSelectFormItem.js +2 -1
- package/lib/theme/ApiExplorer/ParamOptions/index.d.ts +5 -0
- package/lib/theme/ApiExplorer/ParamOptions/index.js +24 -2
- package/package.json +3 -3
- package/src/markdown/schema.ts +53 -5
- package/src/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamMultiSelectFormItem.tsx +2 -1
- package/src/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamSelectFormItem.tsx +2 -1
- package/src/theme/ApiExplorer/ParamOptions/index.tsx +27 -2
package/lib/markdown/schema.js
CHANGED
|
@@ -10,6 +10,38 @@ exports.getSchemaName = getSchemaName;
|
|
|
10
10
|
exports.getQualifierMessage = getQualifierMessage;
|
|
11
11
|
const Translate_1 = require("@docusaurus/Translate");
|
|
12
12
|
const translationIds_1 = require("../theme/translationIds");
|
|
13
|
+
/**
|
|
14
|
+
* Extracts enum values from a schema, including when wrapped in allOf.
|
|
15
|
+
*/
|
|
16
|
+
function getEnumFromSchema(schema) {
|
|
17
|
+
if (schema.enum) {
|
|
18
|
+
return schema.enum;
|
|
19
|
+
}
|
|
20
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
21
|
+
for (const item of schema.allOf) {
|
|
22
|
+
if (item.enum) {
|
|
23
|
+
return item.enum;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extracts the type from a schema, including when wrapped in allOf.
|
|
31
|
+
*/
|
|
32
|
+
function getTypeFromSchema(schema) {
|
|
33
|
+
if (schema.type) {
|
|
34
|
+
return schema.type;
|
|
35
|
+
}
|
|
36
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
37
|
+
for (const item of schema.allOf) {
|
|
38
|
+
if (item.type) {
|
|
39
|
+
return item.type;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
13
45
|
function prettyName(schema, circular) {
|
|
14
46
|
// Handle enum-only schemas (valid in JSON Schema)
|
|
15
47
|
// When enum is present without explicit type, treat as string
|
|
@@ -26,6 +58,12 @@ function prettyName(schema, circular) {
|
|
|
26
58
|
return schema.allOf[0];
|
|
27
59
|
}
|
|
28
60
|
}
|
|
61
|
+
// Check if allOf contains an enum - if so, return the type from allOf
|
|
62
|
+
const enumFromAllOf = getEnumFromSchema(schema);
|
|
63
|
+
if (enumFromAllOf) {
|
|
64
|
+
const typeFromAllOf = getTypeFromSchema(schema);
|
|
65
|
+
return typeFromAllOf ?? "string";
|
|
66
|
+
}
|
|
29
67
|
return "object";
|
|
30
68
|
}
|
|
31
69
|
if (schema.oneOf) {
|
|
@@ -72,9 +110,11 @@ function getQualifierMessage(schema) {
|
|
|
72
110
|
message: "Possible values:",
|
|
73
111
|
})}** `;
|
|
74
112
|
let qualifierGroups = [];
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
113
|
+
// Check for enum in array items (directly or inside allOf)
|
|
114
|
+
if (schema.items) {
|
|
115
|
+
const itemsEnum = getEnumFromSchema(schema.items);
|
|
116
|
+
if (itemsEnum) {
|
|
117
|
+
qualifierGroups.push(`[${itemsEnum.map((e) => `\`${e}\``).join(", ")}]`);
|
|
78
118
|
}
|
|
79
119
|
}
|
|
80
120
|
if (schema.minLength || schema.maxLength) {
|
|
@@ -146,8 +186,10 @@ function getQualifierMessage(schema) {
|
|
|
146
186
|
const values = Object.keys(discriminator.mapping);
|
|
147
187
|
qualifierGroups.push(`[${values.map((e) => `\`${e}\``).join(", ")}]`);
|
|
148
188
|
}
|
|
149
|
-
|
|
150
|
-
|
|
189
|
+
// Check for enum directly on schema or inside allOf
|
|
190
|
+
const schemaEnum = getEnumFromSchema(schema);
|
|
191
|
+
if (schemaEnum) {
|
|
192
|
+
qualifierGroups.push(`[${schemaEnum.map((e) => `\`${e}\``).join(", ")}]`);
|
|
151
193
|
}
|
|
152
194
|
if (schema.minItems) {
|
|
153
195
|
qualifierGroups.push(`\`>= ${schema.minItems}\``);
|
|
@@ -18,6 +18,7 @@ const error_message_1 = require("@hookform/error-message");
|
|
|
18
18
|
const FormMultiSelect_1 = __importDefault(
|
|
19
19
|
require("@theme/ApiExplorer/FormMultiSelect")
|
|
20
20
|
);
|
|
21
|
+
const ParamOptions_1 = require("@theme/ApiExplorer/ParamOptions");
|
|
21
22
|
const slice_1 = require("@theme/ApiExplorer/ParamOptions/slice");
|
|
22
23
|
const hooks_1 = require("@theme/ApiItem/hooks");
|
|
23
24
|
const translationIds_1 = require("@theme/translationIds");
|
|
@@ -29,7 +30,7 @@ function ParamMultiSelectFormItem({ param }) {
|
|
|
29
30
|
} = (0, react_hook_form_1.useFormContext)();
|
|
30
31
|
const showErrorMessage = errors?.paramMultiSelect;
|
|
31
32
|
const dispatch = (0, hooks_1.useTypedDispatch)();
|
|
32
|
-
const options = param.schema?.items
|
|
33
|
+
const options = (0, ParamOptions_1.getSchemaEnum)(param.schema?.items) ?? [];
|
|
33
34
|
const pathParams = (0, hooks_1.useTypedSelector)(
|
|
34
35
|
(state) => state.params.path
|
|
35
36
|
);
|
|
@@ -16,6 +16,7 @@ const react_1 = __importDefault(require("react"));
|
|
|
16
16
|
const Translate_1 = require("@docusaurus/Translate");
|
|
17
17
|
const error_message_1 = require("@hookform/error-message");
|
|
18
18
|
const FormSelect_1 = __importDefault(require("@theme/ApiExplorer/FormSelect"));
|
|
19
|
+
const ParamOptions_1 = require("@theme/ApiExplorer/ParamOptions");
|
|
19
20
|
const slice_1 = require("@theme/ApiExplorer/ParamOptions/slice");
|
|
20
21
|
const hooks_1 = require("@theme/ApiItem/hooks");
|
|
21
22
|
const translationIds_1 = require("@theme/translationIds");
|
|
@@ -27,7 +28,7 @@ function ParamSelectFormItem({ param }) {
|
|
|
27
28
|
} = (0, react_hook_form_1.useFormContext)();
|
|
28
29
|
const showErrorMessage = errors?.paramSelect;
|
|
29
30
|
const dispatch = (0, hooks_1.useTypedDispatch)();
|
|
30
|
-
const options = param.schema
|
|
31
|
+
const options = (0, ParamOptions_1.getSchemaEnum)(param.schema) ?? [];
|
|
31
32
|
return react_1.default.createElement(
|
|
32
33
|
react_1.default.Fragment,
|
|
33
34
|
null,
|
|
@@ -3,5 +3,10 @@ import { Param } from "./slice";
|
|
|
3
3
|
export interface ParamProps {
|
|
4
4
|
param: Param;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Extracts enum values from a schema, including when wrapped in allOf.
|
|
8
|
+
* This handles cases where an enum is referenced via allOf for composition.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getSchemaEnum(schema: any): any[] | undefined;
|
|
6
11
|
declare function ParamOptions(): React.JSX.Element;
|
|
7
12
|
export default ParamOptions;
|
|
@@ -67,6 +67,7 @@ var __importDefault =
|
|
|
67
67
|
return mod && mod.__esModule ? mod : { default: mod };
|
|
68
68
|
};
|
|
69
69
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
70
|
+
exports.getSchemaEnum = getSchemaEnum;
|
|
70
71
|
const react_1 = __importStar(require("react"));
|
|
71
72
|
const Translate_1 = require("@docusaurus/Translate");
|
|
72
73
|
const FormItem_1 = __importDefault(require("@theme/ApiExplorer/FormItem"));
|
|
@@ -87,8 +88,29 @@ const ParamTextFormItem_1 = __importDefault(
|
|
|
87
88
|
);
|
|
88
89
|
const hooks_1 = require("@theme/ApiItem/hooks");
|
|
89
90
|
const translationIds_1 = require("@theme/translationIds");
|
|
91
|
+
/**
|
|
92
|
+
* Extracts enum values from a schema, including when wrapped in allOf.
|
|
93
|
+
* This handles cases where an enum is referenced via allOf for composition.
|
|
94
|
+
*/
|
|
95
|
+
function getSchemaEnum(schema) {
|
|
96
|
+
// Direct enum on schema
|
|
97
|
+
if (schema?.enum) {
|
|
98
|
+
return schema.enum;
|
|
99
|
+
}
|
|
100
|
+
// Enum inside allOf - check each item
|
|
101
|
+
if (schema?.allOf && Array.isArray(schema.allOf)) {
|
|
102
|
+
for (const item of schema.allOf) {
|
|
103
|
+
if (item.enum) {
|
|
104
|
+
return item.enum;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
90
110
|
function ParamOption({ param }) {
|
|
91
|
-
|
|
111
|
+
const schemaEnum = getSchemaEnum(param.schema);
|
|
112
|
+
const itemsEnum = getSchemaEnum(param.schema?.items);
|
|
113
|
+
if (param.schema?.type === "array" && itemsEnum) {
|
|
92
114
|
return react_1.default.createElement(ParamMultiSelectFormItem_1.default, {
|
|
93
115
|
param: param,
|
|
94
116
|
});
|
|
@@ -98,7 +120,7 @@ function ParamOption({ param }) {
|
|
|
98
120
|
param: param,
|
|
99
121
|
});
|
|
100
122
|
}
|
|
101
|
-
if (
|
|
123
|
+
if (schemaEnum) {
|
|
102
124
|
return react_1.default.createElement(ParamSelectFormItem_1.default, {
|
|
103
125
|
param: param,
|
|
104
126
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "docusaurus-theme-openapi-docs",
|
|
3
3
|
"description": "OpenAPI theme for Docusaurus.",
|
|
4
|
-
"version": "0.0.0-
|
|
4
|
+
"version": "0.0.0-1106",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"openapi",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"@types/postman-collection": "^3.5.11",
|
|
39
39
|
"@types/react-modal": "^3.16.3",
|
|
40
40
|
"concurrently": "^9.2.0",
|
|
41
|
-
"docusaurus-plugin-openapi-docs": "0.0.0-
|
|
41
|
+
"docusaurus-plugin-openapi-docs": "0.0.0-1106",
|
|
42
42
|
"docusaurus-plugin-sass": "^0.2.6",
|
|
43
43
|
"eslint-plugin-prettier": "^5.5.1"
|
|
44
44
|
},
|
|
@@ -81,5 +81,5 @@
|
|
|
81
81
|
"engines": {
|
|
82
82
|
"node": ">=14"
|
|
83
83
|
},
|
|
84
|
-
"gitHead": "
|
|
84
|
+
"gitHead": "f0ef2d969b4244b515264100ae5122bf3e08f9dc"
|
|
85
85
|
}
|
package/src/markdown/schema.ts
CHANGED
|
@@ -10,6 +10,44 @@ import { translate } from "@docusaurus/Translate";
|
|
|
10
10
|
import { OPENAPI_SCHEMA_ITEM } from "../theme/translationIds";
|
|
11
11
|
import { SchemaObject } from "../types";
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Extracts enum values from a schema, including when wrapped in allOf.
|
|
15
|
+
*/
|
|
16
|
+
function getEnumFromSchema(schema: SchemaObject): any[] | undefined {
|
|
17
|
+
if (schema.enum) {
|
|
18
|
+
return schema.enum;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
22
|
+
for (const item of schema.allOf) {
|
|
23
|
+
if (item.enum) {
|
|
24
|
+
return item.enum;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Extracts the type from a schema, including when wrapped in allOf.
|
|
34
|
+
*/
|
|
35
|
+
function getTypeFromSchema(schema: SchemaObject): string | undefined {
|
|
36
|
+
if (schema.type) {
|
|
37
|
+
return schema.type as string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
41
|
+
for (const item of schema.allOf) {
|
|
42
|
+
if (item.type) {
|
|
43
|
+
return item.type as string;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
13
51
|
function prettyName(schema: SchemaObject, circular?: boolean) {
|
|
14
52
|
// Handle enum-only schemas (valid in JSON Schema)
|
|
15
53
|
// When enum is present without explicit type, treat as string
|
|
@@ -28,6 +66,12 @@ function prettyName(schema: SchemaObject, circular?: boolean) {
|
|
|
28
66
|
return schema.allOf[0];
|
|
29
67
|
}
|
|
30
68
|
}
|
|
69
|
+
// Check if allOf contains an enum - if so, return the type from allOf
|
|
70
|
+
const enumFromAllOf = getEnumFromSchema(schema);
|
|
71
|
+
if (enumFromAllOf) {
|
|
72
|
+
const typeFromAllOf = getTypeFromSchema(schema);
|
|
73
|
+
return typeFromAllOf ?? "string";
|
|
74
|
+
}
|
|
31
75
|
return "object";
|
|
32
76
|
}
|
|
33
77
|
|
|
@@ -92,10 +136,12 @@ export function getQualifierMessage(schema?: SchemaObject): string | undefined {
|
|
|
92
136
|
|
|
93
137
|
let qualifierGroups = [];
|
|
94
138
|
|
|
95
|
-
|
|
96
|
-
|
|
139
|
+
// Check for enum in array items (directly or inside allOf)
|
|
140
|
+
if (schema.items) {
|
|
141
|
+
const itemsEnum = getEnumFromSchema(schema.items as SchemaObject);
|
|
142
|
+
if (itemsEnum) {
|
|
97
143
|
qualifierGroups.push(
|
|
98
|
-
`[${
|
|
144
|
+
`[${itemsEnum.map((e) => `\`${e}\``).join(", ")}]`
|
|
99
145
|
);
|
|
100
146
|
}
|
|
101
147
|
}
|
|
@@ -177,8 +223,10 @@ export function getQualifierMessage(schema?: SchemaObject): string | undefined {
|
|
|
177
223
|
qualifierGroups.push(`[${values.map((e) => `\`${e}\``).join(", ")}]`);
|
|
178
224
|
}
|
|
179
225
|
|
|
180
|
-
|
|
181
|
-
|
|
226
|
+
// Check for enum directly on schema or inside allOf
|
|
227
|
+
const schemaEnum = getEnumFromSchema(schema);
|
|
228
|
+
if (schemaEnum) {
|
|
229
|
+
qualifierGroups.push(`[${schemaEnum.map((e) => `\`${e}\``).join(", ")}]`);
|
|
182
230
|
}
|
|
183
231
|
|
|
184
232
|
if (schema.minItems) {
|
|
@@ -10,6 +10,7 @@ import React from "react";
|
|
|
10
10
|
import { translate } from "@docusaurus/Translate";
|
|
11
11
|
import { ErrorMessage } from "@hookform/error-message";
|
|
12
12
|
import FormMultiSelect from "@theme/ApiExplorer/FormMultiSelect";
|
|
13
|
+
import { getSchemaEnum } from "@theme/ApiExplorer/ParamOptions";
|
|
13
14
|
import { Param, setParam } from "@theme/ApiExplorer/ParamOptions/slice";
|
|
14
15
|
import { useTypedDispatch, useTypedSelector } from "@theme/ApiItem/hooks";
|
|
15
16
|
import { OPENAPI_FORM } from "@theme/translationIds";
|
|
@@ -29,7 +30,7 @@ export default function ParamMultiSelectFormItem({ param }: ParamProps) {
|
|
|
29
30
|
|
|
30
31
|
const dispatch = useTypedDispatch();
|
|
31
32
|
|
|
32
|
-
const options = param.schema?.items
|
|
33
|
+
const options = getSchemaEnum(param.schema?.items) ?? [];
|
|
33
34
|
|
|
34
35
|
const pathParams = useTypedSelector((state: any) => state.params.path);
|
|
35
36
|
const queryParams = useTypedSelector((state: any) => state.params.query);
|
|
@@ -10,6 +10,7 @@ import React from "react";
|
|
|
10
10
|
import { translate } from "@docusaurus/Translate";
|
|
11
11
|
import { ErrorMessage } from "@hookform/error-message";
|
|
12
12
|
import FormSelect from "@theme/ApiExplorer/FormSelect";
|
|
13
|
+
import { getSchemaEnum } from "@theme/ApiExplorer/ParamOptions";
|
|
13
14
|
import { Param, setParam } from "@theme/ApiExplorer/ParamOptions/slice";
|
|
14
15
|
import { useTypedDispatch } from "@theme/ApiItem/hooks";
|
|
15
16
|
import { OPENAPI_FORM } from "@theme/translationIds";
|
|
@@ -29,7 +30,7 @@ export default function ParamSelectFormItem({ param }: ParamProps) {
|
|
|
29
30
|
|
|
30
31
|
const dispatch = useTypedDispatch();
|
|
31
32
|
|
|
32
|
-
const options = param.schema
|
|
33
|
+
const options = getSchemaEnum(param.schema) ?? [];
|
|
33
34
|
|
|
34
35
|
return (
|
|
35
36
|
<>
|
|
@@ -23,8 +23,33 @@ export interface ParamProps {
|
|
|
23
23
|
param: Param;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Extracts enum values from a schema, including when wrapped in allOf.
|
|
28
|
+
* This handles cases where an enum is referenced via allOf for composition.
|
|
29
|
+
*/
|
|
30
|
+
export function getSchemaEnum(schema: any): any[] | undefined {
|
|
31
|
+
// Direct enum on schema
|
|
32
|
+
if (schema?.enum) {
|
|
33
|
+
return schema.enum;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Enum inside allOf - check each item
|
|
37
|
+
if (schema?.allOf && Array.isArray(schema.allOf)) {
|
|
38
|
+
for (const item of schema.allOf) {
|
|
39
|
+
if (item.enum) {
|
|
40
|
+
return item.enum;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
26
48
|
function ParamOption({ param }: ParamProps) {
|
|
27
|
-
|
|
49
|
+
const schemaEnum = getSchemaEnum(param.schema);
|
|
50
|
+
const itemsEnum = getSchemaEnum(param.schema?.items);
|
|
51
|
+
|
|
52
|
+
if (param.schema?.type === "array" && itemsEnum) {
|
|
28
53
|
return <ParamMultiSelectFormItem param={param} />;
|
|
29
54
|
}
|
|
30
55
|
|
|
@@ -32,7 +57,7 @@ function ParamOption({ param }: ParamProps) {
|
|
|
32
57
|
return <ParamArrayFormItem param={param} />;
|
|
33
58
|
}
|
|
34
59
|
|
|
35
|
-
if (
|
|
60
|
+
if (schemaEnum) {
|
|
36
61
|
return <ParamSelectFormItem param={param} />;
|
|
37
62
|
}
|
|
38
63
|
|