docusaurus-theme-openapi-docs 1.0.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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/babel.config.js +35 -0
  3. package/lib/index.js +48 -0
  4. package/lib/markdown/createDescription.js +20 -0
  5. package/lib/markdown/schema.js +121 -0
  6. package/lib/markdown/utils.js +45 -0
  7. package/lib/theme/ApiDemoPanel/Accept/index.js +41 -0
  8. package/lib/theme/ApiDemoPanel/Accept/slice.js +32 -0
  9. package/lib/theme/ApiDemoPanel/Authorization/auth-types.js +32 -0
  10. package/lib/theme/ApiDemoPanel/Authorization/index.js +174 -0
  11. package/lib/theme/ApiDemoPanel/Authorization/slice.js +137 -0
  12. package/lib/theme/ApiDemoPanel/Body/index.js +185 -0
  13. package/lib/theme/ApiDemoPanel/Body/slice.js +105 -0
  14. package/lib/theme/ApiDemoPanel/ContentType/index.js +41 -0
  15. package/lib/theme/ApiDemoPanel/ContentType/slice.js +32 -0
  16. package/lib/theme/ApiDemoPanel/Curl/index.js +236 -0
  17. package/lib/theme/ApiDemoPanel/Curl/styles.module.css +84 -0
  18. package/lib/theme/ApiDemoPanel/Execute/index.js +85 -0
  19. package/lib/theme/ApiDemoPanel/Execute/makeRequest.js +202 -0
  20. package/lib/theme/ApiDemoPanel/FloatingButton/index.js +32 -0
  21. package/lib/theme/ApiDemoPanel/FloatingButton/styles.module.css +26 -0
  22. package/lib/theme/ApiDemoPanel/FormFileUpload/index.js +97 -0
  23. package/lib/theme/ApiDemoPanel/FormFileUpload/styles.module.css +75 -0
  24. package/lib/theme/ApiDemoPanel/FormItem/index.js +35 -0
  25. package/lib/theme/ApiDemoPanel/FormItem/styles.module.css +7 -0
  26. package/lib/theme/ApiDemoPanel/FormMultiSelect/index.js +52 -0
  27. package/lib/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +38 -0
  28. package/lib/theme/ApiDemoPanel/FormSelect/index.js +39 -0
  29. package/lib/theme/ApiDemoPanel/FormSelect/styles.module.css +51 -0
  30. package/lib/theme/ApiDemoPanel/FormTextInput/index.js +30 -0
  31. package/lib/theme/ApiDemoPanel/FormTextInput/styles.module.css +21 -0
  32. package/lib/theme/ApiDemoPanel/MethodEndpoint/index.js +60 -0
  33. package/lib/theme/ApiDemoPanel/ParamOptions/index.js +248 -0
  34. package/lib/theme/ApiDemoPanel/ParamOptions/slice.js +35 -0
  35. package/lib/theme/ApiDemoPanel/ParamOptions/styles.module.css +180 -0
  36. package/lib/theme/ApiDemoPanel/Response/index.js +75 -0
  37. package/lib/theme/ApiDemoPanel/Response/slice.js +37 -0
  38. package/lib/theme/ApiDemoPanel/SecuritySchemes/index.js +51 -0
  39. package/lib/theme/ApiDemoPanel/Server/index.js +109 -0
  40. package/lib/theme/ApiDemoPanel/Server/slice.js +41 -0
  41. package/lib/theme/ApiDemoPanel/Server/styles.module.css +61 -0
  42. package/lib/theme/ApiDemoPanel/VSCode/index.js +252 -0
  43. package/lib/theme/ApiDemoPanel/VSCode/styles.module.css +19 -0
  44. package/lib/theme/ApiDemoPanel/buildPostmanRequest.js +329 -0
  45. package/lib/theme/ApiDemoPanel/hooks.js +20 -0
  46. package/lib/theme/ApiDemoPanel/index.js +134 -0
  47. package/lib/theme/ApiDemoPanel/persistanceMiddleware.js +44 -0
  48. package/lib/theme/ApiDemoPanel/postman-collection.d.ts +10 -0
  49. package/lib/theme/ApiDemoPanel/storage-utils.js +47 -0
  50. package/lib/theme/ApiDemoPanel/store.js +48 -0
  51. package/lib/theme/ApiDemoPanel/styles.module.css +44 -0
  52. package/lib/theme/ApiItem/index.js +160 -0
  53. package/lib/theme/ApiItem/styles.module.css +109 -0
  54. package/lib/theme/ParamsItem/index.js +68 -0
  55. package/lib/theme/ParamsItem/styles.module.css +24 -0
  56. package/lib/theme/SchemaItem/index.js +58 -0
  57. package/lib/theme/SchemaItem/styles.module.css +24 -0
  58. package/lib/theme/Tabs/index.js +258 -0
  59. package/lib/theme/Tabs/styles.module.css +118 -0
  60. package/lib/theme-classic.d.ts +8 -0
  61. package/lib/theme-openapi.d.ts +48 -0
  62. package/lib/theme-translations.d.ts +9 -0
  63. package/lib/types.js +1 -0
  64. package/lib-next/index.js +38 -0
  65. package/lib-next/markdown/createDescription.js +13 -0
  66. package/lib-next/markdown/schema.js +115 -0
  67. package/lib-next/markdown/utils.js +31 -0
  68. package/lib-next/theme/ApiDemoPanel/Accept/index.js +33 -0
  69. package/lib-next/theme/ApiDemoPanel/Accept/slice.js +19 -0
  70. package/lib-next/theme/ApiDemoPanel/Authorization/auth-types.js +22 -0
  71. package/lib-next/theme/ApiDemoPanel/Authorization/index.js +203 -0
  72. package/lib-next/theme/ApiDemoPanel/Authorization/slice.js +101 -0
  73. package/lib-next/theme/ApiDemoPanel/Body/index.js +210 -0
  74. package/lib-next/theme/ApiDemoPanel/Body/slice.js +89 -0
  75. package/lib-next/theme/ApiDemoPanel/ContentType/index.js +33 -0
  76. package/lib-next/theme/ApiDemoPanel/ContentType/slice.js +19 -0
  77. package/lib-next/theme/ApiDemoPanel/Curl/index.js +264 -0
  78. package/lib-next/theme/ApiDemoPanel/Curl/styles.module.css +84 -0
  79. package/lib-next/theme/ApiDemoPanel/Execute/index.js +74 -0
  80. package/lib-next/theme/ApiDemoPanel/Execute/makeRequest.js +183 -0
  81. package/lib-next/theme/ApiDemoPanel/FloatingButton/index.js +19 -0
  82. package/lib-next/theme/ApiDemoPanel/FloatingButton/styles.module.css +26 -0
  83. package/lib-next/theme/ApiDemoPanel/FormFileUpload/index.js +113 -0
  84. package/lib-next/theme/ApiDemoPanel/FormFileUpload/styles.module.css +75 -0
  85. package/lib-next/theme/ApiDemoPanel/FormItem/index.js +29 -0
  86. package/lib-next/theme/ApiDemoPanel/FormItem/styles.module.css +7 -0
  87. package/lib-next/theme/ApiDemoPanel/FormMultiSelect/index.js +49 -0
  88. package/lib-next/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +38 -0
  89. package/lib-next/theme/ApiDemoPanel/FormSelect/index.js +28 -0
  90. package/lib-next/theme/ApiDemoPanel/FormSelect/styles.module.css +51 -0
  91. package/lib-next/theme/ApiDemoPanel/FormTextInput/index.js +23 -0
  92. package/lib-next/theme/ApiDemoPanel/FormTextInput/styles.module.css +21 -0
  93. package/lib-next/theme/ApiDemoPanel/MethodEndpoint/index.js +53 -0
  94. package/lib-next/theme/ApiDemoPanel/ParamOptions/index.js +284 -0
  95. package/lib-next/theme/ApiDemoPanel/ParamOptions/slice.js +22 -0
  96. package/lib-next/theme/ApiDemoPanel/ParamOptions/styles.module.css +180 -0
  97. package/lib-next/theme/ApiDemoPanel/Response/index.js +65 -0
  98. package/lib-next/theme/ApiDemoPanel/Response/slice.js +22 -0
  99. package/lib-next/theme/ApiDemoPanel/SecuritySchemes/index.js +48 -0
  100. package/lib-next/theme/ApiDemoPanel/Server/index.js +114 -0
  101. package/lib-next/theme/ApiDemoPanel/Server/slice.js +25 -0
  102. package/lib-next/theme/ApiDemoPanel/Server/styles.module.css +61 -0
  103. package/lib-next/theme/ApiDemoPanel/VSCode/index.js +265 -0
  104. package/lib-next/theme/ApiDemoPanel/VSCode/styles.module.css +19 -0
  105. package/lib-next/theme/ApiDemoPanel/buildPostmanRequest.js +310 -0
  106. package/lib-next/theme/ApiDemoPanel/hooks.js +9 -0
  107. package/lib-next/theme/ApiDemoPanel/index.js +110 -0
  108. package/lib-next/theme/ApiDemoPanel/persistanceMiddleware.js +38 -0
  109. package/lib-next/theme/ApiDemoPanel/postman-collection.d.ts +10 -0
  110. package/lib-next/theme/ApiDemoPanel/storage-utils.js +35 -0
  111. package/lib-next/theme/ApiDemoPanel/store.js +30 -0
  112. package/lib-next/theme/ApiDemoPanel/styles.module.css +44 -0
  113. package/lib-next/theme/ApiItem/index.js +171 -0
  114. package/lib-next/theme/ApiItem/styles.module.css +109 -0
  115. package/lib-next/theme/ParamsItem/index.js +68 -0
  116. package/lib-next/theme/ParamsItem/styles.module.css +24 -0
  117. package/lib-next/theme/SchemaItem/index.js +58 -0
  118. package/lib-next/theme/SchemaItem/styles.module.css +24 -0
  119. package/lib-next/theme/Tabs/index.js +258 -0
  120. package/lib-next/theme/Tabs/styles.module.css +118 -0
  121. package/lib-next/theme-classic.d.ts +8 -0
  122. package/lib-next/theme-openapi.d.ts +48 -0
  123. package/lib-next/theme-translations.d.ts +9 -0
  124. package/lib-next/types.js +1 -0
  125. package/package.json +68 -0
  126. package/src/index.ts +42 -0
  127. package/src/markdown/createDescription.ts +13 -0
  128. package/src/markdown/schema.ts +115 -0
  129. package/src/markdown/utils.ts +39 -0
  130. package/src/theme/ApiDemoPanel/Accept/index.tsx +35 -0
  131. package/src/theme/ApiDemoPanel/Accept/slice.ts +29 -0
  132. package/src/theme/ApiDemoPanel/Authorization/auth-types.ts +26 -0
  133. package/src/theme/ApiDemoPanel/Authorization/index.tsx +211 -0
  134. package/src/theme/ApiDemoPanel/Authorization/slice.ts +145 -0
  135. package/src/theme/ApiDemoPanel/Body/index.tsx +218 -0
  136. package/src/theme/ApiDemoPanel/Body/slice.ts +133 -0
  137. package/src/theme/ApiDemoPanel/ContentType/index.tsx +35 -0
  138. package/src/theme/ApiDemoPanel/ContentType/slice.ts +29 -0
  139. package/src/theme/ApiDemoPanel/Curl/index.tsx +280 -0
  140. package/src/theme/ApiDemoPanel/Curl/styles.module.css +84 -0
  141. package/src/theme/ApiDemoPanel/Execute/index.tsx +88 -0
  142. package/src/theme/ApiDemoPanel/Execute/makeRequest.ts +184 -0
  143. package/src/theme/ApiDemoPanel/FloatingButton/index.tsx +27 -0
  144. package/src/theme/ApiDemoPanel/FloatingButton/styles.module.css +26 -0
  145. package/src/theme/ApiDemoPanel/FormFileUpload/index.tsx +116 -0
  146. package/src/theme/ApiDemoPanel/FormFileUpload/styles.module.css +75 -0
  147. package/src/theme/ApiDemoPanel/FormItem/index.tsx +28 -0
  148. package/src/theme/ApiDemoPanel/FormItem/styles.module.css +7 -0
  149. package/src/theme/ApiDemoPanel/FormMultiSelect/index.tsx +54 -0
  150. package/src/theme/ApiDemoPanel/FormMultiSelect/styles.module.css +38 -0
  151. package/src/theme/ApiDemoPanel/FormSelect/index.tsx +36 -0
  152. package/src/theme/ApiDemoPanel/FormSelect/styles.module.css +51 -0
  153. package/src/theme/ApiDemoPanel/FormTextInput/index.tsx +32 -0
  154. package/src/theme/ApiDemoPanel/FormTextInput/styles.module.css +21 -0
  155. package/src/theme/ApiDemoPanel/MethodEndpoint/index.tsx +55 -0
  156. package/src/theme/ApiDemoPanel/ParamOptions/index.tsx +316 -0
  157. package/src/theme/ApiDemoPanel/ParamOptions/slice.ts +37 -0
  158. package/src/theme/ApiDemoPanel/ParamOptions/styles.module.css +180 -0
  159. package/src/theme/ApiDemoPanel/Response/index.tsx +66 -0
  160. package/src/theme/ApiDemoPanel/Response/slice.ts +31 -0
  161. package/src/theme/ApiDemoPanel/SecuritySchemes/index.tsx +49 -0
  162. package/src/theme/ApiDemoPanel/Server/index.tsx +103 -0
  163. package/src/theme/ApiDemoPanel/Server/slice.ts +40 -0
  164. package/src/theme/ApiDemoPanel/Server/styles.module.css +61 -0
  165. package/src/theme/ApiDemoPanel/VSCode/index.tsx +205 -0
  166. package/src/theme/ApiDemoPanel/VSCode/styles.module.css +19 -0
  167. package/src/theme/ApiDemoPanel/buildPostmanRequest.ts +307 -0
  168. package/src/theme/ApiDemoPanel/hooks.ts +13 -0
  169. package/src/theme/ApiDemoPanel/index.tsx +118 -0
  170. package/src/theme/ApiDemoPanel/persistanceMiddleware.ts +46 -0
  171. package/src/theme/ApiDemoPanel/postman-collection.d.ts +10 -0
  172. package/src/theme/ApiDemoPanel/storage-utils.ts +39 -0
  173. package/src/theme/ApiDemoPanel/store.ts +41 -0
  174. package/src/theme/ApiDemoPanel/styles.module.css +44 -0
  175. package/src/theme/ApiItem/index.tsx +171 -0
  176. package/src/theme/ApiItem/styles.module.css +109 -0
  177. package/src/theme/ParamsItem/index.js +68 -0
  178. package/src/theme/ParamsItem/styles.module.css +24 -0
  179. package/src/theme/SchemaItem/index.js +58 -0
  180. package/src/theme/SchemaItem/styles.module.css +24 -0
  181. package/src/theme/Tabs/index.js +258 -0
  182. package/src/theme/Tabs/styles.module.css +118 -0
  183. package/src/theme-classic.d.ts +8 -0
  184. package/src/theme-openapi.d.ts +48 -0
  185. package/src/theme-translations.d.ts +9 -0
  186. package/src/types.ts +70 -0
  187. package/tsconfig.json +10 -0
