zudoku 0.0.0-f865d81 → 0.0.0-fa903e7

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 (446) hide show
  1. package/dist/app/demo.js +0 -2
  2. package/dist/app/demo.js.map +1 -1
  3. package/dist/app/entry.client.js +14 -0
  4. package/dist/app/entry.client.js.map +1 -1
  5. package/dist/app/entry.server.js +6 -6
  6. package/dist/app/entry.server.js.map +1 -1
  7. package/dist/app/main.d.ts +1 -1
  8. package/dist/app/main.js +2 -2
  9. package/dist/app/main.js.map +1 -1
  10. package/dist/app/standalone.js +0 -2
  11. package/dist/app/standalone.js.map +1 -1
  12. package/dist/cli/cli.js +1 -2
  13. package/dist/cli/cli.js.map +1 -1
  14. package/dist/cli/common/logger.js +9 -0
  15. package/dist/cli/common/logger.js.map +1 -1
  16. package/dist/codegen.d.ts +3 -0
  17. package/dist/codegen.js +45 -0
  18. package/dist/codegen.js.map +1 -0
  19. package/dist/config/validators/InputSidebarSchema.d.ts +10 -10
  20. package/dist/config/validators/validate.d.ts +148 -117
  21. package/dist/config/validators/validate.js +13 -6
  22. package/dist/config/validators/validate.js.map +1 -1
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/authentication/AuthenticationPlugin.d.ts +4 -2
  27. package/dist/lib/authentication/AuthenticationPlugin.js +3 -0
  28. package/dist/lib/authentication/AuthenticationPlugin.js.map +1 -1
  29. package/dist/lib/authentication/authentication.d.ts +3 -3
  30. package/dist/lib/authentication/hook.d.ts +5 -4
  31. package/dist/lib/authentication/hook.js +1 -3
  32. package/dist/lib/authentication/hook.js.map +1 -1
  33. package/dist/lib/authentication/providers/auth0.js +12 -11
  34. package/dist/lib/authentication/providers/auth0.js.map +1 -1
  35. package/dist/lib/authentication/providers/openid.d.ts +0 -1
  36. package/dist/lib/authentication/providers/openid.js +11 -26
  37. package/dist/lib/authentication/providers/openid.js.map +1 -1
  38. package/dist/lib/authentication/state.d.ts +25 -4
  39. package/dist/lib/authentication/state.js +28 -3
  40. package/dist/lib/authentication/state.js.map +1 -1
  41. package/dist/lib/authentication/use-broadcast/shared.d.ts +48 -0
  42. package/dist/lib/authentication/use-broadcast/shared.js +243 -0
  43. package/dist/lib/authentication/use-broadcast/shared.js.map +1 -0
  44. package/dist/lib/authentication/use-broadcast/useBroadcast.d.ts +24 -0
  45. package/dist/lib/authentication/use-broadcast/useBroadcast.js +106 -0
  46. package/dist/lib/authentication/use-broadcast/useBroadcast.js.map +1 -0
  47. package/dist/lib/components/Bootstrap.d.ts +3 -1
  48. package/dist/lib/components/Bootstrap.js +10 -4
  49. package/dist/lib/components/Bootstrap.js.map +1 -1
  50. package/dist/lib/components/ClientOnly.d.ts +4 -2
  51. package/dist/lib/components/ClientOnly.js +1 -1
  52. package/dist/lib/components/ClientOnly.js.map +1 -1
  53. package/dist/lib/components/DeveloperHint.js +2 -1
  54. package/dist/lib/components/DeveloperHint.js.map +1 -1
  55. package/dist/lib/components/Header.js +16 -10
  56. package/dist/lib/components/Header.js.map +1 -1
  57. package/dist/lib/components/Heading.d.ts +1 -1
  58. package/dist/lib/components/Layout.js +12 -4
  59. package/dist/lib/components/Layout.js.map +1 -1
  60. package/dist/lib/components/MobileTopNavigation.js +6 -7
  61. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  62. package/dist/lib/components/SyntaxHighlight.js +16 -12
  63. package/dist/lib/components/SyntaxHighlight.js.map +1 -1
  64. package/dist/lib/components/ThemeSwitch.d.ts +1 -0
  65. package/dist/lib/components/ThemeSwitch.js +13 -0
  66. package/dist/lib/components/ThemeSwitch.js.map +1 -0
  67. package/dist/lib/components/TopNavigation.d.ts +2 -0
  68. package/dist/lib/components/TopNavigation.js +13 -7
  69. package/dist/lib/components/TopNavigation.js.map +1 -1
  70. package/dist/lib/components/{DevPortal.d.ts → Zudoku.d.ts} +3 -3
  71. package/dist/lib/components/{DevPortal.js → Zudoku.js} +13 -14
  72. package/dist/lib/components/Zudoku.js.map +1 -0
  73. package/dist/lib/components/context/ZudokuContext.d.ts +7 -7
  74. package/dist/lib/components/context/ZudokuContext.js +8 -13
  75. package/dist/lib/components/context/ZudokuContext.js.map +1 -1
  76. package/dist/lib/components/context/ZudokuProvider.d.ts +2 -2
  77. package/dist/lib/components/context/ZudokuProvider.js.map +1 -1
  78. package/dist/lib/components/index.d.ts +18 -10
  79. package/dist/lib/components/index.js +2 -3
  80. package/dist/lib/components/index.js.map +1 -1
  81. package/dist/lib/components/navigation/Sidebar.js +1 -1
  82. package/dist/lib/components/navigation/Sidebar.js.map +1 -1
  83. package/dist/lib/components/navigation/utils.js +2 -2
  84. package/dist/lib/components/navigation/utils.js.map +1 -1
  85. package/dist/lib/core/{DevPortalContext.d.ts → ZudokuContext.d.ts} +3 -7
  86. package/dist/lib/core/{DevPortalContext.js → ZudokuContext.js} +2 -7
  87. package/dist/lib/core/ZudokuContext.js.map +1 -0
  88. package/dist/lib/core/plugins.d.ts +18 -12
  89. package/dist/lib/core/plugins.js.map +1 -1
  90. package/dist/lib/errors/ErrorAlert.js +1 -1
  91. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  92. package/dist/lib/oas/graphql/index.js +4 -4
  93. package/dist/lib/oas/graphql/index.js.map +1 -1
  94. package/dist/lib/oas/parser/upgrade/index.d.ts +2 -2
  95. package/dist/lib/oas/parser/upgrade/index.js +2 -17
  96. package/dist/lib/oas/parser/upgrade/index.js.map +1 -1
  97. package/dist/lib/plugins/api-keys/index.d.ts +9 -9
  98. package/dist/lib/plugins/api-keys/index.js +3 -0
  99. package/dist/lib/plugins/api-keys/index.js.map +1 -1
  100. package/dist/lib/plugins/custom-pages/index.d.ts +2 -2
  101. package/dist/lib/plugins/custom-pages/index.js.map +1 -1
  102. package/dist/lib/plugins/markdown/MdxPage.d.ts +9 -1
  103. package/dist/lib/plugins/markdown/MdxPage.js +14 -1
  104. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  105. package/dist/lib/plugins/markdown/index.d.ts +2 -2
  106. package/dist/lib/plugins/markdown/index.js +1 -1
  107. package/dist/lib/plugins/markdown/index.js.map +1 -1
  108. package/dist/lib/plugins/openapi/CollapsibleCode.d.ts +5 -0
  109. package/dist/lib/plugins/openapi/CollapsibleCode.js +24 -0
  110. package/dist/lib/plugins/openapi/CollapsibleCode.js.map +1 -0
  111. package/dist/lib/plugins/openapi/ColorizedParam.js +13 -9
  112. package/dist/lib/plugins/openapi/ColorizedParam.js.map +1 -1
  113. package/dist/lib/plugins/openapi/Endpoint.d.ts +1 -1
  114. package/dist/lib/plugins/openapi/Endpoint.js +5 -9
  115. package/dist/lib/plugins/openapi/Endpoint.js.map +1 -1
  116. package/dist/lib/plugins/openapi/OperationList.d.ts +2 -2
  117. package/dist/lib/plugins/openapi/OperationList.js +21 -22
  118. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  119. package/dist/lib/plugins/openapi/ParameterListItem.js +6 -1
  120. package/dist/lib/plugins/openapi/ParameterListItem.js.map +1 -1
  121. package/dist/lib/plugins/openapi/RequestBodySidecarBox.js +7 -3
  122. package/dist/lib/plugins/openapi/RequestBodySidecarBox.js.map +1 -1
  123. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js +9 -2
  124. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js.map +1 -1
  125. package/dist/lib/plugins/openapi/Route.d.ts +4 -4
  126. package/dist/lib/plugins/openapi/Route.js +2 -4
  127. package/dist/lib/plugins/openapi/Route.js.map +1 -1
  128. package/dist/lib/plugins/openapi/Sidecar.d.ts +1 -1
  129. package/dist/lib/plugins/openapi/Sidecar.js +35 -33
  130. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  131. package/dist/lib/plugins/openapi/client/GraphQLClient.d.ts +8 -0
  132. package/dist/lib/plugins/openapi/client/GraphQLClient.js +114 -0
  133. package/dist/lib/plugins/openapi/client/GraphQLClient.js.map +1 -0
  134. package/dist/lib/plugins/openapi/client/GraphQLContext.d.ts +7 -0
  135. package/dist/lib/plugins/openapi/client/GraphQLContext.js +5 -0
  136. package/dist/lib/plugins/openapi/client/GraphQLContext.js.map +1 -0
  137. package/dist/lib/plugins/openapi/client/createServer.d.ts +1 -0
  138. package/dist/lib/plugins/openapi/client/useCreateQuery.d.ts +5 -0
  139. package/dist/lib/plugins/openapi/client/useCreateQuery.js +15 -0
  140. package/dist/lib/plugins/openapi/client/useCreateQuery.js.map +1 -0
  141. package/dist/lib/plugins/openapi/client/worker.d.ts +4 -1
  142. package/dist/lib/plugins/openapi/client/worker.js +23 -14
  143. package/dist/lib/plugins/openapi/client/worker.js.map +1 -1
  144. package/dist/lib/plugins/openapi/graphql/fragment-masking.d.ts +3 -3
  145. package/dist/lib/plugins/openapi/graphql/fragment-masking.js +3 -4
  146. package/dist/lib/plugins/openapi/graphql/fragment-masking.js.map +1 -1
  147. package/dist/lib/plugins/openapi/graphql/gql.d.ts +5 -51
  148. package/dist/lib/plugins/openapi/graphql/gql.js +4 -2
  149. package/dist/lib/plugins/openapi/graphql/gql.js.map +1 -1
  150. package/dist/lib/plugins/openapi/graphql/graphql.d.ts +32 -8
  151. package/dist/lib/plugins/openapi/graphql/graphql.js +194 -662
  152. package/dist/lib/plugins/openapi/graphql/graphql.js.map +1 -1
  153. package/dist/lib/plugins/openapi/index.d.ts +2 -2
  154. package/dist/lib/plugins/openapi/index.js +40 -53
  155. package/dist/lib/plugins/openapi/index.js.map +1 -1
  156. package/dist/lib/plugins/openapi/interfaces.d.ts +1 -1
  157. package/dist/lib/plugins/openapi/post-processors/removeExtensions.d.ts +6 -0
  158. package/dist/lib/plugins/openapi/post-processors/removeExtensions.js +14 -0
  159. package/dist/lib/plugins/openapi/post-processors/removeExtensions.js.map +1 -0
  160. package/dist/lib/plugins/openapi/post-processors/removeExtensions.test.d.ts +1 -0
  161. package/dist/lib/plugins/openapi/post-processors/removeExtensions.test.js +125 -0
  162. package/dist/lib/plugins/openapi/post-processors/removeExtensions.test.js.map +1 -0
  163. package/dist/lib/plugins/openapi/post-processors/removePaths.d.ts +11 -0
  164. package/dist/lib/plugins/openapi/post-processors/removePaths.js +33 -0
  165. package/dist/lib/plugins/openapi/post-processors/removePaths.js.map +1 -0
  166. package/dist/lib/plugins/openapi/post-processors/removePaths.test.d.ts +1 -0
  167. package/dist/lib/plugins/openapi/post-processors/removePaths.test.js +104 -0
  168. package/dist/lib/plugins/openapi/post-processors/removePaths.test.js.map +1 -0
  169. package/dist/lib/plugins/openapi/post-processors/traverse.d.ts +1 -0
  170. package/dist/lib/plugins/openapi/post-processors/traverse.js +2 -0
  171. package/dist/lib/plugins/openapi/post-processors/traverse.js.map +1 -0
  172. package/dist/lib/plugins/openapi/schema/SchemaView.js +2 -1
  173. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  174. package/dist/lib/plugins/openapi/util/generateSchemaExample.d.ts +0 -1
  175. package/dist/lib/plugins/openapi/util/generateSchemaExample.js +25 -36
  176. package/dist/lib/plugins/openapi/util/generateSchemaExample.js.map +1 -1
  177. package/dist/lib/plugins/openapi-worker.d.ts +1 -1
  178. package/dist/lib/plugins/openapi-worker.js +7 -1
  179. package/dist/lib/plugins/openapi-worker.js.map +1 -1
  180. package/dist/lib/plugins/redirect/index.d.ts +4 -7
  181. package/dist/lib/plugins/redirect/index.js +1 -1
  182. package/dist/lib/plugins/redirect/index.js.map +1 -1
  183. package/dist/lib/plugins/search-inkeep/index.d.ts +2 -2
  184. package/dist/lib/plugins/search-inkeep/index.js.map +1 -1
  185. package/dist/lib/ui/ActionButton.d.ts +4 -0
  186. package/dist/lib/ui/ActionButton.js +10 -0
  187. package/dist/lib/ui/ActionButton.js.map +1 -0
  188. package/dist/lib/util/MdxComponents.d.ts +1 -1
  189. package/dist/lib/util/traverse.d.ts +2 -0
  190. package/dist/lib/util/traverse.js +18 -0
  191. package/dist/lib/util/traverse.js.map +1 -0
  192. package/dist/lib/util/useIsomorphicLayoutEffect.d.ts +3 -0
  193. package/dist/lib/util/useIsomorphicLayoutEffect.js +4 -0
  194. package/dist/lib/util/useIsomorphicLayoutEffect.js.map +1 -0
  195. package/dist/lib/util/useOnScreen.d.ts +4 -0
  196. package/dist/lib/util/useOnScreen.js +19 -0
  197. package/dist/lib/util/useOnScreen.js.map +1 -0
  198. package/dist/vite/build.js +5 -1
  199. package/dist/vite/build.js.map +1 -1
  200. package/dist/vite/config.d.ts +2 -8
  201. package/dist/vite/config.js +25 -54
  202. package/dist/vite/config.js.map +1 -1
  203. package/dist/vite/config.test.js +3 -4
  204. package/dist/vite/config.test.js.map +1 -1
  205. package/dist/vite/html.js +0 -2
  206. package/dist/vite/html.js.map +1 -1
  207. package/dist/vite/output.d.ts +101 -0
  208. package/dist/vite/output.js +53 -0
  209. package/dist/vite/output.js.map +1 -0
  210. package/dist/vite/plugin-api.js +23 -19
  211. package/dist/vite/plugin-api.js.map +1 -1
  212. package/dist/vite/plugin-component.js +14 -19
  213. package/dist/vite/plugin-component.js.map +1 -1
  214. package/dist/vite/plugin-config.d.ts +2 -3
  215. package/dist/vite/plugin-config.js +2 -3
  216. package/dist/vite/plugin-config.js.map +1 -1
  217. package/dist/vite/plugin-docs.test.js +15 -23
  218. package/dist/vite/plugin-docs.test.js.map +1 -1
  219. package/dist/vite/plugin-mdx.d.ts +0 -6
  220. package/dist/vite/plugin-mdx.js +13 -5
  221. package/dist/vite/plugin-mdx.js.map +1 -1
  222. package/dist/vite/plugin.js +1 -3
  223. package/dist/vite/plugin.js.map +1 -1
  224. package/dist/vite/prerender.js +3 -2
  225. package/dist/vite/prerender.js.map +1 -1
  226. package/dist/vite/remarkStaticGeneration.d.ts +3 -0
  227. package/dist/vite/remarkStaticGeneration.js +125 -0
  228. package/dist/vite/remarkStaticGeneration.js.map +1 -0
  229. package/dist/zuplo/with-zuplo.d.ts +3 -0
  230. package/dist/zuplo/with-zuplo.js +28 -0
  231. package/dist/zuplo/with-zuplo.js.map +1 -0
  232. package/lib/{AnchorLink-BbB2q-jx.js → AnchorLink-CDlhr8gL.js} +11 -10
  233. package/lib/{AnchorLink-BbB2q-jx.js.map → AnchorLink-CDlhr8gL.js.map} +1 -1
  234. package/lib/AuthenticationPlugin-D0Em0SwR.js +59 -0
  235. package/lib/{AuthenticationPlugin-C9BHGXlE.js.map → AuthenticationPlugin-D0Em0SwR.js.map} +1 -1
  236. package/lib/Button-jK0EsymC.js +48 -0
  237. package/lib/Button-jK0EsymC.js.map +1 -0
  238. package/lib/{ClientOnly-CVN6leDu.js → ClientOnly-E7hGysn1.js} +4 -4
  239. package/lib/ClientOnly-E7hGysn1.js.map +1 -0
  240. package/lib/Markdown-ievDDhFT.js +15192 -0
  241. package/lib/Markdown-ievDDhFT.js.map +1 -0
  242. package/lib/MdxPage-B2FpJ9KC.js +183 -0
  243. package/lib/MdxPage-B2FpJ9KC.js.map +1 -0
  244. package/lib/OperationList-BkNQEsNs.js +4693 -0
  245. package/lib/OperationList-BkNQEsNs.js.map +1 -0
  246. package/lib/Route-DlG_HTMu.js +11 -0
  247. package/lib/Route-DlG_HTMu.js.map +1 -0
  248. package/lib/{Select-Bagt3Bme.js → Select-O9ZM3ZgX.js} +7 -7
  249. package/lib/Select-O9ZM3ZgX.js.map +1 -0
  250. package/lib/{Spinner-C6zroowC.js → SidebarBadge-DxFJcJ6V.js} +28 -17
  251. package/lib/SidebarBadge-DxFJcJ6V.js.map +1 -0
  252. package/lib/SlotletProvider-DyomlzGx.js +252 -0
  253. package/lib/SlotletProvider-DyomlzGx.js.map +1 -0
  254. package/lib/Spinner-3cQDBVGr.js +7 -0
  255. package/lib/Spinner-3cQDBVGr.js.map +1 -0
  256. package/lib/SyntaxHighlight-DkLOsjHS.js +2983 -0
  257. package/lib/SyntaxHighlight-DkLOsjHS.js.map +1 -0
  258. package/lib/assets/{worker-Bf8vjASY.js → worker-BHClFO3A.js} +156 -156
  259. package/lib/assets/worker-BHClFO3A.js.map +1 -0
  260. package/lib/context-D1nXWxm7.js +22 -0
  261. package/lib/context-D1nXWxm7.js.map +1 -0
  262. package/lib/createServer-CpJlUPtn.js +15299 -0
  263. package/lib/createServer-CpJlUPtn.js.map +1 -0
  264. package/lib/{hook-sn0zMTkE.js → hook-hEqe7fPB.js} +12 -14
  265. package/lib/hook-hEqe7fPB.js.map +1 -0
  266. package/lib/index-C7SaIME0.js +1277 -0
  267. package/lib/index-C7SaIME0.js.map +1 -0
  268. package/lib/index-Czzd9rjU.js +899 -0
  269. package/lib/index-Czzd9rjU.js.map +1 -0
  270. package/lib/index-Yn8c3UWE.js +921 -0
  271. package/lib/index-Yn8c3UWE.js.map +1 -0
  272. package/lib/object_hash-CvlLgU-M.js +785 -0
  273. package/lib/object_hash-CvlLgU-M.js.map +1 -0
  274. package/lib/post-processors/removeExtensions.js +11 -0
  275. package/lib/post-processors/removeExtensions.js.map +1 -0
  276. package/lib/post-processors/removePaths.js +28 -0
  277. package/lib/post-processors/removePaths.js.map +1 -0
  278. package/lib/post-processors/traverse.js +12 -0
  279. package/lib/post-processors/traverse.js.map +1 -0
  280. package/lib/{router-BsfSoK2j.js → router-lfyopgBI.js} +23 -23
  281. package/lib/{router-BsfSoK2j.js.map → router-lfyopgBI.js.map} +1 -1
  282. package/lib/state-tsXBLONe.js +203 -0
  283. package/lib/{state-CsuHT8ZO.js.map → state-tsXBLONe.js.map} +1 -1
  284. package/lib/ui/ActionButton.js +25 -0
  285. package/lib/ui/ActionButton.js.map +1 -0
  286. package/lib/useExposedProps-CTPtylCV.js +10 -0
  287. package/lib/{useExposedProps-ChOIUaS4.js.map → useExposedProps-CTPtylCV.js.map} +1 -1
  288. package/lib/{ZudokuContext-BKXGJTmu.js → utils-DcpDOncX.js} +242 -246
  289. package/lib/utils-DcpDOncX.js.map +1 -0
  290. package/lib/zudoku.auth-auth0.js +24 -18
  291. package/lib/zudoku.auth-auth0.js.map +1 -1
  292. package/lib/zudoku.auth-clerk.js +2 -2
  293. package/lib/zudoku.auth-openid.js +124 -138
  294. package/lib/zudoku.auth-openid.js.map +1 -1
  295. package/lib/zudoku.components.js +1291 -1119
  296. package/lib/zudoku.components.js.map +1 -1
  297. package/lib/zudoku.openapi-worker.js +10 -16336
  298. package/lib/zudoku.openapi-worker.js.map +1 -1
  299. package/lib/zudoku.plugin-api-keys.js +41 -39
  300. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  301. package/lib/zudoku.plugin-custom-pages.js +2 -2
  302. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  303. package/lib/zudoku.plugin-markdown.js +15 -14
  304. package/lib/zudoku.plugin-markdown.js.map +1 -1
  305. package/lib/zudoku.plugin-openapi.js +5 -9
  306. package/lib/zudoku.plugin-openapi.js.map +1 -1
  307. package/lib/zudoku.plugin-redirect.js +2 -2
  308. package/lib/zudoku.plugin-redirect.js.map +1 -1
  309. package/lib/zudoku.plugin-search-inkeep.js +1 -1
  310. package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
  311. package/package.json +27 -7
  312. package/src/app/demo.tsx +0 -3
  313. package/src/app/entry.client.tsx +14 -0
  314. package/src/app/entry.server.tsx +59 -53
  315. package/src/app/main.css +1 -1
  316. package/src/app/main.tsx +4 -4
  317. package/src/app/standalone.tsx +0 -3
  318. package/src/lib/authentication/AuthenticationPlugin.tsx +4 -1
  319. package/src/lib/authentication/authentication.ts +3 -3
  320. package/src/lib/authentication/hook.ts +1 -3
  321. package/src/lib/authentication/providers/auth0.tsx +17 -11
  322. package/src/lib/authentication/providers/openid.tsx +12 -30
  323. package/src/lib/authentication/state.ts +50 -9
  324. package/{LICENSE.md → src/lib/authentication/use-broadcast/LICENSE.md} +2 -2
  325. package/src/lib/authentication/use-broadcast/shared.ts +372 -0
  326. package/src/lib/authentication/use-broadcast/useBroadcast.ts +146 -0
  327. package/src/lib/components/Bootstrap.tsx +36 -14
  328. package/src/lib/components/ClientOnly.tsx +6 -3
  329. package/src/lib/components/DeveloperHint.tsx +6 -1
  330. package/src/lib/components/Header.tsx +68 -40
  331. package/src/lib/components/Layout.tsx +49 -37
  332. package/src/lib/components/MobileTopNavigation.tsx +15 -18
  333. package/src/lib/components/SyntaxHighlight.tsx +81 -46
  334. package/src/lib/components/ThemeSwitch.tsx +26 -0
  335. package/src/lib/components/TopNavigation.tsx +27 -19
  336. package/src/lib/components/Zudoku.tsx +108 -0
  337. package/src/lib/components/context/ZudokuContext.ts +11 -16
  338. package/src/lib/components/context/ZudokuProvider.tsx +2 -2
  339. package/src/lib/components/index.ts +2 -3
  340. package/src/lib/components/navigation/Sidebar.tsx +3 -3
  341. package/src/lib/components/navigation/utils.ts +2 -2
  342. package/src/lib/core/{DevPortalContext.ts → ZudokuContext.ts} +3 -11
  343. package/src/lib/core/plugins.ts +20 -16
  344. package/src/lib/errors/ErrorAlert.tsx +2 -1
  345. package/src/lib/oas/graphql/index.ts +4 -4
  346. package/src/lib/oas/parser/upgrade/index.ts +3 -24
  347. package/src/lib/plugins/api-keys/index.tsx +12 -9
  348. package/src/lib/plugins/custom-pages/index.tsx +2 -2
  349. package/src/lib/plugins/markdown/MdxPage.tsx +25 -1
  350. package/src/lib/plugins/markdown/index.tsx +3 -2
  351. package/src/lib/plugins/openapi/CollapsibleCode.tsx +80 -0
  352. package/src/lib/plugins/openapi/ColorizedParam.tsx +23 -14
  353. package/src/lib/plugins/openapi/Endpoint.tsx +5 -10
  354. package/src/lib/plugins/openapi/OperationList.tsx +20 -40
  355. package/src/lib/plugins/openapi/ParameterListItem.tsx +37 -31
  356. package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +18 -13
  357. package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +17 -12
  358. package/src/lib/plugins/openapi/Route.tsx +11 -12
  359. package/src/lib/plugins/openapi/Sidecar.tsx +73 -59
  360. package/src/lib/plugins/openapi/client/GraphQLClient.tsx +157 -0
  361. package/src/lib/plugins/openapi/client/GraphQLContext.tsx +16 -0
  362. package/src/lib/plugins/openapi/client/createServer.ts +2 -0
  363. package/src/lib/plugins/openapi/client/useCreateQuery.ts +21 -0
  364. package/src/lib/plugins/openapi/client/worker.ts +38 -24
  365. package/src/lib/plugins/openapi/graphql/fragment-masking.ts +11 -18
  366. package/src/lib/plugins/openapi/graphql/gql.ts +10 -27
  367. package/src/lib/plugins/openapi/graphql/graphql.ts +233 -665
  368. package/src/lib/plugins/openapi/index.tsx +42 -67
  369. package/src/lib/plugins/openapi/interfaces.ts +1 -1
  370. package/src/lib/plugins/openapi/post-processors/removeExtensions.test.ts +144 -0
  371. package/src/lib/plugins/openapi/post-processors/removeExtensions.ts +24 -0
  372. package/src/lib/plugins/openapi/post-processors/removePaths.test.ts +126 -0
  373. package/src/lib/plugins/openapi/post-processors/removePaths.ts +55 -0
  374. package/src/lib/plugins/openapi/post-processors/traverse.ts +1 -0
  375. package/src/lib/plugins/openapi/schema/SchemaView.tsx +5 -2
  376. package/src/lib/plugins/openapi/util/generateSchemaExample.ts +28 -42
  377. package/src/lib/plugins/openapi-worker.ts +11 -1
  378. package/src/lib/plugins/redirect/index.tsx +5 -9
  379. package/src/lib/plugins/search-inkeep/index.tsx +2 -2
  380. package/src/lib/ui/ActionButton.tsx +28 -0
  381. package/src/lib/util/traverse.ts +25 -0
  382. package/src/lib/util/useIsomorphicLayoutEffect.ts +5 -0
  383. package/src/lib/util/useOnScreen.ts +32 -0
  384. package/dist/lib/components/DevPortal.js.map +0 -1
  385. package/dist/lib/components/context/ThemeContext.d.ts +0 -2
  386. package/dist/lib/components/context/ThemeContext.js +0 -7
  387. package/dist/lib/components/context/ThemeContext.js.map +0 -1
  388. package/dist/lib/components/context/ThemeProvider.d.ts +0 -4
  389. package/dist/lib/components/context/ThemeProvider.js +0 -23
  390. package/dist/lib/components/context/ThemeProvider.js.map +0 -1
  391. package/dist/lib/core/DevPortalContext.js.map +0 -1
  392. package/dist/lib/plugins/openapi/client/createMemoryClient.d.ts +0 -12
  393. package/dist/lib/plugins/openapi/client/createMemoryClient.js +0 -46
  394. package/dist/lib/plugins/openapi/client/createMemoryClient.js.map +0 -1
  395. package/dist/lib/plugins/openapi/client/createWorkerClient.d.ts +0 -10
  396. package/dist/lib/plugins/openapi/client/createWorkerClient.js +0 -61
  397. package/dist/lib/plugins/openapi/client/createWorkerClient.js.map +0 -1
  398. package/dist/lib/plugins/openapi/client/interfaces.d.ts +0 -4
  399. package/dist/lib/plugins/openapi/client/interfaces.js +0 -2
  400. package/dist/lib/plugins/openapi/client/interfaces.js.map +0 -1
  401. package/dist/lib/themeToggle.d.ts +0 -1
  402. package/dist/lib/themeToggle.js +0 -7
  403. package/dist/lib/themeToggle.js.map +0 -1
  404. package/dist/lib/util/createWaitForNotify.d.ts +0 -1
  405. package/dist/lib/util/createWaitForNotify.js +0 -15
  406. package/dist/lib/util/createWaitForNotify.js.map +0 -1
  407. package/dist/vite/plugin-html-transform.d.ts +0 -2
  408. package/dist/vite/plugin-html-transform.js +0 -15
  409. package/dist/vite/plugin-html-transform.js.map +0 -1
  410. package/lib/AuthenticationPlugin-C9BHGXlE.js +0 -55
  411. package/lib/ClientOnly-CVN6leDu.js.map +0 -1
  412. package/lib/DeveloperHint-DHdLXGHA.js +0 -16
  413. package/lib/DeveloperHint-DHdLXGHA.js.map +0 -1
  414. package/lib/Markdown-BDcCAWwm.js +0 -18059
  415. package/lib/Markdown-BDcCAWwm.js.map +0 -1
  416. package/lib/MdxPage-DKMH_t0f.js +0 -174
  417. package/lib/MdxPage-DKMH_t0f.js.map +0 -1
  418. package/lib/OperationList-Tj7ubW_t.js +0 -604
  419. package/lib/OperationList-Tj7ubW_t.js.map +0 -1
  420. package/lib/Route-C3DGB6OS.js +0 -13
  421. package/lib/Route-C3DGB6OS.js.map +0 -1
  422. package/lib/Select-Bagt3Bme.js.map +0 -1
  423. package/lib/SlotletProvider-Da7eFgd2.js +0 -241
  424. package/lib/SlotletProvider-Da7eFgd2.js.map +0 -1
  425. package/lib/Spinner-C6zroowC.js.map +0 -1
  426. package/lib/StaggeredRender-DDHSzQKE.js +0 -17
  427. package/lib/StaggeredRender-DDHSzQKE.js.map +0 -1
  428. package/lib/ZudokuContext-BKXGJTmu.js.map +0 -1
  429. package/lib/assets/worker-Bf8vjASY.js.map +0 -1
  430. package/lib/hook-sn0zMTkE.js.map +0 -1
  431. package/lib/index-AjWCJNGC.js +0 -5690
  432. package/lib/index-AjWCJNGC.js.map +0 -1
  433. package/lib/index-CRo94sKK.js +0 -1783
  434. package/lib/index-CRo94sKK.js.map +0 -1
  435. package/lib/state-CsuHT8ZO.js +0 -183
  436. package/lib/urql-core-KJnLL26g.js +0 -1455
  437. package/lib/urql-core-KJnLL26g.js.map +0 -1
  438. package/lib/useExposedProps-ChOIUaS4.js +0 -9
  439. package/src/lib/components/DevPortal.tsx +0 -111
  440. package/src/lib/components/context/ThemeContext.tsx +0 -8
  441. package/src/lib/components/context/ThemeProvider.tsx +0 -27
  442. package/src/lib/plugins/openapi/client/createMemoryClient.ts +0 -51
  443. package/src/lib/plugins/openapi/client/createWorkerClient.ts +0 -75
  444. package/src/lib/plugins/openapi/client/interfaces.ts +0 -5
  445. package/src/lib/themeToggle.ts +0 -7
  446. package/src/lib/util/createWaitForNotify.ts +0 -18
