@lukoweb/apitogo 0.1.23 → 0.1.37

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
@@ -1,163 +1,163 @@
1
- import { type RecordAny, traverse } from "../../lib/util/traverse.js";
2
-
3
- const unescapeJsonPointer = (uri: string) =>
4
- decodeURIComponent(uri.replace(/~1/g, "/").replace(/~0/g, "~"));
5
-
6
- const getSegmentsFromPath = (path: string) =>
7
- path.split("/").slice(1).map(unescapeJsonPointer);
8
-
9
- // Find all $ref occurrences in the schema and assign them unique variable names
10
- const createLocalRefMap = (obj: RecordAny) => {
11
- const refMap = new Map<string, number>();
12
- const siblingsMap = new Map<
13
- string,
14
- { refPath: string; siblings: RecordAny }
15
- >();
16
-
17
- traverse(obj, (node) => {
18
- if (typeof node.$ref === "string" && node.$ref.startsWith("#/")) {
19
- if (!refMap.has(node.$ref)) {
20
- refMap.set(node.$ref, refMap.size);
21
- }
22
-
23
- const { $ref, ...siblings } = node;
24
-
25
- if (Object.keys(siblings).length > 0) {
26
- const uniqueKey = `${$ref}__${siblingsMap.size}`;
27
- siblingsMap.set(uniqueKey, { refPath: $ref, siblings });
28
- node.__uniqueRefKey = uniqueKey;
29
- }
30
- }
31
- return node;
32
- });
33
-
34
- return { refMap, siblingsMap };
35
- };
36
-
37
- // Replace $ref nodes with markers that become JS variable references
38
- const setRefMarkers = (obj: RecordAny, refMap: Map<string, number>) =>
39
- traverse(obj, (node) => {
40
- const { $ref, __uniqueRefKey } = node;
41
- if (typeof $ref === "string" && refMap.has($ref)) {
42
- return __uniqueRefKey
43
- ? `__refMap+Siblings:${__uniqueRefKey}`
44
- : `__refMap:${$ref}`;
45
- }
46
- return node;
47
- });
48
-
49
- // Replace ref markers in generated code with actual variable references
50
- const replaceMarkers = (code: string, mergedRefs: Map<string, string>) =>
51
- code
52
- .replace(/"__refMap:(.*?)"/g, '__refMap["$1"]')
53
- .replace(
54
- /"__refMap\+Siblings:(.*?)"/g,
55
- (_, key) => mergedRefs.get(key) ?? `__refMap["${key}"]`,
56
- );
57
-
58
- const lookup = (
59
- schema: RecordAny,
60
- path: string,
61
- filePath?: string,
62
- ): RecordAny => {
63
- const parts = getSegmentsFromPath(path);
64
- let val = schema;
65
-
66
- for (const part of parts) {
67
- while (val.$ref?.startsWith("#/")) {
68
- val = val.$ref === path ? val : lookup(schema, val.$ref, filePath);
69
- }
70
-
71
- if (val[part] === undefined) {
72
- throw new Error(
73
- `Error in ${filePath ?? "code generation"}: Could not find path segment ${part} in path: ${path}`,
74
- );
75
- }
76
-
77
- val = val[part];
78
- }
79
-
80
- return val;
81
- };
82
-
83
- const stringify = (obj: unknown, indent = 2) =>
84
- JSON.stringify(obj, null, indent);
85
-
86
- /**
87
- * Generate JavaScript code that exports the schema with all references resolved as variables.
88
- *
89
- * Handles circular references by:
90
- * 1. Creating empty objects first to establish the references
91
- * 2. Adding these objects to the reference map
92
- * 3. Using Object.assign to populate their properties later
93
- *
94
- * This ensures object identity throughout the circular references.
95
- */
96
- export const generateCode = (schema: RecordAny, filePath?: string) => {
97
- const { refMap, siblingsMap } = createLocalRefMap(schema);
98
- const lines: string[] = [];
99
-
100
- lines.push(
101
- `const __refs = Array.from({ length: ${refMap.size} }, () => ({}));`,
102
- "const __refMap = {",
103
- Array.from(refMap)
104
- .map(([refPath, index]) => ` "${refPath}": __refs[${index}]`)
105
- .join(",\n"),
106
- "};",
107
- "const __refMapPaths = Object.keys(__refMap);",
108
- );
109
-
110
- // Pre-declare merged ref variables as empty objects so they can be referenced
111
- // during base ref population (they get populated after)
112
- const mergedRefs = new Map<string, string>();
113
-
114
- for (const uniqueKey of siblingsMap.keys()) {
115
- const varName = `__merged_${mergedRefs.size}`;
116
- mergedRefs.set(uniqueKey, varName);
117
- lines.push(`const ${varName} = {};`);
118
- }
119
-
120
- const toCode = (obj: RecordAny) =>
121
- replaceMarkers(stringify(setRefMarkers(obj, refMap)), mergedRefs);
122
-
123
- // Pass 1: Populate all base refs. Bare $ref+siblings aliases are deferred
124
- // until all regular base refs are populated (ordering is DFS-dependent).
125
- const deferred: string[] = [];
126
- for (const [refPath, index] of refMap) {
127
- const value = lookup(schema, refPath, filePath);
128
-
129
- if (!value) {
130
- // biome-ignore lint/suspicious/noConsole: Logging allowed here
131
- console.warn(`Could not find value for refPath: ${refPath}`);
132
- continue;
133
- }
134
-
135
- const siblingEntry =
136
- value.__uniqueRefKey && siblingsMap.get(value.__uniqueRefKey);
137
- const target = siblingEntry ? deferred : lines;
138
-
139
- target.push(
140
- siblingEntry
141
- ? `Object.assign(__refs[${index}], __refMap["${siblingEntry.refPath}"], ${stringify(siblingEntry.siblings)});`
142
- : `Object.assign(__refs[${index}], ${toCode(value)});`,
143
- `Object.defineProperty(__refs[${index}], "__$ref", { value: __refMapPaths[${index}], enumerable: false });`,
144
- );
145
- }
146
- lines.push(...deferred);
147
-
148
- // Pass 2: Populate merged objects (refs with sibling overrides like description)
149
- for (const [uniqueKey, { refPath, siblings }] of siblingsMap) {
150
- const varName = mergedRefs.get(uniqueKey);
151
- const refIndex = refMap.get(refPath);
152
- lines.push(
153
- `Object.assign(${varName}, __refMap["${refPath}"], ${stringify(siblings)});`,
154
- `Object.defineProperty(${varName}, "__$ref", { value: __refMapPaths[${refIndex}], enumerable: false });`,
155
- );
156
- }
157
-
158
- const finalCode = toCode(schema);
159
-
160
- lines.push(`export const schema = ${finalCode};`);
161
-
162
- return lines.join("\n");
163
- };
1
+ import { type RecordAny, traverse } from "../../lib/util/traverse.js";
2
+
3
+ const unescapeJsonPointer = (uri: string) =>
4
+ decodeURIComponent(uri.replace(/~1/g, "/").replace(/~0/g, "~"));
5
+
6
+ const getSegmentsFromPath = (path: string) =>
7
+ path.split("/").slice(1).map(unescapeJsonPointer);
8
+
9
+ // Find all $ref occurrences in the schema and assign them unique variable names
10
+ const createLocalRefMap = (obj: RecordAny) => {
11
+ const refMap = new Map<string, number>();
12
+ const siblingsMap = new Map<
13
+ string,
14
+ { refPath: string; siblings: RecordAny }
15
+ >();
16
+
17
+ traverse(obj, (node) => {
18
+ if (typeof node.$ref === "string" && node.$ref.startsWith("#/")) {
19
+ if (!refMap.has(node.$ref)) {
20
+ refMap.set(node.$ref, refMap.size);
21
+ }
22
+
23
+ const { $ref, ...siblings } = node;
24
+
25
+ if (Object.keys(siblings).length > 0) {
26
+ const uniqueKey = `${$ref}__${siblingsMap.size}`;
27
+ siblingsMap.set(uniqueKey, { refPath: $ref, siblings });
28
+ node.__uniqueRefKey = uniqueKey;
29
+ }
30
+ }
31
+ return node;
32
+ });
33
+
34
+ return { refMap, siblingsMap };
35
+ };
36
+
37
+ // Replace $ref nodes with markers that become JS variable references
38
+ const setRefMarkers = (obj: RecordAny, refMap: Map<string, number>) =>
39
+ traverse(obj, (node) => {
40
+ const { $ref, __uniqueRefKey } = node;
41
+ if (typeof $ref === "string" && refMap.has($ref)) {
42
+ return __uniqueRefKey
43
+ ? `__refMap+Siblings:${__uniqueRefKey}`
44
+ : `__refMap:${$ref}`;
45
+ }
46
+ return node;
47
+ });
48
+
49
+ // Replace ref markers in generated code with actual variable references
50
+ const replaceMarkers = (code: string, mergedRefs: Map<string, string>) =>
51
+ code
52
+ .replace(/"__refMap:(.*?)"/g, '__refMap["$1"]')
53
+ .replace(
54
+ /"__refMap\+Siblings:(.*?)"/g,
55
+ (_, key) => mergedRefs.get(key) ?? `__refMap["${key}"]`,
56
+ );
57
+
58
+ const lookup = (
59
+ schema: RecordAny,
60
+ path: string,
61
+ filePath?: string,
62
+ ): RecordAny => {
63
+ const parts = getSegmentsFromPath(path);
64
+ let val = schema;
65
+
66
+ for (const part of parts) {
67
+ while (val.$ref?.startsWith("#/")) {
68
+ val = val.$ref === path ? val : lookup(schema, val.$ref, filePath);
69
+ }
70
+
71
+ if (val[part] === undefined) {
72
+ throw new Error(
73
+ `Error in ${filePath ?? "code generation"}: Could not find path segment ${part} in path: ${path}`,
74
+ );
75
+ }
76
+
77
+ val = val[part];
78
+ }
79
+
80
+ return val;
81
+ };
82
+
83
+ const stringify = (obj: unknown, indent = 2) =>
84
+ JSON.stringify(obj, null, indent);
85
+
86
+ /**
87
+ * Generate JavaScript code that exports the schema with all references resolved as variables.
88
+ *
89
+ * Handles circular references by:
90
+ * 1. Creating empty objects first to establish the references
91
+ * 2. Adding these objects to the reference map
92
+ * 3. Using Object.assign to populate their properties later
93
+ *
94
+ * This ensures object identity throughout the circular references.
95
+ */
96
+ export const generateCode = (schema: RecordAny, filePath?: string) => {
97
+ const { refMap, siblingsMap } = createLocalRefMap(schema);
98
+ const lines: string[] = [];
99
+
100
+ lines.push(
101
+ `const __refs = Array.from({ length: ${refMap.size} }, () => ({}));`,
102
+ "const __refMap = {",
103
+ Array.from(refMap)
104
+ .map(([refPath, index]) => ` "${refPath}": __refs[${index}]`)
105
+ .join(",\n"),
106
+ "};",
107
+ "const __refMapPaths = Object.keys(__refMap);",
108
+ );
109
+
110
+ // Pre-declare merged ref variables as empty objects so they can be referenced
111
+ // during base ref population (they get populated after)
112
+ const mergedRefs = new Map<string, string>();
113
+
114
+ for (const uniqueKey of siblingsMap.keys()) {
115
+ const varName = `__merged_${mergedRefs.size}`;
116
+ mergedRefs.set(uniqueKey, varName);
117
+ lines.push(`const ${varName} = {};`);
118
+ }
119
+
120
+ const toCode = (obj: RecordAny) =>
121
+ replaceMarkers(stringify(setRefMarkers(obj, refMap)), mergedRefs);
122
+
123
+ // Pass 1: Populate all base refs. Bare $ref+siblings aliases are deferred
124
+ // until all regular base refs are populated (ordering is DFS-dependent).
125
+ const deferred: string[] = [];
126
+ for (const [refPath, index] of refMap) {
127
+ const value = lookup(schema, refPath, filePath);
128
+
129
+ if (!value) {
130
+ // biome-ignore lint/suspicious/noConsole: Logging allowed here
131
+ console.warn(`Could not find value for refPath: ${refPath}`);
132
+ continue;
133
+ }
134
+
135
+ const siblingEntry =
136
+ value.__uniqueRefKey && siblingsMap.get(value.__uniqueRefKey);
137
+ const target = siblingEntry ? deferred : lines;
138
+
139
+ target.push(
140
+ siblingEntry
141
+ ? `Object.assign(__refs[${index}], __refMap["${siblingEntry.refPath}"], ${stringify(siblingEntry.siblings)});`
142
+ : `Object.assign(__refs[${index}], ${toCode(value)});`,
143
+ `Object.defineProperty(__refs[${index}], "__$ref", { value: __refMapPaths[${index}], enumerable: false });`,
144
+ );
145
+ }
146
+ lines.push(...deferred);
147
+
148
+ // Pass 2: Populate merged objects (refs with sibling overrides like description)
149
+ for (const [uniqueKey, { refPath, siblings }] of siblingsMap) {
150
+ const varName = mergedRefs.get(uniqueKey);
151
+ const refIndex = refMap.get(refPath);
152
+ lines.push(
153
+ `Object.assign(${varName}, __refMap["${refPath}"], ${stringify(siblings)});`,
154
+ `Object.defineProperty(${varName}, "__$ref", { value: __refMapPaths[${refIndex}], enumerable: false });`,
155
+ );
156
+ }
157
+
158
+ const finalCode = toCode(schema);
159
+
160
+ lines.push(`export const schema = ${finalCode};`);
161
+
162
+ return lines.join("\n");
163
+ };
@@ -15,8 +15,9 @@ import { getZudokuRootDir } from "../cli/common/package-json.js";
15
15
  import { loadZudokuConfig } from "../config/loader.js";
