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,310 @@
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
+ import sdk from "@paloaltonetworks/postman-collection";
8
+ // @ts-ignore
9
+ import cloneDeep from "lodash/cloneDeep";
10
+
11
+ function setQueryParams(postman, queryParams) {
12
+ postman.url.query.clear();
13
+ const qp = queryParams
14
+ .map((param) => {
15
+ if (!param.value) {
16
+ return undefined;
17
+ }
18
+
19
+ if (Array.isArray(param.value)) {
20
+ return new sdk.QueryParam({
21
+ key: param.name,
22
+ value: param.value.join(","),
23
+ });
24
+ } // Parameter allows empty value: "/hello?extended"
25
+
26
+ if (param.allowEmptyValue) {
27
+ if (param.value === "true") {
28
+ return new sdk.QueryParam({
29
+ key: param.name,
30
+ value: null,
31
+ });
32
+ }
33
+
34
+ return undefined;
35
+ }
36
+
37
+ return new sdk.QueryParam({
38
+ key: param.name,
39
+ value: param.value,
40
+ });
41
+ })
42
+ .filter((item) => item !== undefined);
43
+
44
+ if (qp.length > 0) {
45
+ postman.addQueryParams(qp);
46
+ }
47
+ }
48
+
49
+ function setPathParams(postman, queryParams) {
50
+ const source = queryParams.map((param) => {
51
+ return new sdk.Variable({
52
+ key: param.name,
53
+ value: param.value || `:${param.name}`,
54
+ });
55
+ });
56
+ postman.url.variables.assimilate(source, false);
57
+ }
58
+
59
+ function buildCookie(cookieParams) {
60
+ const cookies = cookieParams
61
+ .map((param) => {
62
+ if (param.value && !Array.isArray(param.value)) {
63
+ return new sdk.Cookie({
64
+ // TODO: Is this right?
65
+ path: "",
66
+ domain: "",
67
+ key: param.name,
68
+ value: param.value,
69
+ });
70
+ }
71
+
72
+ return undefined;
73
+ })
74
+ .filter((item) => item !== undefined);
75
+ const list = new sdk.CookieList(null, cookies);
76
+ return list.toString();
77
+ }
78
+
79
+ function setHeaders(postman, contentType, accept, cookie, headerParams, other) {
80
+ postman.headers.clear();
81
+
82
+ if (contentType) {
83
+ postman.addHeader({
84
+ key: "Content-Type",
85
+ value: contentType,
86
+ });
87
+ }
88
+
89
+ if (accept) {
90
+ postman.addHeader({
91
+ key: "Accept",
92
+ value: accept,
93
+ });
94
+ }
95
+
96
+ headerParams.forEach((param) => {
97
+ if (param.value && !Array.isArray(param.value)) {
98
+ postman.addHeader({
99
+ key: param.name,
100
+ value: param.value,
101
+ });
102
+ }
103
+ });
104
+ other.forEach((header) => {
105
+ postman.addHeader(header);
106
+ });
107
+
108
+ if (cookie) {
109
+ postman.addHeader({
110
+ key: "Cookie",
111
+ value: cookie,
112
+ });
113
+ }
114
+ } // TODO: this is all a bit hacky
115
+
116
+ function setBody(clonedPostman, body) {
117
+ if (clonedPostman.body === undefined) {
118
+ return;
119
+ }
120
+
121
+ if (body.type === "empty") {
122
+ clonedPostman.body = undefined;
123
+ return;
124
+ }
125
+
126
+ if (body.type === "raw" && body.content?.type === "file") {
127
+ // treat it like file.
128
+ clonedPostman.body.mode = "file";
129
+ clonedPostman.body.file = {
130
+ src: body.content.value.src,
131
+ };
132
+ return;
133
+ }
134
+
135
+ switch (clonedPostman.body.mode) {
136
+ case "raw": {
137
+ // check file even though it should already be set from above
138
+ if (body.type !== "raw" || body.content?.type === "file") {
139
+ clonedPostman.body = undefined;
140
+ return;
141
+ }
142
+
143
+ clonedPostman.body.raw = body.content?.value ?? "";
144
+ return;
145
+ }
146
+
147
+ case "formdata": {
148
+ clonedPostman.body.formdata?.clear();
149
+
150
+ if (body.type !== "form") {
151
+ // treat it like raw.
152
+ clonedPostman.body.mode = "raw";
153
+ clonedPostman.body.raw = `${body.content?.value}`;
154
+ return;
155
+ }
156
+
157
+ const params = Object.entries(body.content)
158
+ .filter((entry) => !!entry[1])
159
+ .map(([key, content]) => {
160
+ if (content.type === "file") {
161
+ return new sdk.FormParam({
162
+ key: key,
163
+ ...content,
164
+ });
165
+ }
166
+
167
+ return new sdk.FormParam({
168
+ key: key,
169
+ value: content.value,
170
+ });
171
+ });
172
+ clonedPostman.body.formdata?.assimilate(params, false);
173
+ return;
174
+ }
175
+
176
+ case "urlencoded": {
177
+ clonedPostman.body.urlencoded?.clear();
178
+
179
+ if (body.type !== "form") {
180
+ // treat it like raw.
181
+ clonedPostman.body.mode = "raw";
182
+ clonedPostman.body.raw = `${body.content?.value}`;
183
+ return;
184
+ }
185
+
186
+ const params = Object.entries(body.content)
187
+ .filter((entry) => !!entry[1])
188
+ .map(([key, content]) => {
189
+ if (content.type !== "file" && content.value) {
190
+ return new sdk.QueryParam({
191
+ key: key,
192
+ value: content.value,
193
+ });
194
+ }
195
+
196
+ return undefined;
197
+ })
198
+ .filter((item) => item !== undefined);
199
+ clonedPostman.body.urlencoded?.assimilate(params, false);
200
+ return;
201
+ }
202
+
203
+ default:
204
+ return;
205
+ }
206
+ } // TODO: finish these types
207
+
208
+ function buildPostmanRequest(
209
+ postman,
210
+ {
211
+ queryParams,
212
+ pathParams,
213
+ cookieParams,
214
+ contentType,
215
+ accept,
216
+ headerParams,
217
+ body,
218
+ server,
219
+ auth,
220
+ }
221
+ ) {
222
+ const clonedPostman = cloneDeep(postman);
223
+ clonedPostman.url.protocol = undefined;
224
+ clonedPostman.url.host = [window.location.origin];
225
+
226
+ if (server) {
227
+ let url = server.url.replace(/\/$/, "");
228
+ const variables = server.variables;
229
+
230
+ if (variables) {
231
+ Object.keys(variables).forEach((variable) => {
232
+ url = url.replace(`{${variable}}`, variables[variable].default);
233
+ });
234
+ }
235
+
236
+ clonedPostman.url.host = [url];
237
+ }
238
+
239
+ setQueryParams(clonedPostman, queryParams);
240
+ setPathParams(clonedPostman, pathParams);
241
+ const cookie = buildCookie(cookieParams);
242
+ let otherHeaders = [];
243
+ let selectedAuth = [];
244
+
245
+ if (auth.selected !== undefined) {
246
+ selectedAuth = auth.options[auth.selected];
247
+ }
248
+
249
+ for (const a of selectedAuth) {
250
+ // Bearer Auth
251
+ if (a.type === "http" && a.scheme === "bearer") {
252
+ const { token } = auth.data[a.key];
253
+
254
+ if (token === undefined) {
255
+ continue;
256
+ }
257
+
258
+ otherHeaders.push({
259
+ key: "Authorization",
260
+ value: `Bearer ${token}`,
261
+ });
262
+ continue;
263
+ } // Basic Auth
264
+
265
+ if (a.type === "http" && a.scheme === "basic") {
266
+ const { username, password } = auth.data[a.key];
267
+
268
+ if (username === undefined || password === undefined) {
269
+ continue;
270
+ }
271
+
272
+ otherHeaders.push({
273
+ key: "Authorization",
274
+ value: `Basic ${window.btoa(`${username}:${password}`)}`,
275
+ });
276
+ continue;
277
+ } // API Key
278
+
279
+ if (a.type === "apiKey" && a.in === "header") {
280
+ const { apikey } = auth.data[a.key];
281
+
282
+ if (apikey === undefined) {
283
+ otherHeaders.push({
284
+ key: a.name,
285
+ value: "API_KEY_VALUE",
286
+ });
287
+ continue;
288
+ }
289
+
290
+ otherHeaders.push({
291
+ key: a.name,
292
+ value: apikey,
293
+ });
294
+ continue;
295
+ }
296
+ }
297
+
298
+ setHeaders(
299
+ clonedPostman,
300
+ contentType,
301
+ accept,
302
+ cookie,
303
+ headerParams,
304
+ otherHeaders
305
+ );
306
+ setBody(clonedPostman, body);
307
+ return clonedPostman;
308
+ }
309
+
310
+ export default buildPostmanRequest;
@@ -0,0 +1,9 @@
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
+ import { useDispatch, useSelector } from "react-redux";
8
+ export const useTypedDispatch = () => useDispatch();
9
+ export const useTypedSelector = useSelector;
@@ -0,0 +1,110 @@
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
+ import React from "react";
8
+ import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; // @ts-ignore
9
+ // @ts-ignore
10
+
11
+ import sdk from "@paloaltonetworks/postman-collection"; // @ts-ignore
12
+
13
+ import { Provider } from "react-redux";
14
+ import Accept from "./Accept";
15
+ import { createAuth } from "./Authorization/slice";
16
+ import Body from "./Body";
17
+ import Curl from "./Curl";
18
+ import MethodEndpoint from "./MethodEndpoint";
19
+ import ParamOptions from "./ParamOptions";
20
+ import { createPersistanceMiddleware } from "./persistanceMiddleware";
21
+ import Response from "./Response";
22
+ import SecuritySchemes from "./SecuritySchemes";
23
+ import Server from "./Server";
24
+ import { createStoreWithState } from "./store";
25
+ import styles from "./styles.module.css";
26
+
27
+ function ApiDemoPanel({ item }) {
28
+ const { siteConfig } = useDocusaurusContext();
29
+ const themeConfig = siteConfig.themeConfig;
30
+ const options = themeConfig.api;
31
+ const postman = new sdk.Request(item.postman);
32
+ const acceptArray = Array.from(
33
+ new Set(
34
+ Object.values(item.responses ?? {}) // @ts-ignore
35
+ .map((response) => Object.keys(response.content ?? {}))
36
+ .flat()
37
+ )
38
+ );
39
+ const content = item.requestBody?.content ?? {};
40
+ const contentTypeArray = Object.keys(content);
41
+ const servers = item.servers ?? [];
42
+ const params = {
43
+ path: [],
44
+ query: [],
45
+ header: [],
46
+ cookie: [],
47
+ };
48
+ item.parameters?.forEach((param) => {
49
+ // @ts-ignore
50
+ params[param.in].push(param);
51
+ });
52
+ const auth = createAuth({
53
+ security: item.security,
54
+ securitySchemes: item.securitySchemes,
55
+ options,
56
+ });
57
+ const persistanceMiddleware = createPersistanceMiddleware(options);
58
+ const store2 = createStoreWithState(
59
+ {
60
+ accept: {
61
+ value: acceptArray[0],
62
+ options: acceptArray,
63
+ },
64
+ contentType: {
65
+ value: contentTypeArray[0],
66
+ options: contentTypeArray,
67
+ },
68
+ server: {
69
+ value: servers[0],
70
+ options: servers,
71
+ },
72
+ response: {
73
+ value: undefined,
74
+ },
75
+ body: {
76
+ type: "empty",
77
+ },
78
+ params,
79
+ auth,
80
+ },
81
+ [persistanceMiddleware]
82
+ );
83
+ const { path, method } = item;
84
+ return (
85
+ <Provider store={store2}>
86
+ <div className={styles.apiDemoPanelContainer}>
87
+ <MethodEndpoint method={method} path={path} />
88
+
89
+ <SecuritySchemes />
90
+
91
+ <div className={styles.optionsPanel}>
92
+ <ParamOptions />
93
+ <Body
94
+ jsonRequestBodyExample={item.jsonRequestBodyExample}
95
+ requestBodyMetadata={item.requestBody}
96
+ />
97
+ <Accept />
98
+ </div>
99
+
100
+ <Server />
101
+
102
+ <Curl postman={postman} codeSamples={item["x-code-samples"] ?? []} />
103
+
104
+ <Response />
105
+ </div>
106
+ </Provider>
107
+ );
108
+ }
109
+
110
+ export default ApiDemoPanel;
@@ -0,0 +1,38 @@
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
+ import { setAuthData, setSelectedAuth } from "./Authorization/slice";
8
+ import { createStorage, hashArray } from "./storage-utils";
9
+ export function createPersistanceMiddleware(options) {
10
+ const persistanceMiddleware = (storeAPI) => (next) => (action) => {
11
+ const result = next(action);
12
+ const state = storeAPI.getState();
13
+ const storage = createStorage(options?.authPersistance);
14
+
15
+ if (action.type === setAuthData.type) {
16
+ for (const [key, value] of Object.entries(state.auth.data)) {
17
+ if (Object.values(value).filter(Boolean).length > 0) {
18
+ storage.setItem(key, JSON.stringify(value));
19
+ } else {
20
+ storage.removeItem(key);
21
+ }
22
+ }
23
+ }
24
+
25
+ if (action.type === setSelectedAuth.type) {
26
+ if (state.auth.selected) {
27
+ storage.setItem(
28
+ hashArray(Object.keys(state.auth.options)),
29
+ state.auth.selected
30
+ );
31
+ }
32
+ }
33
+
34
+ return result;
35
+ };
36
+
37
+ return persistanceMiddleware;
38
+ }
@@ -0,0 +1,10 @@
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
+ declare module "@paloaltonetworks/postman-collection" {
9
+ export = Request.sdk;
10
+ }
@@ -0,0 +1,35 @@
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
+ import crypto from "crypto-js";
8
+ export function hashArray(arr) {
9
+ function hash(message) {
10
+ return crypto.SHA1(message).toString();
11
+ }
12
+
13
+ const hashed = arr.map((item) => hash(item));
14
+ hashed.sort();
15
+ const res = hashed.join();
16
+ return hash(res);
17
+ }
18
+ export function createStorage(persistance) {
19
+ if (persistance === false) {
20
+ return {
21
+ getItem: () => null,
22
+ setItem: () => {},
23
+ clear: () => {},
24
+ key: () => null,
25
+ removeItem: () => {},
26
+ length: 0,
27
+ };
28
+ }
29
+
30
+ if (persistance === "sessionStorage") {
31
+ return sessionStorage;
32
+ }
33
+
34
+ return localStorage;
35
+ }
@@ -0,0 +1,30 @@
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
+ import { configureStore, combineReducers } from "@reduxjs/toolkit";
8
+ import accept from "./Accept/slice";
9
+ import auth from "./Authorization/slice";
10
+ import body from "./Body/slice";
11
+ import contentType from "./ContentType/slice";
12
+ import params from "./ParamOptions/slice";
13
+ import response from "./Response/slice";
14
+ import server from "./Server/slice";
15
+ const rootReducer = combineReducers({
16
+ accept,
17
+ contentType,
18
+ response,
19
+ server,
20
+ body,
21
+ params,
22
+ auth,
23
+ });
24
+ export const createStoreWithState = (preloadedState, middlewares) =>
25
+ configureStore({
26
+ reducer: rootReducer,
27
+ preloadedState,
28
+ middleware: (getDefaultMiddleware) =>
29
+ getDefaultMiddleware().concat(...middlewares),
30
+ });
@@ -0,0 +1,44 @@
1
+ :root {
2
+ /* VS Dark mode */
3
+ --openapi-monaco-background-color-dark: var(--ifm-color-gray-900);
4
+ --openapi-code-bright-dark: var(--ifm-color-secondary-lighter);
5
+ --openapi-code-dim-dark: var(--ifm-color-secondary-dark);
6
+ --openapi-code-blue-dark: var(--ifm-color-primary);
7
+ --openapi-code-green-dark: var(--ifm-color-success);
8
+ --openapi-code-select-dark: var(--ifm-color-secondary-lightest);
9
+
10
+ /* VS Light mode */
11
+ --openapi-monaco-background-color-light: var(--ifm-color-gray-100);
12
+ --openapi-code-bright-light: var(--ifm-color-black);
13
+ --openapi-code-dim-light: var(--ifm-color-black);
14
+ --openapi-code-blue-light: var(--ifm-color-primary);
15
+ --openapi-code-green-light: var(--ifm-color-success);
16
+ --openapi-code-select-light: var(--ifm-color-secondary-light);
17
+
18
+ --openapi-card-background-color: var(--ifm-color-gray-100);
19
+ --openapi-card-border-radius: var(--ifm-pre-border-radius);
20
+ --openapi-monaco-border-color: var(--openapi-card-background-color);
21
+ --openapi-input-border: var(--ifm-color-primary);
22
+ }
23
+
24
+ [data-theme="dark"] {
25
+ --openapi-card-background-color: var(--ifm-color-gray-900) !important;
26
+ }
27
+
28
+ .optionsPanel:empty {
29
+ display: none;
30
+ }
31
+
32
+ .optionsPanel {
33
+ background: var(--openapi-card-background-color);
34
+ border-radius: var(--openapi-card-border-radius);
35
+ color: var(--ifm-pre-color);
36
+ line-height: var(--ifm-pre-line-height);
37
+ margin-bottom: var(--ifm-spacing-vertical);
38
+ margin-top: 0;
39
+ overflow: auto;
40
+ padding: var(--ifm-pre-padding);
41
+
42
+ /* hack for view calculation when monaco is hidden */
43
+ position: relative;
44
+ }