@lukoweb/apitogo 0.1.24 → 0.1.38

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 (477) hide show
  1. package/README.md +92 -0
  2. package/cli.js +13 -13
  3. package/client.d.ts +8 -8
  4. package/dist/cli/cli.js +1117 -624
  5. package/dist/declarations/config/config.d.ts +4 -0
  6. package/dist/declarations/config/loader.d.ts +2 -0
  7. package/dist/declarations/config/resolve-modules.d.ts +34 -0
  8. package/dist/declarations/config/validators/InputNavigationSchema.d.ts +7 -7
  9. package/dist/declarations/config/validators/ModulesSchema.d.ts +417 -0
  10. package/dist/declarations/config/validators/ZudokuConfig.d.ts +123 -4
  11. package/dist/declarations/index.d.ts +3 -1
  12. package/dist/declarations/lib/authentication/components/ProductionUnlockPage.d.ts +1 -0
  13. package/dist/declarations/lib/authentication/hook.d.ts +3 -19
  14. package/dist/declarations/lib/authentication/providers/dev-portal-constants.d.ts +16 -0
  15. package/dist/declarations/lib/authentication/providers/dev-portal-utils.d.ts +9 -0
  16. package/dist/declarations/lib/authentication/providers/dev-portal.d.ts +39 -0
  17. package/dist/declarations/lib/authentication/state.d.ts +12 -26
  18. package/dist/declarations/lib/components/LandingLayout.d.ts +4 -0
  19. package/dist/declarations/lib/components/index.d.ts +2 -0
  20. package/dist/declarations/lib/plugins/api-keys/index.d.ts +2 -1
  21. package/dist/flat-config.d.ts +209 -24
  22. package/docs/components/alert.mdx +130 -0
  23. package/docs/components/badge.mdx +70 -0
  24. package/docs/components/button.mdx +132 -0
  25. package/docs/components/callout.mdx +112 -0
  26. package/docs/components/card.mdx +104 -0
  27. package/docs/components/checkbox.mdx +72 -0
  28. package/docs/components/client-only.mdx +79 -0
  29. package/docs/components/code-tabs.mdx +179 -0
  30. package/docs/components/dialog.mdx +167 -0
  31. package/docs/components/head.mdx +200 -0
  32. package/docs/components/icons.mdx +27 -0
  33. package/docs/components/input.mdx +96 -0
  34. package/docs/components/label.mdx +86 -0
  35. package/docs/components/link.mdx +242 -0
  36. package/docs/components/markdown.mdx +151 -0
  37. package/docs/components/mermaid.mdx +81 -0
  38. package/docs/components/playground.mdx +87 -0
  39. package/docs/components/secret.mdx +79 -0
  40. package/docs/components/select.mdx +176 -0
  41. package/docs/components/shadcn.mdx +73 -0
  42. package/docs/components/slider.mdx +108 -0
  43. package/docs/components/slot.mdx +119 -0
  44. package/docs/components/stepper.mdx +138 -0
  45. package/docs/components/switch.mdx +96 -0
  46. package/docs/components/syntax-highlight.mdx +602 -0
  47. package/docs/components/textarea.mdx +78 -0
  48. package/docs/components/tooltip.mdx +195 -0
  49. package/docs/components/typography.mdx +61 -0
  50. package/docs/concepts/auth-provider-api-identities.md +109 -0
  51. package/docs/configuration/ai-assistants.md +65 -0
  52. package/docs/configuration/api-catalog.md +109 -0
  53. package/docs/configuration/api-reference.md +397 -0
  54. package/docs/configuration/authentication-auth0.md +174 -0
  55. package/docs/configuration/authentication-azure-ad.md +238 -0
  56. package/docs/configuration/authentication-clerk.md +110 -0
  57. package/docs/configuration/authentication-firebase.md +62 -0
  58. package/docs/configuration/authentication-pingfederate.md +136 -0
  59. package/docs/configuration/authentication-supabase.md +226 -0
  60. package/docs/configuration/authentication.md +231 -0
  61. package/docs/configuration/build-configuration.mdx +147 -0
  62. package/docs/configuration/docs.md +282 -0
  63. package/docs/configuration/footer.mdx +214 -0
  64. package/docs/configuration/llms.md +90 -0
  65. package/docs/configuration/make-config.mdx +90 -0
  66. package/docs/configuration/navigation.mdx +422 -0
  67. package/docs/configuration/overview.md +380 -0
  68. package/docs/configuration/protected-routes.md +150 -0
  69. package/docs/configuration/search.md +163 -0
  70. package/docs/configuration/sentry.mdx +44 -0
  71. package/docs/configuration/site.md +124 -0
  72. package/docs/configuration/slots.mdx +125 -0
  73. package/docs/configuration/vite-config.md +18 -0
  74. package/docs/custom-plugins.md +285 -0
  75. package/docs/customization/colors-theme.mdx +276 -0
  76. package/docs/customization/fonts.md +110 -0
  77. package/docs/deploy/apache-nginx.md +41 -0
  78. package/docs/deploy/apitogo.md +139 -0
  79. package/docs/deploy/cloudflare-pages.md +75 -0
  80. package/docs/deploy/direct-upload.md +18 -0
  81. package/docs/deploy/github-pages.md +50 -0
  82. package/docs/deploy/vercel.md +103 -0
  83. package/docs/deployment.md +21 -0
  84. package/docs/extending/events.md +124 -0
  85. package/docs/guides/custom-pages.md +106 -0
  86. package/docs/guides/environment-variables.md +99 -0
  87. package/docs/guides/managing-api-keys-and-identities.md +172 -0
  88. package/docs/guides/mermaid.mdx +70 -0
  89. package/docs/guides/navigation-migration.md +87 -0
  90. package/docs/guides/navigation-rules.mdx +203 -0
  91. package/docs/guides/processors.mdx +234 -0
  92. package/docs/guides/static-files.md +55 -0
  93. package/docs/guides/transforming-examples.md +156 -0
  94. package/docs/guides/using-multiple-apis.md +87 -0
  95. package/docs/markdown/admonitions.md +128 -0
  96. package/docs/markdown/code-blocks.md +196 -0
  97. package/docs/markdown/frontmatter.md +173 -0
  98. package/docs/markdown/mdx.md +68 -0
  99. package/docs/markdown/overview.md +275 -0
  100. package/docs/plugins.md +5 -0
  101. package/docs/quickstart.md +87 -0
  102. package/docs/writing.mdx +72 -0
  103. package/package.json +170 -116
  104. package/src/app/ZuploBuildConfig.ts +36 -36
  105. package/src/app/defaultTheme.css +77 -77
  106. package/src/app/demo-cdn.html +37 -37
  107. package/src/app/demo.html +21 -21
  108. package/src/app/demo.tsx +77 -77
  109. package/src/app/entry.client.tsx +118 -118
  110. package/src/app/entry.server.tsx +160 -160
  111. package/src/app/env.ts +40 -40
  112. package/src/app/font.geist.css +73 -73
  113. package/src/app/main.css +390 -390
  114. package/src/app/main.tsx +8 -1
  115. package/src/app/polyfills.ts +47 -47
  116. package/src/app/processRoutes.tsx +51 -25
  117. package/src/app/sentry.ts +24 -24
  118. package/src/app/standalone.html +23 -23
  119. package/src/app/standalone.tsx +60 -60
  120. package/src/app/utils/createRedirectRoutes.ts +11 -11
  121. package/src/config/config.ts +32 -0
  122. package/src/config/create-plugin.ts +71 -71
  123. package/src/config/file-exists.ts +6 -6
  124. package/src/config/loader.ts +11 -1
  125. package/src/config/resolve-modules.ts +260 -0
  126. package/src/config/validators/BuildSchema.ts +95 -95
  127. package/src/config/validators/HeaderNavigationSchema.ts +41 -41
  128. package/src/config/validators/InputNavigationSchema.test-d.ts +178 -178
  129. package/src/config/validators/InputNavigationSchema.ts +206 -206
  130. package/src/config/validators/ModulesSchema.ts +312 -0
  131. package/src/config/validators/ProtectedRoutesSchema.ts +35 -35
  132. package/src/config/validators/ZudokuConfig.ts +766 -729
  133. package/src/config/validators/auth.ts +3 -3
  134. package/src/config/validators/reason-codes.ts +7 -7
  135. package/src/env.d.ts +11 -11
  136. package/src/index.ts +31 -0
  137. package/src/lib/MissingIcon.tsx +22 -22
  138. package/src/lib/assets/language-icons/bun.tsx +50 -50
  139. package/src/lib/assets/language-icons/c.tsx +31 -31
  140. package/src/lib/assets/language-icons/commonlisp.tsx +22 -22
  141. package/src/lib/assets/language-icons/cpp.tsx +35 -35
  142. package/src/lib/assets/language-icons/csharp.tsx +35 -35
  143. package/src/lib/assets/language-icons/css.tsx +36 -36
  144. package/src/lib/assets/language-icons/dart.tsx +39 -39
  145. package/src/lib/assets/language-icons/elixir.tsx +19 -19
  146. package/src/lib/assets/language-icons/go.tsx +19 -19
  147. package/src/lib/assets/language-icons/graphql.tsx +19 -19
  148. package/src/lib/assets/language-icons/html.tsx +24 -24
  149. package/src/lib/assets/language-icons/java.tsx +35 -35
  150. package/src/lib/assets/language-icons/javascript.tsx +11 -11
  151. package/src/lib/assets/language-icons/json.tsx +19 -19
  152. package/src/lib/assets/language-icons/kotlin.tsx +30 -30
  153. package/src/lib/assets/language-icons/markdown.tsx +19 -19
  154. package/src/lib/assets/language-icons/mdx.tsx +23 -23
  155. package/src/lib/assets/language-icons/npm.tsx +15 -15
  156. package/src/lib/assets/language-icons/objectivec.tsx +23 -23
  157. package/src/lib/assets/language-icons/ocaml.tsx +34 -34
  158. package/src/lib/assets/language-icons/php.tsx +19 -19
  159. package/src/lib/assets/language-icons/pnpm.tsx +32 -32
  160. package/src/lib/assets/language-icons/powershell.tsx +27 -27
  161. package/src/lib/assets/language-icons/python.tsx +23 -23
  162. package/src/lib/assets/language-icons/react.tsx +21 -21
  163. package/src/lib/assets/language-icons/ruby.tsx +19 -19
  164. package/src/lib/assets/language-icons/rust.tsx +19 -19
  165. package/src/lib/assets/language-icons/scala.tsx +19 -19
  166. package/src/lib/assets/language-icons/shell.tsx +19 -19
  167. package/src/lib/assets/language-icons/swift.tsx +19 -19
  168. package/src/lib/assets/language-icons/toml.tsx +23 -23
  169. package/src/lib/assets/language-icons/typescript.tsx +23 -23
  170. package/src/lib/assets/language-icons/xml.tsx +19 -19
  171. package/src/lib/assets/language-icons/yaml.tsx +23 -23
  172. package/src/lib/assets/language-icons/yarn.tsx +17 -17
  173. package/src/lib/assets/language-icons/zig.tsx +32 -32
  174. package/src/lib/auth/issuer.ts +34 -31
  175. package/src/lib/authentication/AuthenticationPlugin.tsx +33 -33
  176. package/src/lib/authentication/authentication.ts +48 -48
  177. package/src/lib/authentication/components/OAuthErrorPage.tsx +197 -197
  178. package/src/lib/authentication/components/ProductionUnlockPage.tsx +27 -0
  179. package/src/lib/authentication/components/SignOut.tsx +15 -15
  180. package/src/lib/authentication/constants.ts +1 -1
  181. package/src/lib/authentication/errors.ts +34 -34
  182. package/src/lib/authentication/hook.ts +141 -139
  183. package/src/lib/authentication/providers/auth0.tsx +91 -91
  184. package/src/lib/authentication/providers/azureb2c.tsx +223 -223
  185. package/src/lib/authentication/providers/dev-portal-constants.ts +21 -0
  186. package/src/lib/authentication/providers/dev-portal-utils.ts +107 -0
  187. package/src/lib/authentication/providers/dev-portal.tsx +270 -0
  188. package/src/lib/authentication/providers/firebase.tsx +486 -486
  189. package/src/lib/authentication/providers/openid.tsx +516 -516
  190. package/src/lib/authentication/providers/supabase.tsx +412 -412
  191. package/src/lib/authentication/providers/util.ts +26 -26
  192. package/src/lib/authentication/state.ts +179 -91
  193. package/src/lib/authentication/ui/icons/Apple.tsx +10 -10
  194. package/src/lib/authentication/ui/icons/Facebook.tsx +15 -15
  195. package/src/lib/authentication/ui/icons/Github.tsx +16 -16
  196. package/src/lib/authentication/ui/icons/Google.tsx +16 -16
  197. package/src/lib/authentication/ui/icons/Microsoft.tsx +12 -12
  198. package/src/lib/authentication/ui/icons/X.tsx +10 -10
  199. package/src/lib/authentication/utils/relativeRedirectUrl.ts +16 -16
  200. package/src/lib/components/AnchorLink.tsx +24 -24
  201. package/src/lib/components/Banner.tsx +52 -52
  202. package/src/lib/components/Bootstrap.tsx +77 -77
  203. package/src/lib/components/BuildCheck.tsx +87 -87
  204. package/src/lib/components/CategoryHeading.tsx +19 -19
  205. package/src/lib/components/ClientOnly.tsx +19 -19
  206. package/src/lib/components/ErrorPage.tsx +26 -26
  207. package/src/lib/components/Footer.tsx +140 -140
  208. package/src/lib/components/Framed.tsx +51 -51
  209. package/src/lib/components/Header.tsx +11 -3
  210. package/src/lib/components/HeaderNavigation.tsx +148 -148
  211. package/src/lib/components/Heading.tsx +84 -84
  212. package/src/lib/components/InlineCode.tsx +15 -15
  213. package/src/lib/components/LandingLayout.tsx +21 -0
  214. package/src/lib/components/LanguageIcon.tsx +199 -199
  215. package/src/lib/components/Markdown.tsx +55 -55
  216. package/src/lib/components/Meta.tsx +46 -46
  217. package/src/lib/components/MobileTopNavigation.tsx +11 -3
  218. package/src/lib/components/NotFoundPage.tsx +37 -37
  219. package/src/lib/components/PageProgress.tsx +28 -28
  220. package/src/lib/components/PagefindSearchMeta.tsx +14 -14
  221. package/src/lib/components/Pagination.tsx +44 -44
  222. package/src/lib/components/PathRenderer.tsx +61 -61
  223. package/src/lib/components/PluginHeads.tsx +17 -17
  224. package/src/lib/components/Search.tsx +70 -70
  225. package/src/lib/components/Slot.tsx +64 -64
  226. package/src/lib/components/Spinner.tsx +5 -5
  227. package/src/lib/components/StatusPage.tsx +96 -96
  228. package/src/lib/components/ThemeSwitch.tsx +49 -49
  229. package/src/lib/components/Typography.tsx +12 -12
  230. package/src/lib/components/Zudoku.tsx +106 -106
  231. package/src/lib/components/cache.ts +27 -27
  232. package/src/lib/components/context/RenderContext.ts +11 -11
  233. package/src/lib/components/context/RouterEventsEmitter.tsx +19 -19
  234. package/src/lib/components/context/SlotProvider.tsx +149 -149
  235. package/src/lib/components/context/ViewportAnchorContext.tsx +137 -137
  236. package/src/lib/components/context/ZudokuContext.ts +140 -140
  237. package/src/lib/components/context/ZudokuProvider.tsx +22 -22
  238. package/src/lib/components/context/ZudokuReactContext.tsx +17 -17
  239. package/src/lib/components/index.ts +2 -0
  240. package/src/lib/components/navigation/Navigation.tsx +51 -51
  241. package/src/lib/components/navigation/NavigationBadge.tsx +48 -48
  242. package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -28
  243. package/src/lib/components/navigation/NavigationWrapper.tsx +49 -49
  244. package/src/lib/components/navigation/Toc.tsx +137 -137
  245. package/src/lib/components/navigation/ZudokuLogo.tsx +25 -25
  246. package/src/lib/components/navigation/ZuploLogo.tsx +14 -14
  247. package/src/lib/components/navigation/utils.ts +234 -234
  248. package/src/lib/core/RouteGuard.tsx +11 -1
  249. package/src/lib/core/ZudokuContext.ts +271 -271
  250. package/src/lib/core/plugins.ts +138 -138
  251. package/src/lib/core/react-query.ts +1 -1
  252. package/src/lib/core/router.ts +1 -1
  253. package/src/lib/core/transform-config.ts +67 -67
  254. package/src/lib/demo/DemoAnnouncement.tsx +17 -17
  255. package/src/lib/errors/ErrorAlert.tsx +28 -28
  256. package/src/lib/errors/RouterError.tsx +18 -18
  257. package/src/lib/errors/ServerError.tsx +5 -5
  258. package/src/lib/errors/TopLevelError.tsx +6 -6
  259. package/src/lib/hooks/index.ts +13 -13
  260. package/src/lib/hooks/useEvent.ts +41 -41
  261. package/src/lib/hooks/useHighlighter.ts +15 -15
  262. package/src/lib/hooks/useHotkey.ts +70 -70
  263. package/src/lib/icons.ts +2 -2
  264. package/src/lib/navigation/applyRules.ts +127 -127
  265. package/src/lib/navigation/pathMatcher.ts +81 -81
  266. package/src/lib/oas/graphql/circular.ts +69 -69
  267. package/src/lib/oas/graphql/constants.ts +2 -2
  268. package/src/lib/oas/graphql/index.ts +791 -791
  269. package/src/lib/oas/parser/dereference/index.ts +84 -84
  270. package/src/lib/oas/parser/dereference/resolveRef.ts +32 -32
  271. package/src/lib/oas/parser/index.ts +129 -129
  272. package/src/lib/oas/parser/schemas/v3.0.json +1489 -1489
  273. package/src/lib/oas/parser/schemas/v3.1.json +1298 -1298
  274. package/src/lib/oas/parser/upgrade/index.ts +174 -174
  275. package/src/lib/plugins/api-catalog/index.tsx +119 -119
  276. package/src/lib/plugins/api-keys/ProtectedRoute.tsx +33 -33
  277. package/src/lib/plugins/api-keys/index.tsx +274 -272
  278. package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -67
  279. package/src/lib/plugins/custom-pages/index.tsx +32 -32
  280. package/src/lib/plugins/markdown/assets/ChatGPTLogo.tsx +11 -11
  281. package/src/lib/plugins/markdown/assets/ClaudeLogo.tsx +19 -19
  282. package/src/lib/plugins/markdown/index.tsx +62 -62
  283. package/src/lib/plugins/openapi/ColorizedParam.tsx +115 -115
  284. package/src/lib/plugins/openapi/Endpoint.tsx +85 -85
  285. package/src/lib/plugins/openapi/MCPEndpoint.tsx +273 -273
  286. package/src/lib/plugins/openapi/OasProvider.tsx +74 -74
  287. package/src/lib/plugins/openapi/OperationList.tsx +275 -275
  288. package/src/lib/plugins/openapi/ParamInfos.tsx +96 -96
  289. package/src/lib/plugins/openapi/ParameterList.tsx +53 -53
  290. package/src/lib/plugins/openapi/ParameterListItem.tsx +161 -161
  291. package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +67 -67
  292. package/src/lib/plugins/openapi/SidecarBox.tsx +57 -57
  293. package/src/lib/plugins/openapi/SimpleSelect.tsx +46 -46
  294. package/src/lib/plugins/openapi/client/GraphQLClient.tsx +73 -73
  295. package/src/lib/plugins/openapi/client/GraphQLContext.tsx +16 -16
  296. package/src/lib/plugins/openapi/client/createServer.ts +35 -35
  297. package/src/lib/plugins/openapi/client/useCreateQuery.ts +44 -44
  298. package/src/lib/plugins/openapi/components/ConstValue.tsx +24 -24
  299. package/src/lib/plugins/openapi/components/NonHighlightedCode.tsx +22 -22
  300. package/src/lib/plugins/openapi/components/SelectOnClick.tsx +29 -29
  301. package/src/lib/plugins/openapi/context.tsx +16 -16
  302. package/src/lib/plugins/openapi/graphql/fragment-masking.ts +104 -104
  303. package/src/lib/plugins/openapi/graphql/gql.ts +95 -95
  304. package/src/lib/plugins/openapi/graphql/graphql.ts +835 -835
  305. package/src/lib/plugins/openapi/graphql/index.ts +2 -2
  306. package/src/lib/plugins/openapi/index.tsx +221 -221
  307. package/src/lib/plugins/openapi/interfaces.ts +100 -100
  308. package/src/lib/plugins/openapi/playground/Headers.tsx +6 -6
  309. package/src/lib/plugins/openapi/playground/PathParams.tsx +53 -53
  310. package/src/lib/plugins/openapi/playground/Spinner.tsx +87 -87
  311. package/src/lib/plugins/openapi/playground/createUrl.ts +25 -25
  312. package/src/lib/plugins/openapi/playground/fileUtils.ts +36 -36
  313. package/src/lib/plugins/openapi/playground/rememberedIdentity.ts +26 -26
  314. package/src/lib/plugins/openapi/playground/request-panel/UrlPath.tsx +31 -31
  315. package/src/lib/plugins/openapi/playground/request-panel/UrlQueryParams.tsx +29 -29
  316. package/src/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.ts +340 -340
  317. package/src/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.tsx +117 -117
  318. package/src/lib/plugins/openapi/playground/result-panel/convertToTypes.ts +36 -36
  319. package/src/lib/plugins/openapi/playground/serializeQueryParams.ts +125 -125
  320. package/src/lib/plugins/openapi/playground/useRememberSkipLoginDialog.tsx +23 -23
  321. package/src/lib/plugins/openapi/processors/removeExtensions.ts +29 -29
  322. package/src/lib/plugins/openapi/processors/removeParameters.ts +103 -103
  323. package/src/lib/plugins/openapi/processors/removePaths.ts +57 -57
  324. package/src/lib/plugins/openapi/processors/traverse.ts +1 -1
  325. package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +39 -39
  326. package/src/lib/plugins/openapi/schema/UnionView.tsx +132 -132
  327. package/src/lib/plugins/openapi/schema/union-helpers.ts +123 -123
  328. package/src/lib/plugins/openapi/schema/utils.ts +49 -49
  329. package/src/lib/plugins/openapi/state.ts +36 -36
  330. package/src/lib/plugins/openapi/util/buildTagCategories.ts +54 -54
  331. package/src/lib/plugins/openapi/util/createHttpSnippet.ts +135 -135
  332. package/src/lib/plugins/openapi/util/createNavigationCategory.tsx +39 -39
  333. package/src/lib/plugins/openapi/util/generateSchemaExample.ts +191 -191
  334. package/src/lib/plugins/openapi/util/getRoutes.tsx +265 -265
  335. package/src/lib/plugins/openapi/util/methodColorMap.tsx +11 -11
  336. package/src/lib/plugins/openapi/util/methodToColor.ts +27 -27
  337. package/src/lib/plugins/openapi/util/sanitizeMarkdownForMetatag.tsx +32 -32
  338. package/src/lib/plugins/openapi/util/useWarmupSchema.ts +23 -23
  339. package/src/lib/plugins/search-inkeep/index.tsx +108 -108
  340. package/src/lib/plugins/search-inkeep/inkeep.ts +24 -24
  341. package/src/lib/plugins/search-pagefind/get-results.tsx +74 -74
  342. package/src/lib/plugins/search-pagefind/index.tsx +21 -21
  343. package/src/lib/plugins/search-pagefind/types.ts +118 -118
  344. package/src/lib/shiki-constants.ts +24 -24
  345. package/src/lib/testing/index.tsx +146 -146
  346. package/src/lib/ui/Accordion.tsx +55 -55
  347. package/src/lib/ui/Alert.tsx +84 -84
  348. package/src/lib/ui/AlertDialog.tsx +195 -195
  349. package/src/lib/ui/AspectRatio.tsx +5 -5
  350. package/src/lib/ui/Badge.tsx +48 -48
  351. package/src/lib/ui/Breadcrumb.tsx +115 -115
  352. package/src/lib/ui/Button.tsx +65 -65
  353. package/src/lib/ui/ButtonGroup.tsx +80 -80
  354. package/src/lib/ui/Callout.tsx +113 -113
  355. package/src/lib/ui/Card.tsx +95 -95
  356. package/src/lib/ui/Carousel.tsx +259 -259
  357. package/src/lib/ui/Checkbox.tsx +28 -28
  358. package/src/lib/ui/CodeBlock.tsx +92 -92
  359. package/src/lib/ui/CodeTabPanel.tsx +13 -13
  360. package/src/lib/ui/CodeTabs.tsx +161 -161
  361. package/src/lib/ui/Collapsible.tsx +31 -31
  362. package/src/lib/ui/Dialog.tsx +138 -138
  363. package/src/lib/ui/DismissibleAlert.tsx +74 -74
  364. package/src/lib/ui/Drawer.tsx +121 -121
  365. package/src/lib/ui/DropdownMenu.tsx +254 -254
  366. package/src/lib/ui/EmbeddedCodeBlock.tsx +99 -99
  367. package/src/lib/ui/Form.tsx +176 -176
  368. package/src/lib/ui/Frame.tsx +81 -81
  369. package/src/lib/ui/HoverCard.tsx +26 -26
  370. package/src/lib/ui/Input.tsx +23 -23
  371. package/src/lib/ui/InputGroup.tsx +168 -168
  372. package/src/lib/ui/Item.tsx +213 -213
  373. package/src/lib/ui/Kbd.tsx +28 -28
  374. package/src/lib/ui/Label.tsx +23 -23
  375. package/src/lib/ui/NativeSelect.tsx +48 -48
  376. package/src/lib/ui/NavigationMenu.tsx +169 -169
  377. package/src/lib/ui/Pagination.tsx +115 -115
  378. package/src/lib/ui/Popover.tsx +28 -28
  379. package/src/lib/ui/Progress.tsx +25 -25
  380. package/src/lib/ui/RadioGroup.tsx +41 -41
  381. package/src/lib/ui/ReactComponentDoc.tsx +68 -68
  382. package/src/lib/ui/ScrollArea.tsx +45 -45
  383. package/src/lib/ui/Secret.tsx +133 -133
  384. package/src/lib/ui/Select.tsx +184 -184
  385. package/src/lib/ui/Separator.tsx +25 -25
  386. package/src/lib/ui/Skeleton.tsx +15 -15
  387. package/src/lib/ui/Slider.tsx +25 -25
  388. package/src/lib/ui/Stepper.tsx +8 -8
  389. package/src/lib/ui/Switch.tsx +26 -26
  390. package/src/lib/ui/SyntaxHighlight.tsx +54 -54
  391. package/src/lib/ui/Tabs.tsx +52 -52
  392. package/src/lib/ui/Textarea.tsx +22 -22
  393. package/src/lib/ui/Toggle.tsx +42 -42
  394. package/src/lib/ui/ToggleGroup.tsx +58 -58
  395. package/src/lib/ui/Tooltip.tsx +65 -65
  396. package/src/lib/ui/Value.tsx +42 -42
  397. package/src/lib/ui/util.tsx +8 -8
  398. package/src/lib/util/cn.ts +6 -6
  399. package/src/lib/util/createVariantComponent.tsx +61 -61
  400. package/src/lib/util/ensureArray.ts +3 -3
  401. package/src/lib/util/flattenAllOf.ts +72 -72
  402. package/src/lib/util/flattenAllOfProcessor.ts +74 -74
  403. package/src/lib/util/hastToJsx.tsx +67 -67
  404. package/src/lib/util/humanFileSize.ts +15 -15
  405. package/src/lib/util/invariant.ts +52 -52
  406. package/src/lib/util/joinUrl.ts +60 -60
  407. package/src/lib/util/logInit.ts +9 -9
  408. package/src/lib/util/objectEntries.ts +5 -5
  409. package/src/lib/util/os.ts +18 -18
  410. package/src/lib/util/pastellize.ts +25 -25
  411. package/src/lib/util/problemJson.ts +63 -63
  412. package/src/lib/util/readFrontmatter.ts +14 -14
  413. package/src/lib/util/renderIf.ts +4 -4
  414. package/src/lib/util/scrollIntoViewIfNeeded.ts +18 -18
  415. package/src/lib/util/slugify.ts +21 -21
  416. package/src/lib/util/syncZustandState.ts +22 -22
  417. package/src/lib/util/traverse.ts +70 -70
  418. package/src/lib/util/types.ts +7 -7
  419. package/src/lib/util/url.ts +18 -18
  420. package/src/lib/util/useCopyToClipboard.ts +17 -17
  421. package/src/lib/util/useExposedProps.tsx +27 -27
  422. package/src/lib/util/useIsomorphicLayoutEffect.ts +6 -6
  423. package/src/lib/util/useLatest.ts +18 -18
  424. package/src/lib/util/useOnScreen.ts +34 -34
  425. package/src/lib/util/useScrollToAnchor.ts +70 -70
  426. package/src/lib/util/useScrollToTop.ts +18 -18
  427. package/src/types.d.ts +57 -53
  428. package/src/vite/api/SchemaManager.ts +371 -371
  429. package/src/vite/api/schema-codegen.ts +163 -163
  430. package/src/vite/config.ts +5 -1
  431. package/src/vite/css/collect.ts +42 -42
  432. package/src/vite/css/plugin.ts +105 -105
  433. package/src/vite/debug.ts +18 -18
  434. package/src/vite/dev-portal-env.ts +93 -0
  435. package/src/vite/html.ts +54 -54
  436. package/src/vite/index.ts +2 -2
  437. package/src/vite/mdx/rehype-extract-toc-with-jsx-export.ts +19 -19
  438. package/src/vite/mdx/rehype-extract-toc-with-jsx.ts +70 -70
  439. package/src/vite/mdx/remark-code-tabs.ts +47 -47
  440. package/src/vite/mdx/remark-inject-filepath.ts +13 -13
  441. package/src/vite/mdx/remark-last-modified.ts +103 -103
  442. package/src/vite/mdx/remark-link-rewrite.ts +23 -23
  443. package/src/vite/mdx/remark-normalize-image-url.ts +15 -15
  444. package/src/vite/mdx/remark-static-generation.ts +149 -149
  445. package/src/vite/mdx/utils.ts +32 -32
  446. package/src/vite/output.ts +261 -261
  447. package/src/vite/package-root.ts +12 -12
  448. package/src/vite/pagefind-dev-index.ts +100 -100
  449. package/src/vite/plugin-api-keys.ts +6 -1
  450. package/src/vite/plugin-api.ts +4 -1
  451. package/src/vite/plugin-auth.ts +5 -1
  452. package/src/vite/plugin-component.ts +1 -1
  453. package/src/vite/plugin-config-reload.ts +49 -49
  454. package/src/vite/plugin-doc-metadata.ts +45 -45
  455. package/src/vite/plugin-docs.ts +4 -1
  456. package/src/vite/plugin-metadata.ts +30 -30
  457. package/src/vite/plugin-modules.ts +144 -0
  458. package/src/vite/plugin-shiki-register.ts +97 -97
  459. package/src/vite/plugin-theme.ts +399 -399
  460. package/src/vite/plugin.ts +2 -0
  461. package/src/vite/prerender/utils.ts +76 -76
  462. package/src/vite/prerender/worker.ts +118 -118
  463. package/src/vite/reporter.ts +34 -34
  464. package/src/vite/shadcn-registry.ts +48 -48
  465. package/src/vite/sitemap.ts +78 -78
  466. package/src/vite/ssr-templates/cloudflare.ts +19 -19
  467. package/src/vite/ssr-templates/node.ts +25 -25
  468. package/src/vite/ssr-templates/vercel.ts +22 -22
  469. package/src/vite/zuplo.ts +30 -30
  470. package/src/vite-env.d.ts +6 -6
  471. package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -168
  472. package/src/zuplo/enrich-with-zuplo.ts +256 -256
  473. package/src/zuplo/policy-types.ts +46 -46
  474. package/src/zuplo/with-zuplo-processors.ts +36 -36
  475. package/src/zuplo/with-zuplo.ts +14 -14
  476. package/LICENSE.md +0 -18
  477. package/dist/declarations/lib/components/navigation/ZudokuLogo.d.ts +0 -6
