@camunda8/docusaurus-theme-openapi-docs 4.5.1

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 (312) hide show
  1. package/babel.config.js +35 -0
  2. package/lib/index.d.ts +2 -0
  3. package/lib/index.js +81 -0
  4. package/lib/markdown/createDescription.d.ts +1 -0
  5. package/lib/markdown/createDescription.js +15 -0
  6. package/lib/markdown/schema.d.ts +3 -0
  7. package/lib/markdown/schema.js +154 -0
  8. package/lib/markdown/utils.d.ts +10 -0
  9. package/lib/markdown/utils.js +49 -0
  10. package/lib/markdown/utils.test.d.ts +1 -0
  11. package/lib/markdown/utils.test.js +43 -0
  12. package/lib/theme/ApiExplorer/Accept/index.d.ts +3 -0
  13. package/lib/theme/ApiExplorer/Accept/index.js +38 -0
  14. package/lib/theme/ApiExplorer/Accept/slice.d.ts +11 -0
  15. package/lib/theme/ApiExplorer/Accept/slice.js +22 -0
  16. package/lib/theme/ApiExplorer/ApiCodeBlock/Container/_Container.scss +7 -0
  17. package/lib/theme/ApiExplorer/ApiCodeBlock/Container/index.d.ts +4 -0
  18. package/lib/theme/ApiExplorer/ApiCodeBlock/Container/index.js +35 -0
  19. package/lib/theme/ApiExplorer/ApiCodeBlock/Content/Element.d.ts +3 -0
  20. package/lib/theme/ApiExplorer/ApiCodeBlock/Content/Element.js +41 -0
  21. package/lib/theme/ApiExplorer/ApiCodeBlock/Content/String.d.ts +3 -0
  22. package/lib/theme/ApiExplorer/ApiCodeBlock/Content/String.js +153 -0
  23. package/lib/theme/ApiExplorer/ApiCodeBlock/Content/_Content.scss +91 -0
  24. package/lib/theme/ApiExplorer/ApiCodeBlock/CopyButton/_CopyButton.scss +44 -0
  25. package/lib/theme/ApiExplorer/ApiCodeBlock/CopyButton/index.d.ts +7 -0
  26. package/lib/theme/ApiExplorer/ApiCodeBlock/CopyButton/index.js +147 -0
  27. package/lib/theme/ApiExplorer/ApiCodeBlock/ExitButton/_ExitButton.scss +16 -0
  28. package/lib/theme/ApiExplorer/ApiCodeBlock/ExitButton/index.d.ts +6 -0
  29. package/lib/theme/ApiExplorer/ApiCodeBlock/ExitButton/index.js +58 -0
  30. package/lib/theme/ApiExplorer/ApiCodeBlock/ExpandButton/_ExpandButton.scss +62 -0
  31. package/lib/theme/ApiExplorer/ApiCodeBlock/ExpandButton/index.d.ts +14 -0
  32. package/lib/theme/ApiExplorer/ApiCodeBlock/ExpandButton/index.js +248 -0
  33. package/lib/theme/ApiExplorer/ApiCodeBlock/Line/_Line.scss +34 -0
  34. package/lib/theme/ApiExplorer/ApiCodeBlock/Line/index.d.ts +3 -0
  35. package/lib/theme/ApiExplorer/ApiCodeBlock/Line/index.js +59 -0
  36. package/lib/theme/ApiExplorer/ApiCodeBlock/WordWrapButton/_WordWrapButton.scss +10 -0
  37. package/lib/theme/ApiExplorer/ApiCodeBlock/WordWrapButton/index.d.ts +7 -0
  38. package/lib/theme/ApiExplorer/ApiCodeBlock/WordWrapButton/index.js +51 -0
  39. package/lib/theme/ApiExplorer/ApiCodeBlock/index.d.ts +3 -0
  40. package/lib/theme/ApiExplorer/ApiCodeBlock/index.js +110 -0
  41. package/lib/theme/ApiExplorer/Authorization/auth-types.d.ts +3 -0
  42. package/lib/theme/ApiExplorer/Authorization/auth-types.js +28 -0
  43. package/lib/theme/ApiExplorer/Authorization/index.d.ts +3 -0
  44. package/lib/theme/ApiExplorer/Authorization/index.js +201 -0
  45. package/lib/theme/ApiExplorer/Authorization/slice.d.ts +40 -0
  46. package/lib/theme/ApiExplorer/Authorization/slice.js +102 -0
  47. package/lib/theme/ApiExplorer/Body/index.d.ts +10 -0
  48. package/lib/theme/ApiExplorer/Body/index.js +394 -0
  49. package/lib/theme/ApiExplorer/Body/json2xml.js +43 -0
  50. package/lib/theme/ApiExplorer/Body/slice.d.ts +82 -0
  51. package/lib/theme/ApiExplorer/Body/slice.js +97 -0
  52. package/lib/theme/ApiExplorer/CodeSnippets/code-snippets-types.d.ts +21 -0
  53. package/lib/theme/ApiExplorer/CodeSnippets/code-snippets-types.js +8 -0
  54. package/lib/theme/ApiExplorer/CodeSnippets/index.d.ts +11 -0
  55. package/lib/theme/ApiExplorer/CodeSnippets/index.js +435 -0
  56. package/lib/theme/ApiExplorer/CodeSnippets/languages.d.ts +5 -0
  57. package/lib/theme/ApiExplorer/CodeSnippets/languages.js +133 -0
  58. package/lib/theme/ApiExplorer/CodeSnippets/languages.json +1290 -0
  59. package/lib/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +505 -0
  60. package/lib/theme/ApiExplorer/CodeTabs/index.d.ts +15 -0
  61. package/lib/theme/ApiExplorer/CodeTabs/index.js +283 -0
  62. package/lib/theme/ApiExplorer/ContentType/index.d.ts +3 -0
  63. package/lib/theme/ApiExplorer/ContentType/index.js +40 -0
  64. package/lib/theme/ApiExplorer/ContentType/slice.d.ts +11 -0
  65. package/lib/theme/ApiExplorer/ContentType/slice.js +22 -0
  66. package/lib/theme/ApiExplorer/Export/index.d.ts +3 -0
  67. package/lib/theme/ApiExplorer/Export/index.js +57 -0
  68. package/lib/theme/ApiExplorer/FloatingButton/_FloatingButton.scss +27 -0
  69. package/lib/theme/ApiExplorer/FloatingButton/index.d.ts +8 -0
  70. package/lib/theme/ApiExplorer/FloatingButton/index.js +28 -0
  71. package/lib/theme/ApiExplorer/FormFileUpload/_FormFileUpload.scss +74 -0
  72. package/lib/theme/ApiExplorer/FormFileUpload/index.d.ts +7 -0
  73. package/lib/theme/ApiExplorer/FormFileUpload/index.js +178 -0
  74. package/lib/theme/ApiExplorer/FormItem/_FormItem.scss +21 -0
  75. package/lib/theme/ApiExplorer/FormItem/index.d.ts +10 -0
  76. package/lib/theme/ApiExplorer/FormItem/index.js +49 -0
  77. package/lib/theme/ApiExplorer/FormMultiSelect/_FormMultiSelect.scss +30 -0
  78. package/lib/theme/ApiExplorer/FormMultiSelect/index.d.ts +9 -0
  79. package/lib/theme/ApiExplorer/FormMultiSelect/index.js +51 -0
  80. package/lib/theme/ApiExplorer/FormSelect/_FormSelect.scss +43 -0
  81. package/lib/theme/ApiExplorer/FormSelect/index.d.ts +8 -0
  82. package/lib/theme/ApiExplorer/FormSelect/index.js +35 -0
  83. package/lib/theme/ApiExplorer/FormTextInput/_FormTextInput.scss +34 -0
  84. package/lib/theme/ApiExplorer/FormTextInput/index.d.ts +11 -0
  85. package/lib/theme/ApiExplorer/FormTextInput/index.js +80 -0
  86. package/lib/theme/ApiExplorer/LiveEditor/_LiveEditor.scss +15 -0
  87. package/lib/theme/ApiExplorer/LiveEditor/index.d.ts +6 -0
  88. package/lib/theme/ApiExplorer/LiveEditor/index.js +176 -0
  89. package/lib/theme/ApiExplorer/MethodEndpoint/_MethodEndpoint.scss +22 -0
  90. package/lib/theme/ApiExplorer/MethodEndpoint/index.d.ts +8 -0
  91. package/lib/theme/ApiExplorer/MethodEndpoint/index.js +86 -0
  92. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamArrayFormItem.d.ts +6 -0
  93. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamArrayFormItem.js +230 -0
  94. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamBooleanFormItem.d.ts +6 -0
  95. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamBooleanFormItem.js +71 -0
  96. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamMultiSelectFormItem.d.ts +6 -0
  97. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamMultiSelectFormItem.js +97 -0
  98. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamSelectFormItem.d.ts +6 -0
  99. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamSelectFormItem.js +72 -0
  100. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamTextFormItem.d.ts +6 -0
  101. package/lib/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamTextFormItem.js +38 -0
  102. package/lib/theme/ApiExplorer/ParamOptions/_ParamOptions.scss +123 -0
  103. package/lib/theme/ApiExplorer/ParamOptions/index.d.ts +7 -0
  104. package/lib/theme/ApiExplorer/ParamOptions/index.js +233 -0
  105. package/lib/theme/ApiExplorer/ParamOptions/slice.d.ts +17 -0
  106. package/lib/theme/ApiExplorer/ParamOptions/slice.js +25 -0
  107. package/lib/theme/ApiExplorer/Request/_Request.scss +129 -0
  108. package/lib/theme/ApiExplorer/Request/index.d.ts +6 -0
  109. package/lib/theme/ApiExplorer/Request/index.js +443 -0
  110. package/lib/theme/ApiExplorer/Request/makeRequest.d.ts +4 -0
  111. package/lib/theme/ApiExplorer/Request/makeRequest.js +223 -0
  112. package/lib/theme/ApiExplorer/Response/_Response.scss +121 -0
  113. package/lib/theme/ApiExplorer/Response/index.d.ts +6 -0
  114. package/lib/theme/ApiExplorer/Response/index.js +207 -0
  115. package/lib/theme/ApiExplorer/Response/slice.d.ts +17 -0
  116. package/lib/theme/ApiExplorer/Response/slice.js +51 -0
  117. package/lib/theme/ApiExplorer/SecuritySchemes/index.d.ts +3 -0
  118. package/lib/theme/ApiExplorer/SecuritySchemes/index.js +519 -0
  119. package/lib/theme/ApiExplorer/Server/_Server.scss +26 -0
  120. package/lib/theme/ApiExplorer/Server/index.d.ts +3 -0
  121. package/lib/theme/ApiExplorer/Server/index.js +213 -0
  122. package/lib/theme/ApiExplorer/Server/slice.d.ts +13 -0
  123. package/lib/theme/ApiExplorer/Server/slice.js +33 -0
  124. package/lib/theme/ApiExplorer/buildPostmanRequest.d.ts +20 -0
  125. package/lib/theme/ApiExplorer/buildPostmanRequest.js +511 -0
  126. package/lib/theme/ApiExplorer/index.d.ts +7 -0
  127. package/lib/theme/ApiExplorer/index.js +107 -0
  128. package/lib/theme/ApiExplorer/persistanceMiddleware.d.ts +19 -0
  129. package/lib/theme/ApiExplorer/persistanceMiddleware.js +54 -0
  130. package/lib/theme/ApiExplorer/storage-utils.d.ts +4 -0
  131. package/lib/theme/ApiExplorer/storage-utils.js +41 -0
  132. package/lib/theme/ApiItem/Layout/index.d.ts +3 -0
  133. package/lib/theme/ApiItem/Layout/index.js +121 -0
  134. package/lib/theme/ApiItem/Layout/styles.module.css +17 -0
  135. package/lib/theme/ApiItem/hooks.d.ts +12 -0
  136. package/lib/theme/ApiItem/hooks.js +13 -0
  137. package/lib/theme/ApiItem/index.d.ts +2 -0
  138. package/lib/theme/ApiItem/index.js +238 -0
  139. package/lib/theme/ApiItem/store.d.ts +58 -0
  140. package/lib/theme/ApiItem/store.js +53 -0
  141. package/lib/theme/ApiLogo/index.d.ts +2 -0
  142. package/lib/theme/ApiLogo/index.js +51 -0
  143. package/lib/theme/ApiTabs/_ApiTabs.scss +142 -0
  144. package/lib/theme/ApiTabs/index.d.ts +7 -0
  145. package/lib/theme/ApiTabs/index.js +275 -0
  146. package/lib/theme/ArrayBrackets/index.d.ts +3 -0
  147. package/lib/theme/ArrayBrackets/index.js +50 -0
  148. package/lib/theme/CodeSamples/_CodeSamples.scss +3 -0
  149. package/lib/theme/CodeSamples/index.d.ts +8 -0
  150. package/lib/theme/CodeSamples/index.js +27 -0
  151. package/lib/theme/DiscriminatorTabs/_DiscriminatorTabs.scss +98 -0
  152. package/lib/theme/DiscriminatorTabs/index.d.ts +3 -0
  153. package/lib/theme/DiscriminatorTabs/index.js +258 -0
  154. package/lib/theme/Markdown/Details/_Details.scss +122 -0
  155. package/lib/theme/Markdown/index.js +179 -0
  156. package/lib/theme/MimeTabs/_MimeTabs.scss +70 -0
  157. package/lib/theme/MimeTabs/index.d.ts +6 -0
  158. package/lib/theme/MimeTabs/index.js +286 -0
  159. package/lib/theme/OperationTabs/_OperationTabs.scss +72 -0
  160. package/lib/theme/OperationTabs/index.d.ts +3 -0
  161. package/lib/theme/OperationTabs/index.js +248 -0
  162. package/lib/theme/ParamsDetails/index.d.ts +6 -0
  163. package/lib/theme/ParamsDetails/index.js +93 -0
  164. package/lib/theme/ParamsItem/_ParamsItem.scss +54 -0
  165. package/lib/theme/ParamsItem/index.d.ts +22 -0
  166. package/lib/theme/ParamsItem/index.js +281 -0
  167. package/lib/theme/RequestSchema/index.d.ts +15 -0
  168. package/lib/theme/RequestSchema/index.js +208 -0
  169. package/lib/theme/ResponseExamples/index.d.ts +18 -0
  170. package/lib/theme/ResponseExamples/index.js +213 -0
  171. package/lib/theme/ResponseHeaders/index.d.ts +13 -0
  172. package/lib/theme/ResponseHeaders/index.js +39 -0
  173. package/lib/theme/ResponseSchema/index.d.ts +15 -0
  174. package/lib/theme/ResponseSchema/index.js +165 -0
  175. package/lib/theme/Schema/index.d.ts +8 -0
  176. package/lib/theme/Schema/index.js +853 -0
  177. package/lib/theme/SchemaItem/_SchemaItem.scss +89 -0
  178. package/lib/theme/SchemaItem/index.d.ts +12 -0
  179. package/lib/theme/SchemaItem/index.js +314 -0
  180. package/lib/theme/SchemaTabs/_SchemaTabs.scss +61 -0
  181. package/lib/theme/SchemaTabs/index.d.ts +3 -0
  182. package/lib/theme/SchemaTabs/index.js +255 -0
  183. package/lib/theme/SkeletonLoader/index.d.ts +6 -0
  184. package/lib/theme/SkeletonLoader/index.js +20 -0
  185. package/lib/theme/StatusCodes/index.d.ts +9 -0
  186. package/lib/theme/StatusCodes/index.js +90 -0
  187. package/lib/theme/styles.scss +215 -0
  188. package/lib/theme/translationIds.d.ts +83 -0
  189. package/lib/theme/translationIds.js +106 -0
  190. package/lib/types.d.ts +46 -0
  191. package/lib/types.js +8 -0
  192. package/package.json +85 -0
  193. package/src/index.ts +85 -0
  194. package/src/markdown/createDescription.ts +13 -0
  195. package/src/markdown/schema.ts +186 -0
  196. package/src/markdown/utils.test.ts +49 -0
  197. package/src/markdown/utils.ts +59 -0
  198. package/src/plugin-content-docs.d.ts +20 -0
  199. package/src/postman-code-generators.d.ts +9 -0
  200. package/src/react-magic-dropzone.d.ts +9 -0
  201. package/src/theme/ApiExplorer/Accept/index.tsx +36 -0
  202. package/src/theme/ApiExplorer/Accept/slice.ts +29 -0
  203. package/src/theme/ApiExplorer/ApiCodeBlock/Container/_Container.scss +7 -0
  204. package/src/theme/ApiExplorer/ApiCodeBlock/Container/index.tsx +32 -0
  205. package/src/theme/ApiExplorer/ApiCodeBlock/Content/Element.tsx +34 -0
  206. package/src/theme/ApiExplorer/ApiCodeBlock/Content/String.tsx +134 -0
  207. package/src/theme/ApiExplorer/ApiCodeBlock/Content/_Content.scss +91 -0
  208. package/src/theme/ApiExplorer/ApiCodeBlock/CopyButton/_CopyButton.scss +44 -0
  209. package/src/theme/ApiExplorer/ApiCodeBlock/CopyButton/index.tsx +83 -0
  210. package/src/theme/ApiExplorer/ApiCodeBlock/ExitButton/_ExitButton.scss +16 -0
  211. package/src/theme/ApiExplorer/ApiCodeBlock/ExitButton/index.tsx +55 -0
  212. package/src/theme/ApiExplorer/ApiCodeBlock/ExpandButton/_ExpandButton.scss +62 -0
  213. package/src/theme/ApiExplorer/ApiCodeBlock/ExpandButton/index.tsx +166 -0
  214. package/src/theme/ApiExplorer/ApiCodeBlock/Line/_Line.scss +34 -0
  215. package/src/theme/ApiExplorer/ApiCodeBlock/Line/index.tsx +48 -0
  216. package/src/theme/ApiExplorer/ApiCodeBlock/WordWrapButton/_WordWrapButton.scss +10 -0
  217. package/src/theme/ApiExplorer/ApiCodeBlock/WordWrapButton/index.tsx +54 -0
  218. package/src/theme/ApiExplorer/ApiCodeBlock/index.tsx +45 -0
  219. package/src/theme/ApiExplorer/Authorization/auth-types.ts +30 -0
  220. package/src/theme/ApiExplorer/Authorization/index.tsx +199 -0
  221. package/src/theme/ApiExplorer/Authorization/slice.ts +146 -0
  222. package/src/theme/ApiExplorer/Body/index.tsx +388 -0
  223. package/src/theme/ApiExplorer/Body/json2xml.d.ts +8 -0
  224. package/src/theme/ApiExplorer/Body/json2xml.js +43 -0
  225. package/src/theme/ApiExplorer/Body/slice.ts +133 -0
  226. package/src/theme/ApiExplorer/CodeSnippets/code-snippets-types.ts +57 -0
  227. package/src/theme/ApiExplorer/CodeSnippets/index.tsx +383 -0
  228. package/src/theme/ApiExplorer/CodeSnippets/languages.json +1290 -0
  229. package/src/theme/ApiExplorer/CodeSnippets/languages.ts +139 -0
  230. package/src/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +505 -0
  231. package/src/theme/ApiExplorer/CodeTabs/index.tsx +261 -0
  232. package/src/theme/ApiExplorer/ContentType/index.tsx +38 -0
  233. package/src/theme/ApiExplorer/ContentType/slice.ts +29 -0
  234. package/src/theme/ApiExplorer/Export/index.tsx +47 -0
  235. package/src/theme/ApiExplorer/FloatingButton/_FloatingButton.scss +27 -0
  236. package/src/theme/ApiExplorer/FloatingButton/index.tsx +29 -0
  237. package/src/theme/ApiExplorer/FormFileUpload/_FormFileUpload.scss +74 -0
  238. package/src/theme/ApiExplorer/FormFileUpload/index.tsx +124 -0
  239. package/src/theme/ApiExplorer/FormItem/_FormItem.scss +21 -0
  240. package/src/theme/ApiExplorer/FormItem/index.tsx +40 -0
  241. package/src/theme/ApiExplorer/FormMultiSelect/_FormMultiSelect.scss +30 -0
  242. package/src/theme/ApiExplorer/FormMultiSelect/index.tsx +57 -0
  243. package/src/theme/ApiExplorer/FormSelect/_FormSelect.scss +43 -0
  244. package/src/theme/ApiExplorer/FormSelect/index.tsx +38 -0
  245. package/src/theme/ApiExplorer/FormTextInput/_FormTextInput.scss +34 -0
  246. package/src/theme/ApiExplorer/FormTextInput/index.tsx +89 -0
  247. package/src/theme/ApiExplorer/LiveEditor/_LiveEditor.scss +15 -0
  248. package/src/theme/ApiExplorer/LiveEditor/index.tsx +122 -0
  249. package/src/theme/ApiExplorer/MethodEndpoint/_MethodEndpoint.scss +22 -0
  250. package/src/theme/ApiExplorer/MethodEndpoint/index.tsx +91 -0
  251. package/src/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamArrayFormItem.tsx +185 -0
  252. package/src/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamBooleanFormItem.tsx +72 -0
  253. package/src/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamMultiSelectFormItem.tsx +94 -0
  254. package/src/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamSelectFormItem.tsx +74 -0
  255. package/src/theme/ApiExplorer/ParamOptions/ParamFormItems/ParamTextFormItem.tsx +38 -0
  256. package/src/theme/ApiExplorer/ParamOptions/_ParamOptions.scss +123 -0
  257. package/src/theme/ApiExplorer/ParamOptions/index.tsx +154 -0
  258. package/src/theme/ApiExplorer/ParamOptions/slice.ts +37 -0
  259. package/src/theme/ApiExplorer/Request/_Request.scss +129 -0
  260. package/src/theme/ApiExplorer/Request/index.tsx +352 -0
  261. package/src/theme/ApiExplorer/Request/makeRequest.ts +255 -0
  262. package/src/theme/ApiExplorer/Response/_Response.scss +121 -0
  263. package/src/theme/ApiExplorer/Response/index.tsx +173 -0
  264. package/src/theme/ApiExplorer/Response/slice.ts +52 -0
  265. package/src/theme/ApiExplorer/SecuritySchemes/index.tsx +375 -0
  266. package/src/theme/ApiExplorer/Server/_Server.scss +26 -0
  267. package/src/theme/ApiExplorer/Server/index.tsx +138 -0
  268. package/src/theme/ApiExplorer/Server/slice.ts +39 -0
  269. package/src/theme/ApiExplorer/buildPostmanRequest.ts +524 -0
  270. package/src/theme/ApiExplorer/index.tsx +52 -0
  271. package/src/theme/ApiExplorer/persistanceMiddleware.ts +73 -0
  272. package/src/theme/ApiExplorer/storage-utils.ts +39 -0
  273. package/src/theme/ApiItem/Layout/index.tsx +85 -0
  274. package/src/theme/ApiItem/Layout/styles.module.css +17 -0
  275. package/src/theme/ApiItem/hooks.ts +13 -0
  276. package/src/theme/ApiItem/index.tsx +222 -0
  277. package/src/theme/ApiItem/store.ts +51 -0
  278. package/src/theme/ApiLogo/index.tsx +52 -0
  279. package/src/theme/ApiTabs/_ApiTabs.scss +142 -0
  280. package/src/theme/ApiTabs/index.tsx +243 -0
  281. package/src/theme/ArrayBrackets/index.tsx +37 -0
  282. package/src/theme/CodeSamples/_CodeSamples.scss +3 -0
  283. package/src/theme/CodeSamples/index.tsx +26 -0
  284. package/src/theme/DiscriminatorTabs/_DiscriminatorTabs.scss +98 -0
  285. package/src/theme/DiscriminatorTabs/index.tsx +229 -0
  286. package/src/theme/Markdown/Details/_Details.scss +122 -0
  287. package/src/theme/Markdown/index.d.ts +8 -0
  288. package/src/theme/Markdown/index.js +179 -0
  289. package/src/theme/MimeTabs/_MimeTabs.scss +70 -0
  290. package/src/theme/MimeTabs/index.tsx +257 -0
  291. package/src/theme/OperationTabs/_OperationTabs.scss +72 -0
  292. package/src/theme/OperationTabs/index.tsx +220 -0
  293. package/src/theme/ParamsDetails/index.tsx +90 -0
  294. package/src/theme/ParamsItem/_ParamsItem.scss +54 -0
  295. package/src/theme/ParamsItem/index.tsx +246 -0
  296. package/src/theme/RequestSchema/index.tsx +172 -0
  297. package/src/theme/ResponseExamples/index.tsx +209 -0
  298. package/src/theme/ResponseHeaders/index.tsx +49 -0
  299. package/src/theme/ResponseSchema/index.tsx +150 -0
  300. package/src/theme/Schema/index.tsx +938 -0
  301. package/src/theme/SchemaItem/_SchemaItem.scss +89 -0
  302. package/src/theme/SchemaItem/index.tsx +273 -0
  303. package/src/theme/SchemaTabs/_SchemaTabs.scss +61 -0
  304. package/src/theme/SchemaTabs/index.tsx +224 -0
  305. package/src/theme/SkeletonLoader/index.tsx +18 -0
  306. package/src/theme/StatusCodes/index.tsx +83 -0
  307. package/src/theme/styles.scss +215 -0
  308. package/src/theme/translationIds.ts +103 -0
  309. package/src/theme-classic.d.ts +80 -0
  310. package/src/theme-openapi.d.ts +20 -0
  311. package/src/types.ts +72 -0
  312. package/tsconfig.json +16 -0