@@ -1,26 +1,23 @@
1
- import { matchPath, useRouteError, type RouteObject } from "react-router-dom";
2
- import { Client as UrqlClient, cacheExchange, fetchExchange } from "urql";
3
- import { type DevPortalPlugin } from "../../core/plugins.js";
1
+ import { matchPath, type RouteObject } from "react-router-dom";
2
+ import { type ZudokuPlugin } from "../../core/plugins.js";
4
3
  import { graphql } from "./graphql/index.js";
5
4
 
6
5
  import { useQuery } from "@tanstack/react-query";
7
6
  import { CirclePlayIcon, LogInIcon } from "lucide-react";
8
- import { createClient } from "zudoku/openapi-worker";
9
7
  import type { SidebarItem } from "../../../config/validators/SidebarSchema.js";
10
8
  import { useAuth } from "../../authentication/hook.js";
11
- import { ErrorPage } from "../../components/ErrorPage.js";
12
9
  import { ColorMap } from "../../components/navigation/SidebarBadge.js";
13
- import { SyntaxHighlight } from "../../components/SyntaxHighlight.js";
14
10
  import { Button } from "../../ui/Button.js";
15
11
  import { joinPath } from "../../util/joinPath.js";
12
+ import { GraphQLClient } from "./client/GraphQLClient.js";
16
13
  import { OasPluginConfig } from "./interfaces.js";