@@ -13,6 +13,8 @@ import { getZudokuRootDir } from "../cli/common/package-json.js";
13
13
  import { runPluginTransformConfig } from "../lib/core/transform-config.js";
14
14
  import invariant from "../lib/util/invariant.js";
15
15
  import { fileExists } from "./file-exists.js";
16
+ import { resolveModulesConfig } from "./resolve-modules.js";
17
+ import type { ResolvedModulesConfig } from "./validators/ModulesSchema.js";
16
18
  import type { ZudokuConfig } from "./validators/ZudokuConfig.js";
17
19
  import { validateConfig } from "./validators/ZudokuConfig.js";
18
20
 
@@ -24,6 +26,7 @@ export type ConfigWithMeta = ZudokuConfig & {
24
26
  mode: typeof process.env.ZUDOKU_ENV;
25
27
  dependencies: string[];
26
28
  };
29
+ __resolvedModules: ResolvedModulesConfig;
27
30
  };
28
31
 
29
32
  let config: ConfigWithMeta | undefined;
@@ -108,6 +111,7 @@ async function loadZudokuConfigWithMeta(
108
111
  dependencies,
109
112
  configPath,
110
113
  },
114
+ __resolvedModules: resolveModulesConfig(config),
111
115
  };
112
116
 
113
117
  return configWithMetadata;
