zudoku 0.0.0-z179c4f85 → 0.0.0-z2f55b5ae

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 (336) hide show
  1. package/dist/app/main.js +1 -1
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/config/create-plugin.d.ts +2 -0
  4. package/dist/config/create-plugin.js +55 -0
  5. package/dist/config/create-plugin.js.map +1 -0
  6. package/dist/config/loader.js +3 -1
  7. package/dist/config/loader.js.map +1 -1
  8. package/dist/config/validators/InputNavigationSchema.d.ts +103 -53
  9. package/dist/config/validators/InputNavigationSchema.js +17 -0
  10. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  11. package/dist/config/validators/NavigationSchema.d.ts +10 -2
  12. package/dist/config/validators/NavigationSchema.js +7 -0
  13. package/dist/config/validators/NavigationSchema.js.map +1 -1
  14. package/dist/config/validators/ProtectedRoutesSchema.d.ts +1 -1
  15. package/dist/config/validators/validate.d.ts +25 -6
  16. package/dist/config/validators/validate.js +8 -3
  17. package/dist/config/validators/validate.js.map +1 -1
  18. package/dist/flat-config.d.ts +40 -27
  19. package/dist/index.d.ts +2 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/lib/components/Bootstrap.js +1 -2
  23. package/dist/lib/components/Bootstrap.js.map +1 -1
  24. package/dist/lib/components/Heading.d.ts +1 -1
  25. package/dist/lib/components/MobileTopNavigation.js +2 -1
  26. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  27. package/dist/lib/components/Slot.test.js +1 -1
  28. package/dist/lib/components/Slot.test.js.map +1 -1
  29. package/dist/lib/components/TopNavigation.d.ts +7 -1
  30. package/dist/lib/components/TopNavigation.js +7 -2
  31. package/dist/lib/components/TopNavigation.js.map +1 -1
  32. package/dist/lib/components/Zudoku.d.ts +4 -1
  33. package/dist/lib/components/Zudoku.js +4 -7
  34. package/dist/lib/components/Zudoku.js.map +1 -1
  35. package/dist/lib/components/context/ZudokuContext.d.ts +9 -4
  36. package/dist/lib/components/context/ZudokuContext.js +4 -2
  37. package/dist/lib/components/context/ZudokuContext.js.map +1 -1
  38. package/dist/lib/components/context/ZudokuProvider.js +1 -1
  39. package/dist/lib/components/context/ZudokuProvider.js.map +1 -1
  40. package/dist/lib/components/context/ZudokuReactContext.d.ts +11 -0
  41. package/dist/lib/components/context/ZudokuReactContext.js +4 -0
  42. package/dist/lib/components/context/ZudokuReactContext.js.map +1 -0
  43. package/dist/lib/components/index.d.ts +18 -74
  44. package/dist/lib/components/index.js +19 -36
  45. package/dist/lib/components/index.js.map +1 -1
  46. package/dist/lib/components/navigation/Navigation.js +4 -3
  47. package/dist/lib/components/navigation/Navigation.js.map +1 -1
  48. package/dist/lib/components/navigation/NavigationCategory.js +8 -0
  49. package/dist/lib/components/navigation/NavigationCategory.js.map +1 -1
  50. package/dist/lib/components/navigation/NavigationFilterContext.d.ts +8 -0
  51. package/dist/lib/components/navigation/NavigationFilterContext.js +12 -0
  52. package/dist/lib/components/navigation/NavigationFilterContext.js.map +1 -0
  53. package/dist/lib/components/navigation/NavigationFilterInput.d.ts +3 -0
  54. package/dist/lib/components/navigation/NavigationFilterInput.js +9 -0
  55. package/dist/lib/components/navigation/NavigationFilterInput.js.map +1 -0
  56. package/dist/lib/components/navigation/NavigationItem.js +11 -1
  57. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  58. package/dist/lib/components/navigation/utils.d.ts +2 -1
  59. package/dist/lib/components/navigation/utils.js +22 -1
  60. package/dist/lib/components/navigation/utils.js.map +1 -1
  61. package/dist/lib/core/ZudokuContext.d.ts +2 -1
  62. package/dist/lib/core/ZudokuContext.js +3 -1
  63. package/dist/lib/core/ZudokuContext.js.map +1 -1
  64. package/dist/lib/core/__internal.d.ts +1 -0
  65. package/dist/lib/core/__internal.js +2 -0
  66. package/dist/lib/core/__internal.js.map +1 -1
  67. package/dist/lib/core/plugins.d.ts +15 -1
  68. package/dist/lib/core/plugins.js +1 -0
  69. package/dist/lib/core/plugins.js.map +1 -1
  70. package/dist/lib/core/transform-config.d.ts +4 -0
  71. package/dist/lib/core/transform-config.js +42 -0
  72. package/dist/lib/core/transform-config.js.map +1 -0
  73. package/dist/lib/core/transform-config.test.d.ts +1 -0
  74. package/dist/lib/core/transform-config.test.js +83 -0
  75. package/dist/lib/core/transform-config.test.js.map +1 -0
  76. package/dist/lib/errors/ErrorAlert.js +1 -2
  77. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  78. package/dist/lib/hooks/index.d.ts +7 -30
  79. package/dist/lib/hooks/index.js +7 -15
  80. package/dist/lib/hooks/index.js.map +1 -1
  81. package/dist/lib/hooks/useEvent.test.js +1 -1
  82. package/dist/lib/hooks/useEvent.test.js.map +1 -1
  83. package/dist/lib/oas/graphql/circular.d.ts +1 -1
  84. package/dist/lib/oas/graphql/circular.js +18 -35
  85. package/dist/lib/oas/graphql/circular.js.map +1 -1
  86. package/dist/lib/oas/graphql/circular.test.js +33 -2
  87. package/dist/lib/oas/graphql/circular.test.js.map +1 -1
  88. package/dist/lib/oas/parser/index.js +14 -5
  89. package/dist/lib/oas/parser/index.js.map +1 -1
  90. package/dist/lib/plugins/openapi/OasProvider.js +6 -2
  91. package/dist/lib/plugins/openapi/OasProvider.js.map +1 -1
  92. package/dist/lib/plugins/openapi/OperationList.js +4 -8
  93. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  94. package/dist/lib/plugins/openapi/interfaces.d.ts +3 -0
  95. package/dist/lib/plugins/openapi/playground/fileUtils.d.ts +1 -0
  96. package/dist/lib/plugins/openapi/playground/fileUtils.js +3 -0
  97. package/dist/lib/plugins/openapi/playground/fileUtils.js.map +1 -1
  98. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.d.ts +6 -0
  99. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.js +20 -0
  100. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.js.map +1 -0
  101. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js +7 -2
  102. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js.map +1 -1
  103. package/dist/lib/plugins/openapi/util/getRoutes.d.ts +3 -0
  104. package/dist/lib/plugins/openapi/util/getRoutes.js +2 -1
  105. package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
  106. package/dist/lib/ui/Alert.d.ts +3 -2
  107. package/dist/lib/ui/Alert.js +9 -5
  108. package/dist/lib/ui/Alert.js.map +1 -1
  109. package/dist/lib/ui/Command.d.ts +3 -3
  110. package/dist/lib/ui/InputGroup.d.ts +16 -0
  111. package/dist/lib/ui/InputGroup.js +65 -0
  112. package/dist/lib/ui/InputGroup.js.map +1 -0
  113. package/dist/lib/ui/Secret.js +2 -2
  114. package/dist/lib/ui/Secret.js.map +1 -1
  115. package/dist/lib/util/flattenAllOf.d.ts +0 -2
  116. package/dist/lib/util/flattenAllOf.js +0 -46
  117. package/dist/lib/util/flattenAllOf.js.map +1 -1
  118. package/dist/lib/util/flattenAllOf.test.js +2 -1
  119. package/dist/lib/util/flattenAllOf.test.js.map +1 -1
  120. package/dist/lib/util/flattenAllOfProcessor.d.ts +2 -0
  121. package/dist/lib/util/flattenAllOfProcessor.js +48 -0
  122. package/dist/lib/util/flattenAllOfProcessor.js.map +1 -0
  123. package/dist/lib/util/readFrontmatter.js +2 -1
  124. package/dist/lib/util/readFrontmatter.js.map +1 -1
  125. package/dist/vite/api/SchemaManager.d.ts +11 -1
  126. package/dist/vite/api/SchemaManager.js +29 -18
  127. package/dist/vite/api/SchemaManager.js.map +1 -1
  128. package/dist/vite/api/SchemaManager.test.js +45 -1
  129. package/dist/vite/api/SchemaManager.test.js.map +1 -1
  130. package/dist/vite/build.js +91 -73
  131. package/dist/vite/build.js.map +1 -1
  132. package/dist/vite/config.js +5 -2
  133. package/dist/vite/config.js.map +1 -1
  134. package/dist/vite/mdx/remark-inject-filepath.js +5 -1
  135. package/dist/vite/mdx/remark-inject-filepath.js.map +1 -1
  136. package/dist/vite/mdx/remark-link-rewrite.js +3 -2
  137. package/dist/vite/mdx/remark-link-rewrite.js.map +1 -1
  138. package/dist/vite/plugin-api.js +5 -3
  139. package/dist/vite/plugin-api.js.map +1 -1
  140. package/dist/vite/plugin-config.js +16 -4
  141. package/dist/vite/plugin-config.js.map +1 -1
  142. package/dist/vite/plugin-docs.js +9 -7
  143. package/dist/vite/plugin-docs.js.map +1 -1
  144. package/dist/vite/plugin-markdown-export.js +4 -2
  145. package/dist/vite/plugin-markdown-export.js.map +1 -1
  146. package/dist/vite/plugin-theme.js +2 -1
  147. package/dist/vite/plugin-theme.js.map +1 -1
  148. package/dist/vite/prerender/prerender.js +3 -1
  149. package/dist/vite/prerender/prerender.js.map +1 -1
  150. package/dist/vite/prerender/worker.js +3 -1
  151. package/dist/vite/prerender/worker.js.map +1 -1
  152. package/lib/{ClaudeLogo-DHxJUhN_.js → ClaudeLogo-Br8C_vTq.js} +26 -22
  153. package/lib/{ClaudeLogo-DHxJUhN_.js.map → ClaudeLogo-Br8C_vTq.js.map} +1 -1
  154. package/lib/Drawer-Ch7927PF.js.map +1 -1
  155. package/lib/{HydrationBoundary-CNF2ZV3E.js → HydrationBoundary-CJu4vUlG.js} +6 -6
  156. package/lib/{HydrationBoundary-CNF2ZV3E.js.map → HydrationBoundary-CJu4vUlG.js.map} +1 -1
  157. package/lib/{MdxPage-CD36PJ17.js → MdxPage-C0QFAsgv.js} +8 -8
  158. package/lib/{MdxPage-CD36PJ17.js.map → MdxPage-C0QFAsgv.js.map} +1 -1
  159. package/lib/Mermaid-Chx5BPHn.js +104 -0
  160. package/lib/Mermaid-Chx5BPHn.js.map +1 -0
  161. package/lib/{OAuthErrorPage-4mN5DA86.js → OAuthErrorPage-CFz_gBFx.js} +22 -19
  162. package/lib/{OAuthErrorPage-4mN5DA86.js.map → OAuthErrorPage-CFz_gBFx.js.map} +1 -1
  163. package/lib/OasProvider-BnQ1_ehf.js +48 -0
  164. package/lib/OasProvider-BnQ1_ehf.js.map +1 -0
  165. package/lib/OperationList-Bw-3OS_8.js +5907 -0
  166. package/lib/OperationList-Bw-3OS_8.js.map +1 -0
  167. package/lib/{RouteGuard--A04ESy8.js → RouteGuard-CVs3yvEs.js} +5 -5
  168. package/lib/{RouteGuard--A04ESy8.js.map → RouteGuard-CVs3yvEs.js.map} +1 -1
  169. package/lib/{SchemaList-Dw3-CJPb.js → SchemaList-IehIWcDV.js} +8 -8
  170. package/lib/{SchemaList-Dw3-CJPb.js.map → SchemaList-IehIWcDV.js.map} +1 -1
  171. package/lib/{SchemaView-DyJkiQkD.js → SchemaView-BZLyoQRI.js} +3 -3
  172. package/lib/{SchemaView-DyJkiQkD.js.map → SchemaView-BZLyoQRI.js.map} +1 -1
  173. package/lib/{Secret-BDBqq4p3.js → Secret-DUpgv4V3.js} +92 -72
  174. package/lib/Secret-DUpgv4V3.js.map +1 -0
  175. package/lib/{SignUp-DRvN-8cq.js → SignUp-Dug1jAGC.js} +31 -26
  176. package/lib/{SignUp-DRvN-8cq.js.map → SignUp-Dug1jAGC.js.map} +1 -1
  177. package/lib/{SyntaxHighlight-klTH8c6-.js → SyntaxHighlight-BMu0b_hF.js} +12 -11
  178. package/lib/SyntaxHighlight-BMu0b_hF.js.map +1 -0
  179. package/lib/{Toc-PbuF-u9x.js → Toc-BiJ2YL0O.js} +2 -2
  180. package/lib/{Toc-PbuF-u9x.js.map → Toc-BiJ2YL0O.js.map} +1 -1
  181. package/lib/{index-BDsEwofZ.js → Zudoku-iyiXgWFY.js} +2996 -2859
  182. package/lib/Zudoku-iyiXgWFY.js.map +1 -0
  183. package/lib/ZudokuContext-CYyb_PB_.js +175 -0
  184. package/lib/ZudokuContext-CYyb_PB_.js.map +1 -0
  185. package/lib/ZudokuReactContext-DGJAP1sN.js +222 -0
  186. package/lib/ZudokuReactContext-DGJAP1sN.js.map +1 -0
  187. package/lib/chunk-EPOLDU6W-C6C8jAwd.js.map +1 -1
  188. package/lib/{circular-DFquXeY2.js → circular-CfBNz-Ot.js} +1327 -1346
  189. package/lib/{circular-DFquXeY2.js.map → circular-CfBNz-Ot.js.map} +1 -1
  190. package/lib/createServer-BtZPTSEO.js +13036 -0
  191. package/lib/createServer-BtZPTSEO.js.map +1 -0
  192. package/lib/{errors-rWHkzVTd.js → errors-B77S9iOc.js} +3 -3
  193. package/lib/{errors-rWHkzVTd.js.map → errors-B77S9iOc.js.map} +1 -1
  194. package/lib/{firebase-BmGU1FuD.js → firebase-C7XKRGLf.js} +26 -25
  195. package/lib/firebase-C7XKRGLf.js.map +1 -0
  196. package/lib/{hook-BGlHBdET.js → hook-Dz_n9SoE.js} +16 -15
  197. package/lib/{hook-BGlHBdET.js.map → hook-Dz_n9SoE.js.map} +1 -1
  198. package/lib/{index-DRBOFufT.js → index-BDp2MTiq.js} +2 -2
  199. package/lib/{index-DRBOFufT.js.map → index-BDp2MTiq.js.map} +1 -1
  200. package/lib/{index-BQB9hb6n.js → index-CQ-p1wyT.js} +588 -547
  201. package/lib/index-CQ-p1wyT.js.map +1 -0
  202. package/lib/index-CrcNWbel.js.map +1 -1
  203. package/lib/index-DAWHN3cH.js +86 -0
  204. package/lib/index-DAWHN3cH.js.map +1 -0
  205. package/lib/index.esm-BYObtETB.js.map +1 -1
  206. package/lib/{index.esm-B_0dvNjB.js → index.esm-Ca5zvoff.js} +20 -20
  207. package/lib/{index.esm-B_0dvNjB.js.map → index.esm-Ca5zvoff.js.map} +1 -1
  208. package/lib/{index.esm-Cx8B1YJQ.js → index.esm-Cth49JBv.js} +2 -2
  209. package/lib/index.esm-Cth49JBv.js.map +1 -0
  210. package/lib/{invariant-BJAl77rw.js → invariant-B_t_F2s_.js} +3 -3
  211. package/lib/{invariant-BJAl77rw.js.map → invariant-B_t_F2s_.js.map} +1 -1
  212. package/lib/jsx-runtime-BzflLqGi.js.map +1 -1
  213. package/lib/{mutation-BISOc7OM.js → mutation-B7eFBLZY.js} +2 -2
  214. package/lib/{mutation-BISOc7OM.js.map → mutation-B7eFBLZY.js.map} +1 -1
  215. package/lib/ui/Alert.js +32 -20
  216. package/lib/ui/Alert.js.map +1 -1
  217. package/lib/ui/Carousel.js.map +1 -1
  218. package/lib/ui/InputGroup.js +155 -0
  219. package/lib/ui/InputGroup.js.map +1 -0
  220. package/lib/ui/Secret.js +2 -2
  221. package/lib/ui/Secret.js.map +1 -1
  222. package/lib/ui/SyntaxHighlight.js +3 -3
  223. package/lib/useExposedProps-CzTDfXfq.js +30 -0
  224. package/lib/useExposedProps-CzTDfXfq.js.map +1 -0
  225. package/lib/{useMutation-CFMGlAMW.js → useMutation-CErliDZ9.js} +5 -5
  226. package/lib/{useMutation-CFMGlAMW.js.map → useMutation-CErliDZ9.js.map} +1 -1
  227. package/lib/{useSuspenseQuery-CSB_rVek.js → useQuery-ht7aWJ3S.js} +432 -446
  228. package/lib/useQuery-ht7aWJ3S.js.map +1 -0
  229. package/lib/useSuspenseQuery-DQH4Bmc2.js +18 -0
  230. package/lib/useSuspenseQuery-DQH4Bmc2.js.map +1 -0
  231. package/lib/zudoku.__internal.js +1519 -1033
  232. package/lib/zudoku.__internal.js.map +1 -1
  233. package/lib/zudoku.auth-auth0.js +6 -5
  234. package/lib/zudoku.auth-auth0.js.map +1 -1
  235. package/lib/zudoku.auth-azureb2c.js +14 -13
  236. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  237. package/lib/zudoku.auth-clerk.js +2 -2
  238. package/lib/zudoku.auth-firebase.js +5 -5
  239. package/lib/zudoku.auth-openid.js +8 -7
  240. package/lib/zudoku.auth-openid.js.map +1 -1
  241. package/lib/zudoku.auth-supabase.js +4 -4
  242. package/lib/zudoku.components.js +31 -29
  243. package/lib/zudoku.components.js.map +1 -1
  244. package/lib/zudoku.hooks.js +24 -11
  245. package/lib/zudoku.hooks.js.map +1 -1
  246. package/lib/zudoku.mermaid.js +5 -4
  247. package/lib/zudoku.mermaid.js.map +1 -1
  248. package/lib/zudoku.plugin-api-catalog.js +41 -36
  249. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  250. package/lib/zudoku.plugin-api-keys.js +156 -153
  251. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  252. package/lib/zudoku.plugin-custom-pages.js +1 -1
  253. package/lib/zudoku.plugin-markdown.js +1 -1
  254. package/lib/zudoku.plugin-openapi.js +2 -2
  255. package/lib/zudoku.plugin-search-pagefind.js +19 -18
  256. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  257. package/lib/zudoku.plugins.js +9 -8
  258. package/lib/zudoku.plugins.js.map +1 -1
  259. package/lib/zudoku.react-query.js +26 -25
  260. package/lib/zudoku.react-query.js.map +1 -1
  261. package/lib/zudoku.router.js.map +1 -1
  262. package/package.json +23 -15
  263. package/src/app/defaultTheme.css +4 -0
  264. package/src/app/main.css +2 -0
  265. package/src/app/main.tsx +1 -1
  266. package/src/lib/components/Bootstrap.tsx +1 -4
  267. package/src/lib/components/MobileTopNavigation.tsx +13 -8
  268. package/src/lib/components/Slot.test.tsx +1 -1
  269. package/src/lib/components/TopNavigation.tsx +25 -7
  270. package/src/lib/components/Zudoku.tsx +18 -14
  271. package/src/lib/components/context/ZudokuContext.ts +3 -6
  272. package/src/lib/components/context/ZudokuProvider.tsx +1 -1
  273. package/src/lib/components/context/ZudokuReactContext.tsx +17 -0
  274. package/src/lib/components/index.ts +19 -39
  275. package/src/lib/components/navigation/Navigation.tsx +4 -3
  276. package/src/lib/components/navigation/NavigationCategory.tsx +9 -0
  277. package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -0
  278. package/src/lib/components/navigation/NavigationFilterInput.tsx +35 -0
  279. package/src/lib/components/navigation/NavigationItem.tsx +17 -1
  280. package/src/lib/components/navigation/utils.ts +32 -1
  281. package/src/lib/core/ZudokuContext.ts +7 -1
  282. package/src/lib/core/__internal.tsx +2 -0
  283. package/src/lib/core/plugins.ts +25 -1
  284. package/src/lib/core/transform-config.test.tsx +99 -0
  285. package/src/lib/core/transform-config.ts +67 -0
  286. package/src/lib/errors/ErrorAlert.tsx +1 -6
  287. package/src/lib/hooks/index.ts +7 -16
  288. package/src/lib/hooks/useEvent.test.tsx +1 -1
  289. package/src/lib/oas/graphql/circular.test.ts +37 -2
  290. package/src/lib/oas/graphql/circular.ts +25 -51
  291. package/src/lib/oas/parser/index.ts +17 -6
  292. package/src/lib/plugins/openapi/OasProvider.tsx +10 -2
  293. package/src/lib/plugins/openapi/OperationList.tsx +4 -9
  294. package/src/lib/plugins/openapi/interfaces.ts +6 -1
  295. package/src/lib/plugins/openapi/playground/fileUtils.ts +4 -0
  296. package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +50 -0
  297. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +33 -17
  298. package/src/lib/plugins/openapi/util/getRoutes.tsx +4 -1
  299. package/src/lib/ui/Alert.tsx +17 -5
  300. package/src/lib/ui/InputGroup.tsx +168 -0
  301. package/src/lib/ui/Secret.tsx +2 -2
  302. package/src/lib/util/flattenAllOf.test.ts +2 -1
  303. package/src/lib/util/flattenAllOf.ts +0 -57
  304. package/src/lib/util/flattenAllOfProcessor.ts +58 -0
  305. package/src/lib/util/readFrontmatter.ts +2 -1
  306. package/src/shiki/langs/c3.js +1 -0
  307. package/src/shiki/langs/gn.js +1 -0
  308. package/src/shiki/langs/moonbit.js +1 -0
  309. package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -0
  310. package/src/zuplo/enrich-with-zuplo.ts +254 -0
  311. package/src/zuplo/policy-types.ts +46 -0
  312. package/src/zuplo/with-zuplo-processors.ts +35 -0
  313. package/src/zuplo/with-zuplo.ts +14 -0
  314. package/lib/Mermaid-Koc3z8mU.js +0 -102
  315. package/lib/Mermaid-Koc3z8mU.js.map +0 -1
  316. package/lib/OasProvider-DSe-hk5Y.js +0 -40
  317. package/lib/OasProvider-DSe-hk5Y.js.map +0 -1
  318. package/lib/OperationList-CaknPbvq.js +0 -5823
  319. package/lib/OperationList-CaknPbvq.js.map +0 -1
  320. package/lib/Secret-BDBqq4p3.js.map +0 -1
  321. package/lib/Separator-BXt1LYnm.js +0 -27
  322. package/lib/Separator-BXt1LYnm.js.map +0 -1
  323. package/lib/SyntaxHighlight-klTH8c6-.js.map +0 -1
  324. package/lib/ZudokuContext-BZB1TWdT.js +0 -387
  325. package/lib/ZudokuContext-BZB1TWdT.js.map +0 -1
  326. package/lib/___vite-browser-external_commonjs-proxy-BttVsNON.js +0 -9
  327. package/lib/___vite-browser-external_commonjs-proxy-BttVsNON.js.map +0 -1
  328. package/lib/createServer-BXZ0CAUn.js +0 -16693
  329. package/lib/createServer-BXZ0CAUn.js.map +0 -1
  330. package/lib/firebase-BmGU1FuD.js.map +0 -1
  331. package/lib/index-BDsEwofZ.js.map +0 -1
  332. package/lib/index-BQB9hb6n.js.map +0 -1
  333. package/lib/index-DBjOT2H1.js +0 -133
  334. package/lib/index-DBjOT2H1.js.map +0 -1
  335. package/lib/index.esm-Cx8B1YJQ.js.map +0 -1
  336. package/lib/useSuspenseQuery-CSB_rVek.js.map +0 -1