@@ -0,0 +1,21 @@
1
+ .inputBase {
2
+ margin-top: calc(var(--ifm-pre-padding) / 2);
3
+ /* height: 40px; */
4
+ background-color: var(--openapi-input-background);
5
+ border: none;
6
+ outline: none;
7
+ width: 100%;
8
+ font-size: var(--ifm-code-font-size);
9
+ color: var(--ifm-pre-color);
10
+ padding: 12px var(--ifm-pre-padding);
11
+
12
+ border-radius: 4px;
13
+ }
14
+
15
+ .input {
16
+ composes: inputBase;
17
+ }
18
+
19
+ .input:focus {
20
+ box-shadow: inset 0px 0px 0px 2px var(--openapi-input-border);
21
+ }
@@ -0,0 +1,55 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ * ========================================================================== */
7
+
8
+ import React from "react";
9
+
10
+ const methodStyle = {
11
+ borderRadius: "var(--ifm-global-radius)",
12
+ };
13
+
14
+ function colorForMethod(method: string) {
15
+ switch (method.toLowerCase()) {
16
+ case "get":
17
+ return "primary";
18
+ case "put":
19
+ return "warning";
20
+ case "patch":
21
+ return "warning";
22
+ case "post":
23
+ return "success";
24
+ case "delete":
25
+ return "danger";
26
+ default:
27
+ return undefined;
28
+ }
29
+ }
30
+
31
+ interface Props {
32
+ method: string;
33
+ path: string;
34
+ }
35
+
36
+ function MethodEndpoint({ method, path }: Props) {
37
+ return (
38
+ <pre
39
+ style={{
40
+ background: "var(--openapi-card-background-color)",
41
+ borderRadius: "var(--openapi-card-border-radius)",
42
+ }}
43
+ >
44
+ <span
45
+ style={methodStyle}
46
+ className={"badge badge--" + colorForMethod(method)}
47
+ >
48
+ {method.toUpperCase()}
49
+ </span>{" "}
50
+ <span>{path.replace(/{([a-z0-9-_]+)}/gi, ":$1")}</span>
51
+ </pre>
52
+ );
53
+ }
54
+
55
+ export default MethodEndpoint;
@@ -0,0 +1,316 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ * ========================================================================== */
7
+
8
+ import React, { useState, useEffect } from "react";
9
+
10
+ import { nanoid } from "@reduxjs/toolkit";
11
+
12
+ import { useTypedDispatch, useTypedSelector } from "../hooks";
13
+ import FormItem from "./../FormItem";
14
+ import FormMultiSelect from "./../FormMultiSelect";
15
+ import FormSelect from "./../FormSelect";
16
+ import FormTextInput from "./../FormTextInput";
17
+ import { Param, setParam } from "./slice";
18
+ import styles from "./styles.module.css";
19
+
20
+ interface ParamProps {
21
+ param: Param;
22
+ }
23
+
24
+ function ParamOption({ param }: ParamProps) {
25
+ if (param.schema?.type === "array" && param.schema.items?.enum) {
26
+ return <ParamMultiSelectFormItem param={param} />;
27
+ }
28
+
29
+ if (param.schema?.type === "array") {
30
+ return <ParamArrayFormItem param={param} />;
31
+ }
32
+
33
+ if (param.schema?.enum) {
34
+ return <ParamSelectFormItem param={param} />;
35
+ }
36
+
37
+ if (param.schema?.type === "boolean") {
38
+ return <ParamBooleanFormItem param={param} />;
39
+ }
40
+
41
+ // integer, number, string, int32, int64, float, double, object, byte, binary,
42
+ // date-time, date, password
43
+ return <ParamTextFormItem param={param} />;
44
+ }
45
+
46
+ function ParamOptionWrapper({ param }: ParamProps) {
47
+ return (
48
+ <FormItem label={param.name} type={param.in}>
49
+ <ParamOption param={param} />
50
+ </FormItem>
51
+ );
52
+ }
53
+
54
+ function ParamOptions() {
55
+ const [showOptional, setShowOptional] = useState(false);
56
+
57
+ const pathParams = useTypedSelector((state) => state.params.path);
58
+ const queryParams = useTypedSelector((state) => state.params.query);
59
+ const cookieParams = useTypedSelector((state) => state.params.cookie);
60
+ const headerParams = useTypedSelector((state) => state.params.header);
61
+
62
+ const allParams = [
63
+ ...pathParams,
64
+ ...queryParams,
65
+ ...cookieParams,
66
+ ...headerParams,
67
+ ];
68
+
69
+ const requiredParams = allParams.filter((p) => p.required);
70
+ const optionalParams = allParams.filter((p) => !p.required);
71
+
72
+ return (
73
+ <>
74
+ {/* Required Parameters */}
75
+ {requiredParams.map((param) => (
76
+ <ParamOptionWrapper key={`${param.in}-${param.name}`} param={param} />
77
+ ))}
78
+
79
+ {/* Optional Parameters */}
80
+ {optionalParams.length > 0 && (
81
+ <>
82
+ <button
83
+ className={styles.showMoreButton}
84
+ onClick={() => setShowOptional((prev) => !prev)}
85
+ >
86
+ <span
87
+ style={{
88
+ width: "1.5em",
89
+ display: "inline-block",
90
+ textAlign: "center",
91
+ }}
92
+ >
93
+ <span
94
+ className={showOptional ? styles.plusExpanded : styles.plus}
95
+ >
96
+ <div>
97
+ <svg
98
+ style={{
99
+ fill: "currentColor",
100
+ width: "10px",
101
+ height: "10px",
102
+ }}
103
+ height="16"
104
+ viewBox="0 0 16 16"
105
+ width="16"
106
+ xmlns="http://www.w3.org/2000/svg"
107
+ >
108
+ <path
109
+ d="M9 7h6a1 1 0 0 1 0 2H9v6a1 1 0 0 1-2 0V9H1a1 1 0 1 1 0-2h6V1a1 1 0 1 1 2 0z"
110
+ fillRule="evenodd"
111
+ ></path>
112
+ </svg>
113
+ </div>
114
+ </span>
115
+ </span>
116
+ {showOptional
117
+ ? "Hide optional parameters"
118
+ : "Show optional parameters"}
119
+ </button>
120
+
121
+ <div
122
+ className={showOptional ? styles.showOptions : styles.hideOptions}
123
+ >
124
+ {optionalParams.map((param) => (
125
+ <ParamOptionWrapper
126
+ key={`${param.in}-${param.name}`}
127
+ param={param}
128
+ />
129
+ ))}
130
+ </div>
131
+ </>
132
+ )}
133
+ </>
134
+ );
135
+ }
136
+
137
+ function ArrayItem({
138
+ param,
139
+ onChange,
140
+ }: ParamProps & { onChange(value?: string): any }) {
141
+ if (param.schema?.items?.type === "boolean") {
142
+ return (
143
+ <FormSelect
144
+ options={["---", "true", "false"]}
145
+ onChange={(e) => {
146
+ const val = e.target.value;
147
+ onChange(val === "---" ? undefined : val);
148
+ }}
149
+ />
150
+ );
151
+ }
152
+
153
+ return (
154
+ <FormTextInput
155
+ placeholder={param.description || param.name}
156
+ onChange={(e) => {
157
+ onChange(e.target.value);
158
+ }}
159
+ />
160
+ );
161
+ }
162
+
163
+ function ParamArrayFormItem({ param }: ParamProps) {
164
+ const [items, setItems] = useState<{ id: string; value?: string }[]>([]);
165
+ const dispatch = useTypedDispatch();
166
+
167
+ function handleAddItem() {
168
+ setItems((i) => [
169
+ ...i,
170
+ {
171
+ id: nanoid(),
172
+ },
173
+ ]);
174
+ }
175
+
176
+ useEffect(() => {
177
+ const values = items
178
+ .map((item) => item.value)
179
+ .filter((item): item is string => !!item);
180
+
181
+ dispatch(
182
+ setParam({
183
+ ...param,
184
+ value: values.length > 0 ? values : undefined,
185
+ })
186
+ );
187
+ // eslint-disable-next-line react-hooks/exhaustive-deps
188
+ }, [items]);
189
+
190
+ function handleDeleteItem(itemToDelete: { id: string }) {
191
+ return () => {
192
+ const newItems = items.filter((i) => i.id !== itemToDelete.id);
193
+ setItems(newItems);
194
+ };
195
+ }
196
+
197
+ function handleChangeItem(itemToUpdate: { id: string }) {
198
+ return (value: string) => {
199
+ const newItems = items.map((i) => {
200
+ if (i.id === itemToUpdate.id) {
201
+ return { ...i, value: value };
202
+ }
203
+ return i;
204
+ });
205
+ setItems(newItems);
206
+ };
207
+ }
208
+
209
+ return (
210
+ <>
211
+ {items.map((item) => (
212
+ <div key={item.id} style={{ display: "flex" }}>
213
+ <ArrayItem param={param} onChange={handleChangeItem(item)} />
214
+ <button
215
+ className={styles.buttonDelete}
216
+ onClick={handleDeleteItem(item)}
217
+ >
218
+ <svg
219
+ focusable="false"
220
+ preserveAspectRatio="xMidYMid meet"
221
+ xmlns="http://www.w3.org/2000/svg"
222
+ fill="currentColor"
223
+ width="16"
224
+ height="16"
225
+ viewBox="0 0 32 32"
226
+ aria-hidden="true"
227
+ >
228
+ <path d="M24 9.4L22.6 8 16 14.6 9.4 8 8 9.4 14.6 16 8 22.6 9.4 24 16 17.4 22.6 24 24 22.6 17.4 16 24 9.4z"></path>
229
+ <title>Delete</title>
230
+ </svg>
231
+ </button>
232
+ </div>
233
+ ))}
234
+ <button className={styles.buttonThin} onClick={handleAddItem}>
235
+ Add item
236
+ </button>
237
+ </>
238
+ );
239
+ }
240
+
241
+ function ParamSelectFormItem({ param }: ParamProps) {
242
+ const dispatch = useTypedDispatch();
243
+
244
+ const options = param.schema?.enum ?? [];
245
+
246
+ return (
247
+ <FormSelect
248
+ options={["---", ...(options as string[])]}
249
+ onChange={(e) => {
250
+ const val = e.target.value;
251
+ dispatch(
252
+ setParam({
253
+ ...param,
254
+ value: val === "---" ? undefined : val,
255
+ })
256
+ );
257
+ }}
258
+ />
259
+ );
260
+ }
261
+
262
+ function ParamBooleanFormItem({ param }: ParamProps) {
263
+ const dispatch = useTypedDispatch();
264
+
265
+ return (
266
+ <FormSelect
267
+ options={["---", "true", "false"]}
268
+ onChange={(e) => {
269
+ const val = e.target.value;
270
+ dispatch(
271
+ setParam({
272
+ ...param,
273
+ value: val === "---" ? undefined : val,
274
+ })
275
+ );
276
+ }}
277
+ />
278
+ );
279
+ }
280
+
281
+ function ParamMultiSelectFormItem({ param }: ParamProps) {
282
+ const dispatch = useTypedDispatch();
283
+
284
+ const options = param.schema?.items?.enum ?? [];
285
+
286
+ return (
287
+ <FormMultiSelect
288
+ options={options as string[]}
289
+ onChange={(e) => {
290
+ const values = Array.prototype.filter
291
+ .call(e.target.options, (o) => o.selected)
292
+ .map((o) => o.value);
293
+
294
+ dispatch(
295
+ setParam({
296
+ ...param,
297
+ value: values.length > 0 ? values : undefined,
298
+ })
299
+ );
300
+ }}
301
+ />
302
+ );
303
+ }
304
+
305
+ function ParamTextFormItem({ param }: ParamProps) {
306
+ const dispatch = useTypedDispatch();
307
+
308
+ return (
309
+ <FormTextInput
310
+ placeholder={param.description || param.name}
311
+ onChange={(e) => dispatch(setParam({ ...param, value: e.target.value }))}
312
+ />
313
+ );
314
+ }
315
+
316
+ export default ParamOptions;
@@ -0,0 +1,37 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ * ========================================================================== */
7
+
8
+ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
9
+ import { ParameterObject } from "docusaurus-plugin-openapi-docs/src/openapi/types";
10
+
11
+ export type Param = ParameterObject & { value?: string[] | string };
12
+
13
+ export interface State {
14
+ path: Param[];
15
+ query: Param[];
16
+ header: Param[];
17
+ cookie: Param[];
18
+ }
19
+
20
+ const initialState: State = {} as any;
21
+
22
+ export const slice = createSlice({
23
+ name: "params",
24
+ initialState,
25
+ reducers: {
26
+ setParam: (state, action: PayloadAction<Param>) => {
27
+ const newParam = action.payload;
28
+ const paramGroup = state[action.payload.in];
29
+ const index = paramGroup.findIndex((p) => p.name === newParam.name);
30
+ paramGroup[index] = newParam;
31
+ },
32
+ },
33
+ });
34
+
35
+ export const { setParam } = slice.actions;
36
+
37
+ export default slice.reducer;
@@ -0,0 +1,180 @@
1
+ .plus {
2
+ transition: transform 0.2s ease;
3
+ display: inline-block;
4
+ transform: rotate(0deg);
5
+ transform-origin: center;
6
+ margin-right: 6px;
7
+ }
8
+
9
+ .plusExpanded {
10
+ composes: plus;
11
+ transform: rotate(45deg);
12
+ }
13
+
14
+ .showMoreButton {
15
+ -webkit-appearance: none;
16
+ -moz-appearance: none;
17
+ appearance: none;
18
+
19
+ cursor: pointer;
20
+ font-size: var(--ifm-code-font-size);
21
+ /* font-weight: var(--ifm-button-font-weight); */
22
+ /* line-height: 1.5; */
23
+
24
+ padding: 0;
25
+
26
+ user-select: none;
27
+ white-space: nowrap;
28
+
29
+ border: 0px solid transparent;
30
+
31
+ display: block;
32
+ width: 100%;
33
+
34
+ background-color: transparent;
35
+
36
+ color: var(--ifm-color-primary);
37
+ cursor: pointer;
38
+ margin-top: var(--ifm-pre-padding);
39
+ margin-bottom: 0;
40
+ text-align: left;
41
+ display: block;
42
+ }
43
+
44
+ .showMoreButton:focus {
45
+ outline: 0;
46
+ }
47
+
48
+ .showMoreButton:hover {
49
+ /* text-decoration: underline; */
50
+ /* background-color: red; */
51
+ color: var(--ifm-color-primary-hover);
52
+ }
53
+
54
+ .showMoreButton:first-child {
55
+ margin-top: 0;
56
+ }
57
+
58
+ /* .showMoreButton:last-child {
59
+ margin-bottom: 0;
60
+ } */
61
+
62
+ .buttonDelete {
63
+ -webkit-appearance: none;
64
+ -moz-appearance: none;
65
+ appearance: none;
66
+
67
+ cursor: pointer;
68
+ font-size: calc(0.875rem * var(--ifm-button-size-multiplier));
69
+ font-weight: normal;
70
+ line-height: 1.5;
71
+
72
+ transition-property: color, background, border-color, box-shadow;
73
+ transition-duration: 100ms, 100ms, 100ms,
74
+ var(--ifm-button-transition-duration);
75
+ transition-timing-function: cubic-bezier(0.08, 0.52, 0.52, 1);
76
+
77
+ -webkit-user-select: none;
78
+ user-select: none;
79
+ white-space: nowrap;
80
+
81
+ display: flex;
82
+
83
+ align-items: center;
84
+ justify-content: center;
85
+
86
+ padding: 0 12px;
87
+
88
+ margin-top: calc(var(--ifm-pre-padding) / 2);
89
+ background-color: var(--openapi-input-background);
90
+ border: none;
91
+ outline: none;
92
+ color: var(--ifm-pre-color);
93
+ border-radius: 4px;
94
+ margin-left: 4px;
95
+ }
96
+
97
+ .buttonDelete:focus {
98
+ outline: 0;
99
+ }
100
+
101
+ .buttonDelete:active {
102
+ box-shadow: inset 0px 0px 0px 2px var(--openapi-input-border);
103
+ }
104
+
105
+ .buttonThin {
106
+ -webkit-appearance: none;
107
+ -moz-appearance: none;
108
+ appearance: none;
109
+
110
+ cursor: pointer;
111
+ font-size: calc(0.875rem * var(--ifm-button-size-multiplier));
112
+ font-weight: normal;
113
+ line-height: 1.5;
114
+
115
+ transition-property: color, background, border-color, box-shadow;
116
+ transition-duration: 100ms, 100ms, 100ms,
117
+ var(--ifm-button-transition-duration);
118
+ transition-timing-function: cubic-bezier(0.08, 0.52, 0.52, 1);
119
+
120
+ -webkit-user-select: none;
121
+ user-select: none;
122
+ white-space: nowrap;
123
+
124
+ background-color: transparent;
125
+ color: var(--openapi-input-border);
126
+ border: 1px solid var(--openapi-input-border);
127
+ border-radius: var(--ifm-pre-border-radius);
128
+ /* height: 48px; */
129
+ padding: 3px 60px 3px 12px;
130
+ margin-top: calc(var(--ifm-pre-padding) / 2);
131
+ margin-bottom: var(--ifm-pre-padding);
132
+
133
+ display: block;
134
+ }
135
+
136
+ .buttonThin:hover {
137
+ color: var(--openapi-inverse-color);
138
+ background-color: var(--openapi-input-border);
139
+ }
140
+
141
+ .buttonThin:focus {
142
+ outline: 0;
143
+ }
144
+
145
+ .buttonThin:active {
146
+ box-shadow: inset 0 0 0 1px var(--openapi-input-border),
147
+ inset 0 0 0 2px var(--openapi-inverse-color);
148
+ }
149
+
150
+ .inputBase {
151
+ margin-top: calc(var(--ifm-pre-padding) / 2);
152
+ /* height: 40px; */
153
+ background-color: var(--openapi-input-background);
154
+ border: none;
155
+ outline: none;
156
+ width: 100%;
157
+ font-size: var(--ifm-code-font-size);
158
+ color: var(--ifm-pre-color);
159
+ padding: 12px var(--ifm-pre-padding);
160
+
161
+ border-radius: 4px;
162
+ }
163
+
164
+ .input {
165
+ composes: inputBase;
166
+ }
167
+
168
+ .input:focus {
169
+ box-shadow: inset 0px 0px 0px 2px var(--openapi-input-border);
170
+ }
171
+
172
+ .showOptions {
173
+ visibility: visible;
174
+ margin-top: var(--ifm-pre-padding);
175
+ }
176
+
177
+ .hideOptions {
178
+ display: none;
179
+ visibility: hidden;
180
+ }
@@ -0,0 +1,66 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ * ========================================================================== */
7
+
8
+ import React from "react";
9
+
10
+ import { useTypedDispatch, useTypedSelector } from "../hooks";
11
+ import FloatingButton from "./../FloatingButton";
12
+ import { clearResponse } from "./slice";
13
+
14
+ // TODO: We probably shouldn't attempt to format XML...
15
+ function formatXml(xml: string) {
16
+ const tab = " ";
17
+ let formatted = "";
18
+ let indent = "";
19
+
20
+ xml.split(/>\s*</).forEach((node) => {
21
+ if (node.match(/^\/\w/)) {
22
+ // decrease indent by one 'tab'
23
+ indent = indent.substring(tab.length);
24
+ }
25
+ formatted += indent + "<" + node + ">\r\n";
26
+ if (node.match(/^<?\w[^>]*[^/]$/)) {
27
+ // increase indent
28
+ indent += tab;
29
+ }
30
+ });
31
+ return formatted.substring(1, formatted.length - 3);
32
+ }
33
+
34
+ function Response() {
35
+ const response = useTypedSelector((state) => state.response.value);
36
+ const dispatch = useTypedDispatch();
37
+
38
+ if (response === undefined) {
39
+ return null;
40
+ }
41
+
42
+ let prettyResponse: string = response;
43
+ try {
44
+ prettyResponse = JSON.stringify(JSON.parse(response), null, 2);
45
+ } catch {
46
+ if (response.startsWith("<?xml ")) {
47
+ prettyResponse = formatXml(response);
48
+ }
49
+ }
50
+
51
+ return (
52
+ <FloatingButton onClick={() => dispatch(clearResponse())} label="Clear">
53
+ <pre
54
+ style={{
55
+ background: "var(--openapi-card-background-color)",
56
+ borderRadius: "var(--openapi-card-border-radius)",
57
+ paddingRight: "60px",
58
+ }}
59
+ >
60
+ <code>{prettyResponse || "No Response"}</code>
61
+ </pre>
62
+ </FloatingButton>
63
+ );
64
+ }
65
+
66
+ export default Response;
@@ -0,0 +1,31 @@
1
+ /* ============================================================================
2
+ * Copyright (c) Palo Alto Networks
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ * ========================================================================== */
7
+
8
+ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
9
+
10
+ export interface State {
11
+ value?: string;
12
+ }
13
+
14
+ const initialState: State = {} as any;
15
+
16
+ export const slice = createSlice({
17
+ name: "response",
18
+ initialState,
19
+ reducers: {
20
+ setResponse: (state, action: PayloadAction<string>) => {
21
+ state.value = action.payload;
22
+ },
23
+ clearResponse: (state) => {
24
+ state.value = undefined;
25
+ },
26
+ },
27
+ });
28
+
29
+ export const { setResponse, clearResponse } = slice.actions;
30
+
31
+ export default slice.reducer;