zudoku 0.39.5 → 0.40.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/app/entry.client.js +2 -0
  2. package/dist/app/entry.client.js.map +1 -1
  3. package/dist/config/config.d.ts +3 -1
  4. package/dist/config/loader.d.ts +1 -0
  5. package/dist/config/loader.js +1 -1
  6. package/dist/config/loader.js.map +1 -1
  7. package/dist/config/validators/BuildSchema.d.ts +60 -0
  8. package/dist/config/validators/BuildSchema.js +31 -0
  9. package/dist/config/validators/BuildSchema.js.map +1 -0
  10. package/dist/config/validators/common.d.ts +7 -51
  11. package/dist/config/validators/common.js +1 -7
  12. package/dist/config/validators/common.js.map +1 -1
  13. package/dist/config/validators/icon-types.d.ts +1 -1
  14. package/dist/config/validators/validate.d.ts +2 -18
  15. package/dist/index.d.ts +1 -1
  16. package/dist/lib/authentication/providers/clerk.js +2 -2
  17. package/dist/lib/authentication/providers/clerk.js.map +1 -1
  18. package/dist/lib/components/Footer.js +2 -2
  19. package/dist/lib/components/Footer.js.map +1 -1
  20. package/dist/lib/components/Layout.js +2 -1
  21. package/dist/lib/components/Layout.js.map +1 -1
  22. package/dist/lib/components/Search.js +7 -1
  23. package/dist/lib/components/Search.js.map +1 -1
  24. package/dist/lib/components/navigation/Sidebar.js +3 -1
  25. package/dist/lib/components/navigation/Sidebar.js.map +1 -1
  26. package/dist/lib/components/navigation/SidebarWrapper.js +1 -1
  27. package/dist/lib/components/navigation/SidebarWrapper.js.map +1 -1
  28. package/dist/lib/plugins/openapi/processors/removeExtensions.d.ts +8 -0
  29. package/dist/lib/plugins/openapi/{post-processors → processors}/removeExtensions.js +1 -1
  30. package/dist/lib/plugins/openapi/processors/removeExtensions.js.map +1 -0
  31. package/dist/lib/plugins/openapi/{post-processors → processors}/removeExtensions.test.js +26 -6
  32. package/dist/lib/plugins/openapi/processors/removeExtensions.test.js.map +1 -0
  33. package/dist/lib/plugins/openapi/{post-processors → processors}/removeParameters.d.ts +3 -1
  34. package/dist/lib/plugins/openapi/{post-processors → processors}/removeParameters.js +1 -1
  35. package/dist/lib/plugins/openapi/processors/removeParameters.js.map +1 -0
  36. package/dist/lib/plugins/openapi/{post-processors → processors}/removeParameters.test.js +53 -25
  37. package/dist/lib/plugins/openapi/processors/removeParameters.test.js.map +1 -0
  38. package/dist/lib/plugins/openapi/{post-processors → processors}/removePaths.d.ts +3 -1
  39. package/dist/lib/plugins/openapi/{post-processors → processors}/removePaths.js +1 -1
  40. package/dist/lib/plugins/openapi/processors/removePaths.js.map +1 -0
  41. package/dist/lib/plugins/openapi/processors/removePaths.test.js +144 -0
  42. package/dist/lib/plugins/openapi/processors/removePaths.test.js.map +1 -0
  43. package/dist/lib/plugins/openapi/processors/traverse.js.map +1 -0
  44. package/dist/lib/ui/Callout.js +1 -1
  45. package/dist/lib/ui/Callout.js.map +1 -1
  46. package/dist/lib/ui/Form.d.ts +1 -1
  47. package/dist/lib/util/MdxComponents.d.ts +1 -0
  48. package/dist/lib/util/MdxComponents.js +2 -0
  49. package/dist/lib/util/MdxComponents.js.map +1 -1
  50. package/dist/lib/util/detectOS.d.ts +1 -0
  51. package/dist/lib/util/detectOS.js +11 -0
  52. package/dist/lib/util/detectOS.js.map +1 -0
  53. package/dist/vite/plugin-api.js +33 -18
  54. package/dist/vite/plugin-api.js.map +1 -1
  55. package/dist/vite/plugin-sidebar.js +1 -1
  56. package/dist/vite/plugin-sidebar.js.map +1 -1
  57. package/dist/zuplo/enrich-with-zuplo.d.ts +3 -3
  58. package/dist/zuplo/enrich-with-zuplo.js +18 -17
  59. package/dist/zuplo/enrich-with-zuplo.js.map +1 -1
  60. package/dist/zuplo/with-zuplo-processors.d.ts +2 -2
  61. package/dist/zuplo/with-zuplo-processors.js +6 -6
  62. package/dist/zuplo/with-zuplo-processors.js.map +1 -1
  63. package/dist/zuplo/with-zuplo.d.ts +1 -1
  64. package/lib/{AuthenticationPlugin-foqdvvkf.js → AuthenticationPlugin-CJOFRBk3.js} +4 -4
  65. package/lib/{AuthenticationPlugin-foqdvvkf.js.map → AuthenticationPlugin-CJOFRBk3.js.map} +1 -1
  66. package/lib/{Button-Fp19CMUr.js → Button-BBNrKpQd.js} +2 -2
  67. package/lib/{Button-Fp19CMUr.js.map → Button-BBNrKpQd.js.map} +1 -1
  68. package/lib/{Callout-B2vsR09t.js → Callout-D3Ja4OPX.js} +14 -13
  69. package/lib/{Callout-B2vsR09t.js.map → Callout-D3Ja4OPX.js.map} +1 -1
  70. package/lib/{CategoryHeading-DpB47wvk.js → CategoryHeading-D06WK_Wo.js} +2 -2
  71. package/lib/{CategoryHeading-DpB47wvk.js.map → CategoryHeading-D06WK_Wo.js.map} +1 -1
  72. package/lib/{Dialog-sbgekbjb.js → Dialog-ByYz4ABw.js} +2 -2
  73. package/lib/{Dialog-sbgekbjb.js.map → Dialog-ByYz4ABw.js.map} +1 -1
  74. package/lib/{Drawer-kDAfOq_2.js → Drawer-CEwbkLDb.js} +2 -2
  75. package/lib/Drawer-CEwbkLDb.js.map +1 -0
  76. package/lib/{Markdown-aF5FdsNi.js → Markdown-C5h6bxbE.js} +4239 -4073
  77. package/lib/Markdown-C5h6bxbE.js.map +1 -0
  78. package/lib/{MdxPage-Vw_dc9Yz.js → MdxPage-B66ht0D_.js} +9 -9
  79. package/lib/{MdxPage-Vw_dc9Yz.js.map → MdxPage-B66ht0D_.js.map} +1 -1
  80. package/lib/{OasProvider-C5paEivQ.js → OasProvider-BKPF0Pbt.js} +6 -6
  81. package/lib/{OasProvider-C5paEivQ.js.map → OasProvider-BKPF0Pbt.js.map} +1 -1
  82. package/lib/{OperationList-Ds9Izgkn.js → OperationList-0bhBU7ME.js} +16 -16
  83. package/lib/{OperationList-Ds9Izgkn.js.map → OperationList-0bhBU7ME.js.map} +1 -1
  84. package/lib/{Pagination-SdlocK96.js → Pagination-Bt1czAiJ.js} +4 -4
  85. package/lib/{Pagination-SdlocK96.js.map → Pagination-Bt1czAiJ.js.map} +1 -1
  86. package/lib/{RouteGuard-CqZPoZYJ.js → RouteGuard-BZ_VsiXc.js} +6 -6
  87. package/lib/{RouteGuard-CqZPoZYJ.js.map → RouteGuard-BZ_VsiXc.js.map} +1 -1
  88. package/lib/{SchemaList-NZbDXAV5.js → SchemaList-CsTIT1pi.js} +10 -10
  89. package/lib/{SchemaList-NZbDXAV5.js.map → SchemaList-CsTIT1pi.js.map} +1 -1
  90. package/lib/{SchemaView-B3fOPR4V.js → SchemaView-DCSWtnYr.js} +5 -5
  91. package/lib/{SchemaView-B3fOPR4V.js.map → SchemaView-DCSWtnYr.js.map} +1 -1
  92. package/lib/{Select-DVFRKf1R.js → Select-Dg5R11Dx.js} +4 -4
  93. package/lib/{Select-DVFRKf1R.js.map → Select-Dg5R11Dx.js.map} +1 -1
  94. package/lib/{SlotletProvider-DXvc0aY6.js → SlotletProvider-VUmTNmLZ.js} +41 -39
  95. package/lib/SlotletProvider-VUmTNmLZ.js.map +1 -0
  96. package/lib/{Spinner-CE68iCm0.js → Spinner-mNLZ6awP.js} +2 -2
  97. package/lib/{Spinner-CE68iCm0.js.map → Spinner-mNLZ6awP.js.map} +1 -1
  98. package/lib/{SyntaxHighlight-BEoSoPEo.js → SyntaxHighlight-CxhyyMkF.js} +6 -6
  99. package/lib/{SyntaxHighlight-BEoSoPEo.js.map → SyntaxHighlight-CxhyyMkF.js.map} +1 -1
  100. package/lib/{Toc-YBsgI72s.js → Toc-BK39DQvI.js} +3 -3
  101. package/lib/{Toc-YBsgI72s.js.map → Toc-BK39DQvI.js.map} +1 -1
  102. package/lib/{_commonjsHelpers-BkfeUUK-.js → _commonjsHelpers-B4e78b8K.js} +2 -2
  103. package/lib/_commonjsHelpers-B4e78b8K.js.map +1 -0
  104. package/lib/{chunk-HA7DTUK3-C4gP41vD.js → chunk-KNED5TY2-BUPjb3LQ.js} +314 -313
  105. package/lib/chunk-KNED5TY2-BUPjb3LQ.js.map +1 -0
  106. package/lib/{context-DLCwaMXN.js → context-Lrf2Y9bR.js} +2 -2
  107. package/lib/{context-DLCwaMXN.js.map → context-Lrf2Y9bR.js.map} +1 -1
  108. package/lib/{createServer-mYvGvmc0.js → createServer-DLN7APz_.js} +5381 -5517
  109. package/lib/createServer-DLN7APz_.js.map +1 -0
  110. package/lib/{hook-CqpVYDqN.js → hook-pPrHCB6G.js} +460 -465
  111. package/lib/hook-pPrHCB6G.js.map +1 -0
  112. package/lib/{index-PGJOZ6R-.js → index-Ba_X7EnR.js} +16 -16
  113. package/lib/{index-PGJOZ6R-.js.map → index-Ba_X7EnR.js.map} +1 -1
  114. package/lib/index-CuBIgTKC.js +316 -0
  115. package/lib/index-CuBIgTKC.js.map +1 -0
  116. package/lib/{index-Dl3Yl0yb.js → index-DcHeSvkE.js} +51 -38
  117. package/lib/index-DcHeSvkE.js.map +1 -0
  118. package/lib/index-DwT-v3zK.js.map +1 -1
  119. package/lib/{index-D48iOQvJ.js → index-tpbiZmWp.js} +586 -543
  120. package/lib/index-tpbiZmWp.js.map +1 -0
  121. package/lib/index.esm-D2ZUREQN.js +1216 -0
  122. package/lib/index.esm-D2ZUREQN.js.map +1 -0
  123. package/lib/jsx-runtime-C5mzlN2N.js +285 -0
  124. package/lib/jsx-runtime-C5mzlN2N.js.map +1 -0
  125. package/lib/{mutation-8LjrN7uz.js → mutation-Csa9eQDM.js} +70 -67
  126. package/lib/mutation-Csa9eQDM.js.map +1 -0
  127. package/lib/{prism-csharp.min-bQAo2pmx.js → prism-csharp.min-C43x1RY2.js} +2 -2
  128. package/lib/{prism-csharp.min-bQAo2pmx.js.map → prism-csharp.min-C43x1RY2.js.map} +1 -1
  129. package/lib/{prism-java.min-BpvsOuIa.js → prism-java.min-CQzr40NQ.js} +2 -2
  130. package/lib/{prism-java.min-BpvsOuIa.js.map → prism-java.min-CQzr40NQ.js.map} +1 -1
  131. package/lib/{prism-ruby.min-Dx9KO9ds.js → prism-ruby.min-L9OdQ6tU.js} +2 -2
  132. package/lib/{prism-ruby.min-Dx9KO9ds.js.map → prism-ruby.min-L9OdQ6tU.js.map} +1 -1
  133. package/lib/{prism-typescript.min-CD7H2IYQ.js → prism-typescript.min-qTySPvCh.js} +2 -2
  134. package/lib/{prism-typescript.min-CD7H2IYQ.js.map → prism-typescript.min-qTySPvCh.js.map} +1 -1
  135. package/lib/{post-processors → processors}/removeExtensions.js +1 -1
  136. package/lib/processors/removeExtensions.js.map +1 -0
  137. package/lib/{post-processors → processors}/removeParameters.js +1 -1
  138. package/lib/processors/removeParameters.js.map +1 -0
  139. package/lib/{post-processors → processors}/removePaths.js +1 -1
  140. package/lib/processors/removePaths.js.map +1 -0
  141. package/lib/ui/Accordion.js +1 -1
  142. package/lib/ui/ActionButton.js +3 -3
  143. package/lib/ui/Alert.js +1 -1
  144. package/lib/ui/AlertDialog.js +1 -1
  145. package/lib/ui/Badge.js +1 -1
  146. package/lib/ui/Breadcrumb.js +1 -1
  147. package/lib/ui/Button.js +1 -1
  148. package/lib/ui/Callout.js +10 -9
  149. package/lib/ui/Callout.js.map +1 -1
  150. package/lib/ui/Card.js +1 -1
  151. package/lib/ui/Carousel.js +207 -207
  152. package/lib/ui/Carousel.js.map +1 -1
  153. package/lib/ui/Checkbox.js +1 -1
  154. package/lib/ui/Command.js +3 -3
  155. package/lib/ui/Dialog.js +1 -1
  156. package/lib/ui/Drawer.js +2 -2
  157. package/lib/ui/DropdownMenu.js +1 -1
  158. package/lib/ui/Form.js +2 -2
  159. package/lib/ui/HoverCard.js +1 -1
  160. package/lib/ui/Input.js +1 -1
  161. package/lib/ui/Label.js +1 -1
  162. package/lib/ui/Pagination.js +1 -1
  163. package/lib/ui/Popover.js +1 -1
  164. package/lib/ui/Progress.js +1 -1
  165. package/lib/ui/RadioGroup.js +1 -1
  166. package/lib/ui/ScrollArea.js +1 -1
  167. package/lib/ui/Select.js +1 -1
  168. package/lib/ui/Skeleton.js +1 -1
  169. package/lib/ui/Slider.js +1 -1
  170. package/lib/ui/Stepper.js +1 -1
  171. package/lib/ui/Switch.js +1 -1
  172. package/lib/ui/SyntaxHighlight.js +2 -2
  173. package/lib/ui/Tabs.js +1 -1
  174. package/lib/ui/Textarea.js +1 -1
  175. package/lib/ui/Toggle.js +1 -1
  176. package/lib/ui/ToggleGroup.js +1 -1
  177. package/lib/ui/Tooltip.js +1 -1
  178. package/lib/{useExposedProps-B9qXJedG.js → useExposedProps-Dq2yUQIG.js} +2 -2
  179. package/lib/{useExposedProps-B9qXJedG.js.map → useExposedProps-Dq2yUQIG.js.map} +1 -1
  180. package/lib/zudoku.auth-auth0.js +1 -1
  181. package/lib/zudoku.auth-clerk.js +4 -4
  182. package/lib/zudoku.auth-clerk.js.map +1 -1
  183. package/lib/zudoku.auth-openid.js +5 -5
  184. package/lib/zudoku.components.js +7 -7
  185. package/lib/zudoku.hooks.js +1 -1
  186. package/lib/zudoku.icons.js +1 -1
  187. package/lib/zudoku.plugin-api-catalog.js +6 -6
  188. package/lib/zudoku.plugin-api-keys.js +6 -6
  189. package/lib/zudoku.plugin-custom-pages.js +3 -3
  190. package/lib/zudoku.plugin-markdown.js +2 -2
  191. package/lib/zudoku.plugin-openapi.js +4 -4
  192. package/lib/zudoku.plugin-redirect.js +1 -1
  193. package/lib/zudoku.plugin-search-inkeep.js +1 -1
  194. package/lib/zudoku.plugin-search-pagefind.js +7 -7
  195. package/package.json +61 -62
  196. package/src/app/entry.client.tsx +2 -0
  197. package/src/app/main.css +8 -2
  198. package/src/lib/authentication/providers/clerk.tsx +2 -2
  199. package/src/lib/components/Footer.tsx +6 -3
  200. package/src/lib/components/Layout.tsx +8 -1
  201. package/src/lib/components/Search.tsx +14 -3
  202. package/src/lib/components/navigation/Sidebar.tsx +8 -1
  203. package/src/lib/components/navigation/SidebarWrapper.tsx +1 -1
  204. package/src/lib/plugins/openapi/{post-processors → processors}/removeExtensions.test.ts +29 -9
  205. package/src/lib/plugins/openapi/{post-processors → processors}/removeExtensions.ts +5 -3
  206. package/src/lib/plugins/openapi/{post-processors → processors}/removeParameters.test.ts +67 -33
  207. package/src/lib/plugins/openapi/{post-processors → processors}/removeParameters.ts +5 -3
  208. package/src/lib/plugins/openapi/processors/removePaths.test.ts +167 -0
  209. package/src/lib/plugins/openapi/{post-processors → processors}/removePaths.ts +5 -3
  210. package/src/lib/ui/Callout.tsx +1 -0
  211. package/src/lib/util/MdxComponents.tsx +2 -0
  212. package/src/lib/util/detectOS.ts +9 -0
  213. package/dist/lib/plugins/openapi/post-processors/removeExtensions.d.ts +0 -7
  214. package/dist/lib/plugins/openapi/post-processors/removeExtensions.js.map +0 -1
  215. package/dist/lib/plugins/openapi/post-processors/removeExtensions.test.js.map +0 -1
  216. package/dist/lib/plugins/openapi/post-processors/removeParameters.js.map +0 -1
  217. package/dist/lib/plugins/openapi/post-processors/removeParameters.test.js.map +0 -1
  218. package/dist/lib/plugins/openapi/post-processors/removePaths.js.map +0 -1
  219. package/dist/lib/plugins/openapi/post-processors/removePaths.test.js +0 -104
  220. package/dist/lib/plugins/openapi/post-processors/removePaths.test.js.map +0 -1
  221. package/dist/lib/plugins/openapi/post-processors/traverse.js.map +0 -1
  222. package/lib/Drawer-kDAfOq_2.js.map +0 -1
  223. package/lib/Markdown-aF5FdsNi.js.map +0 -1
  224. package/lib/SlotletProvider-DXvc0aY6.js.map +0 -1
  225. package/lib/_commonjsHelpers-BkfeUUK-.js.map +0 -1
  226. package/lib/chunk-HA7DTUK3-C4gP41vD.js.map +0 -1
  227. package/lib/createServer-mYvGvmc0.js.map +0 -1
  228. package/lib/hook-CqpVYDqN.js.map +0 -1
  229. package/lib/index-D48iOQvJ.js.map +0 -1
  230. package/lib/index-Dl3Yl0yb.js.map +0 -1
  231. package/lib/index-gQD2h1wX.js +0 -447
  232. package/lib/index-gQD2h1wX.js.map +0 -1
  233. package/lib/index.esm--gIChbWs.js +0 -1207
  234. package/lib/index.esm--gIChbWs.js.map +0 -1
  235. package/lib/jsx-runtime-CYK1ROHF.js +0 -446
  236. package/lib/jsx-runtime-CYK1ROHF.js.map +0 -1
  237. package/lib/mutation-8LjrN7uz.js.map +0 -1
  238. package/lib/post-processors/removeExtensions.js.map +0 -1
  239. package/lib/post-processors/removeParameters.js.map +0 -1
  240. package/lib/post-processors/removePaths.js.map +0 -1
  241. package/src/lib/plugins/openapi/post-processors/removePaths.test.ts +0 -126
  242. /package/dist/lib/plugins/openapi/{post-processors → processors}/removeExtensions.test.d.ts +0 -0
  243. /package/dist/lib/plugins/openapi/{post-processors → processors}/removeParameters.test.d.ts +0 -0
  244. /package/dist/lib/plugins/openapi/{post-processors → processors}/removePaths.test.d.ts +0 -0
  245. /package/dist/lib/plugins/openapi/{post-processors → processors}/traverse.d.ts +0 -0
  246. /package/dist/lib/plugins/openapi/{post-processors → processors}/traverse.js +0 -0
  247. /package/lib/{post-processors → processors}/traverse.js +0 -0
  248. /package/lib/{post-processors → processors}/traverse.js.map +0 -0
  249. /package/src/lib/plugins/openapi/{post-processors → processors}/traverse.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.39.5",
