@digi-frontend/dgate-api-documentation 1.1.12 → 1.3.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 (240) hide show
  1. package/.editorconfig +13 -0
  2. package/.prettierignore +8 -0
  3. package/.prettierrc +15 -0
  4. package/dist/_virtual/index4.js +1 -1
  5. package/dist/_virtual/index5.js +1 -1
  6. package/dist/_virtual/index6.js +1 -1
  7. package/dist/_virtual/index7.js +1 -1
  8. package/dist/node_modules/@popperjs/core/lib/createPopper.js +1 -1
  9. package/dist/node_modules/@popperjs/core/lib/createPopper.js.map +1 -1
  10. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +1 -1
  11. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js.map +1 -1
  12. package/dist/node_modules/@popperjs/core/lib/enums.js +1 -1
  13. package/dist/node_modules/@popperjs/core/lib/enums.js.map +1 -1
  14. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js +1 -1
  15. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js.map +1 -1
  16. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js +1 -1
  17. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js.map +1 -1
  18. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js +1 -1
  19. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js.map +1 -1
  20. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js +1 -1
  21. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js.map +1 -1
  22. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js +1 -1
  23. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js.map +1 -1
  24. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +1 -1
  25. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js.map +1 -1
  26. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js +1 -1
  27. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js.map +1 -1
  28. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js +1 -1
  29. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js.map +1 -1
  30. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js +1 -1
  31. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js.map +1 -1
  32. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +1 -1
  33. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js.map +1 -1
  34. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +1 -1
  35. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js.map +1 -1
  36. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js +1 -1
  37. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js.map +1 -1
  38. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js +1 -1
  39. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js.map +1 -1
  40. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js +1 -1
  41. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js.map +1 -1
  42. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js +1 -1
  43. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js.map +1 -1
  44. package/dist/node_modules/digitinary-ui/dist/index.js +1 -1
  45. package/dist/node_modules/digitinary-ui/dist/index.js.map +1 -1
  46. package/dist/node_modules/dom-serializer/lib/foreignNames.js +1 -1
  47. package/dist/node_modules/dom-serializer/lib/foreignNames.js.map +1 -1
  48. package/dist/node_modules/dom-serializer/lib/index.js +1 -1
  49. package/dist/node_modules/dom-serializer/lib/index.js.map +1 -1
  50. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js +1 -1
  51. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js.map +1 -1
  52. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js +1 -1
  53. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js.map +1 -1
  54. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js +1 -1
  55. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js.map +1 -1
  56. package/dist/node_modules/domhandler/lib/node.js +1 -1
  57. package/dist/node_modules/domhandler/lib/node.js.map +1 -1
  58. package/dist/node_modules/domutils/lib/feeds.js +1 -1
  59. package/dist/node_modules/domutils/lib/feeds.js.map +1 -1
  60. package/dist/node_modules/domutils/lib/helpers.js +1 -1
  61. package/dist/node_modules/domutils/lib/helpers.js.map +1 -1
  62. package/dist/node_modules/domutils/lib/legacy.js +1 -1
  63. package/dist/node_modules/domutils/lib/legacy.js.map +1 -1
  64. package/dist/node_modules/domutils/lib/querying.js +1 -1
  65. package/dist/node_modules/domutils/lib/querying.js.map +1 -1
  66. package/dist/node_modules/domutils/lib/stringify.js +1 -1
  67. package/dist/node_modules/domutils/lib/stringify.js.map +1 -1
  68. package/dist/node_modules/entities/dist/commonjs/decode.js +1 -1
  69. package/dist/node_modules/entities/dist/commonjs/decode.js.map +1 -1
  70. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js +1 -1
  71. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -1
  72. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +1 -1
  73. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -1
  74. package/dist/node_modules/formik/dist/formik.esm.js +1 -1
  75. package/dist/node_modules/formik/dist/formik.esm.js.map +1 -1
  76. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js +1 -1
  77. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js.map +1 -1
  78. package/dist/node_modules/highlight.js/lib/core.js +1 -1
  79. package/dist/node_modules/highlight.js/lib/core.js.map +1 -1
  80. package/dist/node_modules/highlight.js/lib/languages/json.js +1 -1
  81. package/dist/node_modules/highlight.js/lib/languages/json.js.map +1 -1
  82. package/dist/node_modules/html-react-parser/lib/utilities.js.map +1 -1
  83. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js +1 -1
  84. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js.map +1 -1
  85. package/dist/node_modules/htmlparser2/dist/commonjs/index.js +1 -1
  86. package/dist/node_modules/htmlparser2/dist/commonjs/index.js.map +1 -1
  87. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js +1 -1
  88. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js.map +1 -1
  89. package/dist/node_modules/lodash-es/_baseClone.js +1 -1
  90. package/dist/node_modules/lodash-es/_baseClone.js.map +1 -1
  91. package/dist/node_modules/lodash-es/_getSymbols.js +1 -1
  92. package/dist/node_modules/lodash-es/_getSymbols.js.map +1 -1
  93. package/dist/node_modules/lodash-es/_memoizeCapped.js +1 -1
  94. package/dist/node_modules/lodash-es/_memoizeCapped.js.map +1 -1
  95. package/dist/node_modules/lodash-es/_stringToPath.js +1 -1
  96. package/dist/node_modules/lodash-es/_stringToPath.js.map +1 -1
  97. package/dist/node_modules/property-expr/index.js +1 -1
  98. package/dist/node_modules/property-expr/index.js.map +1 -1
  99. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +1 -1
  100. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -1
  101. package/dist/node_modules/react-property/lib/index.js +1 -1
  102. package/dist/node_modules/react-property/lib/index.js.map +1 -1
  103. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js +1 -1
  104. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js.map +1 -1
  105. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js +1 -1
  106. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js.map +1 -1
  107. package/dist/node_modules/react-toastify/dist/index.mjs.js +1 -1
  108. package/dist/node_modules/react-toastify/dist/index.mjs.js.map +1 -1
  109. package/dist/node_modules/style-to-js/cjs/index.js +1 -1
  110. package/dist/node_modules/style-to-js/cjs/index.js.map +1 -1
  111. package/dist/node_modules/style-to-object/cjs/index.js +1 -1
  112. package/dist/node_modules/style-to-object/cjs/index.js.map +1 -1
  113. package/dist/node_modules/tiny-case/index.js +1 -1
  114. package/dist/node_modules/tiny-case/index.js.map +1 -1
  115. package/dist/node_modules/tippy.js/dist/tippy.esm.js +1 -1
  116. package/dist/node_modules/tippy.js/dist/tippy.esm.js.map +1 -1
  117. package/dist/node_modules/toposort/index.js +1 -1
  118. package/dist/node_modules/toposort/index.js.map +1 -1
  119. package/dist/node_modules/tslib/tslib.es6.js +1 -1
  120. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  121. package/dist/node_modules/yup/index.esm.js +1 -1
  122. package/dist/node_modules/yup/index.esm.js.map +1 -1
  123. package/dist/src/components/InfoForm/InfoForm.js +1 -1
  124. package/dist/src/components/InfoForm/InfoForm.js.map +1 -1
  125. package/dist/src/components/JsonInput/JsonInput.js +1 -1
  126. package/dist/src/components/JsonInput/JsonInput.js.map +1 -1
  127. package/dist/src/components/LivePreview/LivePreview.js +1 -1
  128. package/dist/src/components/LivePreview/LivePreview.js.map +1 -1
  129. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  130. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  131. package/dist/src/components/SVGLoader/SVGLoader.js +1 -1
  132. package/dist/src/components/SVGLoader/SVGLoader.js.map +1 -1
  133. package/dist/src/components/Tooltip/Tooltip.js +1 -1
  134. package/dist/src/components/Tooltip/Tooltip.js.map +1 -1
  135. package/dist/src/components/table/table.js +1 -1
  136. package/dist/src/components/table/table.js.map +1 -1
  137. package/dist/src/components/table/tags-table.js +1 -1
  138. package/dist/src/components/table/tags-table.js.map +1 -1
  139. package/dist/src/constants/methods.constant.js +1 -1
  140. package/dist/src/constants/methods.constant.js.map +1 -1
  141. package/dist/src/context/SectionToggleContext.js +1 -1
  142. package/dist/src/context/SectionToggleContext.js.map +1 -1
  143. package/dist/src/helpers/docs.helper.js +1 -1
  144. package/dist/src/helpers/docs.helper.js.map +1 -1
  145. package/dist/src/helpers/layout.helper.js +1 -1
  146. package/dist/src/helpers/layout.helper.js.map +1 -1
  147. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js +1 -1
  148. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js.map +1 -1
  149. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js +1 -1
  150. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js.map +1 -1
  151. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js +1 -1
  152. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js.map +1 -1
  153. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js +1 -1
  154. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js.map +1 -1
  155. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js +1 -1
  156. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js.map +1 -1
  157. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js +1 -1
  158. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js.map +1 -1
  159. package/dist/src/layout/docsLayout.js +1 -1
  160. package/dist/src/layout/docsLayout.js.map +1 -1
  161. package/dist/src/layout/layout.js +1 -1
  162. package/dist/src/layout/layout.js.map +1 -1
  163. package/dist/src/utils/index.js +1 -1
  164. package/dist/src/utils/index.js.map +1 -1
  165. package/dist/src/validator/form.scheme.js +1 -1
  166. package/dist/src/validator/form.scheme.js.map +1 -1
  167. package/dist/styles.css +773 -773
  168. package/index.ts +2 -0
  169. package/package.json +4 -9
  170. package/rollup.config.js +37 -0
  171. package/src/assets/icons/AddRow.svg +3 -0
  172. package/src/assets/icons/ApiIcon.svg +12 -0
  173. package/src/assets/icons/ArrowBack.svg +3 -0
  174. package/src/assets/icons/BookIcon.svg +6 -0
  175. package/src/assets/icons/CheckMarkSquare.svg +5 -0
  176. package/src/assets/icons/CloseIcon.svg +4 -0
  177. package/src/assets/icons/CopySticker.svg +6 -0
  178. package/src/assets/icons/DeleteIcon.svg +3 -0
  179. package/src/assets/icons/DownArrow.svg +3 -0
  180. package/src/assets/icons/EditIcon.svg +3 -0
  181. package/src/assets/icons/FilterIcon.svg +4 -0
  182. package/src/assets/icons/Plus.svg +5 -0
  183. package/src/assets/icons/PlusSquare.svg +3 -0
  184. package/src/assets/icons/RequestOption.svg +5 -0
  185. package/src/assets/icons/UpArrow.svg +3 -0
  186. package/src/assets/icons/arrow-down.svg +3 -0
  187. package/src/assets/icons/arrow-up.svg +10 -0
  188. package/src/assets/icons/arrowDownGray.svg +3 -0
  189. package/src/assets/icons/arrowRightGray.svg +3 -0
  190. package/src/assets/icons/close-circle.svg +5 -0
  191. package/src/assets/icons/copy.svg +4 -0
  192. package/src/assets/icons/deleteOutlinedIcon.svg +8 -0
  193. package/src/assets/icons/document.svg +6 -0
  194. package/src/assets/icons/eye.svg +4 -0
  195. package/src/assets/icons/index.ts +27 -0
  196. package/src/assets/icons/infoIcon.svg +5 -0
  197. package/src/assets/icons/newCopyIcon.svg +4 -0
  198. package/src/assets/icons/searchIcon.svg +4 -0
  199. package/src/components/Chips/Chips.tsx +87 -0
  200. package/src/components/InfoForm/InfoForm.tsx +432 -0
  201. package/src/components/JsonInput/JsonInput.tsx +149 -0
  202. package/src/components/LivePreview/LivePreview.tsx +224 -0
  203. package/src/components/MethodAccordion/MethodAccordion.tsx +1070 -0
  204. package/src/components/SVGLoader/SVGLoader.tsx +96 -0
  205. package/src/components/SectionHead/SectionHead.tsx +22 -0
  206. package/src/components/SimpleLabelValue/SimpleLabelValue.tsx +31 -0
  207. package/src/components/SimpleLabelValue/index.ts +1 -0
  208. package/src/components/Tooltip/Tooltip.tsx +85 -0
  209. package/src/components/dialog/dialog.ts +61 -0
  210. package/src/components/dialog/index.tsx +88 -0
  211. package/src/components/table/table.tsx +508 -0
  212. package/src/components/table/tags-table.tsx +348 -0
  213. package/src/constants/index.ts +95 -0
  214. package/src/constants/methods.constant.ts +26 -0
  215. package/src/constants/regex.ts +7 -0
  216. package/src/context/SectionToggleContext.tsx +121 -0
  217. package/src/global.d.ts +13 -0
  218. package/src/helpers/docs.helper.ts +42 -0
  219. package/src/helpers/layout.helper.ts +290 -0
  220. package/src/helpers/methodAccordion.helper.ts +20 -0
  221. package/src/index.ts +2 -0
  222. package/src/layout/docsComponents/Codebox/Codebox.tsx +61 -0
  223. package/src/layout/docsComponents/DocsAside/DocsAside.tsx +112 -0
  224. package/src/layout/docsComponents/DocsContent/DocsContent.tsx +51 -0
  225. package/src/layout/docsComponents/DocsContent/EndpointPage/index.tsx +307 -0
  226. package/src/layout/docsComponents/DocsContent/OverviewPage/index.tsx +223 -0
  227. package/src/layout/docsComponents/DocsHeader/DocsHeader.tsx +188 -0
  228. package/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.tsx +229 -0
  229. package/src/layout/docsComponents/index.tsx +28 -0
  230. package/src/layout/docsLayout.tsx +123 -0
  231. package/src/layout/layout.module.css +65 -0
  232. package/src/layout/layout.tsx +177 -0
  233. package/src/types/docsLayout.type.ts +7 -0
  234. package/src/types/index.ts +28 -0
  235. package/src/types/layout.type.ts +32 -0
  236. package/src/types/openApi.ts +109 -0
  237. package/src/types/transformedOpenApi.ts +52 -0
  238. package/src/utils/index.ts +15 -0
  239. package/src/validator/form.scheme.ts +96 -0
  240. package/tsconfig.json +33 -0