17
14
  import type { PlaygroundContentProps } from "./playground/Playground.js";
18
15
  import { PlaygroundDialog } from "./playground/PlaygroundDialog.js";
19
- import { GetServerQuery } from "./Sidecar.js";
20
16
 
21
17
  const GetCategoriesQuery = graphql(`
22
18
  query GetCategories($input: JSON!, $type: SchemaType!) {
23
19
  schema(input: $input, type: $type) {
20
+ url
24
21
  tags {
25
22
  __typename
26
23
  name
@@ -38,20 +35,6 @@ const GetCategoriesQuery = graphql(`
38
35
  }
39
36
  `);
40
37
 
41
- const OpenApiErrorPage = () => {
42
- const error = useRouteError();
43
- const message =
44
- error instanceof Error ? (
45
- <SyntaxHighlight code={error.message} />
46
- ) : (
47
- "An unknown error occurred"
48
- );
49
-
50
- return (
51
- <ErrorPage category="Error" title="An error occurred" message={message} />
52
- );
53
- };
54
-
55
38
  type InternalOasPluginConfig = { inMemory?: boolean };
56
39
 
57
40
  const MethodColorMap: Record<string, keyof typeof ColorMap> = {
@@ -66,17 +49,10 @@ const MethodColorMap: Record<string, keyof typeof ColorMap> = {
66
49
 
67
50
  export type OpenApiPluginOptions = OasPluginConfig & InternalOasPluginConfig;
68
51
 
69
- export const openApiPlugin = (
70
- config: OpenApiPluginOptions,
71
- ): DevPortalPlugin => {
52
+ export const openApiPlugin = (config: OpenApiPluginOptions): ZudokuPlugin => {
72
53
  const basePath = joinPath(config.navigationId ?? "/reference");
73
54
 
74
- const client = config.server
75
- ? new UrqlClient({
76
- url: config.server,
77
- exchanges: [cacheExchange, fetchExchange],
78
- })
79
- : createClient({ useMemoryClient: config.inMemory ?? false });
55
+ const client = new GraphQLClient(config);
80
56
 
81
57
  return {
82
58
  getHead: () => {
@@ -104,15 +80,13 @@ export const openApiPlugin = (
104
80
  ...props
105
81
  }: Partial<PlaygroundContentProps> & { requireAuth: boolean }) => {
106
82
  const auth = useAuth();
83
+ // We don't have the GraphQL context here
107
84
  const serverQuery = useQuery({
108
- queryFn: async () => {
109
- const result = await client.query(GetServerQuery, {
85
+ queryFn: () =>
86
+ client.fetch(GetCategoriesQuery, {
110
87
  type: config.type,
111
88
  input: config.input,
112
- });
113
-
114
- return result.data;
115
- },
89
+ }),
116
90
  enabled: !server,
117
91
  queryKey: ["playground-server"],
118
92
  });
@@ -150,38 +124,40 @@ export const openApiPlugin = (
150
124
  return [];
151
125
  }
152
126
 
153
- const { data } = await client.query(GetCategoriesQuery, {
154
- input: config.input,
155
- type: config.type,
156
- });
157
-
158
- if (!data) return [];
159
-
160
- const categories = data.schema.tags
161
- .filter((tag) => tag.operations.length > 0)
162
- .map<SidebarItem>((tag) => ({
163
- type: "category",
164
- label: tag.name || "Other endpoints",
165
- collapsible: true,
166
- collapsed: false,
167
- items: tag.operations.map((operation) => ({
168
- type: "link",
169
- label: operation.summary ?? operation.path,
170
- href: `#${operation.slug}`,
171
- badge: {
172
- label: operation.method,
173
- color: MethodColorMap[operation.method.toLowerCase()]!,
174
- },
175
- })),
176
- }));
127
+ try {
128
+ const data = await client.fetch(GetCategoriesQuery, {
129
+ type: config.type,
130
+ input: config.input,
131
+ });
177
132
 
178
- categories.unshift({
179
- type: "link",
180
- label: "Overview",
181
- href: "#description",
182
- });
133
+ const categories = data.schema.tags
134
+ .filter((tag) => tag.operations.length > 0)
135
+ .map<SidebarItem>((tag) => ({
136
+ type: "category",
137
+ label: tag.name || "Other endpoints",
138
+ collapsible: true,
139
+ collapsed: false,
140
+ items: tag.operations.map((operation) => ({
141
+ type: "link",
142
+ label: operation.summary ?? operation.path,
143
+ href: `#${operation.slug}`,
144
+ badge: {
145
+ label: operation.method,
146
+ color: MethodColorMap[operation.method.toLowerCase()]!,
147
+ },
148
+ })),
149
+ }));
150
+
151
+ categories.unshift({
152
+ type: "link",
153
+ label: "Overview",
154
+ href: "#description",
155
+ });
183
156
 
184
- return categories;
157
+ return categories;
158
+ } catch {
159
+ return [];
160
+ }
185
161
  },
