docusaurus-theme-openapi-docs 4.1.0 → 4.2.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.
Files changed (43) hide show
  1. package/lib/theme/ApiExplorer/CodeSnippets/index.js +2 -1
  2. package/lib/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +50 -0
  3. package/lib/theme/ApiItem/Layout/index.js +6 -2
  4. package/lib/theme/ApiItem/index.js +15 -4
  5. package/lib/theme/ApiTabs/_ApiTabs.scss +0 -1
  6. package/lib/theme/ArrayBrackets/index.d.ts +3 -0
  7. package/lib/theme/ArrayBrackets/index.js +50 -0
  8. package/lib/theme/ParamsDetails/index.d.ts +6 -0
  9. package/lib/theme/ParamsDetails/index.js +134 -0
  10. package/lib/theme/ParamsItem/index.d.ts +1 -0
  11. package/lib/theme/ParamsItem/index.js +10 -6
  12. package/lib/theme/RequestSchema/index.d.ts +15 -0
  13. package/lib/theme/RequestSchema/index.js +235 -0
  14. package/lib/theme/ResponseExamples/index.d.ts +48 -0
  15. package/lib/theme/ResponseExamples/index.js +290 -0
  16. package/lib/theme/ResponseSchema/index.d.ts +15 -0
  17. package/lib/theme/ResponseSchema/index.js +206 -0
  18. package/lib/theme/Schema/index.d.ts +8 -0
  19. package/lib/theme/Schema/index.js +879 -0
  20. package/lib/theme/SchemaItem/index.d.ts +8 -8
  21. package/lib/theme/SchemaItem/index.js +9 -5
  22. package/lib/theme/SkeletonLoader/index.d.ts +6 -0
  23. package/lib/theme/SkeletonLoader/index.js +20 -0
  24. package/lib/theme/StatusCodes/index.d.ts +9 -0
  25. package/lib/theme/StatusCodes/index.js +78 -0
  26. package/lib/theme/styles.scss +56 -9
  27. package/package.json +6 -5
  28. package/src/theme/ApiExplorer/CodeSnippets/index.tsx +2 -1
  29. package/src/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +50 -0
  30. package/src/theme/ApiItem/Layout/index.tsx +5 -2
  31. package/src/theme/ApiItem/index.tsx +14 -2
  32. package/src/theme/ApiTabs/_ApiTabs.scss +0 -1
  33. package/src/theme/ArrayBrackets/index.tsx +37 -0
  34. package/src/theme/ParamsDetails/index.tsx +88 -0
  35. package/src/theme/ParamsItem/index.tsx +10 -7
  36. package/src/theme/RequestSchema/index.tsx +164 -0
  37. package/src/theme/ResponseExamples/index.tsx +290 -0
  38. package/src/theme/ResponseSchema/index.tsx +151 -0
  39. package/src/theme/Schema/index.tsx +928 -0
  40. package/src/theme/SchemaItem/index.tsx +15 -13
  41. package/src/theme/SkeletonLoader/index.tsx +18 -0
  42. package/src/theme/StatusCodes/index.tsx +72 -0
  43. package/src/theme/styles.scss +56 -9