16
16
  import { CdnUrlSchema } from "../config/validators/ZudokuConfig.js";
17
17
  import { joinUrl } from "../lib/util/joinUrl.js";
18
- import { ensurePagefindDevStub } from "./pagefind-dev-stub.js";
18
+ import { loadDevPortalViteDefines } from "./dev-portal-env.js";
19
19
  import { findPackageRoot } from "./package-root.js";
20
+ import { ensurePagefindDevStub } from "./pagefind-dev-stub.js";
20
21
  import vitePlugin from "./plugin.js";
21
22
  import { getZuploSystemConfigurations } from "./zuplo.js";
22
23
 
@@ -96,6 +97,8 @@ export async function getViteConfig(
96
97
  getZuploSystemConfigurations(process.env.ZUPLO_SYSTEM_CONFIGURATIONS)
97
98
  ?.__ZUPLO_DEPLOYMENT_NAME;
98
99
 
100
+ const devPortalDefines = await loadDevPortalViteDefines(dir, configEnv.mode);
101
+
99
102
  const viteConfig: InlineConfig = {
100
103
  root: dir,
101
104
  base,
@@ -126,6 +129,7 @@ export async function getViteConfig(
126
129
  "ZUPLO_GATEWAY_SERVICE_URL",
127
130
  ]),
128
131
  ...publicVarsProcessEnvDefine,
132
+ ...devPortalDefines,
129
133
  },