@@ -0,0 +1,938 @@
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 { translate } from "@docusaurus/Translate";
11
+ import { OPENAPI_SCHEMA_ITEM } from "@theme/translationIds";
12
+
13
+ import { ClosingArrayBracket, OpeningArrayBracket } from "@theme/ArrayBrackets";
14
+ import Details from "@theme/Details";
15
+ import DiscriminatorTabs from "@theme/DiscriminatorTabs";
16
+ import Markdown from "@theme/Markdown";
17
+ import SchemaItem from "@theme/SchemaItem";
18
+ import SchemaTabs from "@theme/SchemaTabs";
19
+ import TabItem from "@theme/TabItem";
20
+ // eslint-disable-next-line import/no-extraneous-dependencies
21
+ import { merge } from "allof-merge";
22
+ import clsx from "clsx";
23
+ import {
24
+ getQualifierMessage,
25
+ getSchemaName,
26
+ } from "@camunda8/docusaurus-plugin-openapi-docs/lib/markdown/schema";
27
+ import {
28
+ SchemaObject,
29
+ SchemaType,
30
+ } from "@camunda8/docusaurus-plugin-openapi-docs/lib/openapi/types";
31
+ import isEmpty from "lodash/isEmpty";
32
+
33
+ // eslint-disable-next-line import/no-extraneous-dependencies
34
+ // const jsonSchemaMergeAllOf = require("json-schema-merge-allof");
35
+
36
+ const mergeAllOf = (allOf: any) => {
37
+ const onMergeError = (msg: string) => {
38
+ console.warn(msg);
39
+ };
40
+
41
+ const mergedSchemas = merge(allOf, { onMergeError });
42
+
43
+ return mergedSchemas;
44
+ };
45
+
46
+ interface MarkdownProps {
47
+ text: string | undefined;
48
+ }
49
+
50
+ // Renders string as markdown, useful for descriptions and qualifiers
51
+ const MarkdownWrapper: React.FC<MarkdownProps> = ({ text }) => {
52
+ return (
53
+ <div style={{ marginTop: ".5rem", marginBottom: ".5rem" }}>
54
+ <Markdown>{text}</Markdown>
55
+ </div>
56
+ );
57
+ };
58
+
59
+ interface SummaryProps {
60
+ name: string;
61
+ schemaName: string | undefined;
62
+ schema: {
63
+ deprecated?: boolean;
64
+ nullable?: boolean;
65
+ };
66
+ required?: boolean | string[];
67
+ }
68
+
69
+ const Summary: React.FC<SummaryProps> = ({
70
+ name,
71
+ schemaName,
72
+ schema,
73
+ required,
74
+ }) => {
75
+ const { deprecated, nullable } = schema;
76
+
77
+ const isRequired = Array.isArray(required)
78
+ ? required.includes(name)
79
+ : required === true;
80
+
81
+ return (
82
+ <summary>
83
+ <span className="openapi-schema__container">
84
+ <strong
85
+ className={clsx("openapi-schema__property", {
86
+ "openapi-schema__strikethrough": deprecated,
87
+ })}
88
+ >
89
+ {name}
90
+ </strong>
91
+ <span className="openapi-schema__name"> {schemaName}</span>
92
+ {(isRequired || deprecated || nullable) && (
93
+ <span className="openapi-schema__divider" />
94
+ )}
95
+ {nullable && (
96
+ <span className="openapi-schema__nullable">
97
+ {translate({
98
+ id: OPENAPI_SCHEMA_ITEM.NULLABLE,
99
+ message: "nullable",
100
+ })}
101
+ </span>
102
+ )}
103
+ {isRequired && (
104
+ <span className="openapi-schema__required">
105
+ {translate({
106
+ id: OPENAPI_SCHEMA_ITEM.REQUIRED,
107
+ message: "required",
108
+ })}
109
+ </span>
110
+ )}
111
+ {deprecated && (
112
+ <span className="openapi-schema__deprecated">
113
+ {translate({
114
+ id: OPENAPI_SCHEMA_ITEM.DEPRECATED,
115
+ message: "deprecated",
116
+ })}
117
+ </span>
118
+ )}
119
+ </span>
120
+ </summary>
121
+ );
122
+ };
123
+
124
+ // Common props interface
125
+ interface SchemaProps {
126
+ schema: SchemaObject;
127
+ schemaType: "request" | "response";
128
+ }
129
+
130
+ const AnyOneOf: React.FC<SchemaProps> = ({ schema, schemaType }) => {
131
+ const key = schema.oneOf ? "oneOf" : "anyOf";
132
+ const groupLabel = schema.oneOf
133
+ ? translate({ id: OPENAPI_SCHEMA_ITEM.ONE_OF, message: "oneOf" })
134
+ : translate({ id: OPENAPI_SCHEMA_ITEM.ANY_OF, message: "anyOf" });
135
+
136
+ return (
137
+ <>
138
+ <span className="badge badge--info" style={{ marginBottom: "1rem" }}>
139
+ {groupLabel}
140
+ </span>
141
+ <SchemaTabs>
142
+ {schema[key]?.map((anyOneSchema: any, index: number) => {
143
+ // Prefer explicit title, then inferred name, then raw type, finally fallback MOD{n}
144
+ const computedSchemaName = getSchemaName(anyOneSchema);
145
+ const label =
146
+ anyOneSchema.title ||
147
+ computedSchemaName ||
148
+ anyOneSchema.type ||
149
+ `MOD${index + 1}`;
150
+ const isPrimitiveArm =
151
+ isPrimitive(anyOneSchema) || anyOneSchema.const;
152
+ const emptyObjectPrimitive =
153
+ anyOneSchema.type === "object" &&
154
+ !anyOneSchema.properties &&
155
+ !anyOneSchema.allOf &&
156
+ !anyOneSchema.oneOf &&
157
+ !anyOneSchema.anyOf;
158
+ return (
159
+ // @ts-ignore
160
+ <TabItem
161
+ key={index}
162
+ label={label}
163
+ value={`${index}-item-properties`}
164
+ >
165
+ {isPrimitiveArm && (
166
+ <SchemaItem
167
+ collapsible={false}
168
+ name={undefined}
169
+ schemaName={computedSchemaName}
170
+ qualifierMessage={getQualifierMessage(anyOneSchema)}
171
+ schema={anyOneSchema}
172
+ discriminator={false}
173
+ children={null}
174
+ />
175
+ )}
176
+ {emptyObjectPrimitive && (
177
+ <SchemaItem
178
+ collapsible={false}
179
+ name={undefined}
180
+ schemaName={computedSchemaName}
181
+ qualifierMessage={getQualifierMessage(anyOneSchema)}
182
+ schema={anyOneSchema}
183
+ discriminator={false}
184
+ children={null}
185
+ />
186
+ )}
187
+ {anyOneSchema.type === "object" && anyOneSchema.properties && (
188
+ <Properties schema={anyOneSchema} schemaType={schemaType} />
189
+ )}
190
+ {anyOneSchema.allOf && (
191
+ <SchemaNode schema={anyOneSchema} schemaType={schemaType} />
192
+ )}
193
+ {anyOneSchema.oneOf && (
194
+ <SchemaNode schema={anyOneSchema} schemaType={schemaType} />
195
+ )}
196
+ {anyOneSchema.anyOf && (
197
+ <SchemaNode schema={anyOneSchema} schemaType={schemaType} />
198
+ )}
199
+ {anyOneSchema.items && (
200
+ <Items schema={anyOneSchema} schemaType={schemaType} />
201
+ )}
202
+ </TabItem>
203
+ );
204
+ })}
205
+ </SchemaTabs>
206
+ </>
207
+ );
208
+ };
209
+
210
+ const Properties: React.FC<SchemaProps> = ({ schema, schemaType }) => {
211
+ const discriminator = schema.discriminator;
212
+ if (discriminator && !discriminator.mapping) {
213
+ const anyOneOf = schema.oneOf ?? schema.anyOf ?? {};
214
+ const inferredMapping = {} as any;
215
+ Object.entries(anyOneOf).map(([_, anyOneSchema]: [string, any]) => {
216
+ // ensure discriminated property only renders once
217
+ if (
218
+ schema.properties![discriminator.propertyName] &&
219
+ anyOneSchema.properties[discriminator.propertyName]
220
+ )
221
+ delete anyOneSchema.properties[discriminator.propertyName];
222
+ return (inferredMapping[anyOneSchema.title] = anyOneSchema);
223
+ });
224
+ discriminator["mapping"] = inferredMapping;
225
+ }
226
+ if (Object.keys(schema.properties as {}).length === 0) {
227
+ return (
228
+ <SchemaItem
229
+ collapsible={false}
230
+ name=""
231
+ required={false}
232
+ schemaName="object"
233
+ qualifierMessage={undefined}
234
+ schema={{}}
235
+ />
236
+ );
237
+ }
238
+
239
+ return (
240
+ <>
241
+ {Object.entries(schema.properties as {}).map(
242
+ ([key, val]: [string, any]) => (
243
+ <SchemaEdge
244
+ key={key}
245
+ name={key}
246
+ schema={val}
247
+ required={
248
+ Array.isArray(schema.required)
249
+ ? schema.required.includes(key)
250
+ : false
251
+ }
252
+ discriminator={discriminator}
253
+ schemaType={schemaType}
254
+ />
255
+ )
256
+ )}
257
+ </>
258
+ );
259
+ };
260
+
261
+ const PropertyDiscriminator: React.FC<SchemaEdgeProps> = ({
262
+ name,
263
+ schemaName,
264
+ schema,
265
+ schemaType,
266
+ discriminator,
267
+ required,
268
+ }) => {
269
+ if (!schema) {
270
+ return null;
271
+ }
272
+
273
+ return (
274
+ <>
275
+ <div className="openapi-discriminator__item openapi-schema__list-item">
276
+ <div>
277
+ <span className="openapi-schema__container">
278
+ <strong className="openapi-discriminator__name openapi-schema__property">
279
+ {name}
280
+ </strong>
281
+ {schemaName && (
282
+ <span className="openapi-schema__name"> {schemaName}</span>
283
+ )}
284
+ {required && <span className="openapi-schema__divider"></span>}
285
+ {required && (
286
+ <span className="openapi-schema__required">
287
+ {translate({
288
+ id: OPENAPI_SCHEMA_ITEM.REQUIRED,
289
+ message: "required",
290
+ })}
291
+ </span>
292
+ )}
293
+ </span>
294
+ <div style={{ marginLeft: "1rem" }}>
295
+ {schema.description && (
296
+ <MarkdownWrapper text={schema.description} />
297
+ )}
298
+ {getQualifierMessage(discriminator) && (
299
+ <MarkdownWrapper text={getQualifierMessage(discriminator)} />
300
+ )}
301
+ </div>
302
+ <DiscriminatorTabs className="openapi-tabs__discriminator">
303
+ {Object.keys(discriminator.mapping).map((key, index) => (
304
+ // @ts-ignore
305
+ <TabItem
306
+ key={index}
307
+ label={key}
308
+ value={`${index}-item-discriminator`}
309
+ >
310
+ <SchemaNode
311
+ schema={discriminator.mapping[key]}
312
+ schemaType={schemaType}
313
+ />
314
+ </TabItem>
315
+ ))}
316
+ </DiscriminatorTabs>
317
+ </div>
318
+ </div>
319
+ {schema.properties &&
320
+ Object.entries(schema.properties as {}).map(
321
+ ([key, val]: [string, any]) =>
322
+ key !== discriminator.propertyName && (
323
+ <SchemaEdge
324
+ key={key}
325
+ name={key}
326
+ schema={val}
327
+ required={
328
+ Array.isArray(schema.required)
329
+ ? schema.required.includes(key)
330
+ : false
331
+ }
332
+ discriminator={false}
333
+ schemaType={schemaType}
334
+ />
335
+ )
336
+ )}
337
+ </>
338
+ );
339
+ };
340
+
341
+ interface DiscriminatorNodeProps {
342
+ discriminator: any;
343
+ schema: SchemaObject;
344
+ schemaType: "request" | "response";
345
+ }
346
+
347
+ const DiscriminatorNode: React.FC<DiscriminatorNodeProps> = ({
348
+ discriminator,
349
+ schema,
350
+ schemaType,
351
+ }) => {
352
+ let discriminatedSchemas: any = {};
353
+ let inferredMapping: any = {};
354
+
355
+ // default to empty object if no parent-level properties exist
356
+ const discriminatorProperty = schema.properties
357
+ ? schema.properties![discriminator.propertyName]
358
+ : {};
359
+
360
+ if (schema.allOf) {
361
+ const mergedSchemas = mergeAllOf(schema) as SchemaObject;
362
+ if (mergedSchemas.oneOf || mergedSchemas.anyOf) {
363
+ discriminatedSchemas = mergedSchemas.oneOf || mergedSchemas.anyOf;
364
+ }
365
+ } else if (schema.oneOf || schema.anyOf) {
366
+ discriminatedSchemas = schema.oneOf || schema.anyOf;
367
+ }
368
+
369
+ // Handle case where no mapping is defined
370
+ if (!discriminator.mapping) {
371
+ Object.entries(discriminatedSchemas).forEach(
372
+ ([_, subschema]: [string, any], index) => {
373
+ inferredMapping[subschema.title ?? `PROP${index}`] = subschema;
374
+ }
375
+ );
376
+ discriminator.mapping = inferredMapping;
377
+ }
378
+
379
+ // Merge sub schema discriminator property with parent
380
+ Object.keys(discriminator.mapping).forEach((key) => {
381
+ const subSchema = discriminator.mapping[key];
382
+
383
+ // Handle discriminated schema with allOf
384
+ let mergedSubSchema = {} as SchemaObject;
385
+ if (subSchema.allOf) {
386
+ mergedSubSchema = mergeAllOf(subSchema) as SchemaObject;
387
+ }
388
+
389
+ const subProperties = subSchema.properties || mergedSubSchema.properties;
390
+ // Add a safeguard check to avoid referencing subProperties if it's undefined
391
+ if (subProperties && subProperties[discriminator.propertyName]) {
392
+ if (schema.properties) {
393
+ schema.properties![discriminator.propertyName] = {
394
+ ...schema.properties![discriminator.propertyName],
395
+ ...subProperties[discriminator.propertyName],
396
+ };
397
+ if (subSchema.required && !schema.required) {
398
+ schema.required = subSchema.required;
399
+ }
400
+ // Avoid duplicating property
401
+ delete subProperties[discriminator.propertyName];
402
+ } else {
403
+ schema.properties = {};
404
+ schema.properties[discriminator.propertyName] =
405
+ subProperties[discriminator.propertyName];
406
+ // Avoid duplicating property
407
+ delete subProperties[discriminator.propertyName];
408
+ }
409
+ }
410
+ });
411
+
412
+ const name = discriminator.propertyName;
413
+ const schemaName = getSchemaName(discriminatorProperty);
414
+ // Default case for discriminator without oneOf/anyOf/allOf
415
+ return (
416
+ <PropertyDiscriminator
417
+ name={name}
418
+ schemaName={schemaName}
419
+ schema={schema}
420
+ schemaType={schemaType}
421
+ discriminator={discriminator}
422
+ required={
423
+ Array.isArray(schema.required)
424
+ ? schema.required.includes(name)
425
+ : schema.required
426
+ }
427
+ />
428
+ );
429
+ };
430
+
431
+ const AdditionalProperties: React.FC<SchemaProps> = ({
432
+ schema,
433
+ schemaType,
434
+ }) => {
435
+ const additionalProperties = schema.additionalProperties;
436
+
437
+ if (!additionalProperties) return null;
438
+
439
+ // Handle free-form objects
440
+ if (additionalProperties === true || isEmpty(additionalProperties)) {
441
+ return (
442
+ <SchemaItem
443
+ name="property name*"
444
+ required={false}
445
+ schemaName="any"
446
+ qualifierMessage={getQualifierMessage(schema)}
447
+ schema={schema}
448
+ collapsible={false}
449
+ discriminator={false}
450
+ />
451
+ );
452
+ }
453
+
454
+ // Handle objects, arrays, complex schemas
455
+ if (
456
+ additionalProperties.properties ||
457
+ additionalProperties.items ||
458
+ additionalProperties.allOf ||
459
+ additionalProperties.additionalProperties ||
460
+ additionalProperties.oneOf ||
461
+ additionalProperties.anyOf
462
+ ) {
463
+ const title =
464
+ additionalProperties.title || getSchemaName(additionalProperties);
465
+ const required = schema.required || false;
466
+ return (
467
+ <SchemaNodeDetails
468
+ name="property name*"
469
+ schemaName={title}
470
+ required={required}
471
+ nullable={schema.nullable}
472
+ schema={additionalProperties}
473
+ schemaType={schemaType}
474
+ />
475
+ );
476
+ }
477
+
478
+ // Handle primitive types
479
+ if (
480
+ additionalProperties.type === "string" ||
481
+ additionalProperties.type === "boolean" ||
482
+ additionalProperties.type === "integer" ||
483
+ additionalProperties.type === "number" ||
484
+ additionalProperties.type === "object"
485
+ ) {
486
+ const schemaName = getSchemaName(additionalProperties);
487
+ return (
488
+ <SchemaItem
489
+ name="property name*"
490
+ required={false}
491
+ schemaName={schemaName}
492
+ qualifierMessage={getQualifierMessage(schema)}
493
+ schema={additionalProperties}
494
+ collapsible={false}
495
+ discriminator={false}
496
+ children={null}
497
+ />
498
+ );
499
+ }
500
+
501
+ // Unknown type
502
+ return null;
503
+ };
504
+
505
+ const SchemaNodeDetails: React.FC<SchemaEdgeProps> = ({
506
+ name,
507
+ schemaName,
508
+ schema,
509
+ required,
510
+ schemaType,
511
+ }) => {
512
+ return (
513
+ <SchemaItem collapsible={true}>
514
+ <Details
515
+ className="openapi-markdown__details"
516
+ summary={
517
+ <Summary
518
+ name={name}
519
+ schemaName={schemaName}
520
+ schema={schema}
521
+ required={required}
522
+ />
523
+ }
524
+ >
525
+ <div style={{ marginLeft: "1rem" }}>
526
+ {schema.description && <MarkdownWrapper text={schema.description} />}
527
+ {getQualifierMessage(schema) && (
528
+ <MarkdownWrapper text={getQualifierMessage(schema)} />
529
+ )}
530
+ <SchemaNode schema={schema} schemaType={schemaType} />
531
+ </div>
532
+ </Details>
533
+ </SchemaItem>
534
+ );
535
+ };
536
+
537
+ const Items: React.FC<{
538
+ schema: any;
539
+ schemaType: "request" | "response";
540
+ }> = ({ schema, schemaType }) => {
541
+ // Process schema.items to handle allOf merging
542
+ let itemsSchema = schema.items;
543
+ if (schema.items?.allOf) {
544
+ itemsSchema = mergeAllOf(schema.items) as SchemaObject;
545
+ }
546
+
547
+ // Handle complex schemas with multiple schema types
548
+ const hasOneOfAnyOf = itemsSchema?.oneOf || itemsSchema?.anyOf;
549
+ const hasProperties = itemsSchema?.properties;
550
+ const hasAdditionalProperties = itemsSchema?.additionalProperties;
551
+
552
+ if (hasOneOfAnyOf || hasProperties || hasAdditionalProperties) {
553
+ return (
554
+ <>
555
+ <OpeningArrayBracket />
556
+ {hasOneOfAnyOf && (
557
+ <AnyOneOf schema={itemsSchema} schemaType={schemaType} />
558
+ )}
559
+ {hasProperties && (
560
+ <Properties schema={itemsSchema} schemaType={schemaType} />
561
+ )}
562
+ {hasAdditionalProperties && (
563
+ <AdditionalProperties schema={itemsSchema} schemaType={schemaType} />
564
+ )}
565
+ <ClosingArrayBracket />
566
+ </>
567
+ );
568
+ }
569
+
570
+ // Handles basic types (string, number, integer, boolean, object)
571
+ if (
572
+ itemsSchema?.type === "string" ||
573
+ itemsSchema?.type === "number" ||
574
+ itemsSchema?.type === "integer" ||
575
+ itemsSchema?.type === "boolean" ||
576
+ itemsSchema?.type === "object"
577
+ ) {
578
+ return (
579
+ <div style={{ marginLeft: ".5rem" }}>
580
+ <OpeningArrayBracket />
581
+ <SchemaItem
582
+ collapsible={false}
583
+ name="" // No name for array items
584
+ schemaName={getSchemaName(itemsSchema)}
585
+ qualifierMessage={getQualifierMessage(itemsSchema)}
586
+ schema={itemsSchema}
587
+ discriminator={false}
588
+ children={null}
589
+ />
590
+ <ClosingArrayBracket />
591
+ </div>
592
+ );
593
+ }
594
+
595
+ // Handles fallback case (use createEdges logic)
596
+ return (
597
+ <>
598
+ <OpeningArrayBracket />
599
+ {Object.entries(itemsSchema || {}).map(([key, val]: [string, any]) => (
600
+ <SchemaEdge
601
+ key={key}
602
+ name={key}
603
+ schema={val}
604
+ schemaType={schemaType}
605
+ required={
606
+ Array.isArray(schema.required)
607
+ ? schema.required.includes(key)
608
+ : false
609
+ }
610
+ />
611
+ ))}
612
+ <ClosingArrayBracket />
613
+ </>
614
+ );
615
+ };
616
+
617
+ interface SchemaEdgeProps {
618
+ name: string;
619
+ schemaName?: string;
620
+ schema: SchemaObject;
621
+ required?: boolean | string[];
622
+ nullable?: boolean | undefined;
623
+ discriminator?: any;
624
+ schemaType: "request" | "response";
625
+ }
626
+
627
+ const SchemaEdge: React.FC<SchemaEdgeProps> = ({
628
+ name,
629
+ schema,
630
+ required,
631
+ discriminator,
632
+ schemaType,
633
+ }) => {
634
+ if (
635
+ (schemaType === "request" && schema.readOnly) ||
636
+ (schemaType === "response" && schema.writeOnly)
637
+ ) {
638
+ return null;
639
+ }
640
+
641
+ const schemaName = getSchemaName(schema);
642
+
643
+ if (discriminator && discriminator.propertyName === name) {
644
+ return (
645
+ <PropertyDiscriminator
646
+ name={name}
647
+ schemaName={schemaName}
648
+ schema={schema}
649
+ schemaType={schemaType}
650
+ discriminator={discriminator}
651
+ required={required}
652
+ />
653
+ );
654
+ }
655
+
656
+ if (schema.oneOf || schema.anyOf) {
657
+ // return <AnyOneOf schema={schema} schemaType={schemaType} />;
658
+ return (
659
+ <SchemaNodeDetails
660
+ name={name}
661
+ schemaName={schemaName}
662
+ schemaType={schemaType}
663
+ required={required}
664
+ schema={schema}
665
+ nullable={schema.nullable}
666
+ />
667
+ );
668
+ }
669
+
670
+ if (schema.properties) {
671
+ return (
672
+ <SchemaNodeDetails
673
+ name={name}
674
+ schemaName={schemaName}
675
+ schemaType={schemaType}
676
+ required={required}
677
+ schema={schema}
678
+ nullable={schema.nullable}
679
+ />
680
+ );
681
+ }
682
+
683
+ if (schema.additionalProperties) {
684
+ return (
685
+ <SchemaNodeDetails
686
+ name={name}
687
+ schemaName={schemaName}
688
+ schemaType={schemaType}
689
+ required={required}
690
+ schema={schema}
691
+ nullable={schema.nullable}
692
+ />
693
+ );
694
+ }
695
+
696
+ if (schema.items?.properties) {
697
+ return (
698
+ <SchemaNodeDetails
699
+ name={name}
700
+ schemaName={schemaName}
701
+ required={required}
702
+ nullable={schema.nullable}
703
+ schema={schema}
704
+ schemaType={schemaType}
705
+ />
706
+ );
707
+ }
708
+
709
+ if (schema.items?.anyOf || schema.items?.oneOf || schema.items?.allOf) {
710
+ return (
711
+ <SchemaNodeDetails
712
+ name={name}
713
+ schemaName={schemaName}
714
+ required={required}
715
+ nullable={schema.nullable}
716
+ schema={schema}
717
+ schemaType={schemaType}
718
+ />
719
+ );
720
+ }
721
+
722
+ if (schema.allOf) {
723
+ // handle circular properties
724
+ if (
725
+ schema.allOf &&
726
+ schema.allOf.length &&
727
+ schema.allOf.length === 1 &&
728
+ typeof schema.allOf[0] === "string"
729
+ ) {
730
+ return (
731
+ <SchemaItem
732
+ collapsible={false}
733
+ name={name}
734
+ required={
735
+ Array.isArray(required) ? required.includes(name) : required
736
+ }
737
+ schemaName={schema.allOf[0]}
738
+ qualifierMessage={undefined}
739
+ schema={schema.allOf[0]}
740
+ discriminator={false}
741
+ children={null}
742
+ />
743
+ );
744
+ }
745
+ const mergedSchemas = mergeAllOf(schema) as SchemaObject;
746
+
747
+ if (
748
+ (schemaType === "request" && mergedSchemas.readOnly) ||
749
+ (schemaType === "response" && mergedSchemas.writeOnly)
750
+ ) {
751
+ return null;
752
+ }
753
+
754
+ const mergedSchemaName = getSchemaName(mergedSchemas);
755
+
756
+ if (mergedSchemas.oneOf || mergedSchemas.anyOf) {
757
+ return (
758
+ <SchemaNodeDetails
759
+ name={name}
760
+ schemaName={mergedSchemaName}
761
+ required={
762
+ Array.isArray(required) ? required.includes(name) : required
763
+ }
764
+ nullable={mergedSchemas.nullable}
765
+ schema={mergedSchemas}
766
+ schemaType={schemaType}
767
+ />
768
+ );
769
+ }
770
+
771
+ if (mergedSchemas.properties !== undefined) {
772
+ return (
773
+ <SchemaNodeDetails
774
+ name={name}
775
+ schemaName={mergedSchemaName}
776
+ required={
777
+ Array.isArray(required) ? required.includes(name) : required
778
+ }
779
+ nullable={mergedSchemas.nullable}
780
+ schema={mergedSchemas}
781
+ schemaType={schemaType}
782
+ />
783
+ );
784
+ }
785
+
786
+ if (mergedSchemas.items?.properties) {
787
+ return (
788
+ <SchemaNodeDetails
789
+ name={name}
790
+ schemaName={mergedSchemaName}
791
+ required={
792
+ Array.isArray(required) ? required.includes(name) : required
793
+ }
794
+ nullable={mergedSchemas.nullable}
795
+ schema={mergedSchemas}
796
+ schemaType={schemaType}
797
+ />
798
+ );
799
+ }
800
+
801
+ return (
802
+ <SchemaItem
803
+ collapsible={false}
804
+ name={name}
805
+ required={Array.isArray(required) ? required.includes(name) : required}
806
+ schemaName={mergedSchemaName}
807
+ qualifierMessage={getQualifierMessage(mergedSchemas)}
808
+ schema={mergedSchemas}
809
+ discriminator={false}
810
+ children={null}
811
+ />
812
+ );
813
+ }
814
+
815
+ return (
816
+ <SchemaItem
817
+ collapsible={false}
818
+ name={name}
819
+ required={Array.isArray(required) ? required.includes(name) : required}
820
+ schemaName={schemaName}
821
+ qualifierMessage={getQualifierMessage(schema)}
822
+ schema={schema}
823
+ discriminator={false}
824
+ children={null}
825
+ />
826
+ );
827
+ };
828
+
829
+ function renderChildren(
830
+ schema: SchemaObject,
831
+ schemaType: "request" | "response"
832
+ ) {
833
+ return (
834
+ <>
835
+ {schema.oneOf && <AnyOneOf schema={schema} schemaType={schemaType} />}
836
+ {schema.anyOf && <AnyOneOf schema={schema} schemaType={schemaType} />}
837
+ {schema.properties && (
838
+ <Properties schema={schema} schemaType={schemaType} />
839
+ )}
840
+ {schema.additionalProperties && (
841
+ <AdditionalProperties schema={schema} schemaType={schemaType} />
842
+ )}
843
+ {schema.items && <Items schema={schema} schemaType={schemaType} />}
844
+ </>
845
+ );
846
+ }
847
+
848
+ const SchemaNode: React.FC<SchemaProps> = ({ schema, schemaType }) => {
849
+ if (
850
+ (schemaType === "request" && schema.readOnly) ||
851
+ (schemaType === "response" && schema.writeOnly)
852
+ ) {
853
+ return null;
854
+ }
855
+
856
+ if (schema.discriminator) {
857
+ const { discriminator } = schema;
858
+ return (
859
+ <DiscriminatorNode
860
+ discriminator={discriminator}
861
+ schema={schema}
862
+ schemaType={schemaType}
863
+ />
864
+ );
865
+ }
866
+
867
+ // Handle allOf, oneOf, anyOf without discriminators
868
+ if (schema.allOf) {
869
+ const mergedSchemas = mergeAllOf(schema) as SchemaObject;
870
+
871
+ if (
872
+ (schemaType === "request" && mergedSchemas.readOnly) ||
873
+ (schemaType === "response" && mergedSchemas.writeOnly)
874
+ ) {
875
+ return null;
876
+ }
877
+
878
+ return (
879
+ <div>
880
+ {mergedSchemas.oneOf && (
881
+ <AnyOneOf schema={mergedSchemas} schemaType={schemaType} />
882
+ )}
883
+ {mergedSchemas.anyOf && (
884
+ <AnyOneOf schema={mergedSchemas} schemaType={schemaType} />
885
+ )}
886
+ {mergedSchemas.properties && (
887
+ <Properties schema={mergedSchemas} schemaType={schemaType} />
888
+ )}
889
+ {mergedSchemas.items && (
890
+ <Items schema={mergedSchemas} schemaType={schemaType} />
891
+ )}
892
+ </div>
893
+ );
894
+ }
895
+
896
+ // Handle primitives
897
+ if (
898
+ schema.type &&
899
+ !schema.oneOf &&
900
+ !schema.anyOf &&
901
+ !schema.properties &&
902
+ !schema.allOf &&
903
+ !schema.items &&
904
+ !schema.additionalProperties
905
+ ) {
906
+ const schemaName = getSchemaName(schema);
907
+ return (
908
+ <SchemaItem
909
+ collapsible={false}
910
+ name={schema.type}
911
+ required={Boolean(schema.required)}
912
+ schemaName={schemaName}
913
+ qualifierMessage={getQualifierMessage(schema)}
914
+ schema={schema}
915
+ discriminator={false}
916
+ children={null}
917
+ />
918
+ );
919
+ }
920
+
921
+ return renderChildren(schema, schemaType);
922
+ };
923
+
924
+ export default SchemaNode;
925
+
926
+ type PrimitiveSchemaType = Exclude<SchemaType, "object" | "array">;
927
+
928
+ const PRIMITIVE_TYPES: Record<PrimitiveSchemaType, true> = {
929
+ string: true,
930
+ number: true,
931
+ integer: true,
932
+ boolean: true,
933
+ null: true,
934
+ } as const;
935
+
936
+ const isPrimitive = (schema: SchemaObject) => {
937
+ return PRIMITIVE_TYPES[schema.type as PrimitiveSchemaType];
938
+ };