@@ -20,7 +20,6 @@ import { Heading } from "../../components/Heading.js";
20
20
  import { Markdown } from "../../components/Markdown.js";
21
21
  import { PagefindSearchMeta } from "../../components/PagefindSearchMeta.js";
22
22
  import { Pagination } from "../../components/Pagination.js";
23
- import { joinUrl } from "../../util/joinUrl.js";
24
23
  import { useCreateQuery } from "./client/useCreateQuery.js";
25
24
  import { useOasConfig } from "./context.js";
26
25
  import { DownloadSchemaButton } from "./DownloadSchemaButton.js";
@@ -151,11 +150,6 @@ const OperationsForTagQuery = graphql(/* GraphQL */ `
151
150
 
152
151
  const LAZY_OPERATION_LIST_THRESHOLD = 30;
153
152
 
154
- const getFileExtension = (filename: string): string => {
155
- const lastDotIndex = filename.lastIndexOf(".");
156
- return lastDotIndex !== -1 ? filename.slice(lastDotIndex) : "";
157
- };
158
-
159
153
  export const OperationList = ({
160
154
  tag,
161
155
  untagged,
@@ -163,7 +157,7 @@ export const OperationList = ({
163
157
  tag?: string;
164
158
  untagged?: boolean;
165
159
  }) => {
166
- const { path, input, type, versions, version, options } = useOasConfig();
160
+ const { input, type, versions, version, options } = useOasConfig();
167
161
  const { tag: tagFromParams } = useParams<"tag">();
168
162
  const query = useCreateQuery(OperationsForTagQuery, {
169
163
  input,
@@ -252,11 +246,12 @@ export const OperationList = ({
252
246
  const tagTitle = schema.tag.extensions?.["x-displayName"] ?? schema.tag.name;
253
247
  const helmetTitle = [tagTitle, title].filter(Boolean).join(" - ");
254
248
 
249
+ const currentVersion = version != null ? versions[version] : undefined;
255
250
  const downloadUrl =
256
251
  typeof input === "string"
257
252
  ? type === "url"
258
253
  ? input
259
- : joinUrl(path, version, `schema${getFileExtension(input)}`)
254
+ : currentVersion?.downloadUrl
260
255
  : undefined;
261
256
 
262
257
  return (
@@ -291,7 +286,7 @@ export const OperationList = ({
291
286
  {showVersions && (
292
287
  <span className="text-xl text-muted-foreground ms-1.5">
293
288
  {" "}
294
- ({version})
289
+ ({schema.version})
295
290
  </span>
296
291
  )}
297
292
  </Heading>
@@ -7,6 +7,8 @@ type DynamicInput = () => Promise<unknown>;
7
7
 
8
8
  export type VersionedInput<T> = Array<{
9
9
  path: string;
10
+ version?: string;
11
+ downloadUrl?: string;
10
12
  label?: string;
11
13
  input: T;
12
14
  }>;
@@ -85,5 +87,8 @@ export type OasPluginConfig = BaseOasConfig & OasSource;
85
87
  export type OasPluginContext = BaseOasConfig &
86
88
  ContextOasSource & {
87
89
  version?: string;
88
- versions: Record<string, { path: string; label: string }>;
90
+ versions: Record<
91
+ string,
92
+ { path: string; label: string; downloadUrl?: string }
93
+ >;
89
94
  };
@@ -4,6 +4,10 @@ export function isBinaryContentType(contentType: string) {
4
4
  );
5
5
  }
6
6
 
7
+ export function isAudioContentType(contentType: string) {
8
+ return /^audio\//i.test(contentType);
9
+ }
10
+
7
11
  export const extractFileName = (
8
12
  headers: Array<[string, string]>,
9
13
  url: string,
@@ -0,0 +1,50 @@
1
+ import { DownloadIcon } from "lucide-react";
2
+ import { useEffect, useState } from "react";
3
+ import { Button } from "zudoku/ui/Button.js";
4
+ import { humanFileSize } from "../../../../util/humanFileSize.js";
5
+
6
+ export const AudioPlayer = ({
7
+ blob,
8
+ fileName,
9
+ size,
10
+ onDownload,
11
+ }: {
12
+ blob: Blob;
13
+ fileName: string;
14
+ size: number;
15
+ onDownload: () => void;
16
+ }) => {
17
+ const [audioUrl, setAudioUrl] = useState<string | null>(null);
18
+
19
+ useEffect(() => {
20
+ const url = URL.createObjectURL(blob);
21
+ setAudioUrl(url);
22
+
23
+ return () => {
24
+ URL.revokeObjectURL(url);
25
+ };
26
+ }, [blob]);
27
+
28
+ if (!audioUrl) {
29
+ return (
30
+ <div className="p-4 text-center">
31
+ <div className="text-sm text-muted-foreground">Loading audio...</div>
32
+ </div>
33
+ );
34
+ }
35
+
36
+ return (
37
+ <div className="p-4 text-center">
38
+ <div className="flex flex-col items-center gap-4">
39
+ {/* biome-ignore lint/a11y/useMediaCaption: API response audio cannot have predefined captions */}
40
+ <audio controls src={audioUrl} className="w-full max-w-md">
41
+ Your browser does not support the audio element.
42
+ </audio>
43
+ <Button onClick={onDownload} className="flex items-center gap-2">
44
+ <DownloadIcon className="h-4 w-4" />
45
+ Download {fileName} ({humanFileSize(size)})
46
+ </Button>
47
+ </div>
48
+ </div>
49
+ );
50
+ };
@@ -32,6 +32,8 @@ import {
32
32
  CollapsibleHeader,
33
33
  CollapsibleHeaderTrigger,
34
34
  } from "../CollapsibleHeader.js";
35
+ import { isAudioContentType } from "../fileUtils.js";
36
+ import { AudioPlayer } from "./AudioPlayer.js";
35
37
  import { convertToTypes } from "./convertToTypes.js";
36
38
 
37
39
  const mimeTypeToLanguage = (mimeType: string) => {
@@ -50,9 +52,14 @@ const mimeTypeToLanguage = (mimeType: string) => {
50
52
  )?.[1];
51
53
  };
52
54
 
55
+ const getContentType = (headers: Array<[string, string]>) => {
56
+ return (
57
+ headers.find(([key]) => key.toLowerCase() === "content-type")?.[1] || ""
58
+ );
59
+ };
60
+
53
61
  const detectLanguage = (headers: Array<[string, string]>) => {
54
- const contentType =
55
- headers.find(([key]) => key.toLowerCase() === "content-type")?.[1] || "";
62
+ const contentType = getContentType(headers);
56
63
  return mimeTypeToLanguage(contentType);
57
64
  };
58
65
 
@@ -293,23 +300,32 @@ export const ResponseTab = ({
293
300
  </div>
294
301
  <div className="flex-1">
295
302
  {isBinary ? (
296
- <div className="p-4 text-center">
297
- <div className="flex flex-col items-center gap-4">
298
- <div className="text-lg font-semibold">Binary Content</div>
299
- <div className="text-sm text-muted-foreground">
300
- This response contains binary data that cannot be displayed as
301
- text.
303
+ blob && isAudioContentType(getContentType(headers)) ? (
304
+ <AudioPlayer
305
+ blob={blob}
306
+ fileName={fileName ?? "audio"}
307
+ size={size}
308
+ onDownload={handleDownload}
309
+ />
310
+ ) : (
311
+ <div className="p-4 text-center">
312
+ <div className="flex flex-col items-center gap-4">
313
+ <div className="text-lg font-semibold">Binary Content</div>
314
+ <div className="text-sm text-muted-foreground">
315
+ This response contains binary data that cannot be displayed as
316
+ text.
317
+ </div>
318
+ <Button
319
+ onClick={handleDownload}
320
+ className="flex items-center gap-2"
321
+ disabled={!blob}
322
+ >
323
+ <DownloadIcon className="h-4 w-4" />
324
+ Download {fileName || "file"} ({humanFileSize(size)})
325
+ </Button>
302
326
  </div>
303
- <Button
304
- onClick={handleDownload}
305
- className="flex items-center gap-2"
306
- disabled={!blob}
307
- >
308
- <DownloadIcon className="h-4 w-4" />
309
- Download {fileName || "file"} ({humanFileSize(size)})
310
- </Button>
311
327
  </div>
312
- </div>
328
+ )
313
329
  ) : (
314
330
  <SyntaxHighlight
315
331
  className="text-xs flex-1"
@@ -150,7 +150,7 @@ const createVersionRoutes = (
150
150
 
151
151
  export const getVersionMetadata = (config: OasPluginConfig) => {
152
152
  if (config.type === "raw" || !Array.isArray(config.input)) {
153
- return { versions: [], labels: {} };
153
+ return { versions: [], labels: {}, downloadUrls: {} };
154
154
  }
155
155
 
156
156
  return {
@@ -158,6 +158,9 @@ export const getVersionMetadata = (config: OasPluginConfig) => {
158
158
  labels: Object.fromEntries(
159
159
  config.input.map((v) => [v.path, v.label ?? v.path]),
160
160
  ),
161
+ downloadUrls: Object.fromEntries(
162
+ config.input.map((v) => [v.path, v.downloadUrl]),
163
+ ),
161
164
  };
162
165
  };
163
166
 
@@ -3,13 +3,15 @@ import type * as React from "react";
3
3
  import { cn } from "../util/cn.js";
4
4
 
5
5
  const alertVariants = cva(
6
- "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
6
+ "grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 w-full relative group/alert",
7
7
  {
8
8
  variants: {
9
9
  variant: {
10
10
  default: "bg-card text-card-foreground",
11
11
  destructive:
12
- "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
12
+ "text-destructive bg-card bg-destructive/5 border-destructive/20 *:data-[slot=alert-description]:text-destructive-foreground *:[svg]:text-current",
13
+ warning:
14
+ "text-warning-foreground bg-card bg-warning/10 border-warning/50 *:data-[slot=alert-description]:text-warning-foreground *:[svg]:text-current",
13
15
  },
14
16
  },
15
17
  defaultVariants: {
@@ -38,7 +40,7 @@ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
38
40
  <div
39
41
  data-slot="alert-title"
40
42
  className={cn(
41
- "col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",
43
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
42
44
  className,
43
45
  )}
44
46
  {...props}
@@ -54,7 +56,7 @@ function AlertDescription({
54
56
  <div
55
57
  data-slot="alert-description"
56
58
  className={cn(
57
- "text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",
59
+ "text-muted-foreground text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
58
60
  className,
59
61
  )}
60
62
  {...props}
@@ -62,4 +64,14 @@ function AlertDescription({
62
64
  );
63
65
  }
64
66
 
65
- export { Alert, AlertDescription, AlertTitle };
67
+ function AlertAction({ className, ...props }: React.ComponentProps<"div">) {
68
+ return (
69
+ <div
70
+ data-slot="alert-action"
71
+ className={cn("absolute top-2 right-2", className)}
72
+ {...props}
73
+ />
74
+ );
75
+ }
76
+
77
+ export { Alert, AlertTitle, AlertDescription, AlertAction };
@@ -0,0 +1,168 @@
1
+ import { cva, type VariantProps } from "class-variance-authority";
2
+ import type * as React from "react";
3
+ import { cn } from "../util/cn.js";
4
+ import { Button } from "./Button.js";
5
+ import { Input } from "./Input.js";
6
+ import { Textarea } from "./Textarea.js";
7
+
8
+ function InputGroup({ className, ...props }: React.ComponentProps<"div">) {
9
+ return (
10
+ <div
11
+ data-slot="input-group"
12
+ role="group"
13
+ className={cn(
14
+ "group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none",
15
+ "h-9 min-w-0 has-[>textarea]:h-auto",
16
+
17
+ // Variants based on alignment.
18
+ "has-[>[data-align=inline-start]]:[&>input]:pl-2",
19
+ "has-[>[data-align=inline-end]]:[&>input]:pr-2",
20
+ "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3",
21
+ "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3",
22
+
23
+ // Focus state.
24
+ "has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]",
25
+
26
+ // Error state.
27
+ "has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40",
28
+
29
+ className,
30
+ )}
31
+ {...props}
32
+ />
33
+ );
34
+ }
35
+
36
+ const inputGroupAddonVariants = cva(
37
+ "text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50",
38
+ {
39
+ variants: {
40
+ align: {
41
+ "inline-start":
42
+ "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
43
+ "inline-end":
44
+ "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
45
+ "block-start":
46
+ "order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5",
47
+ "block-end":
48
+ "order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5",
49
+ },
50
+ },
51
+ defaultVariants: {
52
+ align: "inline-start",
53
+ },
54
+ },
55
+ );
56
+
57
+ function InputGroupAddon({
58
+ className,
59
+ align = "inline-start",
60
+ ...props
61
+ }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>) {
62
+ return (
63
+ // biome-ignore lint/a11y/useKeyWithClickEvents: Focus management
64
+ <div
65
+ role="group"
66
+ data-slot="input-group-addon"
67
+ data-align={align}
68
+ className={cn(inputGroupAddonVariants({ align }), className)}
69
+ onClick={(e) => {
70
+ if ((e.target as HTMLElement).closest("button")) {
71
+ return;
72
+ }
73
+ e.currentTarget.parentElement?.querySelector("input")?.focus();
74
+ }}
75
+ {...props}
76
+ />
77
+ );
78
+ }
79
+
80
+ const inputGroupButtonVariants = cva(
81
+ "text-sm shadow-none flex gap-2 items-center",
82
+ {
83
+ variants: {
84
+ size: {
85
+ xs: "h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2",
86
+ sm: "h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5",
87
+ "icon-xs":
88
+ "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
89
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0",
90
+ },
91
+ },
92
+ defaultVariants: {
93
+ size: "xs",
94
+ },
95
+ },
96
+ );
97
+
98
+ function InputGroupButton({
99
+ className,
100
+ type = "button",
101
+ variant = "ghost",
102
+ size = "xs",
103
+ ...props
104
+ }: Omit<React.ComponentProps<typeof Button>, "size"> &
105
+ VariantProps<typeof inputGroupButtonVariants>) {
106
+ return (
107
+ <Button
108
+ type={type}
109
+ data-size={size}
110
+ variant={variant}
111
+ className={cn(inputGroupButtonVariants({ size }), className)}
112
+ {...props}
113
+ />
114
+ );
115
+ }
116
+
117
+ function InputGroupText({ className, ...props }: React.ComponentProps<"span">) {
118
+ return (
119
+ <span
120
+ className={cn(
121
+ "text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
122
+ className,
123
+ )}
124
+ {...props}
125
+ />
126
+ );
127
+ }
128
+
129
+ function InputGroupInput({
130
+ className,
131
+ ...props
132
+ }: React.ComponentProps<"input">) {
133
+ return (
134
+ <Input
135
+ data-slot="input-group-control"
136
+ className={cn(
137
+ "flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent",
138
+ className,
139
+ )}
140
+ {...props}
141
+ />
142
+ );
143
+ }
144
+
145
+ function InputGroupTextarea({
146
+ className,
147
+ ...props
148
+ }: React.ComponentProps<"textarea">) {
149
+ return (
150
+ <Textarea
151
+ data-slot="input-group-control"
152
+ className={cn(
153
+ "flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent",
154
+ className,
155
+ )}
156
+ {...props}
157
+ />
158
+ );
159
+ }
160
+
161
+ export {
162
+ InputGroup,
163
+ InputGroupAddon,
164
+ InputGroupButton,
165
+ InputGroupText,
166
+ InputGroupInput,
167
+ InputGroupTextarea,
168
+ };
@@ -103,7 +103,7 @@ export const Secret = ({
103
103
  setRevealed((prev) => !prev);
104
104
  onReveal?.(!revealed);
105
105
  }}
106
- size="icon"
106
+ size="icon-sm"
107
107
  >
108
108
  {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}
109
109
  </Button>
@@ -114,7 +114,7 @@ export const Secret = ({
114
114
  copyToClipboard(secret);
115
115
  onCopy?.(secret);
116
116
  }}
117
- size="icon"
117
+ size="icon-sm"
118
118
  >
119
119
  {isCopied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}
120
120
  </Button>
@@ -1,7 +1,8 @@
1
1
  import type { JSONSchema7 } from "json-schema";
2
2
  import { describe, expect, it, vi } from "vitest";
3
3
  import type { OpenAPIDocument } from "../oas/parser/index.js";
4
- import { flattenAllOf, flattenAllOfProcessor } from "./flattenAllOf.js";
4
+ import { flattenAllOf } from "./flattenAllOf.js";
5
+ import { flattenAllOfProcessor } from "./flattenAllOfProcessor.js";
5
6
  import invariant from "./invariant.js";
6
7
 
7
8
  describe("flattenAllOf", () => {
@@ -1,4 +1,3 @@
1
- import { $RefParser } from "@apidevtools/json-schema-ref-parser";
2
1
  import {
3
2
  createComparator,
4
3
  createMerger,
@@ -9,62 +8,6 @@ import {
9
8
  createIntersector,
10
9
  } from "@x0k/json-schema-merge/lib/array";
11
10
  import type { JSONSchema7Definition } from "json-schema";
12
- import type { Processor } from "../../config/validators/BuildSchema.js";
13
- import type { OpenAPIDocument } from "../oas/parser/index.js";
14
- import { type RecordAny, traverse } from "./traverse.js";
15
-
16
- export const flattenAllOfProcessor: Processor = async ({ schema, file }) => {
17
- try {
18
- // Resolve refs once - creates a lookup table without modifying the schema
19
- const parser = new $RefParser();
20
- await parser.resolve(schema);
21
- const $refs = parser.$refs;
22
-
23
- const flattened = traverse(schema, (spec) => {
24
- if (!spec || typeof spec !== "object" || Array.isArray(spec)) {
25
- return spec;
26
- }
27
-
28
- const isSchemaObject =
29
- "type" in spec ||
30
- "properties" in spec ||
31
- "allOf" in spec ||
32
- "anyOf" in spec ||
33
- "oneOf" in spec;
34
-
35
- if (!isSchemaObject) return spec;
36
-
37
- if ("allOf" in spec && Array.isArray(spec.allOf)) {
38
- const resolvedAllOf = spec.allOf.map((item) => {
39
- if (
40
- item &&
41
- typeof item === "object" &&
42
- "$ref" in item &&
43
- typeof item.$ref === "string"
44
- ) {
45
- try {
46
- return $refs.get(item.$ref) ?? item;
47
- } catch {
48
- return item;
49
- }
50
- }
51
- return item;
52
- });
53
- return flattenAllOf({ ...spec, allOf: resolvedAllOf }) as RecordAny;
54
- }
55
-
56
- return flattenAllOf(spec) as RecordAny;
57
- }) as OpenAPIDocument;
58
-
59
- return flattened;
60
- } catch (error) {
61
- // biome-ignore lint/suspicious/noConsole: Logging allowed here
62
- console.warn(
63
- `Failed to flatten \`allOf\` in ${file}: ${error instanceof Error ? error.message : error}`,
64
- );
65
- return schema;
66
- }
67
- };
68
11
 