130
134
  ssr: {
131
135
  target: "node",
@@ -1,42 +1,42 @@
1
- import { type DevEnvironment, isCSSRequest } from "vite";
2
-
3
- export async function collectStyle(
4
- server: DevEnvironment,
5
- entries: string[],
6
- cssModuleMap: Map<string, string>,
7
- ) {
8
- const urls = await collectStyleUrls(server, entries);
9
-
10
- return urls.map((url) => cssModuleMap.get(url) ?? "").join("\n");
11
- }
12
-
13
- async function collectStyleUrls(
14
- server: DevEnvironment,
15
- entries: string[],
16
- ): Promise<string[]> {
17
- const visited = new Set<string>();
18
-
19
- async function traverse(url: string) {
20
- const [, id] = await server.moduleGraph.resolveUrl(url);
21
- if (visited.has(id)) {
22
- return;
23
- }
24
- visited.add(id);
25
- const mod = server.moduleGraph.getModuleById(id);
26
- if (!mod) {
27
- return;
28
- }
29
- await Promise.all(
30
- [...mod.importedModules].map((childMod) => traverse(childMod.url)),
31
- );
32
- }
33
-
34
- // ensure vite's import analysis is ready _only_ for top entries to not go too aggresive
35
- await Promise.all(entries.map((e) => server.transformRequest(e)));
36
-
37
- // traverse
38
- await Promise.all(entries.map((url) => traverse(url)));
39
-
40
- // filter
41
- return [...visited].filter((url) => isCSSRequest(url));
42
- }
1
+ import { type DevEnvironment, isCSSRequest } from "vite";
2
+
3
+ export async function collectStyle(
4
+ server: DevEnvironment,
5
+ entries: string[],
6
+ cssModuleMap: Map<string, string>,
7
+ ) {
8
+ const urls = await collectStyleUrls(server, entries);
9
+
10
+ return urls.map((url) => cssModuleMap.get(url) ?? "").join("\n");
11
+ }
12
+
13
+ async function collectStyleUrls(
14
+ server: DevEnvironment,
15
+ entries: string[],
16
+ ): Promise<string[]> {
17
+ const visited = new Set<string>();
18
+
19
+ async function traverse(url: string) {
20
+ const [, id] = await server.moduleGraph.resolveUrl(url);
21
+ if (visited.has(id)) {
22
+ return;
23
+ }
24
+ visited.add(id);
25
+ const mod = server.moduleGraph.getModuleById(id);
26
+ if (!mod) {
27
+ return;
28
+ }
29
+ await Promise.all(
30
+ [...mod.importedModules].map((childMod) => traverse(childMod.url)),
31
+ );
32
+ }
33
+
34
+ // ensure vite's import analysis is ready _only_ for top entries to not go too aggresive
35
+ await Promise.all(entries.map((e) => server.transformRequest(e)));
36
+
37
+ // traverse
38
+ await Promise.all(entries.map((url) => traverse(url)));
39
+
40
+ // filter
41
+ return [...visited].filter((url) => isCSSRequest(url));
42
+ }
@@ -1,105 +1,105 @@
1
- // Taken and adapted from
2
- // https://github.com/hi-ogawa/vite-plugins/tree/main/packages/ssr-css
3
- import path from "node:path";
4
- import { type DevEnvironment, isCSSRequest, type Plugin } from "vite";
5
- import { getCurrentConfig } from "../../config/loader.js";
6
- import { virtualModuleId as THEME_VIRTUAL_MODULE } from "../plugin-theme.js";
7
- import { collectStyle } from "./collect.js";
8
-
9
- const VIRTUAL_ENTRY = "virtual:ssr-css.css";
10
-
11
- export function vitePluginSsrCss(pluginOpts: { entries: string[] }): Plugin {
12
- let server: DevEnvironment;
13
-
14
- const config = getCurrentConfig();
15
-
16
- const virtualHref = path.join(
17
- config.basePath ?? "",
18
- `/@id/__x00__${VIRTUAL_ENTRY}?direct`,
19
- );
20
- const cssModuleMap = new Map<string, string>();
21
-
22
- return {
23
- name: "zudoku-ssr-css",
24
- apply: "serve",
25
- configureServer(server_) {
26
- server = server_.environments.ssr;
27
-
28
- // invalidate virtual modules for each inline request
29
- server_.middlewares.use((req, _res, next) => {
30
- if (req.url === virtualHref) {
31
- invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
32
- }
33
- next();
34
- });
35
-
36
- // Clear CSS cache when config files change
37
- server_.watcher.on("change", (file) => {
38
- const currentConfig = getCurrentConfig();
39
- if (
40
- currentConfig.__meta.dependencies.includes(file) ||
41
- file === currentConfig.__meta.configPath
42
- ) {
43
- cssModuleMap.clear();
44
- invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
45
- invalidateModule(server, `\0${THEME_VIRTUAL_MODULE}`);
46
- }
47
- });
48
- },
49
-
50
- resolveId(id) {
51
- return id.startsWith(VIRTUAL_ENTRY) ? `\0${id}` : undefined;
52
- },
53
- transform(code, id) {
54
- if (!isCSSRequest(id)) return;
55
-
56
- cssModuleMap.set(id, code);
57
- },
58
- async load(id) {
59
- if (!id.startsWith(`\0${VIRTUAL_ENTRY}`)) return;
60
-
61
- const url = new URL(id.slice(1), "https://test.local");
62
- let code = await collectStyle(server, pluginOpts.entries, cssModuleMap);
63
- if (!url.searchParams.has("direct")) {
64
- code = `export default ${JSON.stringify(code)};`;
65
- }
66
- return code;
67
- },
68
-
69
- // also expose via transformIndexHtml
70
- transformIndexHtml: {
71
- handler: async () => {
72
- return [
73
- {
74
- tag: "link",
75
- injectTo: "head",
76
- attrs: {
77
- rel: "stylesheet",
78
- href: virtualHref,
79
- "data-ssr-css": true,
80
- },
81
- },
82
- {
83
- tag: "script",
84
- injectTo: "head",
85
- attrs: { type: "module" },
86
- children: `
87
- import { createHotContext } from "/@vite/client";
88
- const hot = createHotContext("/__clear_ssr_css");
89
- hot.on("vite:afterUpdate", () => {
90
- document.querySelectorAll("[data-ssr-css]").forEach(node => node.remove());
91
- });
92
- `,
93
- },
94
- ];
95
- },
96
- },
97
- };
98
- }
99
-
100
- function invalidateModule(server: DevEnvironment, id: string) {
101
- const mod = server.moduleGraph.getModuleById(id);
102
- if (mod) {
103
- server.moduleGraph.invalidateModule(mod);
104
- }
105
- }
1
+ // Taken and adapted from
2
+ // https://github.com/hi-ogawa/vite-plugins/tree/main/packages/ssr-css
3
+ import path from "node:path";
4
+ import { type DevEnvironment, isCSSRequest, type Plugin } from "vite";
5
+ import { getCurrentConfig } from "../../config/loader.js";
6
+ import { virtualModuleId as THEME_VIRTUAL_MODULE } from "../plugin-theme.js";
7
+ import { collectStyle } from "./collect.js";
8
+
9
+ const VIRTUAL_ENTRY = "virtual:ssr-css.css";
10
+
11
+ export function vitePluginSsrCss(pluginOpts: { entries: string[] }): Plugin {
12
+ let server: DevEnvironment;
13
+
14
+ const config = getCurrentConfig();
15
+
16
+ const virtualHref = path.join(
17
+ config.basePath ?? "",
18
+ `/@id/__x00__${VIRTUAL_ENTRY}?direct`,
19
+ );
20
+ const cssModuleMap = new Map<string, string>();
21
+
22
+ return {
23
+ name: "zudoku-ssr-css",
24
+ apply: "serve",
25
+ configureServer(server_) {
26
+ server = server_.environments.ssr;
27
+
28
+ // invalidate virtual modules for each inline request
29
+ server_.middlewares.use((req, _res, next) => {
30
+ if (req.url === virtualHref) {
31
+ invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
32
+ }
33
+ next();
34
+ });
35
+
36
+ // Clear CSS cache when config files change
37
+ server_.watcher.on("change", (file) => {
38
+ const currentConfig = getCurrentConfig();
39
+ if (
40
+ currentConfig.__meta.dependencies.includes(file) ||
41
+ file === currentConfig.__meta.configPath
42
+ ) {
43
+ cssModuleMap.clear();
44
+ invalidateModule(server, `\0${VIRTUAL_ENTRY}?direct`);
45
+ invalidateModule(server, `\0${THEME_VIRTUAL_MODULE}`);
46
+ }
47
+ });
48
+ },
49
+
50
+ resolveId(id) {
51
+ return id.startsWith(VIRTUAL_ENTRY) ? `\0${id}` : undefined;
52
+ },
53
+ transform(code, id) {
54
+ if (!isCSSRequest(id)) return;
55
+
56
+ cssModuleMap.set(id, code);
57
+ },
58
+ async load(id) {
59
+ if (!id.startsWith(`\0${VIRTUAL_ENTRY}`)) return;
60
+
61
+ const url = new URL(id.slice(1), "https://test.local");
62
+ let code = await collectStyle(server, pluginOpts.entries, cssModuleMap);
63
+ if (!url.searchParams.has("direct")) {
64
+ code = `export default ${JSON.stringify(code)};`;
65
+ }
66
+ return code;
67
+ },
68
+
69
+ // also expose via transformIndexHtml
70
+ transformIndexHtml: {
71
+ handler: async () => {
72
+ return [
73
+ {
74
+ tag: "link",
75
+ injectTo: "head",
76
+ attrs: {
77
+ rel: "stylesheet",
78
+ href: virtualHref,
79
+ "data-ssr-css": true,
80
+ },
81
+ },
82
+ {
83
+ tag: "script",
84
+ injectTo: "head",
85
+ attrs: { type: "module" },
86
+ children: `
87
+ import { createHotContext } from "/@vite/client";
88
+ const hot = createHotContext("/__clear_ssr_css");
89
+ hot.on("vite:afterUpdate", () => {
90
+ document.querySelectorAll("[data-ssr-css]").forEach(node => node.remove());
91
+ });
92
+ `,
93
+ },
94
+ ];
95
+ },
96
+ },
97
+ };
98
+ }
99
+
100
+ function invalidateModule(server: DevEnvironment, id: string) {
101
+ const mod = server.moduleGraph.getModuleById(id);
102
+ if (mod) {
103
+ server.moduleGraph.invalidateModule(mod);
104
+ }
105
+ }