3
+ "version": "0.40.1",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -98,9 +98,9 @@
98
98
  "import": "./lib/zudoku.components.js",
99
99
  "types": "./dist/lib/components/index.d.ts"
100
100
  },
101
- "./post-processors/*": {
102
- "import": "./lib/post-processors/*.js",
103
- "types": "./dist/lib/plugins/openapi/post-processors/*.d.ts"
101
+ "./processors/*": {
102
+ "import": "./lib/processors/*.js",
103
+ "types": "./dist/lib/plugins/openapi/processors/*.d.ts"
104
104
  },
105
105
  "./icons": {
106
106
  "import": "./lib/zudoku.icons.js",
@@ -127,55 +127,55 @@
127
127
  }
128
128
  },
129
129
  "dependencies": {
130
- "@apidevtools/json-schema-ref-parser": "11.9.3",
131
- "@envelop/core": "5.0.3",
130
+ "@apidevtools/json-schema-ref-parser": "12.0.1",
131
+ "@envelop/core": "5.2.3",
132
132
  "@graphql-typed-document-node/core": "3.2.0",
133
133
  "@hookform/resolvers": "4.1.3",
134
134
  "@lekoarts/rehype-meta-as-attributes": "3.0.2",
135
135
  "@mdx-js/react": "3.1.0",
136
136
  "@mdx-js/rollup": "3.1.0",
137
- "@pothos/core": "4.5.0",
138
- "@radix-ui/react-accordion": "1.2.3",
139
- "@radix-ui/react-alert-dialog": "1.1.6",
140
- "@radix-ui/react-aspect-ratio": "1.1.2",
141
- "@radix-ui/react-checkbox": "1.1.4",
142
- "@radix-ui/react-collapsible": "1.1.3",
143
- "@radix-ui/react-dialog": "1.1.6",
144
- "@radix-ui/react-dropdown-menu": "2.1.6",
145
- "@radix-ui/react-hover-card": "1.1.6",
146
- "@radix-ui/react-label": "2.1.2",
147
- "@radix-ui/react-popover": "1.1.6",
148
- "@radix-ui/react-progress": "1.1.2",
149
- "@radix-ui/react-radio-group": "1.2.3",
150
- "@radix-ui/react-scroll-area": "1.2.3",
151
- "@radix-ui/react-select": "2.1.6",
152
- "@radix-ui/react-slider": "1.2.3",
153
- "@radix-ui/react-slot": "1.1.2",
154
- "@radix-ui/react-switch": "1.1.3",
155
- "@radix-ui/react-tabs": "1.1.3",
156
- "@radix-ui/react-toggle": "1.1.2",
157
- "@radix-ui/react-toggle-group": "1.1.2",
158
- "@radix-ui/react-tooltip": "1.1.8",
159
- "@radix-ui/react-visually-hidden": "1.1.2",
160
- "@scalar/openapi-parser": "0.10.12",
161
- "@sentry/node": "9.1.0",
137
+ "@pothos/core": "4.6.0",
138
+ "@radix-ui/react-accordion": "1.2.4",
139
+ "@radix-ui/react-alert-dialog": "1.1.7",
140
+ "@radix-ui/react-aspect-ratio": "1.1.3",
141
+ "@radix-ui/react-checkbox": "1.1.5",
142
+ "@radix-ui/react-collapsible": "1.1.4",
143
+ "@radix-ui/react-dialog": "1.1.7",
144
+ "@radix-ui/react-dropdown-menu": "2.1.7",
145
+ "@radix-ui/react-hover-card": "1.1.7",
146
+ "@radix-ui/react-label": "2.1.3",
147
+ "@radix-ui/react-popover": "1.1.7",
148
+ "@radix-ui/react-progress": "1.1.3",
149
+ "@radix-ui/react-radio-group": "1.2.4",
150
+ "@radix-ui/react-scroll-area": "1.2.4",
151
+ "@radix-ui/react-select": "2.1.7",
152
+ "@radix-ui/react-slider": "1.2.4",
153
+ "@radix-ui/react-slot": "1.2.0",
154
+ "@radix-ui/react-switch": "1.1.4",
155
+ "@radix-ui/react-tabs": "1.1.4",
156
+ "@radix-ui/react-toggle": "1.1.3",
157
+ "@radix-ui/react-toggle-group": "1.1.3",
158
+ "@radix-ui/react-tooltip": "1.2.0",
159
+ "@radix-ui/react-visually-hidden": "1.1.3",
160
+ "@scalar/openapi-parser": "0.10.14",
161
+ "@sentry/node": "9.12.0",
162
162
  "@sindresorhus/slugify": "2.2.1",
163
- "@stefanprobst/rehype-extract-toc": "2.2.1",
163
+ "@stefanprobst/rehype-extract-toc": "3.0.0",
164
164
  "@tailwindcss/typography": "0.5.16",
165
165
  "@tanem/react-nprogress": "5.0.55",
166
- "@tanstack/react-query": "5.66.6",
167
- "@types/react": "19.0.10",
168
- "@types/react-dom": "19.0.4",
166
+ "@tanstack/react-query": "5.74.3",
167
+ "@types/react": "19.1.1",
168
+ "@types/react-dom": "19.1.2",
169
169
  "@vitejs/plugin-react": "4.3.4",
170
170
  "@zudoku/httpsnippet": "10.0.9",
171
171
  "@zudoku/react-helmet-async": "2.0.5",
172
172
  "autoprefixer": "10.4.21",
173
173
  "class-variance-authority": "0.7.1",
174
174
  "clsx": "2.1.1",
175
- "cmdk": "1.0.4",
175
+ "cmdk": "1.1.1",
176
176
  "devlop": "^1.1.0",
177
- "dotenv": "16.4.7",
178
- "embla-carousel-react": "8.5.2",
177
+ "dotenv": "16.5.0",
178
+ "embla-carousel-react": "8.6.0",
179
179
  "esm-loader-css": "^1.0.3",
180
180
  "estree-util-value-to-estree": "3.3.3",
181
181
  "express": "4.21.2",
@@ -183,7 +183,7 @@
183
183
  "glob": "11.0.1",
184
184
  "graphql": "16.10.0",
185
185
  "graphql-type-json": "0.3.2",
186
- "graphql-yoga": "5.13.2",
186
+ "graphql-yoga": "5.13.3",
187
187
  "gray-matter": "4.0.3",
188
188
  "hast-util-to-jsx-runtime": "^2.3.6",
189
189
  "hast-util-to-string": "3.0.1",
@@ -191,7 +191,7 @@
191
191
  "http-terminator": "3.2.0",
192
192
  "loglevel": "1.9.2",
193
193
  "lru-cache": "11.0.2",
194
- "lucide-react": "0.475.0",
194
+ "lucide-react": "0.488.0",
195
195
  "minimatch": "10.0.1",
196
196
  "nanoevents": "^9.1.0",
197
197
  "next-themes": "0.4.4",
@@ -202,13 +202,13 @@
202
202
  "picocolors": "1.1.1",
203
203
  "piscina": "5.0.0-alpha.2",
204
204
  "postcss": "8.5.3",
205
- "posthog-node": "4.8.1",
205
+ "posthog-node": "4.11.3",
206
206
  "prism-react-renderer": "2.4.1",
207
207
  "prismjs": "1.30.0",
208
208
  "react-error-boundary": "5.0.0",
209
- "react-hook-form": "7.54.2",
210
- "react-is": "19.0.0",
211
- "react-router": "7.2.0",
209
+ "react-hook-form": "7.55.0",
210
+ "react-is": "19.1.0",
211
+ "react-router": "7.5.0",
212
212
  "rehype-mdx-import-media": "1.2.0",
213
213
  "rehype-raw": "7.0.0",
214
214
  "rehype-slug": "6.0.0",
@@ -217,25 +217,24 @@
217
217
  "remark-directive-rehype": "0.4.2",
218
218
  "remark-frontmatter": "5.0.0",
219
219
  "remark-gfm": "4.0.1",
220
- "remark-mdx-frontmatter": "5.0.0",
220
+ "remark-mdx-frontmatter": "5.1.0",
221
221
  "remark-parse": "^11.0.0",
222
- "remark-rehype": "^11.1.1",
223
- "rollup": "4.35.0",
222
+ "remark-rehype": "^11.1.2",
223
+ "rollup": "4.40.0",
224
224
  "semver": "7.7.1",
225
225
  "sitemap": "8.0.0",
226
226
  "spin-delay": "2.0.1",
227
227
  "strip-ansi": "7.1.0",
228
228
  "tailwind-merge": "2.6.0",
229
229
  "tailwindcss": "3.4.17",
230
- "tsx": "^4.19.3",
231
230
  "ulidx": "2.4.1",
232
231
  "unified": "^11.0.5",
233
232
  "unist-util-visit": "5.0.0",
234
233
  "urql": "4.2.1",
235
234
  "vaul": "1.1.2",
236
235
  "vfile": "6.0.3",
237
- "vite": "6.2.0",
238
- "yaml": "2.7.0",
236
+ "vite": "6.2.6",
237
+ "yaml": "2.7.1",
239
238
  "yargs": "17.7.2",
240
239
  "zod": "3.24.2",
241
240
  "zod-validation-error": "3.4.0",
@@ -244,9 +243,9 @@
244
243
  "devDependencies": {
245
244
  "@graphql-codegen/cli": "5.0.5",
246
245
  "@graphql-codegen/client-preset": "4.8.0",
247
- "@testing-library/react": "16.2.0",
246
+ "@testing-library/react": "16.3.0",
248
247
  "@types/estree": "1.0.7",
249
- "@types/express": "5.0.0",
248
+ "@types/express": "5.0.1",
250
249
  "@types/har-format": "1.2.16",
251
250
  "@types/hast": "^3.0.4",
252
251
  "@types/json-schema": "7.0.15",
@@ -255,31 +254,31 @@
255
254
  "@types/node": "22.13.5",
256
255
  "@types/object-hash": "3.0.6",
257
256
  "@types/react-is": "19.0.0",
258
- "@types/semver": "7.5.8",
257
+ "@types/semver": "7.7.0",
259
258
  "@types/unist": "^3.0.3",
260
259
  "@types/yargs": "17.0.33",
261
- "@vitest/coverage-v8": "3.0.5",
260
+ "@vitest/coverage-v8": "3.1.1",
262
261
  "happy-dom": "17.4.4",
263
262
  "mdast-util-mdx": "3.0.0",
264
- "react": "19.0.0",
265
- "react-dom": "19.0.0",
263
+ "react": "19.1.0",
264
+ "react-dom": "19.1.0",
266
265
  "rollup-plugin-visualizer": "5.14.0",
267
- "typescript": "5.7.3",
268
- "vitest": "3.0.5"
266
+ "typescript": "5.8.3",
267
+ "vitest": "3.1.1"
269
268
  },
270
269
  "peerDependencies": {
271
270
  "react": ">=19",
272
271
  "react-dom": ">=19"
273
272
  },
274
273
  "optionalDependencies": {
275
- "@clerk/clerk-js": "^5.52.3",
276
- "@sentry/react": "^9.1.0",
277
- "@supabase/supabase-js": "^2.49.1"
274
+ "@clerk/clerk-js": "^5.60.0",
275
+ "@sentry/react": "^9.12.0",
276
+ "@supabase/supabase-js": "^2.49.4"
278
277
  },
279
278
  "scripts": {
280
279
  "build": "tsc --project tsconfig.app.json",
281
280
  "build:vite": "vite build",
282
- "generate:icon-types": "tsx ./scripts/generate-icon-types.ts",
281
+ "generate:icon-types": "node scripts/generate-icon-types.js",
283
282
  "build:standalone:vite": "vite build --mode standalone --config vite.standalone.config.ts",
284
283
  "build:standalone:html": "cp ./src/app/standalone.html ./standalone/standalone.html && cp ./src/app/demo.html ./standalone/demo.html && cp ./src/app/demo-cdn.html ./standalone/index.html && cp standalone/zudoku.css standalone/style.css",
285
284
  "clean": "tsc --build --clean",
@@ -43,6 +43,8 @@ async function hydrateLazyRoutes(routes: RouteObject[]) {
43
43
  if (lazyMatches?.length) {
44
44
  await Promise.all(
45
45
  lazyMatches.map(async (m) => {
46
+ if (typeof m.route.lazy !== "function") return;
47
+
46
48
  const routeModule = await m.route.lazy!();
47
49
  Object.assign(m.route, { ...routeModule, lazy: undefined });
48
50
  }),
package/src/app/main.css CHANGED
@@ -127,6 +127,12 @@
127
127
  @apply bg-primary/100 text-primary-foreground;
128
128
  }
129
129
 
130
+ .bg-primary::selection,
131
+ .bg-primary ::selection {
132
+ background: theme(colors.background);
133
+ color: theme(colors.foreground);
134
+ }
135
+
130
136
  .dark {
131
137
  color-scheme: dark;
132
138
  }
@@ -327,8 +333,8 @@
327
333
 
328
334
  /* Vertical line */
329
335
  .stepper > ol > li::after {
330
- @apply absolute content-[''] w-[2px] bg-border -translate-x-1/2;
331
- left: calc(var(--bullet-size) / 2);
336
+ @apply absolute content-[''] w-[2px] bg-border -translate-x-1/2 rtl:translate-x-1/2;
337
+ inset-inline-start: calc(var(--bullet-size) / 2);
332
338
  top: calc(var(--bullet-size) + var(--line-spacing));
333
339
  height: calc(100% - var(--bullet-size) - (2 * var(--line-spacing)));
334
340
  }
@@ -126,7 +126,7 @@ const clerkAuth: AuthenticationProviderInitializer<
126
126
  providerData: null,
127
127
  });
128
128
  },
129
- signIn: async ({ redirectTo }: { redirectTo?: string }) => {
129
+ signIn: async ({ redirectTo }: { redirectTo?: string } = {}) => {
130
130
  await ensureLoaded;
131
131
  await clerkApi?.redirectToSignIn({
132
132
  signInForceRedirectUrl:
@@ -135,7 +135,7 @@ const clerkAuth: AuthenticationProviderInitializer<
135
135
  redirectTo ?? window.location.origin + redirectToAfterSignUp,
136
136
  });
137
137
  },
138
- signUp: async ({ redirectTo }: { redirectTo?: string }) => {
138
+ signUp: async ({ redirectTo }: { redirectTo?: string } = {}) => {
139
139
  await ensureLoaded;
140
140
  await clerkApi?.redirectToSignUp({
141
141
  signInForceRedirectUrl:
@@ -59,12 +59,12 @@ export const Footer = () => {
59
59
  >
60
60
  <span className="text-sm font-semibold">{column.title}</span>
61
61
  <ul className="mt-4 space-y-2">
62
- {column.links.map((link) => {
62
+ {column.links.map((link, i) => {
63
63
  const className =
64
64
  "flex flex-row gap-1 items-center text-sm text-muted-foreground hover:text-accent-foreground";
65
65
 
66
66
  return (
67
- <li key={link.href}>
67
+ <li key={link.href + i}>
68
68
  {isExternalUrl(link.href) ? (
69
69
  <a
70
70
  href={link.href}
@@ -76,7 +76,10 @@ export const Footer = () => {
76
76
  <ExternalLinkIcon size={12} />
77
77
  </a>
78
78
  ) : (
79
- <AnchorLink to={link.href} className={className}>
79
+ <AnchorLink
80
+ to={link.href + i}
81
+ className={className}
82
+ >
80
83
  <span>{link.label}</span>
81
84
  </AnchorLink>
82
85
  )}
@@ -1,6 +1,7 @@
1
1
  import { Helmet } from "@zudoku/react-helmet-async";
2
2
  import { Suspense, useEffect, type ReactNode } from "react";
3
3
  import { Outlet, useLocation } from "react-router";
4
+ import { cn } from "../util/cn.js";
4
5
  import { joinUrl } from "../util/joinUrl.js";
5
6
  import { useScrollToAnchor } from "../util/useScrollToAnchor.js";
6
7
  import { useScrollToTop } from "../util/useScrollToTop.js";
@@ -54,7 +55,13 @@ export const Layout = ({ children }: { children?: ReactNode }) => {
54
55
  <Header />
55
56
  <Slotlet name="layout-after-head" />
56
57
 
57
- <div className="grid grid-cols-1 grid-rows-[0_min-content_1fr] lg:grid-rows-[min-content_1fr] lg:grid-cols-[var(--side-nav-width)_1fr] max-w-screen-2xl w-full lg:mx-auto">
58
+ <div
59
+ className={cn(
60
+ "grid max-w-screen-2xl w-full lg:mx-auto",
61
+ "has-[:only-child]:grid-rows-1 grid-rows-[0_min-content_1fr] lg:grid-rows-[min-content_1fr]",
62
+ "grid-cols-1 lg:grid-cols-[var(--side-nav-width)_1fr]",
63
+ )}
64
+ >
58
65
  <Suspense fallback={<LoadingFallback />}>
59
66
  <Main>{children ?? <Outlet />}</Main>
60
67
  </Suspense>
@@ -1,6 +1,8 @@
1
1
  import { SearchIcon } from "lucide-react";
2
2
  import { Suspense, useCallback, useEffect, useState } from "react";
3
3
  import { isSearchPlugin } from "../core/plugins.js";
4
+ import { detectOS } from "../util/detectOS.js";
5
+ import { ClientOnly } from "./ClientOnly.js";
4
6
  import { useZudoku } from "./context/ZudokuContext.js";
5
7
 
6
8
  export const Search = ({ className }: { className?: string }) => {
@@ -45,9 +47,9 @@ export const Search = ({ className }: { className?: string }) => {
45
47
  <SearchIcon size={14} />
46
48
  Search
47
49
  </div>
48
- <kbd className="absolute right-[0.3rem] top-[0.3rem] hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[11px] font-medium opacity-100 sm:flex">
49
- ⌘K
50
- </kbd>
50
+ <ClientOnly>
51
+ <KbdShortcut />
52
+ </ClientOnly>
51
53
  </button>
52
54
  <Suspense fallback={null}>
53
55
  {searchPlugin.renderSearch({
@@ -58,3 +60,12 @@ export const Search = ({ className }: { className?: string }) => {
58
60
  </div>
59
61
  );
60
62
  };
63
+
64
+ const KbdShortcut = () => {
65
+ const os = detectOS();
66
+ return (
67
+ <kbd className="absolute right-[0.3rem] top-[0.35rem] hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[11px] font-medium opacity-100 sm:flex">
68
+ {os === "macOS" ? "⌘" : "Ctrl"}+K
69
+ </kbd>
70
+ );
71
+ };
@@ -16,7 +16,14 @@ export const Sidebar = ({
16
16
  <SidebarWrapper>
17
17
  <Slotlet name="zudoku-before-navigation" />
18
18
  {sidebar.map((item) => (
19
- <SidebarItem key={item.label} item={item} />
19
+ <SidebarItem
20
+ key={
21
+ ("id" in item ? item.id : "") +
22
+ ("href" in item ? item.href : "") +
23
+ item.label
24
+ }
25
+ item={item}
26
+ />
20
27
  ))}
21
28
  <Slotlet name="zudoku-after-navigation" />
22
29
  </SidebarWrapper>
@@ -24,7 +24,7 @@ export const SidebarWrapper = ({
24
24
  ref={navRef}
25
25
  className={cn(
26
26
  "hidden max-w-[calc(var(--side-nav-width)+var(--padding-nav-item))] lg:flex scrollbar flex-col overflow-y-auto shrink-0 text-sm pe-3 ps-4 lg:ps-8",
27
- "-mx-[--padding-nav-item] pb-3 pt-[--padding-content-top] scroll-pt-2 gap-1",
27
+ "-mx-[--padding-nav-item] pb-[8vh] pt-[--padding-content-top] scroll-pt-2 gap-1",
28
28
  // Revert the padding/margin on the first child
29
29
  "-mt-2.5",
30
30
  className,
@@ -64,11 +64,15 @@ const baseDoc = {
64
64
  },
65
65
  },
66
66
  },
67
- };
67
+ } as any;
68
68
 
69
69
  describe("removeExtensions", () => {
70
70
  it("removes all x- extensions by default", () => {
71
- const processed = removeExtensions()(baseDoc);
71
+ const processed = removeExtensions()({
72
+ schema: baseDoc,
73
+ file: "/file.json",
74
+ dereference: async (id) => id,
75
+ });
72
76
 
73
77
  const removedExtensions = [
74
78
  "x-root-ext",
@@ -93,7 +97,7 @@ describe("removeExtensions", () => {
93
97
  ["paths", "/test", "get", "responses", "200", "description"],
94
98
  "OK",
95
99
  );
96
- expect(processed.tags[0].name).toBe("example");
100
+ expect(processed.tags?.[0]?.name).toBe("example");
97
101
  });
98
102
 
99
103
  it("removes only specified x- extensions when names are provided", () => {
@@ -104,7 +108,11 @@ describe("removeExtensions", () => {
104
108
 
105
109
  const processed = removeExtensions({
106
110
  keys: ["x-path-ext", "x-param-ext"],
107
- })(docWithExtraExtensions);
111
+ })({
112
+ schema: docWithExtraExtensions,
113
+ file: "/file.json",
114
+ dereference: async (id) => id,
115
+ }) as any;
108
116
 
109
117
  // Assert specified extensions are removed
110
118
  expect(processed.paths["/test"]["x-path-ext"]).toBeUndefined();
@@ -131,9 +139,13 @@ describe("removeExtensions", () => {
131
139
  },
132
140
  },
133
141
  },
134
- };
142
+ } as any;
135
143
 
136
- const processed = removeExtensions()(deeplyNested);
144
+ const processed = removeExtensions()({
145
+ schema: deeplyNested,
146
+ file: "/file.json",
147
+ dereference: async (id) => id,
148
+ }) as any;
137
149
 
138
150
  expect(processed.a.b.c["x-deep-ext"]).toBeUndefined();
139
151
  expect(processed.a.b.c.d["x-another-ext"]).toBeUndefined();
@@ -144,9 +156,13 @@ describe("removeExtensions", () => {
144
156
  const docWithoutExtensions = {
145
157
  openapi: "3.1.0",
146
158
  info: { title: "API without extensions" },
147
- };
159
+ } as any;
148
160
 
149
- const processed = removeExtensions()(docWithoutExtensions);
161
+ const processed = removeExtensions()({
162
+ schema: docWithoutExtensions,
163
+ file: "/file.json",
164
+ dereference: async (id) => id,
165
+ });
150
166
 
151
167
  expect(processed).toEqual(docWithoutExtensions);
152
168
  });
@@ -154,7 +170,11 @@ describe("removeExtensions", () => {
154
170
  it("removes extensions based on shouldRemove callback", () => {
155
171
  const processed = removeExtensions({
156
172
  shouldRemove: (key) => key.startsWith("x-zuplo"),
157
- })(baseDoc);
173
+ })({
174
+ schema: baseDoc,
175
+ file: "/file.json",
176
+ dereference: async (id) => id,
177
+ });
158
178
 
159
179
  // Should remove x-zuplo extensions
160
180
  const removedExtensions = [
@@ -1,3 +1,5 @@
1
+ import type { ProcessorArg } from "../../../../config/validators/BuildSchema.js";
2
+ import type { OpenAPIDocument } from "../../../oas/parser/index.js";
1
3
  import { type RecordAny, traverse } from "./traverse.js";
2
4
 
3
5
  interface RemoveExtensionsOptions {
@@ -8,8 +10,8 @@ interface RemoveExtensionsOptions {
8
10
  // Remove all `x-` prefixed key/value pairs, or filter by names if provided
9
11
  export const removeExtensions =
10
12
  ({ keys, shouldRemove }: RemoveExtensionsOptions = {}) =>
11
- (doc: RecordAny): RecordAny =>
12
- traverse(doc, (spec) => {
13
+ ({ schema }: ProcessorArg) =>
14
+ traverse(schema, (spec) => {
13
15
  const result: RecordAny = {};
14
16
 
15
17
  for (const [key, value] of Object.entries(spec)) {
@@ -24,4 +26,4 @@ export const removeExtensions =
24
26
  result[key] = value;
25
27
  }
26
28
  return result;
27
- });
29
+ }) as OpenAPIDocument;
@@ -1,8 +1,8 @@
1
- import { type OpenAPIV3_1 } from "openapi-types";
2
1
  import { describe, expect, it } from "vitest";
2
+ import type { OpenAPIDocument } from "../../../oas/parser/index.js";
3
3
  import { removeParameters } from "./removeParameters.js";
4
4
 
5
- const baseDoc: OpenAPIV3_1.Document = {
5
+ const baseDoc: OpenAPIDocument = {
6
6
  openapi: "3.1.0",
7
7
  info: {
8
8
  title: "Test API",
@@ -67,45 +67,67 @@ describe("removeParameters", () => {
67
67
  it("removes parameters by name", () => {
68
68
  const processed = removeParameters({
69
69
  names: ["pathParam", "opParam"],
70
- })(baseDoc);
71
-
72
- expect(processed.paths["/test"].parameters).toHaveLength(1);
73
- expect(processed.paths["/test"].parameters[0].name).toBe("pathHeader");
74
- expect(processed.paths["/test"].get.parameters).toHaveLength(1);
75
- expect(processed.paths["/test"].get.parameters[0].name).toBe("opHeader");
70
+ })({
71
+ schema: baseDoc,
72
+ file: "/file.json",
73
+ dereference: async (id) => id,
74
+ });
75
+
76
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(1);
77
+ expect(processed.paths?.["/test"]?.parameters?.[0]?.name).toBe(
78
+ "pathHeader",
79
+ );
80
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(1);
81
+ expect(processed.paths?.["/test"]?.get?.parameters?.[0]?.name).toBe(
82
+ "opHeader",
83
+ );
76
84
  });
77
85
 
78
86
  it("removes parameters by location", () => {
79
87
  const processed = removeParameters({
80
88
  in: ["header"],
81
- })(baseDoc);
82
-
83
- expect(processed.paths["/test"].parameters).toHaveLength(1);
84
- expect(processed.paths["/test"].parameters[0].in).toBe("path");
85
- expect(processed.paths["/test"].get.parameters).toHaveLength(1);
86
- expect(processed.paths["/test"].get.parameters[0].in).toBe("query");
89
+ })({
90
+ schema: baseDoc,
91
+ file: "/file.json",
92
+ dereference: async (id) => id,
93
+ });
94
+
95
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(1);
96
+ expect(processed.paths?.["/test"]?.parameters?.[0]?.in).toBe("path");
97
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(1);
98
+ expect(processed.paths?.["/test"]?.get?.parameters?.[0]?.in).toBe("query");
87
99
  });
88
100
 
89
101
  it("removes parameters using shouldRemove callback", () => {
90
102
  const processed = removeParameters({
91
103
  shouldRemove: ({ parameter }) =>
92
104
  parameter.in === "header" && parameter.name.includes("op"),
93
- })(baseDoc);
94
-
95
- expect(processed.paths["/test"].parameters).toHaveLength(2);
96
- expect(processed.paths["/test"].get.parameters).toHaveLength(1);
97
- expect(processed.paths["/test"].get.parameters[0].name).toBe("opParam");
105
+ })({
106
+ schema: baseDoc,
107
+ file: "/file.json",
108
+ dereference: async (id) => id,
109
+ });
110
+
111
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(2);
112
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(1);
113
+ expect(processed.paths?.["/test"]?.get?.parameters?.[0]?.name).toBe(
114
+ "opParam",
115
+ );
98
116
  });
99
117
 
100
118
  it("combines multiple removal criteria", () => {
101
119
  const processed = removeParameters({
102
120
  in: ["query", "header"],
103
121
  shouldRemove: ({ parameter }) => parameter.name === "pathHeader",
104
- })(baseDoc);
105
-
106
- expect(processed.paths["/test"].parameters).toHaveLength(1);
107
- expect(processed.paths["/test"].parameters[0].name).toBe("pathParam");
108
- expect(processed.paths["/test"].get.parameters).toHaveLength(0);
122
+ })({
123
+ schema: baseDoc,
124
+ file: "/file.json",
125
+ dereference: async (id) => id,
126
+ });
127
+
128
+ expect(processed.paths?.["/test"]?.parameters).toHaveLength(1);
129
+ expect(processed.paths?.["/test"]?.parameters?.[0]?.name).toBe("pathParam");
130
+ expect(processed.paths?.["/test"]?.get?.parameters).toHaveLength(0);
109
131
  });
110
132
 
111
133
  it("handles missing parameters arrays", () => {
@@ -118,11 +140,15 @@ describe("removeParameters", () => {
118
140
  },
119
141
  },
120
142
  },
121
- };
143
+ } as any;
122
144
 
123
145
  const processed = removeParameters({
124
146
  names: ["someParam"],
125
- })(docWithoutParams);
147
+ })({
148
+ schema: docWithoutParams,
149
+ file: "/file.json",
150
+ dereference: async (id) => id,
151
+ });
126
152
 
127
153
  expect(processed).toEqual(docWithoutParams);
128
154
  });
@@ -130,19 +156,27 @@ describe("removeParameters", () => {
130
156
  it("preserves non-parameter properties", () => {
131
157
  const processed = removeParameters({
132
158
  names: ["globalParam"],
133
- })(baseDoc);
159
+ })({
160
+ schema: baseDoc,
161
+ file: "/file.json",
162
+ dereference: async (id) => id,
163
+ });
134
164
 
135
165
  expect(processed.openapi).toBe("3.1.0");
136
- expect(processed.paths["/test"].get).toBeDefined();
166
+ expect(processed.paths?.["/test"]?.get).toBeDefined();
137
167
  });
138
168
 
139
169
  it("removes parameters from components", () => {
140
170
  const processed = removeParameters({
141
171
  in: ["header"],
142
- })(baseDoc);
143
-
144
- expect(Object.keys(processed.components.parameters)).toHaveLength(1);
145
- expect(processed.components.parameters.commonParam).toBeDefined();
146
- expect(processed.components.parameters.headerParam).toBeUndefined();
172
+ })({
173
+ schema: baseDoc,
174
+ file: "/file.json",
175
+ dereference: async (id) => id,
176
+ });
177
+
178
+ expect(Object.keys(processed.components?.parameters ?? {})).toHaveLength(1);
179
+ expect(processed.components?.parameters?.commonParam).toBeDefined();
180
+ expect(processed.components?.parameters?.headerParam).toBeUndefined();
147
181
  });
148
182
  });