@@ -0,0 +1,290 @@
1
+ import { TransformedPathsArray } from '@entities/layout.type'
2
+ import { OpenAPIFile, SecurityScheme } from '@entities/openApi'
3
+ import { TransformedOpenApi } from '@entities/transformedOpenApi'
4
+
5
+ const resolveRef = (ref: string, openApiJson: OpenAPIFile): Object => {
6
+ const parts = ref.replace(/^#\//, '').split('/')
7
+ return parts.reduce((obj, key) => obj?.[key], openApiJson)
8
+ }
9
+
10
+ export const transformOpenApiObject = (openApiJson: OpenAPIFile): TransformedOpenApi => {
11
+ if (openApiJson.components && openApiJson.components.securitySchemes) {
12
+ const authKey = Object.keys(openApiJson.components.securitySchemes)?.at(0)
13
+ if (authKey) {
14
+ openApiJson.components.securitySchemes[authKey].type = openApiJson?.components
15
+ ?.securitySchemes?.[authKey]?.type as SecurityScheme['type']
16
+ }
17
+ } else {
18
+ openApiJson.components = {
19
+ securitySchemes: {
20
+ Public: {
21
+ type: 'http',
22
+ scheme: 'public',
23
+ },
24
+ },
25
+ ...(openApiJson.components || {}),
26
+ }
27
+ }
28
+
29
+ if (!openApiJson.tags) {
30
+ openApiJson.tags = []
31
+ }
32
+
33
+ return {
34
+ ...openApiJson,
35
+ paths: transformPathsToArray(openApiJson),
36
+ } as TransformedOpenApi
37
+ }
38
+
39
+ export const transformOpenApiObjectToOrigin = (values: TransformedOpenApi): OpenAPIFile => {
40
+ const object = {
41
+ ...values,
42
+ paths: transformPathsArrayToOrigin(values.paths),
43
+ }
44
+ if (object.components && object.components.securitySchemes) {
45
+ const authKey = Object.keys(object.components.securitySchemes)?.at(0)
46
+ if (authKey) {
47
+ if (object.components.securitySchemes[authKey].type.toLowerCase() == 'APIKEY'.toLowerCase()) {
48
+ object.components.securitySchemes[authKey].in = object.components.securitySchemes[authKey]
49
+ .in as SecurityScheme['in']
50
+ }
51
+ object.components.securitySchemes[authKey].type = object?.components?.securitySchemes?.[
52
+ authKey
53
+ ]?.type as SecurityScheme['type']
54
+ }
55
+ }
56
+ return object
57
+ }
58
+
59
+ export const transformPathsToArray = (openApiJson: OpenAPIFile): TransformedPathsArray | any => {
60
+ const paths: OpenAPIFile['paths'] = openApiJson.paths
61
+ const transformedPaths = Object.entries(paths).map(([path, methods]) => ({
62
+ path,
63
+ methods: Object.entries(methods).map(([method, methodProps]) => {
64
+ const obj: any = {
65
+ ...methodProps,
66
+ type: method,
67
+ tags: methodProps.tags || [],
68
+ summary: methodProps.summary || '',
69
+ responses: Object.entries(methodProps.responses).map(([code, codeProps]) => {
70
+ const contentType = Object.keys(codeProps.content || {})[0]
71
+ let headers = codeProps?.headers ?? {}
72
+
73
+ // ? Fix headers with items property
74
+ Object.keys(headers).map((header: string) => {
75
+ let headerObj = headers[header]
76
+ if (
77
+ headerObj?.schema &&
78
+ headerObj?.schema?.type &&
79
+ headerObj?.schema?.type != 'array'
80
+ ) {
81
+ delete headers[header]?.schema?.items
82
+ }
83
+ })
84
+
85
+ let schema = codeProps.content?.[contentType]?.schema
86
+ if (schema?.$ref) {
87
+ schema = resolveRef(schema?.$ref, openApiJson)
88
+ } else if (schema?.type == 'array' && schema?.items?.$ref) {
89
+ const resolvedItemSchema = resolveRef(schema.items.$ref, openApiJson)
90
+ schema = {
91
+ ...schema,
92
+ items: resolvedItemSchema,
93
+ }
94
+ }
95
+ // if the response content is not an array remove the (items) property
96
+ if (schema?.type !== 'array') {
97
+ const { items, ...schemaRest } = schema
98
+
99
+ schema = schemaRest
100
+ }
101
+
102
+ return {
103
+ code,
104
+ headers,
105
+ content: {
106
+ contentType,
107
+ schema: {
108
+ ...schema,
109
+ properties: JSON.stringify(schema?.properties || schema?.items?.properties),
110
+ },
111
+ },
112
+ }
113
+ }),
114
+ }
115
+
116
+ if (!obj.responses.find((item) => item.code == '200')) {
117
+ obj.responses.push({
118
+ code: '200',
119
+ content: {
120
+ contentType: 'application/json',
121
+ schema: {},
122
+ },
123
+ headers: {},
124
+ })
125
+ }
126
+ // Add parameters if it does not exist in the original JSON
127
+ if (!methodProps?.parameters) {
128
+ obj.parameters = []
129
+ } else {
130
+ obj.parameters = obj.parameters.map((param) => {
131
+ const { schema } = param
132
+ if (schema && schema?.items && schema?.type?.toLowerCase() != 'array') {
133
+ delete schema.items
134
+ }
135
+
136
+ return { ...param, schema }
137
+ })
138
+ }
139
+
140
+ // load response headers parameters
141
+
142
+ if (method.toLowerCase() != 'get') {
143
+ const contentType = Object.keys(methodProps?.requestBody?.content || {})[0]
144
+ let reqSchema = methodProps?.requestBody?.content?.[contentType]?.schema
145
+
146
+ if (reqSchema?.$ref) {
147
+ reqSchema = resolveRef(reqSchema.$ref, openApiJson)
148
+ } else if (reqSchema?.type === 'array' && reqSchema.items?.$ref) {
149
+ reqSchema = {
150
+ ...reqSchema,
151
+ items: resolveRef(reqSchema.items.$ref, openApiJson),
152
+ }
153
+ }
154
+
155
+ const requestBodyData = reqSchema
156
+ ? {
157
+ content: {
158
+ contentType,
159
+ schema: {
160
+ ...reqSchema,
161
+ properties: JSON.stringify(reqSchema?.properties || reqSchema?.items?.properties),
162
+ },
163
+ },
164
+ }
165
+ : {
166
+ content: {
167
+ contentType: 'application/json',
168
+ schema: {
169
+ properties: '{}',
170
+ type: 'object',
171
+ },
172
+ },
173
+ }
174
+
175
+ obj['requestBody'] = requestBodyData
176
+ }
177
+ return obj
178
+ }),
179
+ }))
180
+
181
+ return transformedPaths
182
+ }
183
+
184
+ const validateBodyForResponse = (content, method) => {
185
+ if (!(content?.schema as any) || !(content?.schema as any)?.properties) {
186
+ return {}
187
+ }
188
+ let _content = JSON.parse((content?.schema as any)?.properties as string)
189
+
190
+ return _content
191
+ }
192
+
193
+ export const transformPathsArrayToOrigin = (paths: TransformedPathsArray): OpenAPIFile['paths'] => {
194
+ return paths.reduce((acc, { path, methods }) => {
195
+ acc[path] = methods.reduce(
196
+ (methodAcc, { type, tags, responses, summary, requestBody, ...rest }) => {
197
+ // Initialize the method object
198
+ // ? Validate (rest) [parameters]
199
+ let copiedRest = structuredClone(rest || {})
200
+ if (copiedRest && copiedRest.parameters) {
201
+ copiedRest.parameters.map((param) => {
202
+ if (param && param?.schema?.items && param?.schema?.type?.toLowerCase() != 'array') {
203
+ delete param?.schema?.items
204
+ }
205
+ if (param && param?.schema?.items && param?.schema?.items?.type == 'array') {
206
+ param.schema.items.items = {}
207
+ }
208
+ return param
209
+ })
210
+ }
211
+
212
+ // Get the original responses from the rest object
213
+ const originalResponses = rest.responses || {}
214
+
215
+ methodAcc[type] = {
216
+ ...copiedRest,
217
+ tags,
218
+ summary,
219
+ responses: responses.reduce((respAcc, { code, content, headers }) => {
220
+ // Skip if:
221
+ // 1. This is a new code (not in original) AND
222
+ // 2. Both headers and content are empty
223
+ const isNewCode = !originalResponses[code]
224
+ const hasHeaders = Object.keys(headers || {}).length > 0
225
+ const hasContent =
226
+ Object.keys(validateBodyForResponse(content || {}, type) || {}).length > 0
227
+
228
+ if (isNewCode && !hasHeaders && !hasContent) {
229
+ return respAcc
230
+ }
231
+
232
+ const formattedHeaders: Record<string, any> = {}
233
+ if (headers) {
234
+ for (const [key, value] of Object.entries(headers)) {
235
+ if (
236
+ value?.schema &&
237
+ value?.schema?.items &&
238
+ value?.schema?.type?.toLowerCase() != 'array'
239
+ ) {
240
+ delete value?.schema?.items
241
+ }
242
+ formattedHeaders[key] = {
243
+ description: value.description || '',
244
+ required: value.required || false,
245
+ schema: value.schema || {},
246
+ }
247
+ }
248
+ }
249
+ respAcc[code] = {
250
+ description: 'Success', // Assuming this is static from the original data
251
+ content: content.contentType
252
+ ? {
253
+ [content.contentType]: {
254
+ schema: {
255
+ ...(content.schema as object),
256
+ properties: validateBodyForResponse(content, type),
257
+ },
258
+ },
259
+ }
260
+ : originalResponses[code]?.content || {},
261
+ headers: formattedHeaders,
262
+ }
263
+ return respAcc
264
+ }, {} as Record<string, any>),
265
+ }
266
+
267
+ const parsedRequestBodyProps =
268
+ type !== 'get' ? JSON.parse(requestBody.content.schema.properties) : {}
269
+ // Add requestBody for non-GET methods
270
+ if (type !== 'get') {
271
+ methodAcc[type].requestBody = {
272
+ content: {
273
+ [requestBody.content.contentType]: {
274
+ schema: {
275
+ ...requestBody.content.schema,
276
+ properties: parsedRequestBodyProps,
277
+ },
278
+ },
279
+ },
280
+ }
281
+ }
282
+
283
+ return methodAcc
284
+ },
285
+ {} as Record<string, any>
286
+ )
287
+
288
+ return acc
289
+ }, {} as OpenAPIFile['paths'])
290
+ }
@@ -0,0 +1,20 @@
1
+ export const handleStatusColor = (code: number): string => {
2
+ if (code >= 200 && code < 300) {
3
+ return 'green' // 2xx codes
4
+ } else if (code >= 400 && code < 500) {
5
+ return 'red' // 4xx codes
6
+ } else if (code >= 500 && code < 600) {
7
+ return 'red' // 5xx codes
8
+ } else if (code >= 100 && code < 200) {
9
+ return 'blue' // 1xx codes (Informational)
10
+ } else if (code >= 300 && code < 400) {
11
+ return 'orange' // 3xx codes (Redirection)
12
+ } else {
13
+ return 'gray' // Default or invalid status codes
14
+ }
15
+ }
16
+
17
+ export const capitalize = (str)=> {
18
+ if (!str) return "";
19
+ return str.charAt(0).toUpperCase() + str.slice(1);
20
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { default as Layout } from './layout/layout'
2
+ export { default as DocsLayout } from './layout/docsLayout'
@@ -0,0 +1,61 @@
1
+ import React, { useState } from 'react'
2
+ import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
3
+ import json from 'react-syntax-highlighter/dist/esm/languages/hljs/json'
4
+ import * as hljs from 'react-syntax-highlighter/dist/esm/styles/hljs'
5
+ import styles from './style.module.scss'
6
+ import SVGLoader from '../../../components/SVGLoader/SVGLoader'
7
+ import { Copy } from '../../../assets/icons'
8
+ import { copyToClipboard } from '../../../utils'
9
+
10
+ SyntaxHighlighter.registerLanguage('json', json)
11
+
12
+ const Codebox = ({ code }: { code: string }) => {
13
+ const [theme, setTheme] = useState<'LIGHT' | 'DARK'>('DARK')
14
+
15
+ return (
16
+ <div className={styles.codebox}>
17
+ <div className={styles.codebox_header}>
18
+ <div
19
+ role="button"
20
+ tabIndex={-1}
21
+ onClick={() => theme !== 'LIGHT' && setTheme('LIGHT')}
22
+ className={`${styles.codebox_header_themeToggle} ${styles.codebox_header_themeToggle_light}`}
23
+ title="Light theme"
24
+ ></div>
25
+ <div
26
+ role="button"
27
+ tabIndex={-1}
28
+ onClick={() => theme !== 'DARK' && setTheme('DARK')}
29
+ className={`${styles.codebox_header_themeToggle} ${styles.codebox_header_themeToggle_dark}`}
30
+ title="Dark theme"
31
+ ></div>
32
+ <SVGLoader
33
+ src={Copy}
34
+ width="0.75rem"
35
+ height="0.75rem"
36
+ className={styles.codebox_header_copyIcon}
37
+ onClick={() => copyToClipboard(code)}
38
+ />
39
+ </div>
40
+ <SyntaxHighlighter
41
+ language="json"
42
+ style={theme === 'LIGHT' ? hljs.stackoverflowLight : hljs.stackoverflowDark}
43
+ showLineNumbers
44
+ wrapLines
45
+ customStyle={{
46
+ margin: 0,
47
+ height: '13.75rem',
48
+ overflowY: 'auto',
49
+ padding: '0.75rem 1rem 0 1.5rem',
50
+ backgroundColor: theme === 'DARK' ? '#455162' : '#F7F7F7',
51
+ fontSize: '0.75rem',
52
+ }}
53
+ lineProps={{ className: 'custom-code-line' }}
54
+ >
55
+ {code}
56
+ </SyntaxHighlighter>
57
+ </div>
58
+ )
59
+ }
60
+
61
+ export default Codebox
@@ -0,0 +1,112 @@
1
+ import React, { useEffect, useState } from 'react'
2
+ import { EndpointData } from 'src/layout/docsLayout'
3
+ import Codebox from '../Codebox/Codebox'
4
+ import { Option, SelectGroup } from 'digitinary-ui'
5
+ import { httpStatusCodes } from '../../../constants/index'
6
+ import { handleStatusColor } from '../../../helpers/methodAccordion.helper'
7
+ import styles from './style.module.scss'
8
+
9
+ const DocsAside = ({ data }: { data: EndpointData }) => {
10
+ // Filter status codes to only include those with non-empty properties
11
+ const filteredStatusCodes = Object.keys(data?.responses || {}).filter((code) => {
12
+ const response = data.responses[code]
13
+ const contentType = Object.keys(response?.content || {})[0]
14
+ return response?.content?.[contentType]?.schema?.properties
15
+ })
16
+
17
+ // Create options for the select dropdown
18
+ const httpStatusCodeOptions = filteredStatusCodes.map((code) => ({
19
+ label: (
20
+ <div className={styles.statusCodeOptionContainer}>
21
+ <div
22
+ className={styles.statusCodeOptionCircle}
23
+ style={{ backgroundColor: handleStatusColor(code) }}
24
+ ></div>
25
+ <span>{code}</span>
26
+ </div>
27
+ ),
28
+ value: String(code),
29
+ }))
30
+
31
+ // Function to get default option
32
+ const getDefaultOption = () => {
33
+ const has200 = filteredStatusCodes.includes('200')
34
+ return has200
35
+ ? httpStatusCodeOptions.find((opt) => opt.value === '200')
36
+ : httpStatusCodeOptions[0] || null
37
+ }
38
+
39
+ useEffect(() => {
40
+ setSelectedResStatusCode(getDefaultOption())
41
+ }, [data])
42
+ const [selectedResStatusCode, setSelectedResStatusCode] = useState(httpStatusCodeOptions[4])
43
+ const currentResponse = Object.entries(data.responses)
44
+ .map(([code, data]) => ({ code, data }))
45
+ .find((res) => res.code === selectedResStatusCode?.value)
46
+
47
+ const stringifyRequestBody = () => {
48
+ if (data?.requestBody?.content) {
49
+ const contentKey = Object.keys(data?.requestBody?.content)[0]
50
+ return JSON.stringify(data?.requestBody?.content[contentKey]?.schema?.properties, null, 2)
51
+ } else {
52
+ return '{}'
53
+ }
54
+ }
55
+
56
+ const stringifyResponseBody = () => {
57
+ if (currentResponse?.data) {
58
+ const contentKey = Object.keys(currentResponse.data?.content)[0]
59
+ return JSON.stringify(currentResponse.data?.content[contentKey]?.schema?.properties, null, 2)
60
+ } else {
61
+ return '{}'
62
+ }
63
+ }
64
+
65
+ return (
66
+ <aside className={styles.apiDocsAside}>
67
+ <h2 className={styles.apiDocsAside_title}>{data.summary}</h2>
68
+ <h4 className={styles.apiDocsAside_subtitle}>
69
+ <span className={styles.apiDocsAside_subtitle_method} data-method={data.method}>
70
+ {data.method}
71
+ </span>{' '}
72
+ <span>{data.path}</span>
73
+ </h4>
74
+ {!['delete', 'get'].includes(data.method) && data?.requestBody?.content && (
75
+ <div className={styles.codeboxSection}>
76
+ <div className={styles.codeboxHeader}>
77
+ <h6 className={styles.codeboxTitle}>Request</h6>
78
+ </div>
79
+
80
+ <Codebox code={stringifyRequestBody()} />
81
+ </div>
82
+ )}
83
+ {Object.keys(data?.responses || {})?.length > 0 && (
84
+ <div className={styles.codeboxSection}>
85
+ <div className={`${styles.codeboxHeader}`}>
86
+ <h6 className={styles.codeboxTitle}>Response</h6>
87
+ <SelectGroup
88
+ size="small"
89
+ withSearch={false}
90
+ isMultiple={false}
91
+ clearable={false}
92
+ placeholder="200"
93
+ options={[
94
+ {
95
+ list: httpStatusCodeOptions,
96
+ },
97
+ ]}
98
+ value={selectedResStatusCode}
99
+ onChange={(value) => {
100
+ setSelectedResStatusCode(value)
101
+ }}
102
+ />
103
+ </div>
104
+
105
+ <Codebox code={stringifyResponseBody()} />
106
+ </div>
107
+ )}
108
+ </aside>
109
+ )
110
+ }
111
+
112
+ export default DocsAside
@@ -0,0 +1,51 @@
1
+ import React, { useEffect, useRef } from 'react'
2
+ import './style.scss'
3
+ import { OverviewPage } from './OverviewPage'
4
+ import { EndpointPage } from './EndpointPage'
5
+ import { EndpointData, OverviewData } from 'src/layout/docsLayout'
6
+
7
+ const DocsContent = ({
8
+ data,
9
+ activeType,
10
+ setActiveItemData,
11
+ setActiveType,
12
+ onProductNavigate,
13
+ apis,
14
+ }: {
15
+ data: OverviewData | EndpointData
16
+ activeType: 'OVERVIEW' | 'ENDPOINT'
17
+ setActiveItemData: React.Dispatch<React.SetStateAction<OverviewData | EndpointData>>
18
+ setActiveType: React.Dispatch<React.SetStateAction<'OVERVIEW' | 'ENDPOINT'>>
19
+ onProductNavigate?: (productId: number) => void
20
+ apis: OverviewData[]
21
+ }) => {
22
+ const containerRef = useRef(null)
23
+
24
+ useEffect(() => {
25
+ // This will scroll to the top when changing the overview
26
+ if (activeType === 'OVERVIEW' && containerRef?.current) {
27
+ containerRef?.current?.scrollTo({ top: 0, behavior: 'smooth' })
28
+ }
29
+ }, [data, activeType])
30
+ return (
31
+ <main ref={containerRef}>
32
+ {activeType === 'OVERVIEW' ? (
33
+ <OverviewPage
34
+ data={data as OverviewData}
35
+ setActiveItemData={setActiveItemData}
36
+ setActiveType={setActiveType}
37
+ onProductNavigate={onProductNavigate}
38
+ apis={apis}
39
+ />
40
+ ) : (
41
+ <EndpointPage
42
+ data={data as EndpointData}
43
+ setActiveType={setActiveType}
44
+ setActiveItemData={setActiveItemData}
45
+ />
46
+ )}
47
+ </main>
48
+ )
49
+ }
50
+
51
+ export default DocsContent