@@ -0,0 +1,48 @@
1
+ import React from "react";
2
+ export declare function json2xml(o: Record<string, any>, tab: string): string;
3
+ interface ParameterProps {
4
+ in: string;
5
+ name: string;
6
+ schema?: {
7
+ type?: string;
8
+ items?: Record<string, any>;
9
+ };
10
+ enumDescriptions?: [string, string][];
11
+ }
12
+ interface ResponseHeaderProps {
13
+ description?: string;
14
+ example?: string;
15
+ schema?: {
16
+ type?: string;
17
+ };
18
+ }
19
+ interface ResponseExampleProps {
20
+ value: any;
21
+ summary?: string;
22
+ }
23
+ interface Props {
24
+ parameters?: ParameterProps[];
25
+ type: string;
26
+ responseHeaders?: Record<string, ResponseHeaderProps>;
27
+ responseExamples?: Record<string, ResponseExampleProps>;
28
+ responseExample?: any;
29
+ schema?: any;
30
+ mimeType: string;
31
+ }
32
+ export declare const ParamsDetails: React.FC<Props>;
33
+ export declare const ResponseHeaders: React.FC<{
34
+ responseHeaders?: Record<string, ResponseHeaderProps>;
35
+ }>;
36
+ export declare const ResponseExamples: React.FC<{
37
+ responseExamples: any;
38
+ mimeType: string;
39
+ }>;
40
+ export declare const ResponseExample: React.FC<{
41
+ responseExample: any;
42
+ mimeType: string;
43
+ }>;
44
+ export declare const ExampleFromSchema: React.FC<{
45
+ schema: any;
46
+ mimeType: string;
47
+ }>;
48
+ export {};
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /* ============================================================================
3
+ * Copyright (c) Palo Alto Networks
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ * ========================================================================== */
8
+ var __importDefault =
9
+ (this && this.__importDefault) ||
10
+ function (mod) {
11
+ return mod && mod.__esModule ? mod : { default: mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.ExampleFromSchema =
15
+ exports.ResponseExample =
16
+ exports.ResponseExamples =
17
+ exports.ResponseHeaders =
18
+ exports.ParamsDetails =
19
+ exports.json2xml =
20
+ void 0;
21
+ const react_1 = __importDefault(require("react"));
22
+ const ParamsItem_1 = __importDefault(require("@theme/ParamsItem"));
23
+ const ResponseSamples_1 = __importDefault(require("@theme/ResponseSamples"));
24
+ const TabItem_1 = __importDefault(require("@theme/TabItem"));
25
+ const createDescription_1 = require("docusaurus-plugin-openapi-docs/lib/markdown/createDescription");
26
+ const createResponseExample_1 = require("docusaurus-plugin-openapi-docs/lib/openapi/createResponseExample");
27
+ const xml_formatter_1 = __importDefault(require("xml-formatter"));
28
+ // Utility function
29
+ function json2xml(o, tab) {
30
+ const toXml = (v, name, ind) => {
31
+ let xml = "";
32
+ if (v instanceof Array) {
33
+ for (let i = 0, n = v.length; i < n; i++) {
34
+ xml += ind + toXml(v[i], name, ind + "\t") + "\n";
35
+ }
36
+ } else if (typeof v === "object") {
37
+ let hasChild = false;
38
+ xml += ind + "<" + name;
39
+ for (const m in v) {
40
+ if (m.charAt(0) === "@") {
41
+ xml += " " + m.substr(1) + '="' + v[m].toString() + '"';
42
+ } else {
43
+ hasChild = true;
44
+ }
45
+ }
46
+ xml += hasChild ? ">" : "/>";
47
+ if (hasChild) {
48
+ for (const m2 in v) {
49
+ if (m2 === "#text") xml += v[m2];
50
+ else if (m2 === "#cdata") xml += "<![CDATA[" + v[m2] + "]]>";
51
+ else if (m2.charAt(0) !== "@") xml += toXml(v[m2], m2, ind + "\t");
52
+ }
53
+ xml +=
54
+ (xml.charAt(xml.length - 1) === "\n" ? ind : "") + "</" + name + ">";
55
+ }
56
+ } else {
57
+ xml += ind + "<" + name + ">" + v.toString() + "</" + name + ">";
58
+ }
59
+ return xml;
60
+ };
61
+ let xml = "";
62
+ for (const m3 in o) xml += toXml(o[m3], m3, "");
63
+ return tab ? xml.replace(/\t/g, tab) : xml.replace(/\t|\n/g, "");
64
+ }
65
+ exports.json2xml = json2xml;
66
+ // React components
67
+ const ParamsDetails = ({ parameters, type }) => {
68
+ const params = parameters?.filter((param) => param?.in === type);
69
+ if (!params || params.length === 0) {
70
+ return null;
71
+ }
72
+ return react_1.default.createElement(
73
+ "details",
74
+ {
75
+ className: "openapi-markdown__details",
76
+ "data-collapsed": false,
77
+ open: true,
78
+ style: { marginBottom: "1rem" },
79
+ },
80
+ react_1.default.createElement(
81
+ "summary",
82
+ null,
83
+ react_1.default.createElement(
84
+ "h3",
85
+ { className: "openapi-markdown__details-summary-header-params" },
86
+ `${type.charAt(0).toUpperCase() + type.slice(1)} Parameters`
87
+ )
88
+ ),
89
+ react_1.default.createElement(
90
+ "div",
91
+ null,
92
+ react_1.default.createElement(
93
+ "ul",
94
+ null,
95
+ params.map((param, index) =>
96
+ react_1.default.createElement(ParamsItem_1.default, {
97
+ key: index,
98
+ className: "paramsItem",
99
+ // @ts-ignore
100
+ param: {
101
+ ...param,
102
+ enumDescriptions: Object.entries(
103
+ param?.schema?.items?.["x-enumDescriptions"] ?? {}
104
+ ),
105
+ },
106
+ })
107
+ )
108
+ )
109
+ )
110
+ );
111
+ };
112
+ exports.ParamsDetails = ParamsDetails;
113
+ const ResponseHeaders = ({ responseHeaders }) => {
114
+ if (!responseHeaders) {
115
+ return null;
116
+ }
117
+ return react_1.default.createElement(
118
+ "ul",
119
+ { style: { marginLeft: "1rem" } },
120
+ Object.entries(responseHeaders).map(([headerName, headerObj]) => {
121
+ const { description, example, schema } = headerObj;
122
+ const type = schema?.type ?? "any";
123
+ return react_1.default.createElement(
124
+ "li",
125
+ { className: "schemaItem", key: headerName },
126
+ react_1.default.createElement(
127
+ "details",
128
+ null,
129
+ react_1.default.createElement(
130
+ "summary",
131
+ null,
132
+ react_1.default.createElement("strong", null, headerName),
133
+ type &&
134
+ react_1.default.createElement(
135
+ "span",
136
+ { style: { opacity: "0.6" } },
137
+ " ",
138
+ type
139
+ )
140
+ ),
141
+ react_1.default.createElement(
142
+ "div",
143
+ null,
144
+ description &&
145
+ react_1.default.createElement(
146
+ "div",
147
+ { style: { marginTop: ".5rem", marginBottom: ".5rem" } },
148
+ example && `Example: ${example}`,
149
+ (0, createDescription_1.createDescription)(description)
150
+ )
151
+ )
152
+ )
153
+ );
154
+ })
155
+ );
156
+ };
157
+ exports.ResponseHeaders = ResponseHeaders;
158
+ const ResponseExamples = ({ responseExamples, mimeType }) => {
159
+ let language = "shell";
160
+ if (mimeType.endsWith("json")) language = "json";
161
+ if (mimeType.endsWith("xml")) language = "xml";
162
+ // Map response examples to an array of TabItem elements
163
+ const examplesArray = Object.entries(responseExamples).map(
164
+ ([exampleName, exampleValue]) => {
165
+ const isObject = typeof exampleValue.value === "object";
166
+ const responseExample = isObject
167
+ ? JSON.stringify(exampleValue.value, null, 2)
168
+ : exampleValue.value;
169
+ return (
170
+ // @ts-ignore
171
+ react_1.default.createElement(
172
+ TabItem_1.default,
173
+ { label: exampleName, value: exampleName, key: exampleName },
174
+ exampleValue.summary &&
175
+ react_1.default.createElement(
176
+ "div",
177
+ { className: "openapi-example__summary" },
178
+ exampleValue.summary
179
+ ),
180
+ react_1.default.createElement(ResponseSamples_1.default, {
181
+ responseExample: responseExample,
182
+ language: language,
183
+ })
184
+ )
185
+ );
186
+ }
187
+ );
188
+ return examplesArray;
189
+ };
190
+ exports.ResponseExamples = ResponseExamples;
191
+ const ResponseExample = ({ responseExample, mimeType }) => {
192
+ let language = "shell";
193
+ if (mimeType.endsWith("json")) {
194
+ language = "json";
195
+ }
196
+ if (mimeType.endsWith("xml")) {
197
+ language = "xml";
198
+ }
199
+ const isObject = typeof responseExample === "object";
200
+ const exampleContent = isObject
201
+ ? JSON.stringify(responseExample, null, 2)
202
+ : responseExample;
203
+ return (
204
+ // @ts-ignore
205
+ react_1.default.createElement(
206
+ TabItem_1.default,
207
+ { label: "Example", value: "Example" },
208
+ responseExample.summary &&
209
+ react_1.default.createElement(
210
+ "div",
211
+ { className: "openapi-example__summary" },
212
+ responseExample.summary
213
+ ),
214
+ react_1.default.createElement(ResponseSamples_1.default, {
215
+ responseExample: exampleContent,
216
+ language: language,
217
+ })
218
+ )
219
+ );
220
+ };
221
+ exports.ResponseExample = ResponseExample;
222
+ const ExampleFromSchema = ({ schema, mimeType }) => {
223
+ const responseExample = (0, createResponseExample_1.sampleResponseFromSchema)(
224
+ schema
225
+ );
226
+ if (mimeType.endsWith("xml")) {
227
+ let responseExampleObject;
228
+ try {
229
+ responseExampleObject = JSON.parse(JSON.stringify(responseExample));
230
+ } catch {
231
+ return null;
232
+ }
233
+ if (typeof responseExampleObject === "object") {
234
+ let xmlExample;
235
+ try {
236
+ xmlExample = (0, xml_formatter_1.default)(
237
+ json2xml(responseExampleObject, ""),
238
+ {
239
+ indentation: " ",
240
+ lineSeparator: "\n",
241
+ collapseContent: true,
242
+ }
243
+ );
244
+ } catch {
245
+ const xmlExampleWithRoot = { root: responseExampleObject };
246
+ try {
247
+ xmlExample = (0, xml_formatter_1.default)(
248
+ json2xml(xmlExampleWithRoot, ""),
249
+ {
250
+ indentation: " ",
251
+ lineSeparator: "\n",
252
+ collapseContent: true,
253
+ }
254
+ );
255
+ } catch {
256
+ xmlExample = json2xml(responseExampleObject, "");
257
+ }
258
+ }
259
+ return (
260
+ // @ts-ignore
261
+ react_1.default.createElement(
262
+ TabItem_1.default,
263
+ { label: "Example (auto)", value: "Example (auto)" },
264
+ react_1.default.createElement(ResponseSamples_1.default, {
265
+ responseExample: xmlExample,
266
+ language: "xml",
267
+ })
268
+ )
269
+ );
270
+ }
271
+ }
272
+ if (
273
+ typeof responseExample === "object" ||
274
+ typeof responseExample === "string"
275
+ ) {
276
+ return (
277
+ // @ts-ignore
278
+ react_1.default.createElement(
279
+ TabItem_1.default,
280
+ { label: "Example (auto)", value: "Example (auto)" },
281
+ react_1.default.createElement(ResponseSamples_1.default, {
282
+ responseExample: JSON.stringify(responseExample, null, 2),
283
+ language: "json",
284
+ })
285
+ )
286
+ );
287
+ }
288
+ return null;
289
+ };
290
+ exports.ExampleFromSchema = ExampleFromSchema;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import { MediaTypeObject } from "docusaurus-plugin-openapi-docs/lib/openapi/types";
3
+ interface Props {
4
+ style?: React.CSSProperties;
5
+ title: string;
6
+ body: {
7
+ content?: {
8
+ [key: string]: MediaTypeObject;
9
+ };
10
+ description?: string;
11
+ required?: string[] | boolean;
12
+ };
13
+ }
14
+ declare const ResponseSchema: React.FC<Props>;
15
+ export default ResponseSchema;
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /* ============================================================================
3
+ * Copyright (c) Palo Alto Networks
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ * ========================================================================== */
8
+ var __createBinding =
9
+ (this && this.__createBinding) ||
10
+ (Object.create
11
+ ? function (o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (
15
+ !desc ||
16
+ ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)
17
+ ) {
18
+ desc = {
19
+ enumerable: true,
20
+ get: function () {
21
+ return m[k];
22
+ },
23
+ };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }
27
+ : function (o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ });
31
+ var __setModuleDefault =
32
+ (this && this.__setModuleDefault) ||
33
+ (Object.create
34
+ ? function (o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }
37
+ : function (o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar =
41
+ (this && this.__importStar) ||
42
+ function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null)
46
+ for (var k in mod)
47
+ if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
48
+ __createBinding(result, mod, k);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ var __importDefault =
53
+ (this && this.__importDefault) ||
54
+ function (mod) {
55
+ return mod && mod.__esModule ? mod : { default: mod };
56
+ };
57
+ Object.defineProperty(exports, "__esModule", { value: true });
58
+ const react_1 = __importStar(require("react"));
59
+ const BrowserOnly_1 = __importDefault(require("@docusaurus/BrowserOnly"));
60
+ const Details_1 = __importDefault(require("@theme/Details"));
61
+ const MimeTabs_1 = __importDefault(require("@theme/MimeTabs")); // Assume these components exist
62
+ const ResponseExamples_1 = require("@theme/ResponseExamples");
63
+ const Schema_1 = __importDefault(require("@theme/Schema"));
64
+ const SchemaTabs_1 = __importDefault(require("@theme/SchemaTabs"));
65
+ const SkeletonLoader_1 = __importDefault(require("@theme/SkeletonLoader"));
66
+ const TabItem_1 = __importDefault(require("@theme/TabItem"));
67
+ const createDescription_1 = require("docusaurus-plugin-openapi-docs/lib/markdown/createDescription");
68
+ const ResponseSchemaComponent = ({ title, body, style }) => {
69
+ if (
70
+ body === undefined ||
71
+ body.content === undefined ||
72
+ Object.keys(body).length === 0 ||
73
+ Object.keys(body.content).length === 0
74
+ ) {
75
+ return null;
76
+ }
77
+ // Get all MIME types, including vendor-specific
78
+ const mimeTypes = Object.keys(body.content);
79
+ if (mimeTypes && mimeTypes.length) {
80
+ return react_1.default.createElement(
81
+ MimeTabs_1.default,
82
+ { className: "openapi-tabs__mime", schemaType: "response" },
83
+ mimeTypes.map((mimeType) => {
84
+ const responseExamples = body.content[mimeType].examples;
85
+ const responseExample = body.content[mimeType].example;
86
+ const firstBody =
87
+ body.content[mimeType].schema ?? body.content[mimeType];
88
+ if (
89
+ firstBody === undefined &&
90
+ responseExample === undefined &&
91
+ responseExamples === undefined
92
+ ) {
93
+ return undefined;
94
+ }
95
+ if (firstBody) {
96
+ return (
97
+ // @ts-ignore
98
+ react_1.default.createElement(
99
+ TabItem_1.default,
100
+ { key: mimeType, label: mimeType, value: mimeType },
101
+ react_1.default.createElement(
102
+ SchemaTabs_1.default,
103
+ { className: "openapi-tabs__schema" },
104
+ react_1.default.createElement(
105
+ TabItem_1.default,
106
+ { key: title, label: title, value: title },
107
+ react_1.default.createElement(
108
+ Details_1.default,
109
+ {
110
+ className: "openapi-markdown__details response",
111
+ "data-collapsed": false,
112
+ open: true,
113
+ style: style,
114
+ summary: react_1.default.createElement(
115
+ react_1.default.Fragment,
116
+ null,
117
+ react_1.default.createElement(
118
+ "summary",
119
+ null,
120
+ react_1.default.createElement(
121
+ "strong",
122
+ {
123
+ className:
124
+ "openapi-markdown__details-summary-response",
125
+ },
126
+ title,
127
+ body.required === true &&
128
+ react_1.default.createElement(
129
+ "span",
130
+ { className: "openapi-schema__required" },
131
+ "required"
132
+ )
133
+ )
134
+ )
135
+ ),
136
+ },
137
+ react_1.default.createElement(
138
+ "div",
139
+ { style: { textAlign: "left", marginLeft: "1rem" } },
140
+ body.description &&
141
+ react_1.default.createElement(
142
+ "div",
143
+ {
144
+ style: { marginTop: "1rem", marginBottom: "1rem" },
145
+ },
146
+ (0, createDescription_1.createDescription)(
147
+ body.description
148
+ )
149
+ )
150
+ ),
151
+ react_1.default.createElement(
152
+ "ul",
153
+ { style: { marginLeft: "1rem" } },
154
+ react_1.default.createElement(Schema_1.default, {
155
+ schema: firstBody,
156
+ schemaType: "response",
157
+ })
158
+ )
159
+ )
160
+ ),
161
+ firstBody &&
162
+ (0, ResponseExamples_1.ExampleFromSchema)({
163
+ schema: firstBody,
164
+ mimeType: mimeType,
165
+ }),
166
+ responseExamples &&
167
+ (0, ResponseExamples_1.ResponseExamples)({
168
+ responseExamples,
169
+ mimeType,
170
+ }),
171
+ responseExample &&
172
+ (0, ResponseExamples_1.ResponseExample)({
173
+ responseExample,
174
+ mimeType,
175
+ })
176
+ )
177
+ )
178
+ );
179
+ }
180
+ return undefined;
181
+ })
182
+ );
183
+ }
184
+ return undefined;
185
+ };
186
+ const ResponseSchema = (props) => {
187
+ return react_1.default.createElement(
188
+ BrowserOnly_1.default,
189
+ {
190
+ fallback: react_1.default.createElement(SkeletonLoader_1.default, {
191
+ size: "md",
192
+ }),
193
+ },
194
+ () => {
195
+ const LazyComponent = react_1.default.lazy(() =>
196
+ Promise.resolve({ default: ResponseSchemaComponent })
197
+ );
198
+ return react_1.default.createElement(
199
+ react_1.Suspense,
200
+ { fallback: null },
201
+ react_1.default.createElement(LazyComponent, { ...props })
202
+ );
203
+ }
204
+ );
205
+ };
206
+ exports.default = ResponseSchema;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { SchemaObject } from "docusaurus-plugin-openapi-docs/lib/openapi/types";
3
+ interface SchemaProps {
4
+ schema: SchemaObject;
5
+ schemaType: "request" | "response";
6
+ }
7
+ declare const SchemaNode: React.FC<SchemaProps>;
8
+ export default SchemaNode;