186
162
  getRoutes: () =>
187
163
  [
@@ -192,7 +168,6 @@ export const openApiPlugin = (
192
168
  element: <OpenApiRoute client={client} config={config} />,
193
169
  };
194
170
  },
195
- errorElement: <OpenApiErrorPage />,
196
171
  children: [
197
172
  {
198
173
  path: basePath,
@@ -1,6 +1,6 @@
1
1
  type OasSource =
2
2
  | { type: "url"; input: string }
3
- | { type: "file"; input: any }
3
+ | { type: "file"; input: () => Promise<unknown> }
4
4
  | { type: "raw"; input: string };
5
5
 
6
6
  export type OasPluginConfig = {
@@ -0,0 +1,144 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { removeExtensions } from "./removeExtensions.js";
3
+
4
+ const baseDoc = {
5
+ openapi: "3.1.0",
6
+ "x-root-ext": "remove me",
7
+ info: {
8
+ title: "Test API",
9
+ version: "1.0.0",
10
+ "x-info-ext": "remove me",
11
+ },
12
+ paths: {
13
+ "/test": {
14
+ "x-path-ext": "remove me",
15
+ parameters: [
16
+ {
17
+ name: "param1",
18
+ in: "query",
19
+ schema: { type: "string" },
20
+ "x-param-ext": "remove me",
21
+ },
22
+ ],
23
+ get: {
24
+ "x-operation-ext": "remove me",
25
+ responses: {
26
+ "200": {
27
+ description: "OK",
28
+ "x-response-ext": "remove me",
29
+ },
30
+ },
31
+ parameters: [
32
+ {
33
+ name: "opParam1",
34
+ in: "header",
35
+ schema: { type: "string" },
36
+ "x-op-param-ext": "remove me",
37
+ },
38
+ ],
39
+ },
40
+ },
41
+ },
42
+ tags: [
43
+ {
44
+ name: "example",
45
+ "x-tag-ext": "remove me",
46
+ },
47
+ ],
48
+ components: {
49
+ securitySchemes: {
50
+ ApiKeyAuth: {
51
+ type: "apiKey",
52
+ name: "api_key",
53
+ in: "header",
54
+ "x-security-ext": "remove me",
55
+ },
56
+ },
57
+ },
58
+ };
59
+
60
+ describe("removeExtensions", () => {
61
+ it("removes all x- extensions by default", () => {
62
+ const processed = removeExtensions()(baseDoc);
63
+
64
+ const removedExtensions = [
65
+ "x-root-ext",
66
+ "info.x-info-ext",
67
+ "paths./test.x-path-ext",
68
+ "paths./test.parameters[0].x-param-ext",
69
+ "paths./test.get.x-operation-ext",
70
+ "paths./test.get.responses.200.x-response-ext",
71
+ "paths./test.get.parameters[0].x-op-param-ext",
72
+ "tags[0].x-tag-ext",
73
+ "components.securitySchemes.ApiKeyAuth.x-security-ext",
74
+ ];
75
+
76
+ removedExtensions.forEach((ext) => {
77
+ expect(processed).not.toHaveProperty(ext.split("."));
78
+ });
79
+
80
+ // Assert that non-x- fields remain unchanged
81
+ expect(processed.openapi).toBe("3.1.0");
82
+ expect(processed.info.title).toBe("Test API");
83
+ expect(processed).toHaveProperty(
84
+ ["paths", "/test", "get", "responses", "200", "description"],
85
+ "OK",
86
+ );
87
+ expect(processed.tags[0].name).toBe("example");
88
+ });
89
+
90
+ it("removes only specified x- extensions when names are provided", () => {
91
+ const docWithExtraExtensions = {
92
+ ...baseDoc,
93
+ info: { ...baseDoc.info, "x-other-ext": "keep me" },
94
+ };
95
+
96
+ const processed = removeExtensions({
97
+ keys: ["x-path-ext", "x-param-ext"],
98
+ })(docWithExtraExtensions);
99
+
100
+ // Assert specified extensions are removed
101
+ expect(processed.paths["/test"]["x-path-ext"]).toBeUndefined();
102
+ expect(
103
+ processed.paths["/test"].parameters[0]["x-param-ext"],
104
+ ).toBeUndefined();
105
+
106
+ // Assert other x- fields remain
107
+ expect(processed["x-root-ext"]).toBe("remove me");
108
+ expect(processed.info["x-info-ext"]).toBe("remove me");
109
+ expect(processed.info["x-other-ext"]).toBe("keep me");
110
+ });
111
+
112
+ it("handles deeply nested extensions", () => {
113
+ const deeplyNested = {
114
+ a: {
115
+ b: {
116
+ c: {
117
+ "x-deep-ext": "remove me",
118
+ d: {
119
+ e: "value",
120
+ "x-another-ext": "remove me",
121
+ },
122
+ },
123
+ },
124
+ },
125
+ };
126
+
127
+ const processed = removeExtensions()(deeplyNested);
128
+
129
+ expect(processed.a.b.c["x-deep-ext"]).toBeUndefined();
130
+ expect(processed.a.b.c.d["x-another-ext"]).toBeUndefined();
131
+ expect(processed.a.b.c.d.e).toBe("value");
132
+ });
133
+
134
+ it("does nothing if no x- extensions are present", () => {
135
+ const docWithoutExtensions = {
136
+ openapi: "3.1.0",
137
+ info: { title: "API without extensions" },
138
+ };
139
+
140
+ const processed = removeExtensions()(docWithoutExtensions);
141
+
142
+ expect(processed).toEqual(docWithoutExtensions);
143
+ });
144
+ });
@@ -0,0 +1,24 @@
1
+ import { type RecordAny, traverse } from "./traverse.js";
2
+
3
+ interface RemoveExtensionsOptions {
4
+ keys?: string[];
5
+ }
6
+
7
+ // Remove all `x-` prefixed key/value pairs, or filter by names if provided
8
+ export const removeExtensions =
9
+ ({ keys }: RemoveExtensionsOptions = {}) =>
10
+ (doc: RecordAny): RecordAny =>
11
+ traverse(doc, (spec) => {
12
+ const result: RecordAny = {};
13
+
14
+ for (const [key, value] of Object.entries(spec)) {
15
+ const isExtension = key.startsWith("x-");
16
+ const shouldRemove =
17
+ isExtension && (keys === undefined || keys.includes(key));
18
+
19
+ if (shouldRemove) continue;
20
+
21
+ result[key] = value;
22
+ }
23
+ return result;
24
+ });
@@ -0,0 +1,126 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { removePaths } from "./removePaths.js";
3
+
4
+ const baseDoc = {
5
+ openapi: "3.0.3",
6
+ paths: {
7
+ "/example": {
8
+ get: { summary: "Get example" },
9
+ post: { summary: "Post example" },
10
+ },
11
+ "/remove-me": {
12
+ delete: { summary: "Delete example" },
13
+ },
14
+ "/another": {
15
+ get: { summary: "Another example" },
16
+ },
17
+ },
18
+ };
19
+
20
+ describe("removePaths", () => {
21
+ it("removes paths specified in the paths option", () => {
22
+ const processed = removePaths({
23
+ paths: {
24
+ "/remove-me": true,
25
+ },
26
+ })(baseDoc);
27
+
28
+ expect(processed.paths["/remove-me"]).toBeUndefined();
29
+ expect(processed.paths["/example"]).toBeDefined();
30
+ expect(processed.paths["/another"]).toBeDefined();
31
+ });
32
+
33
+ it("removes specific methods in the paths option", () => {
34
+ const processed = removePaths({
35
+ paths: {
36
+ "/example": ["get"],
37
+ },
38
+ })(baseDoc);
39
+
40
+ expect(processed.paths["/example"].get).toBeUndefined();
41
+ expect(processed.paths["/example"].post).toBeDefined();
42
+ expect(processed.paths["/remove-me"]).toBeDefined();
43
+ });
44
+
45
+ it("removes paths and methods using paths and shouldRemove together", () => {
46
+ const processed = removePaths({
47
+ paths: {
48
+ "/example": ["post"],
49
+ },
50
+ shouldRemove: ({ path }) => path.startsWith("/remove"),
51
+ })(baseDoc);
52
+
53
+ expect(processed.paths["/remove-me"]).toBeUndefined();
54
+ expect(processed.paths["/example"].get).toBeDefined();
55
+ expect(processed.paths["/example"].post).toBeUndefined();
56
+ expect(processed.paths["/another"]).toBeDefined();
57
+ });
58
+
59
+ it("removes paths based on shouldRemove callback", () => {
60
+ const processed = removePaths({
61
+ shouldRemove: ({ path }) => path.startsWith("/remove"),
62
+ })(baseDoc);
63
+
64
+ expect(processed.paths["/remove-me"]).toBeUndefined();
65
+ expect(processed.paths["/example"]).toBeDefined();
66
+ expect(processed.paths["/another"]).toBeDefined();
67
+ });
68
+
69
+ it("removes methods based on shouldRemove callback", () => {
70
+ const processed = removePaths({
71
+ shouldRemove: ({ method }) => method === "post",
72
+ })(baseDoc);
73
+
74
+ expect(processed.paths["/example"].post).toBeUndefined();
75
+ expect(processed.paths["/example"].get).toBeDefined();
76
+ expect(processed.paths["/remove-me"]).toBeDefined();
77
+ });
78
+
79
+ it("removes both paths and methods based on shouldRemove callback", () => {
80
+ const processed = removePaths({
81
+ shouldRemove: ({ path, method }) =>
82
+ path.startsWith("/remove") || method === "post",
83
+ })(baseDoc);
84
+
85
+ expect(processed.paths["/remove-me"]).toBeUndefined();
86
+ expect(processed.paths["/example"].post).toBeUndefined();
87
+ expect(processed.paths["/example"].get).toBeDefined();
88
+ expect(processed.paths["/another"]).toBeDefined();
89
+ });
90
+
91
+ it("does nothing if shouldRemove always returns false", () => {
92
+ const processed = removePaths({
93
+ shouldRemove: () => false,
94
+ })(baseDoc);
95
+
96
+ expect(processed).toEqual(baseDoc);
97
+ });
98
+
99
+ it("removes everything if shouldRemove always returns true", () => {
100
+ const processed = removePaths({
101
+ shouldRemove: () => true,
102
+ })(baseDoc);
103
+
104
+ expect(processed.paths).toEqual({});
105
+ });
106
+
107
+ it("removes entire paths via shouldRemove callback", () => {
108
+ const processed = removePaths({
109
+ shouldRemove: ({ path, method }) =>
110
+ method === true && path === "/remove-me",
111
+ })(baseDoc);
112
+
113
+ expect(processed.paths["/remove-me"]).toBeUndefined();
114
+ expect(processed.paths["/example"]).toBeDefined();
115
+ expect(processed.paths["/another"]).toBeDefined();
116
+ });
117
+
118
+ it("removes specific methods while keeping paths", () => {
119
+ const processed = removePaths({
120
+ shouldRemove: ({ method }) => method === "delete",
121
+ })(baseDoc);
122
+
123
+ expect(processed.paths["/remove-me"]).toBeDefined();
124
+ expect(processed.paths["/remove-me"].delete).toBeUndefined();
125
+ });
126
+ });
@@ -0,0 +1,55 @@
1
+ import { type RecordAny, traverse } from "./traverse.js";
2
+
3
+ interface RemovePathsOptions {
4
+ // Path definitions, e.g., { '/path': true, '/path-2': ['get'] }
5
+ paths?: Record<string, true | string[]>;
6
+ shouldRemove?: (options: {
7
+ path: string;
8
+ method: true | string;
9
+ operation: RecordAny;
10
+ }) => boolean;
11
+ }
12
+
13
+ export const removePaths =
14
+ ({ paths = {}, shouldRemove }: RemovePathsOptions) =>
15
+ (doc: RecordAny): RecordAny =>
16
+ traverse(doc, (spec) => {
17
+ if (!spec.paths) return spec;
18
+
19
+ const updatedPaths: RecordAny = {};
20
+
21
+ for (const [path, methods] of Object.entries(spec.paths)) {
22
+ const operations = spec.paths[path];
23
+
24
+ // If the path is explicitly marked for removal in `paths`
25
+ if (paths[path] === true) continue;
26
+
27
+ // If the path should be removed via `shouldRemove`
28
+ if (shouldRemove?.({ path, method: true, operation: operations }))
29
+ continue;
30
+
31
+ if (typeof methods === "object" && methods !== null) {
32
+ const filteredPath = Object.fromEntries(
33
+ Object.entries(methods).filter(([method]) => {
34
+ const operations = spec.paths[path][method];
35
+ const isMethodToRemove =
36
+ Array.isArray(paths[path]) && paths[path].includes(method);
37
+
38
+ const isMethodFiltered = shouldRemove?.({
39
+ path,
40
+ method,
41
+ operation: operations,
42
+ });
43
+
44
+ return !isMethodToRemove && !isMethodFiltered;
45
+ }),
46
+ );
47
+
48
+ updatedPaths[path] = filteredPath;
49
+ } else {
50
+ updatedPaths[path] = methods;
51
+ }
52
+ }
53
+
54
+ return { ...spec, paths: updatedPaths };
55
+ });
@@ -0,0 +1 @@
1
+ export { traverse, type RecordAny } from "../../../util/traverse.js";
@@ -67,10 +67,13 @@ export const SchemaView = ({
67
67
  }
68
68
  }
69
69
 
70
- if (schema.type === "object" && !schema.properties) {
70
+ if (
71
+ schema.type === "object" &&
72
+ (!schema.properties || Object.keys(schema.properties).length === 0)
73
+ ) {
71
74
  return (
72
75
  <Card className="p-4 flex gap-2 items-center">
73
- {"name" in schema && <>{schema.name}</>}
76
+ {"name" in schema && <>{schema.name as string}</>}
74
77
  <span className="text-sm text-muted-foreground">object</span>
75
78
  {schema.description && (
76
79
  <Markdown
@@ -1,72 +1,58 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  import { type SchemaObject } from "../../../oas/graphql/index.js";
3
2
 
4
- export const isObject = (value: unknown): boolean =>
5
- typeof value === "object" && value !== null && !Array.isArray(value);
6
-
7
3
  export const generateSchemaExample = (
8
4
  schema: SchemaObject,
9
5
  name?: string,
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
7
  ): any => {
11
8
  // Directly return the example or default if they exist
12
9
  if (schema.example !== undefined) {
13
10
  return schema.example;
11
+ } else if (schema.examples) {
12
+ return Object.values(schema.examples)[0];
14
13
  } else if (schema.default !== undefined) {
15
14
  return schema.default;
16
15
  }
17
16
 
18
- // Process examples object
19
- if (schema.examples && isObject(schema.examples)) {
20
- return Object.values(schema.examples)[0];
21
- }
22
-
23
- // Recursively process objects and arrays
24
- return processComplexTypes(schema, name);
25
- };
17
+ if (schema.properties || schema.type === "object") {
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ const example: any = {};
26
20
 
27
- function processComplexTypes(schema: SchemaObject, name?: string): any {
28
- const properties = Object.entries(schema.properties ?? {}).concat(
29
- Object.entries(schema.additionalProperties ?? {}),
30
- );
31
- if (schema.type === "object" && properties.length > 0) {
32
- const obj: { [key: string]: any } = {};
33
- properties.forEach(([key, propSchema]) => {
34
- const value = generateSchemaExample(propSchema, key);
35
- if (value !== undefined) {
36
- obj[key] = value;
21
+ if (schema.properties) {
22
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
23
+ example[key] = generateSchemaExample(propSchema as SchemaObject, key);
37
24
  }
38
- });
39
- return obj;
40
- } else if (schema.type === "array" && schema.items) {
41
- const value = generateSchemaExample(schema.items, name);
42
- if (value !== undefined) {
43
- return [value];
25
+ }
26
+ return example;
27
+ }
28
+
29
+ if (schema.type === "array") {
30
+ if (Array.isArray(schema.items)) {
31
+ return schema.items.map((itemSchema) =>
32
+ generateSchemaExample(itemSchema as SchemaObject),
33
+ );
34
+ } else if (schema.items) {
35
+ return [generateSchemaExample(schema.items as SchemaObject)];
44
36
  }
45
37
  return [];
46
38
  }
47
- // Fallback for missing or undefined types
48
- return undefined; //getDefaultForType(schema.type);
49
- }
50
39
 
51
- function getDefaultForType(type?: string | string[]): any {
52
- if (Array.isArray(type)) {
53
- return getDefaultForSingleType(type[0]);
40
+ if (schema.enum) {
41
+ return schema.enum[0];
54
42
  }
55
- return getDefaultForSingleType(type);
56
- }
57
43
 
58
- function getDefaultForSingleType(type?: string): any {
59
- switch (type) {
44
+ switch (schema.type) {
60
45
  case "string":
61
- return "";
46
+ return name || "string";
62
47
  case "number":
63
48
  case "integer":
64
49
  return 0;
65
50
  case "boolean":
66
- return false;
51
+ return true;
67
52
  case "null":
68
53
  return null;
54
+ case undefined:
69
55
  default:
70
- return "undefined";
56
+ return {};
71
57
  }
72
- }
58
+ };
@@ -1 +1,11 @@
1
- export { createClient } from "./openapi/client/createWorkerClient.js";
1
+ export const initializeWorker = () => {
2
+ const worker = new SharedWorker(
3
+ new URL("./openapi/client/worker.ts", import.meta.url),
4
+ { type: "module" },
5
+ );
6
+ // eslint-disable-next-line no-console
7
+ worker.onerror = (e) => console.error(e);
8
+ worker.port.start();
9
+
10
+ return worker;
11
+ };