69
12
  const { compareSchemaDefinitions, compareSchemaValues } = createComparator();
70
13
  const { mergeArrayOfSchemaDefinitions } = createMerger({
@@ -0,0 +1,58 @@
1
+ import { $RefParser } from "@apidevtools/json-schema-ref-parser";
2
+ import type { Processor } from "../../config/validators/BuildSchema.js";
3
+ import type { OpenAPIDocument } from "../oas/parser/index.js";
4
+ import { flattenAllOf } from "./flattenAllOf.js";
5
+ import { type RecordAny, traverse } from "./traverse.js";
6
+
7
+ export const flattenAllOfProcessor: Processor = async ({ schema, file }) => {
8
+ try {
9
+ // Resolve refs once - creates a lookup table without modifying the schema
10
+ const parser = new $RefParser();
11
+ await parser.resolve(schema);
12
+ const $refs = parser.$refs;
13
+
14
+ const flattened = traverse(schema, (spec) => {
15
+ if (!spec || typeof spec !== "object" || Array.isArray(spec)) {
16
+ return spec;
17
+ }
18
+
19
+ const isSchemaObject =
20
+ "type" in spec ||
21
+ "properties" in spec ||
22
+ "allOf" in spec ||
23
+ "anyOf" in spec ||
24
+ "oneOf" in spec;
25
+
26
+ if (!isSchemaObject) return spec;
27
+
28
+ if ("allOf" in spec && Array.isArray(spec.allOf)) {
29
+ const resolvedAllOf = spec.allOf.map((item) => {
30
+ if (
31
+ item &&
32
+ typeof item === "object" &&
33
+ "$ref" in item &&
34
+ typeof item.$ref === "string"
35
+ ) {
36
+ try {
37
+ return $refs.get(item.$ref) ?? item;
38
+ } catch {
39
+ return item;
40
+ }
41
+ }
42
+ return item;
43
+ });
44
+ return flattenAllOf({ ...spec, allOf: resolvedAllOf }) as RecordAny;
45
+ }
46
+
47
+ return flattenAllOf(spec) as RecordAny;
48
+ }) as OpenAPIDocument;
49
+
50
+ return flattened;
51
+ } catch (error) {
52
+ // biome-ignore lint/suspicious/noConsole: Logging allowed here
53
+ console.warn(
54
+ `Failed to flatten \`allOf\` in ${file}: ${error instanceof Error ? error.message : error}`,
55
+ );
56
+ return schema;
57
+ }
58
+ };
@@ -9,5 +9,6 @@ export const yaml = {
9
9
 
10
10
  export const readFrontmatter = async (filePath: string) => {
11
11
  const content = await readFile(filePath, "utf-8");
12
- return matter(content, { engines: { yaml } });
12
+ const normalizedContent = content.replace(/\r\n/g, "\n");
13
+ return matter(normalizedContent, { engines: { yaml } });
13
14
  };
@@ -0,0 +1 @@
1
+ export { default } from "@shikijs/langs/c3";
@@ -0,0 +1 @@
1
+ export { default } from "@shikijs/langs/gn";
@@ -0,0 +1 @@
1
+ export { default } from "@shikijs/langs/moonbit";