@@ -210,7 +214,11 @@ export async function loadZudokuConfig(
210
214
 
211
215
  try {
212
216
  const loadedConfig = await loadZudokuConfigWithMeta(rootDir);
213
- config = await runPluginTransformConfig(loadedConfig);
217
+ const transformedConfig = await runPluginTransformConfig(loadedConfig);
218
+ config = {
219
+ ...transformedConfig,
220
+ __resolvedModules: resolveModulesConfig(transformedConfig),
221
+ };
214
222
 
215
223
  if (!process.env.APITOGO_JSON_ONLY) {
216
224
  logger.info(
@@ -236,6 +244,7 @@ export async function loadZudokuConfig(
236
244
  }
237
245
 
238
246
  export const setStandaloneConfig = (rootDir: string) => {
247
+ const emptyConfig = {};
239
248
  config = {
240
249
  __meta: {
241
250
  rootDir,
@@ -244,5 +253,6 @@ export const setStandaloneConfig = (rootDir: string) => {
244
253
  dependencies: [],
245
254
  configPath: "",
246
255
  },
256
+ __resolvedModules: resolveModulesConfig(emptyConfig),
247
257
  };
248
258
  };
@@ -0,0 +1,260 @@
1
+ import {
2
+ type ResolvedModulesConfig,
3
+ ModulesSchema,
4
+ type LandingContentConfig,
5
+ type ResolvedLandingContent,
6
+ type DashboardContentConfig,
7
+ type ProfileContentConfig,
8
+ type PlansContentConfig,
9
+ type ResolvedDashboardContent,
10
+ type ResolvedProfileContent,
11
+ type ResolvedPlansContent,
12
+ } from "./validators/ModulesSchema.js";
13
+ import type { ZudokuConfig } from "./validators/ZudokuConfig.js";
14
+
15
+ const DEFAULT_DOCS_FILES = "/pages/**/*.{md,mdx}";
16
+
17
+ const hasExplicitModules = (config: ZudokuConfig) =>
18
+ config.modules !== undefined;
19
+
20
+ export const joinPanelPath = (basePath: string, routePath: string): string => {
21
+ if (routePath.startsWith("/")) {
22
+ return routePath.replace(/\/+$/, "") || "/";
23
+ }
24
+
25
+ const base = basePath.replace(/\/+$/, "");
26
+ const route = routePath.replace(/^\/+/, "");
27
+
28
+ if (!base) {
29
+ return `/${route}`;
30
+ }
31
+
32
+ return `/${`${base}/${route}`.replace(/^\/+/, "")}`;
33
+ };
34
+
35
+ const DEFAULT_LANDING_FEATURES: ResolvedLandingContent["features"] = [
36
+ {
37
+ title: "Documentation",
38
+ description:
39
+ "Write guides and references in Markdown or MDX with full navigation and search.",
40
+ },
41
+ {
42
+ title: "API Reference",
43
+ description:
44
+ "Publish interactive OpenAPI docs with a built-in playground and code samples.",
45
+ },
46
+ {
47
+ title: "Developer Portal",
48
+ description:
49
+ "Extend with landing pages, authentication, API keys, and subscription modules.",
50
+ },
51
+ ];
52
+
53
+ export const resolveLandingContent = (
54
+ config: ZudokuConfig,
55
+ content?: LandingContentConfig,
56
+ ): ResolvedLandingContent => {
57
+ const siteTitle =
58
+ config.metadata?.applicationName ?? config.site?.title ?? "APIToGo";
59
+
60
+ return {
61
+ hero: {
62
+ title: content?.hero?.title ?? siteTitle,
63
+ subtitle: content?.hero?.subtitle ?? "Developer portal",
64
+ description:
65
+ content?.hero?.description ??
66
+ config.metadata?.description ??
67
+ "Ship beautiful API documentation and developer experiences with APIToGo.",
68
+ },
69
+ features: content?.features ?? DEFAULT_LANDING_FEATURES,
70
+ primaryAction: content?.primaryAction ?? {
71
+ label: "Get started",
72
+ href: "/introduction",
73
+ },
74
+ secondaryAction: content?.secondaryAction ?? {
75
+ label: "API Reference",
76
+ href: "/api",
77
+ },
78
+ showPoweredBy: content?.showPoweredBy,
79
+ };
80
+ };
81
+
82
+ const DEFAULT_DASHBOARD_QUICK_LINKS: ResolvedDashboardContent["quickLinks"] = [
83
+ { label: "Documentation", href: "/introduction" },
84
+ { label: "API Reference", href: "/api" },
85
+ ];
86
+
87
+ export const resolveDashboardContent = (
88
+ content?: DashboardContentConfig,
89
+ ): ResolvedDashboardContent => ({
90
+ title: content?.title ?? "Dashboard",
91
+ subtitle: content?.subtitle ?? "Account",
92
+ description:
93
+ content?.description ??
94
+ "Overview of your account activity, documentation shortcuts, and next steps.",
95
+ quickLinks: content?.quickLinks ?? DEFAULT_DASHBOARD_QUICK_LINKS,
96
+ });
97
+
98
+ export const resolveProfileContent = (
99
+ content?: ProfileContentConfig,
100
+ ): ResolvedProfileContent => ({
101
+ title: content?.title ?? "Profile",
102
+ description:
103
+ content?.description ??
104
+ "View your account details and manage profile settings.",
105
+ });
106
+
107
+ export const resolvePlansContent = (
108
+ content?: PlansContentConfig,
109
+ ): ResolvedPlansContent => ({
110
+ title: content?.title ?? "Plans & billing",
111
+ description:
112
+ content?.description ??
113
+ "Manage subscription tiers, billing details, and usage limits.",
114
+ tiers: content?.tiers,
115
+ });
116
+
117
+ export const resolveModulesConfig = (
118
+ config: ZudokuConfig,
119
+ ): ResolvedModulesConfig => {
120
+ const parsedModules = ModulesSchema.parse(config.modules);
121
+ const modules = parsedModules ?? {};
122
+ const explicit = hasExplicitModules(config);
123
+
124
+ const docsModule = modules.docs;
125
+ const docsEnabled = explicit ? (docsModule?.enabled ?? true) : true;
126
+
127
+ const landingModule = modules.landing;
128
+ const landingEnabled = landingModule?.enabled ?? false;
129
+
130
+ const userPanelModule = modules.userPanel;
131
+ const dashboardConfig = userPanelModule?.dashboard;
132
+ const userManagementConfig = userPanelModule?.userManagement;
133
+ const apiKeysModuleConfig = userPanelModule?.apiKeys;
134
+ const plansConfig = userPanelModule?.plans;
135
+
136
+ const dashboardEnabled =
137
+ dashboardConfig?.enabled ?? (explicit ? false : false);
138
+
139
+ const userManagementEnabled = explicit
140
+ ? (userManagementConfig?.enabled ?? !!config.authentication)
141
+ : !!config.authentication;
142
+
143
+ const apiKeysEnabled = explicit
144
+ ? (apiKeysModuleConfig?.enabled ?? config.apiKeys?.enabled ?? false)
145
+ : (config.apiKeys?.enabled ?? false);
146
+
147
+ const plansEnabled = plansConfig?.enabled ?? false;
148
+
149
+ const userPanelEnabled =
150
+ userPanelModule?.enabled ??
151
+ (dashboardEnabled ||
152
+ userManagementEnabled ||
153
+ apiKeysEnabled ||
154
+ plansEnabled);
155
+
156
+ const basePath = userPanelModule?.basePath ?? "/account";
157
+
158
+ return {
159
+ docs: {
160
+ enabled: docsEnabled,
161
+ files: docsModule?.files ?? config.docs?.files,
162
+ publishMarkdown:
163
+ docsModule?.publishMarkdown ?? config.docs?.publishMarkdown,
164
+ defaultOptions: docsModule?.defaultOptions ?? config.docs?.defaultOptions,
165
+ llms: docsModule?.llms ?? config.docs?.llms,
166
+ },
167
+ landing: {
168
+ enabled: landingEnabled,
169
+ path: landingModule?.path ?? "/",
170
+ component: landingModule?.component,
171
+ layout: landingModule?.layout ?? "landing",
172
+ content: resolveLandingContent(config, landingModule?.content),
173
+ },
174
+ userPanel: {
175
+ enabled: userPanelEnabled,
176
+ basePath,
177
+ dashboard: {
178
+ enabled: dashboardEnabled,
179
+ path: joinPanelPath(basePath, dashboardConfig?.path ?? "dashboard"),
180
+ content: resolveDashboardContent(dashboardConfig?.content),
181
+ },
182
+ userManagement: {
183
+ enabled: userManagementEnabled,
184
+ routes: {
185
+ login: userManagementConfig?.routes?.login ?? "/signin",
186
+ register: userManagementConfig?.routes?.register ?? "/signup",
187
+ profile: joinPanelPath(
188
+ basePath,
189
+ userManagementConfig?.routes?.profile ?? "profile",
190
+ ),
191
+ logout: userManagementConfig?.routes?.logout ?? "/signout",
192
+ },
193
+ content: resolveProfileContent(userManagementConfig?.content),
194
+ },
195
+ apiKeys: {
196
+ enabled: apiKeysEnabled,
197
+ path: joinPanelPath(
198
+ basePath,
199
+ apiKeysModuleConfig?.path ?? "settings/api-keys",
200
+ ),
201
+ },
202
+ plans: {
203
+ enabled: plansEnabled,
204
+ path: joinPanelPath(basePath, plansConfig?.path ?? "plans"),
205
+ content: resolvePlansContent(plansConfig?.content),
206
+ },
207
+ },
208
+ };
209
+ };
210
+
211
+ export const getEffectiveRedirects = (
212
+ config: ZudokuConfig,
213
+ resolved: ResolvedModulesConfig,
214
+ ) => {
215
+ const redirects = config.redirects ?? [];
216
+
217
+ if (!resolved.landing.enabled) {
218
+ return redirects;
219
+ }
220
+
221
+ const landingPath = normalizePath(resolved.landing.path);
222
+
223
+ return redirects.filter(
224
+ (redirect) => normalizePath(redirect.from) !== landingPath,
225
+ );
226
+ };
227
+
228
+ const normalizePath = (path: string) => {
229
+ if (path === "/") {
230
+ return "/";
231
+ }
232
+
233
+ return path.replace(/\/+$/, "") || "/";
234
+ };
235
+
236
+ export const getEffectiveDocsConfig = (
237
+ config: ZudokuConfig,
238
+ resolved: ResolvedModulesConfig,
239
+ ) => {
240
+ if (!resolved.docs.enabled) {
241
+ return undefined;
242
+ }
243
+
244
+ return {
245
+ files: resolved.docs.files ?? config.docs?.files ?? [DEFAULT_DOCS_FILES],
246
+ publishMarkdown:
247
+ resolved.docs.publishMarkdown ?? config.docs?.publishMarkdown ?? false,
248
+ defaultOptions: resolved.docs.defaultOptions ?? config.docs?.defaultOptions,
249
+ llms: resolved.docs.llms ?? config.docs?.llms,
250
+ };
251
+ };
252
+
253
+ export const isDocsModuleEnabled = (config: ZudokuConfig) =>
254
+ resolveModulesConfig(config).docs.enabled;
255
+
256
+ export const isLandingModuleEnabled = (config: ZudokuConfig) =>
257
+ resolveModulesConfig(config).landing.enabled;
258
+
259
+ export const isUserPanelModuleEnabled = (config: ZudokuConfig) =>
260
+ resolveModulesConfig(config).userPanel.enabled;
@@ -1,95 +1,95 @@
1
- import path from "node:path";
2
- import type { PluggableList } from "unified";
3
- import { runnerImport } from "vite";
4
- import { z } from "zod";
5
- import type { OpenAPIDocument } from "../../lib/oas/graphql/index.js";
6
- import { fileExists } from "../file-exists.js";
7
- import { getCurrentConfig } from "../loader.js";
8
-
9
- // Schema for build processors
10
- export const BuildProcessorSchema = z.custom<
11
- (data: {
12
- file: string;
13
- schema: OpenAPIDocument;
14
- params: Record<string, string>;
15
- dereference: (schema: OpenAPIDocument) => Promise<OpenAPIDocument>;
16
- }) => OpenAPIDocument | Promise<OpenAPIDocument>
17
- >((val) => typeof val === "function");
18
-
19
- export type Processor = z.infer<typeof BuildProcessorSchema>;
20
- export type ProcessorArg = Parameters<Processor>[0];
21
-
22
- const PluginConfigSchema = z
23
- .custom<PluggableList>()
24
- .or(
25
- z.custom<(defaultPlugins: PluggableList) => PluggableList>(
26
- (val) => typeof val === "function",
27
- ),
28
- );
29
-
30
- export const BuildConfigSchema = z.object({
31
- processors: z.array(BuildProcessorSchema).optional(),
32
- remarkPlugins: PluginConfigSchema.optional(),
33
- rehypePlugins: PluginConfigSchema.optional(),
34
- prerender: z.object({ workers: z.number().optional() }).optional(),
35
- });
36
-
37
- const buildConfigFiles = [
38
- "apitogo.build.js",
39
- "apitogo.build.jsx",
40
- "apitogo.build.ts",
41
- "apitogo.build.tsx",
42
- "apitogo.build.mjs",
43
- "zudoku.build.js",
44
- "zudoku.build.jsx",
45
- "zudoku.build.ts",
46
- "zudoku.build.tsx",
47
- "zudoku.build.mjs",
48
- ];
49
-
50
- async function getBuildConfigFilePath(rootDir: string) {
51
- for (const fileName of buildConfigFiles) {
52
- const filepath = path.join(rootDir, fileName);
53
- if (await fileExists(filepath)) {
54
- return filepath;
55
- }
56
- }
57
- return undefined;
58
- }
59
-
60
- export const getBuildConfig = async () => {
61
- const initialConfig = getCurrentConfig();
62
- const buildFilePath = await getBuildConfigFilePath(
63
- initialConfig.__meta.rootDir,
64
- );
65
-
66
- if (!buildFilePath) return undefined;
67
-
68
- const buildModule = await runnerImport<{ default: BuildConfig }>(
69
- buildFilePath,
70
- ).then((m) => m.module.default);
71
-
72
- return validateBuildConfig(buildModule);
73
- };
74
-
75
- export type BuildConfig = z.infer<typeof BuildConfigSchema>;
76
-
77
- export function validateBuildConfig(config: unknown): BuildConfig | undefined {
78
- const validationResult = BuildConfigSchema.safeParse(config);
79
-
80
- if (!validationResult.success) {
81
- // In production (build mode), throw an error to fail the build
82
- if (process.env.NODE_ENV === "production") {
83
- throw new Error(z.prettifyError(validationResult.error));
84
- }
85
-
86
- // In development mode, log warnings but don't fail
87
- // biome-ignore lint/suspicious/noConsole: Logging allowed here
88
- console.warn("Build config validation errors:");
89
- // biome-ignore lint/suspicious/noConsole: Logging allowed here
90
- console.warn(z.prettifyError(validationResult.error));
91
- return;
92
- }
93
-
94
- return validationResult.data;
95
- }
1
+ import path from "node:path";
2
+ import type { PluggableList } from "unified";
3
+ import { runnerImport } from "vite";
4
+ import { z } from "zod";
5
+ import type { OpenAPIDocument } from "../../lib/oas/graphql/index.js";
6
+ import { fileExists } from "../file-exists.js";
7
+ import { getCurrentConfig } from "../loader.js";
8
+
9
+ // Schema for build processors
10
+ export const BuildProcessorSchema = z.custom<
11
+ (data: {
12
+ file: string;
13
+ schema: OpenAPIDocument;
14
+ params: Record<string, string>;
15
+ dereference: (schema: OpenAPIDocument) => Promise<OpenAPIDocument>;
16
+ }) => OpenAPIDocument | Promise<OpenAPIDocument>
17
+ >((val) => typeof val === "function");
18
+
19
+ export type Processor = z.infer<typeof BuildProcessorSchema>;
20
+ export type ProcessorArg = Parameters<Processor>[0];
21
+
22
+ const PluginConfigSchema = z
23
+ .custom<PluggableList>()
24
+ .or(
25
+ z.custom<(defaultPlugins: PluggableList) => PluggableList>(
26
+ (val) => typeof val === "function",
27
+ ),
28
+ );
29
+
30
+ export const BuildConfigSchema = z.object({
31
+ processors: z.array(BuildProcessorSchema).optional(),
32
+ remarkPlugins: PluginConfigSchema.optional(),
33
+ rehypePlugins: PluginConfigSchema.optional(),
34
+ prerender: z.object({ workers: z.number().optional() }).optional(),
35
+ });
36
+
37
+ const buildConfigFiles = [
38
+ "apitogo.build.js",
39
+ "apitogo.build.jsx",
40
+ "apitogo.build.ts",
41
+ "apitogo.build.tsx",
42
+ "apitogo.build.mjs",
43
+ "zudoku.build.js",
44
+ "zudoku.build.jsx",
45
+ "zudoku.build.ts",
46
+ "zudoku.build.tsx",
47
+ "zudoku.build.mjs",
48
+ ];
49
+
50
+ async function getBuildConfigFilePath(rootDir: string) {
51
+ for (const fileName of buildConfigFiles) {
52
+ const filepath = path.join(rootDir, fileName);
53
+ if (await fileExists(filepath)) {
54
+ return filepath;
55
+ }
56
+ }
57
+ return undefined;
58
+ }
59
+
60
+ export const getBuildConfig = async () => {
61
+ const initialConfig = getCurrentConfig();
62
+ const buildFilePath = await getBuildConfigFilePath(
63
+ initialConfig.__meta.rootDir,
64
+ );
65
+
66
+ if (!buildFilePath) return undefined;
67
+
68
+ const buildModule = await runnerImport<{ default: BuildConfig }>(
69
+ buildFilePath,
70
+ ).then((m) => m.module.default);
71
+
72
+ return validateBuildConfig(buildModule);
73
+ };
74
+
75
+ export type BuildConfig = z.infer<typeof BuildConfigSchema>;
76
+
77
+ export function validateBuildConfig(config: unknown): BuildConfig | undefined {
78
+ const validationResult = BuildConfigSchema.safeParse(config);
79
+
80
+ if (!validationResult.success) {
81
+ // In production (build mode), throw an error to fail the build
82
+ if (process.env.NODE_ENV === "production") {
83
+ throw new Error(z.prettifyError(validationResult.error));
84
+ }
85
+
86
+ // In development mode, log warnings but don't fail
87
+ // biome-ignore lint/suspicious/noConsole: Logging allowed here
88
+ console.warn("Build config validation errors:");
89
+ // biome-ignore lint/suspicious/noConsole: Logging allowed here
90
+ console.warn(z.prettifyError(validationResult.error));
91
+ return;
92
+ }
93
+
94
+ return validationResult.data;
95
+ }
@@ -1,41 +1,41 @@
1
- import { z } from "zod";
2
- import { IconNames } from "./icon-types.js";
3
-
4
- const IconSchema = z.enum(IconNames);
5
-
6
- const HeaderNavLinkItemSchema = z.object({
7
- label: z.string(),
8
- icon: IconSchema.optional(),
9
- description: z.string().optional(),
10
- to: z.string(),
11
- target: z.enum(["_self", "_blank"]).optional(),
12
- });
13
-
14
- const HeaderNavGroupSchema = z.object({
15
- label: z.string(),
16
- items: z.array(HeaderNavLinkItemSchema),
17
- });
18
-
19
- const HeaderNavItemSchema = z.union([
20
- z.object({
21
- label: z.string(),
22
- icon: IconSchema.optional(),
23
- to: z.string(),
24
- target: z.enum(["_self", "_blank"]).optional(),
25
- }),
26
- z.object({
27
- label: z.string(),
28
- items: z.array(z.union([HeaderNavLinkItemSchema, HeaderNavGroupSchema])),
29
- }),
30
- ]);
31
-
32
- export const HeaderNavigationSchema = z.array(HeaderNavItemSchema);
33
-
34
- export const isHeaderNavGroup = (
35
- item: HeaderNavItem | HeaderNavLinkItem | HeaderNavGroup,
36
- ): item is HeaderNavGroup => "items" in item;
37
-
38
- export type HeaderNavLinkItem = z.infer<typeof HeaderNavLinkItemSchema>;
39
- export type HeaderNavGroup = z.infer<typeof HeaderNavGroupSchema>;
40
- export type HeaderNavItem = z.infer<typeof HeaderNavItemSchema>;
41
- export type HeaderNavigation = z.infer<typeof HeaderNavigationSchema>;
1
+ import { z } from "zod";
2
+ import { IconNames } from "./icon-types.js";
3
+
4
+ const IconSchema = z.enum(IconNames);
5
+
6
+ const HeaderNavLinkItemSchema = z.object({
7
+ label: z.string(),
8
+ icon: IconSchema.optional(),
9
+ description: z.string().optional(),
10
+ to: z.string(),
11
+ target: z.enum(["_self", "_blank"]).optional(),
12
+ });
13
+
14
+ const HeaderNavGroupSchema = z.object({
15
+ label: z.string(),
16
+ items: z.array(HeaderNavLinkItemSchema),
17
+ });
18
+
19
+ const HeaderNavItemSchema = z.union([
20
+ z.object({
21
+ label: z.string(),
22
+ icon: IconSchema.optional(),
23
+ to: z.string(),
24
+ target: z.enum(["_self", "_blank"]).optional(),
25
+ }),
26
+ z.object({
27
+ label: z.string(),
28
+ items: z.array(z.union([HeaderNavLinkItemSchema, HeaderNavGroupSchema])),
29
+ }),
30
+ ]);
31
+
32
+ export const HeaderNavigationSchema = z.array(HeaderNavItemSchema);
33
+
34
+ export const isHeaderNavGroup = (
35
+ item: HeaderNavItem | HeaderNavLinkItem | HeaderNavGroup,
36
+ ): item is HeaderNavGroup => "items" in item;
37
+
38
+ export type HeaderNavLinkItem = z.infer<typeof HeaderNavLinkItemSchema>;
39
+ export type HeaderNavGroup = z.infer<typeof HeaderNavGroupSchema>;
40
+ export type HeaderNavItem = z.infer<typeof HeaderNavItemSchema>;
41
+ export type HeaderNavigation = z.infer<typeof HeaderNavigationSchema>;