@lukoweb/apitogo 0.2.23 → 0.2.25

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 (599) hide show
  1. package/README.md +94 -94
  2. package/cli.js +13 -13
  3. package/client.d.ts +8 -8
  4. package/dist/cli/cli.js +318 -20
  5. package/dist/declarations/cli/platform/client/platform-api.d.ts +18 -0
  6. package/dist/declarations/config/validators/InputNavigationSchema.d.ts +7 -7
  7. package/dist/declarations/config/validators/ZudokuConfig.d.ts +1 -1
  8. package/docs/cli/commands.md +75 -75
  9. package/docs/cli/go-live.md +123 -123
  10. package/docs/cli/overview.md +91 -91
  11. package/docs/cli/setup.md +141 -141
  12. package/docs/cli/shape.md +127 -127
  13. package/docs/components/alert.mdx +130 -130
  14. package/docs/components/badge.mdx +70 -70
  15. package/docs/components/button.mdx +132 -132
  16. package/docs/components/callout.mdx +112 -112
  17. package/docs/components/card.mdx +104 -104
  18. package/docs/components/checkbox.mdx +72 -72
  19. package/docs/components/client-only.mdx +79 -79
  20. package/docs/components/code-tabs.mdx +179 -179
  21. package/docs/components/dialog.mdx +167 -167
  22. package/docs/components/head.mdx +200 -200
  23. package/docs/components/icons.mdx +27 -27
  24. package/docs/components/input.mdx +96 -96
  25. package/docs/components/label.mdx +86 -86
  26. package/docs/components/link.mdx +242 -242
  27. package/docs/components/markdown.mdx +151 -151
  28. package/docs/components/mermaid.mdx +81 -81
  29. package/docs/components/playground.mdx +85 -85
  30. package/docs/components/secret.mdx +79 -79
  31. package/docs/components/select.mdx +176 -176
  32. package/docs/components/shadcn.mdx +73 -73
  33. package/docs/components/slider.mdx +108 -108
  34. package/docs/components/slot.mdx +119 -119
  35. package/docs/components/stepper.mdx +138 -138
  36. package/docs/components/switch.mdx +96 -96
  37. package/docs/components/syntax-highlight.mdx +602 -602
  38. package/docs/components/textarea.mdx +78 -78
  39. package/docs/components/tooltip.mdx +195 -195
  40. package/docs/components/typography.mdx +61 -61
  41. package/docs/components.mdx +60 -60
  42. package/docs/concepts/auth-provider-api-identities.md +105 -105
  43. package/docs/configuration/ai-assistants.md +65 -65
  44. package/docs/configuration/api-catalog.md +109 -109
  45. package/docs/configuration/api-reference.md +397 -397
  46. package/docs/configuration/authentication-auth0.md +181 -181
  47. package/docs/configuration/authentication-azure-ad.md +245 -245
  48. package/docs/configuration/authentication-clerk.md +117 -117
  49. package/docs/configuration/authentication-firebase.md +69 -69
  50. package/docs/configuration/authentication-pingfederate.md +143 -143
  51. package/docs/configuration/authentication-supabase.md +233 -233
  52. package/docs/configuration/authentication.md +159 -159
  53. package/docs/configuration/build-configuration.mdx +147 -147
  54. package/docs/configuration/docs.md +282 -282
  55. package/docs/configuration/footer.mdx +118 -118
  56. package/docs/configuration/gateway.md +221 -221
  57. package/docs/configuration/llms.md +90 -90
  58. package/docs/configuration/make-config.mdx +124 -124
  59. package/docs/configuration/manifest.md +128 -128
  60. package/docs/configuration/navigation.mdx +421 -421
  61. package/docs/configuration/overview.md +166 -166
  62. package/docs/configuration/plans.md +153 -153
  63. package/docs/configuration/protected-routes.md +150 -150
  64. package/docs/configuration/search.md +164 -164
  65. package/docs/configuration/sentry.mdx +44 -44
  66. package/docs/configuration/site.md +124 -124
  67. package/docs/configuration/slots.mdx +125 -125
  68. package/docs/configuration/vite-config.md +18 -18
  69. package/docs/custom-plugins.md +285 -285
  70. package/docs/customization/colors-theme.mdx +278 -278
  71. package/docs/customization/fonts.md +110 -110
  72. package/docs/customization/landing-page.md +188 -188
  73. package/docs/deploy/apache-nginx.md +41 -41
  74. package/docs/deploy/apitogo.md +17 -17
  75. package/docs/deploy/cloudflare-pages.md +74 -74
  76. package/docs/deploy/direct-upload.md +17 -17
  77. package/docs/deploy/github-pages.md +49 -49
  78. package/docs/deploy/vercel.md +101 -101
  79. package/docs/deployment.md +9 -9
  80. package/docs/extending/events.md +124 -124
  81. package/docs/guides/custom-pages.md +110 -110
  82. package/docs/guides/environment-variables.md +94 -94
  83. package/docs/guides/managing-api-keys-and-identities.md +89 -89
  84. package/docs/guides/mermaid.mdx +70 -70
  85. package/docs/guides/navigation-rules.mdx +203 -203
  86. package/docs/guides/processors.mdx +234 -234
  87. package/docs/guides/static-files.md +55 -55
  88. package/docs/guides/transforming-examples.md +156 -156
  89. package/docs/guides/using-multiple-apis.md +87 -87
  90. package/docs/markdown/admonitions.md +128 -128
  91. package/docs/markdown/code-blocks.md +196 -196
  92. package/docs/markdown/frontmatter.md +173 -173
  93. package/docs/markdown/mdx.md +68 -68
  94. package/docs/markdown/overview.md +275 -275
  95. package/docs/mcp/go-live.md +100 -100
  96. package/docs/mcp/overview.md +76 -76
  97. package/docs/mcp/setup.md +173 -173
  98. package/docs/mcp/shape.md +77 -77
  99. package/docs/mcp/tools.md +102 -102
  100. package/docs/plugins.md +24 -24
  101. package/docs/quickstart.md +72 -72
  102. package/docs/writing.mdx +72 -72
  103. package/package.json +3 -1
  104. package/src/app/ZuploBuildConfig.ts +36 -36
  105. package/src/app/apitogoBrandTheme.ts +47 -47
  106. package/src/app/defaultTheme.css +77 -77
  107. package/src/app/demo-cdn.html +37 -37
  108. package/src/app/demo.html +21 -21
  109. package/src/app/demo.tsx +77 -77
  110. package/src/app/entry.client.tsx +107 -107
  111. package/src/app/entry.server.tsx +160 -160
  112. package/src/app/env.ts +40 -40
  113. package/src/app/main.css +400 -400
  114. package/src/app/main.tsx +167 -167
  115. package/src/app/polyfills.ts +47 -47
  116. package/src/app/processRoutes.tsx +51 -51
  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/apitogo-config-core.ts +7 -3
  122. package/src/config/apitogo-config-loader.browser.ts +17 -17
  123. package/src/config/apitogo-config-loader.node.ts +88 -88
  124. package/src/config/apitogo-config-loader.ts +6 -6
  125. package/src/config/build-apitogo-config.ts +61 -61
  126. package/src/config/config.ts +74 -74
  127. package/src/config/create-plugin.ts +71 -71
  128. package/src/config/default-landing-content.ts +149 -149
  129. package/src/config/file-exists.ts +6 -6
  130. package/src/config/gateway-limits.ts +128 -128
  131. package/src/config/landing-manifest.ts +11 -11
  132. package/src/config/landing-openapi-showcase.ts +124 -124
  133. package/src/config/loader.ts +375 -375
  134. package/src/config/local-manifest.ts +545 -545
  135. package/src/config/resolve-modules.ts +354 -354
  136. package/src/config/v2/__fixtures__/scenario-a-docs-only.json +6 -6
  137. package/src/config/v2/__fixtures__/scenario-b-managed-origin.json +14 -14
  138. package/src/config/v2/__fixtures__/scenario-c-proxy-oidc.json +15 -15
  139. package/src/config/v2/__fixtures__/scenario-h-full-stack.json +28 -28
  140. package/src/config/v2/docs-navigation.ts +72 -72
  141. package/src/config/v2/errors.ts +42 -42
  142. package/src/config/v2/gateway-reference.ts +220 -220
  143. package/src/config/v2/gateway-request.ts +123 -123
  144. package/src/config/v2/home-redirect.ts +98 -98
  145. package/src/config/v2/index.ts +126 -126
  146. package/src/config/v2/init.ts +273 -273
  147. package/src/config/v2/layout.ts +237 -237
  148. package/src/config/v2/ledger.ts +235 -235
  149. package/src/config/v2/link-directory.ts +34 -0
  150. package/src/config/v2/load.ts +70 -70
  151. package/src/config/v2/manifest.ts +452 -452
  152. package/src/config/v2/parse.ts +214 -214
  153. package/src/config/v2/paths.ts +54 -54
  154. package/src/config/v2/portal-profile.ts +88 -88
  155. package/src/config/v2/resolve.ts +188 -188
  156. package/src/config/v2/rules.ts +714 -714
  157. package/src/config/v2/schema.ts +245 -245
  158. package/src/config/v2/services.ts +663 -663
  159. package/src/config/v2/workspace.ts +3 -2
  160. package/src/config/v2/wrapper.ts +24 -2
  161. package/src/config/validators/BuildSchema.ts +95 -95
  162. package/src/config/validators/HeaderNavigationSchema.ts +44 -44
  163. package/src/config/validators/InputNavigationSchema.test-d.ts +178 -178
  164. package/src/config/validators/InputNavigationSchema.ts +206 -206
  165. package/src/config/validators/ModulesSchema.ts +502 -502
  166. package/src/config/validators/NavigationSchema.ts +352 -352
  167. package/src/config/validators/ProtectedRoutesSchema.ts +35 -35
  168. package/src/config/validators/ZudokuConfig.ts +792 -792
  169. package/src/config/validators/auth.ts +3 -3
  170. package/src/config/validators/reason-codes.ts +7 -7
  171. package/src/env.d.ts +11 -11
  172. package/src/index.ts +83 -83
  173. package/src/lib/MissingIcon.tsx +22 -22
  174. package/src/lib/assets/language-icons/bun.tsx +50 -50
  175. package/src/lib/assets/language-icons/c.tsx +31 -31
  176. package/src/lib/assets/language-icons/commonlisp.tsx +22 -22
  177. package/src/lib/assets/language-icons/cpp.tsx +35 -35
  178. package/src/lib/assets/language-icons/csharp.tsx +35 -35
  179. package/src/lib/assets/language-icons/css.tsx +36 -36
  180. package/src/lib/assets/language-icons/dart.tsx +39 -39
  181. package/src/lib/assets/language-icons/elixir.tsx +19 -19
  182. package/src/lib/assets/language-icons/go.tsx +19 -19
  183. package/src/lib/assets/language-icons/graphql.tsx +19 -19
  184. package/src/lib/assets/language-icons/html.tsx +24 -24
  185. package/src/lib/assets/language-icons/java.tsx +35 -35
  186. package/src/lib/assets/language-icons/javascript.tsx +11 -11
  187. package/src/lib/assets/language-icons/json.tsx +19 -19
  188. package/src/lib/assets/language-icons/kotlin.tsx +30 -30
  189. package/src/lib/assets/language-icons/markdown.tsx +19 -19
  190. package/src/lib/assets/language-icons/mdx.tsx +23 -23
  191. package/src/lib/assets/language-icons/npm.tsx +15 -15
  192. package/src/lib/assets/language-icons/objectivec.tsx +23 -23
  193. package/src/lib/assets/language-icons/ocaml.tsx +34 -34
  194. package/src/lib/assets/language-icons/php.tsx +19 -19
  195. package/src/lib/assets/language-icons/pnpm.tsx +32 -32
  196. package/src/lib/assets/language-icons/powershell.tsx +27 -27
  197. package/src/lib/assets/language-icons/python.tsx +23 -23
  198. package/src/lib/assets/language-icons/react.tsx +21 -21
  199. package/src/lib/assets/language-icons/ruby.tsx +19 -19
  200. package/src/lib/assets/language-icons/rust.tsx +19 -19
  201. package/src/lib/assets/language-icons/scala.tsx +19 -19
  202. package/src/lib/assets/language-icons/shell.tsx +19 -19
  203. package/src/lib/assets/language-icons/swift.tsx +19 -19
  204. package/src/lib/assets/language-icons/toml.tsx +23 -23
  205. package/src/lib/assets/language-icons/typescript.tsx +23 -23
  206. package/src/lib/assets/language-icons/xml.tsx +19 -19
  207. package/src/lib/assets/language-icons/yaml.tsx +23 -23
  208. package/src/lib/assets/language-icons/yarn.tsx +17 -17
  209. package/src/lib/assets/language-icons/zig.tsx +32 -32
  210. package/src/lib/auth/issuer.ts +34 -34
  211. package/src/lib/authentication/AuthenticationPlugin.tsx +33 -33
  212. package/src/lib/authentication/auth-header-nav.ts +46 -46
  213. package/src/lib/authentication/authentication.ts +51 -51
  214. package/src/lib/authentication/components/CallbackHandler.tsx +45 -45
  215. package/src/lib/authentication/components/OAuthErrorPage.tsx +197 -197
  216. package/src/lib/authentication/components/ProductionUnlockPage.tsx +26 -26
  217. package/src/lib/authentication/components/SignIn.tsx +46 -46
  218. package/src/lib/authentication/components/SignOut.tsx +15 -15
  219. package/src/lib/authentication/components/SignUp.tsx +48 -48
  220. package/src/lib/authentication/constants.ts +1 -1
  221. package/src/lib/authentication/errors.ts +34 -34
  222. package/src/lib/authentication/header-nav-filter.ts +35 -35
  223. package/src/lib/authentication/hook.ts +141 -141
  224. package/src/lib/authentication/providers/auth0.tsx +91 -91
  225. package/src/lib/authentication/providers/azureb2c.tsx +223 -223
  226. package/src/lib/authentication/providers/clerk.tsx +224 -224
  227. package/src/lib/authentication/providers/dev-portal-auth-pages.tsx +602 -602
  228. package/src/lib/authentication/providers/dev-portal-constants.ts +38 -38
  229. package/src/lib/authentication/providers/dev-portal-demo.ts +151 -151
  230. package/src/lib/authentication/providers/dev-portal-utils.ts +279 -279
  231. package/src/lib/authentication/providers/dev-portal.tsx +448 -448
  232. package/src/lib/authentication/providers/firebase.tsx +486 -486
  233. package/src/lib/authentication/providers/openid.tsx +516 -516
  234. package/src/lib/authentication/providers/supabase.tsx +412 -412
  235. package/src/lib/authentication/providers/util.ts +26 -26
  236. package/src/lib/authentication/state.ts +180 -180
  237. package/src/lib/authentication/ui/AuthCard.tsx +7 -7
  238. package/src/lib/authentication/ui/EmailLinkCallbackUi.tsx +129 -129
  239. package/src/lib/authentication/ui/EmailLinkSentUi.tsx +105 -105
  240. package/src/lib/authentication/ui/EmailLinkSignInUi.tsx +100 -100
  241. package/src/lib/authentication/ui/EmailVerificationUi.tsx +128 -128
  242. package/src/lib/authentication/ui/ZudokuAuthUi.tsx +620 -620
  243. package/src/lib/authentication/ui/icons/Apple.tsx +10 -10
  244. package/src/lib/authentication/ui/icons/Facebook.tsx +15 -15
  245. package/src/lib/authentication/ui/icons/Github.tsx +16 -16
  246. package/src/lib/authentication/ui/icons/Google.tsx +16 -16
  247. package/src/lib/authentication/ui/icons/Microsoft.tsx +12 -12
  248. package/src/lib/authentication/ui/icons/X.tsx +10 -10
  249. package/src/lib/authentication/utils/relativeRedirectUrl.ts +16 -16
  250. package/src/lib/components/AiAssistantMenuItems.tsx +102 -102
  251. package/src/lib/components/AnchorLink.tsx +24 -24
  252. package/src/lib/components/Autocomplete.tsx +123 -123
  253. package/src/lib/components/Banner.tsx +52 -52
  254. package/src/lib/components/Bootstrap.tsx +77 -77
  255. package/src/lib/components/BuildCheck.tsx +87 -87
  256. package/src/lib/components/CategoryHeading.tsx +19 -19
  257. package/src/lib/components/ClientOnly.tsx +19 -19
  258. package/src/lib/components/DeveloperHint.tsx +39 -39
  259. package/src/lib/components/ErrorPage.tsx +26 -26
  260. package/src/lib/components/Footer.tsx +146 -146
  261. package/src/lib/components/Framed.tsx +51 -51
  262. package/src/lib/components/Header.tsx +261 -261
  263. package/src/lib/components/HeaderAuthActions.tsx +32 -32
  264. package/src/lib/components/HeaderNavigation.tsx +176 -176
  265. package/src/lib/components/Heading.tsx +84 -84
  266. package/src/lib/components/InlineCode.tsx +15 -15
  267. package/src/lib/components/LandingLayout.tsx +27 -27
  268. package/src/lib/components/LanguageIcon.tsx +199 -199
  269. package/src/lib/components/Layout.tsx +59 -59
  270. package/src/lib/components/Main.tsx +52 -52
  271. package/src/lib/components/Markdown.tsx +55 -55
  272. package/src/lib/components/Mermaid.tsx +74 -74
  273. package/src/lib/components/Meta.tsx +46 -46
  274. package/src/lib/components/MobileTopNavigation.tsx +283 -283
  275. package/src/lib/components/MultiSelect.tsx +86 -86
  276. package/src/lib/components/NotFoundPage.tsx +37 -37
  277. package/src/lib/components/PageProgress.tsx +28 -28
  278. package/src/lib/components/PagefindSearchMeta.tsx +14 -14
  279. package/src/lib/components/Pagination.tsx +44 -44
  280. package/src/lib/components/PathRenderer.tsx +61 -61
  281. package/src/lib/components/PluginHeads.tsx +17 -17
  282. package/src/lib/components/Search.tsx +70 -70
  283. package/src/lib/components/SiteTitle.tsx +58 -58
  284. package/src/lib/components/Slot.tsx +65 -65
  285. package/src/lib/components/Spinner.tsx +5 -5
  286. package/src/lib/components/StatusPage.tsx +96 -96
  287. package/src/lib/components/ThemeSwitch.tsx +99 -99
  288. package/src/lib/components/TopNavigation.tsx +90 -90
  289. package/src/lib/components/Typography.tsx +12 -12
  290. package/src/lib/components/Zudoku.tsx +105 -105
  291. package/src/lib/components/cache.ts +27 -27
  292. package/src/lib/components/context/RenderContext.ts +11 -11
  293. package/src/lib/components/context/RouterEventsEmitter.tsx +19 -19
  294. package/src/lib/components/context/SlotProvider.tsx +149 -149
  295. package/src/lib/components/context/ViewportAnchorContext.tsx +137 -137
  296. package/src/lib/components/context/ZudokuContext.ts +140 -140
  297. package/src/lib/components/context/ZudokuProvider.tsx +20 -20
  298. package/src/lib/components/context/ZudokuReactContext.tsx +17 -17
  299. package/src/lib/components/index.ts +36 -36
  300. package/src/lib/components/navigation/Navigation.tsx +51 -51
  301. package/src/lib/components/navigation/NavigationBadge.tsx +48 -48
  302. package/src/lib/components/navigation/NavigationCategory.tsx +157 -157
  303. package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -28
  304. package/src/lib/components/navigation/NavigationFilterInput.tsx +35 -35
  305. package/src/lib/components/navigation/NavigationItem.tsx +181 -181
  306. package/src/lib/components/navigation/NavigationWrapper.tsx +49 -49
  307. package/src/lib/components/navigation/PoweredByZudoku.tsx +39 -39
  308. package/src/lib/components/navigation/Toc.tsx +137 -137
  309. package/src/lib/components/navigation/ZudokuLogo.tsx +25 -25
  310. package/src/lib/components/navigation/ZuploLogo.tsx +14 -14
  311. package/src/lib/components/navigation/utils.ts +234 -234
  312. package/src/lib/core/RouteGuard.tsx +260 -260
  313. package/src/lib/core/ZudokuContext.ts +272 -272
  314. package/src/lib/core/plugins.ts +139 -139
  315. package/src/lib/core/react-query.ts +1 -1
  316. package/src/lib/core/router.ts +1 -1
  317. package/src/lib/core/transform-config.ts +67 -67
  318. package/src/lib/demo/DemoAnnouncement.tsx +17 -17
  319. package/src/lib/errors/ErrorAlert.tsx +28 -28
  320. package/src/lib/errors/ErrorMessage.tsx +50 -50
  321. package/src/lib/errors/RouterError.tsx +18 -18
  322. package/src/lib/errors/ServerError.tsx +5 -5
  323. package/src/lib/errors/TopLevelError.tsx +6 -6
  324. package/src/lib/hooks/index.ts +13 -13
  325. package/src/lib/hooks/useEvent.ts +41 -41
  326. package/src/lib/hooks/useHighlighter.ts +15 -15
  327. package/src/lib/hooks/useHotkey.ts +70 -70
  328. package/src/lib/icons.ts +2 -2
  329. package/src/lib/navigation/applyRules.ts +127 -127
  330. package/src/lib/navigation/pathMatcher.ts +81 -81
  331. package/src/lib/oas/graphql/circular.ts +69 -69
  332. package/src/lib/oas/graphql/constants.ts +2 -2
  333. package/src/lib/oas/graphql/index.ts +791 -791
  334. package/src/lib/oas/parser/dereference/index.ts +84 -84
  335. package/src/lib/oas/parser/dereference/resolveRef.ts +32 -32
  336. package/src/lib/oas/parser/index.ts +129 -129
  337. package/src/lib/oas/parser/schemas/v3.0.json +1489 -1489
  338. package/src/lib/oas/parser/schemas/v3.1.json +1298 -1298
  339. package/src/lib/oas/parser/upgrade/index.ts +174 -174
  340. package/src/lib/plugins/api-catalog/Catalog.tsx +80 -80
  341. package/src/lib/plugins/api-catalog/index.tsx +119 -119
  342. package/src/lib/plugins/api-keys/CreateApiKey.tsx +128 -128
  343. package/src/lib/plugins/api-keys/CreateApiKeyDialog.tsx +49 -49
  344. package/src/lib/plugins/api-keys/ProtectedRoute.tsx +33 -33
  345. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +72 -72
  346. package/src/lib/plugins/api-keys/index.tsx +274 -274
  347. package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +342 -342
  348. package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -67
  349. package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +127 -127
  350. package/src/lib/plugins/custom-pages/index.tsx +32 -32
  351. package/src/lib/plugins/markdown/MdxPage.tsx +260 -260
  352. package/src/lib/plugins/markdown/assets/ChatGPTLogo.tsx +11 -11
  353. package/src/lib/plugins/markdown/assets/ClaudeLogo.tsx +19 -19
  354. package/src/lib/plugins/markdown/index.tsx +82 -82
  355. package/src/lib/plugins/openapi/ApiHeader.tsx +96 -96
  356. package/src/lib/plugins/openapi/CollapsibleCode.tsx +88 -88
  357. package/src/lib/plugins/openapi/ColorizedParam.tsx +115 -115
  358. package/src/lib/plugins/openapi/DownloadSchemaButton.tsx +94 -94
  359. package/src/lib/plugins/openapi/Endpoint.tsx +85 -85
  360. package/src/lib/plugins/openapi/GeneratedExampleSidecarBox.tsx +52 -52
  361. package/src/lib/plugins/openapi/MCPEndpoint.tsx +273 -273
  362. package/src/lib/plugins/openapi/OasProvider.tsx +74 -74
  363. package/src/lib/plugins/openapi/OperationList.tsx +275 -275
  364. package/src/lib/plugins/openapi/OperationListItem.tsx +183 -183
  365. package/src/lib/plugins/openapi/ParamInfos.tsx +96 -96
  366. package/src/lib/plugins/openapi/ParameterList.tsx +53 -53
  367. package/src/lib/plugins/openapi/ParameterListItem.tsx +161 -161
  368. package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +67 -67
  369. package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +63 -63
  370. package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +120 -120
  371. package/src/lib/plugins/openapi/SchemaInfo.tsx +344 -344
  372. package/src/lib/plugins/openapi/SchemaList.tsx +113 -113
  373. package/src/lib/plugins/openapi/Sidecar.tsx +314 -314
  374. package/src/lib/plugins/openapi/SidecarBox.tsx +57 -57
  375. package/src/lib/plugins/openapi/SidecarExamples.tsx +177 -177
  376. package/src/lib/plugins/openapi/SimpleSelect.tsx +46 -46
  377. package/src/lib/plugins/openapi/client/GraphQLClient.tsx +73 -73
  378. package/src/lib/plugins/openapi/client/GraphQLContext.tsx +16 -16
  379. package/src/lib/plugins/openapi/client/createServer.ts +35 -35
  380. package/src/lib/plugins/openapi/client/useCreateQuery.ts +44 -44
  381. package/src/lib/plugins/openapi/components/ConstValue.tsx +24 -24
  382. package/src/lib/plugins/openapi/components/EnumValues.tsx +58 -58
  383. package/src/lib/plugins/openapi/components/NonHighlightedCode.tsx +22 -22
  384. package/src/lib/plugins/openapi/components/ResponseContent.tsx +117 -117
  385. package/src/lib/plugins/openapi/components/SelectOnClick.tsx +29 -29
  386. package/src/lib/plugins/openapi/context.tsx +16 -16
  387. package/src/lib/plugins/openapi/graphql/fragment-masking.ts +104 -104
  388. package/src/lib/plugins/openapi/graphql/gql.ts +95 -95
  389. package/src/lib/plugins/openapi/graphql/graphql.ts +835 -835
  390. package/src/lib/plugins/openapi/graphql/index.ts +2 -2
  391. package/src/lib/plugins/openapi/index.tsx +221 -221
  392. package/src/lib/plugins/openapi/interfaces.ts +100 -100
  393. package/src/lib/plugins/openapi/playground/BodyPanel.tsx +274 -274
  394. package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +51 -51
  395. package/src/lib/plugins/openapi/playground/ExamplesDropdown.tsx +60 -60
  396. package/src/lib/plugins/openapi/playground/Headers.tsx +194 -194
  397. package/src/lib/plugins/openapi/playground/IdentityDialog.tsx +75 -75
  398. package/src/lib/plugins/openapi/playground/IdentitySelector.tsx +38 -38
  399. package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +45 -45
  400. package/src/lib/plugins/openapi/playground/PathParams.tsx +53 -53
  401. package/src/lib/plugins/openapi/playground/Playground.tsx +602 -602
  402. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +62 -62
  403. package/src/lib/plugins/openapi/playground/QueryParams.tsx +151 -151
  404. package/src/lib/plugins/openapi/playground/RequestLoginDialog.tsx +70 -70
  405. package/src/lib/plugins/openapi/playground/Spinner.tsx +87 -87
  406. package/src/lib/plugins/openapi/playground/createUrl.ts +25 -25
  407. package/src/lib/plugins/openapi/playground/fileUtils.ts +36 -36
  408. package/src/lib/plugins/openapi/playground/rememberedIdentity.ts +26 -26
  409. package/src/lib/plugins/openapi/playground/request-panel/MultipartField.tsx +91 -91
  410. package/src/lib/plugins/openapi/playground/request-panel/UrlPath.tsx +31 -31
  411. package/src/lib/plugins/openapi/playground/request-panel/UrlQueryParams.tsx +29 -29
  412. package/src/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.ts +340 -340
  413. package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +50 -50
  414. package/src/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.tsx +117 -117
  415. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +355 -355
  416. package/src/lib/plugins/openapi/playground/result-panel/ResultPanel.tsx +106 -106
  417. package/src/lib/plugins/openapi/playground/result-panel/convertToTypes.ts +36 -36
  418. package/src/lib/plugins/openapi/playground/serializeQueryParams.ts +125 -125
  419. package/src/lib/plugins/openapi/playground/useRememberSkipLoginDialog.tsx +23 -23
  420. package/src/lib/plugins/openapi/processors/injectApitogoGatewayServer.ts +36 -36
  421. package/src/lib/plugins/openapi/processors/removeExtensions.ts +29 -29
  422. package/src/lib/plugins/openapi/processors/removeParameters.ts +103 -103
  423. package/src/lib/plugins/openapi/processors/removePaths.ts +57 -57
  424. package/src/lib/plugins/openapi/processors/traverse.ts +1 -1
  425. package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +39 -39
  426. package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +189 -189
  427. package/src/lib/plugins/openapi/schema/SchemaView.tsx +299 -299
  428. package/src/lib/plugins/openapi/schema/UnionView.tsx +132 -132
  429. package/src/lib/plugins/openapi/schema/union-helpers.ts +123 -123
  430. package/src/lib/plugins/openapi/schema/utils.ts +49 -49
  431. package/src/lib/plugins/openapi/state.ts +36 -36
  432. package/src/lib/plugins/openapi/util/buildTagCategories.ts +54 -54
  433. package/src/lib/plugins/openapi/util/createHttpSnippet.ts +135 -135
  434. package/src/lib/plugins/openapi/util/createNavigationCategory.tsx +39 -39
  435. package/src/lib/plugins/openapi/util/generateSchemaExample.ts +191 -191
  436. package/src/lib/plugins/openapi/util/getRoutes.tsx +265 -265
  437. package/src/lib/plugins/openapi/util/methodColorMap.tsx +11 -11
  438. package/src/lib/plugins/openapi/util/methodToColor.ts +27 -27
  439. package/src/lib/plugins/openapi/util/sanitizeMarkdownForMetatag.tsx +32 -32
  440. package/src/lib/plugins/openapi/util/useWarmupSchema.ts +23 -23
  441. package/src/lib/plugins/search-inkeep/index.tsx +108 -108
  442. package/src/lib/plugins/search-inkeep/inkeep.ts +24 -24
  443. package/src/lib/plugins/search-pagefind/IndexingDialog.tsx +162 -162
  444. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +202 -202
  445. package/src/lib/plugins/search-pagefind/ResultList.tsx +122 -122
  446. package/src/lib/plugins/search-pagefind/get-results.tsx +74 -74
  447. package/src/lib/plugins/search-pagefind/index.tsx +21 -21
  448. package/src/lib/plugins/search-pagefind/types.ts +118 -118
  449. package/src/lib/shiki-constants.ts +24 -24
  450. package/src/lib/shiki.ts +179 -179
  451. package/src/lib/testing/index.tsx +147 -147
  452. package/src/lib/ui/Accordion.tsx +55 -55
  453. package/src/lib/ui/ActionButton.tsx +21 -21
  454. package/src/lib/ui/Alert.tsx +84 -84
  455. package/src/lib/ui/AlertDialog.tsx +195 -195
  456. package/src/lib/ui/AspectRatio.tsx +5 -5
  457. package/src/lib/ui/Badge.tsx +48 -48
  458. package/src/lib/ui/Breadcrumb.tsx +115 -115
  459. package/src/lib/ui/Button.tsx +65 -65
  460. package/src/lib/ui/ButtonGroup.tsx +80 -80
  461. package/src/lib/ui/Callout.tsx +113 -113
  462. package/src/lib/ui/Card.tsx +95 -95
  463. package/src/lib/ui/Carousel.tsx +259 -259
  464. package/src/lib/ui/Checkbox.tsx +28 -28
  465. package/src/lib/ui/CodeBlock.tsx +92 -92
  466. package/src/lib/ui/CodeTabPanel.tsx +13 -13
  467. package/src/lib/ui/CodeTabs.tsx +161 -161
  468. package/src/lib/ui/Collapsible.tsx +31 -31
  469. package/src/lib/ui/Command.tsx +191 -191
  470. package/src/lib/ui/Dialog.tsx +138 -138
  471. package/src/lib/ui/DismissibleAlert.tsx +74 -74
  472. package/src/lib/ui/Drawer.tsx +121 -121
  473. package/src/lib/ui/DropdownMenu.tsx +254 -254
  474. package/src/lib/ui/EmbeddedCodeBlock.tsx +99 -99
  475. package/src/lib/ui/Form.tsx +176 -176
  476. package/src/lib/ui/Frame.tsx +81 -81
  477. package/src/lib/ui/HoverCard.tsx +26 -26
  478. package/src/lib/ui/Input.tsx +23 -23
  479. package/src/lib/ui/InputGroup.tsx +168 -168
  480. package/src/lib/ui/Item.tsx +213 -213
  481. package/src/lib/ui/Kbd.tsx +28 -28
  482. package/src/lib/ui/Label.tsx +23 -23
  483. package/src/lib/ui/NativeSelect.tsx +48 -48
  484. package/src/lib/ui/NavigationMenu.tsx +169 -169
  485. package/src/lib/ui/Pagination.tsx +115 -115
  486. package/src/lib/ui/Popover.tsx +28 -28
  487. package/src/lib/ui/Progress.tsx +25 -25
  488. package/src/lib/ui/RadioGroup.tsx +41 -41
  489. package/src/lib/ui/ReactComponentDoc.tsx +68 -68
  490. package/src/lib/ui/ScrollArea.tsx +45 -45
  491. package/src/lib/ui/Secret.tsx +133 -133
  492. package/src/lib/ui/Select.tsx +184 -184
  493. package/src/lib/ui/Separator.tsx +25 -25
  494. package/src/lib/ui/Skeleton.tsx +15 -15
  495. package/src/lib/ui/Slider.tsx +25 -25
  496. package/src/lib/ui/Stepper.tsx +8 -8
  497. package/src/lib/ui/Switch.tsx +26 -26
  498. package/src/lib/ui/SyntaxHighlight.tsx +54 -54
  499. package/src/lib/ui/Tabs.tsx +52 -52
  500. package/src/lib/ui/Textarea.tsx +22 -22
  501. package/src/lib/ui/Toggle.tsx +42 -42
  502. package/src/lib/ui/ToggleGroup.tsx +58 -58
  503. package/src/lib/ui/Tooltip.tsx +65 -65
  504. package/src/lib/ui/Value.tsx +42 -42
  505. package/src/lib/ui/util.tsx +8 -8
  506. package/src/lib/util/MdxComponents.tsx +150 -150
  507. package/src/lib/util/cn.ts +6 -6
  508. package/src/lib/util/createVariantComponent.tsx +61 -61
  509. package/src/lib/util/ensureArray.ts +3 -3
  510. package/src/lib/util/flattenAllOf.ts +72 -72
  511. package/src/lib/util/flattenAllOfProcessor.ts +74 -74
  512. package/src/lib/util/hastToJsx.tsx +67 -67
  513. package/src/lib/util/humanFileSize.ts +15 -15
  514. package/src/lib/util/invariant.ts +52 -52
  515. package/src/lib/util/joinUrl.ts +60 -60
  516. package/src/lib/util/logInit.ts +9 -9
  517. package/src/lib/util/objectEntries.ts +5 -5
  518. package/src/lib/util/os.ts +18 -18
  519. package/src/lib/util/pastellize.ts +25 -25
  520. package/src/lib/util/problemJson.ts +63 -63
  521. package/src/lib/util/readFrontmatter.ts +14 -14
  522. package/src/lib/util/renderIf.ts +4 -4
  523. package/src/lib/util/scrollIntoViewIfNeeded.ts +18 -18
  524. package/src/lib/util/slugify.ts +21 -21
  525. package/src/lib/util/syncZustandState.ts +22 -22
  526. package/src/lib/util/traverse.ts +70 -70
  527. package/src/lib/util/types.ts +7 -7
  528. package/src/lib/util/url.ts +18 -18
  529. package/src/lib/util/useCopyToClipboard.ts +17 -17
  530. package/src/lib/util/useExposedProps.tsx +27 -27
  531. package/src/lib/util/useIsomorphicLayoutEffect.ts +6 -6
  532. package/src/lib/util/useLatest.ts +18 -18
  533. package/src/lib/util/useOnScreen.ts +34 -34
  534. package/src/lib/util/useScrollToAnchor.ts +75 -75
  535. package/src/lib/util/useScrollToTop.ts +18 -18
  536. package/src/types.d.ts +66 -66
  537. package/src/vite/api/SchemaManager.ts +371 -371
  538. package/src/vite/api/schema-codegen.ts +163 -163
  539. package/src/vite/build.ts +237 -237
  540. package/src/vite/config.ts +273 -273
  541. package/src/vite/css/collect.ts +42 -42
  542. package/src/vite/css/plugin.ts +105 -105
  543. package/src/vite/debug.ts +18 -18
  544. package/src/vite/dev-portal-env.ts +29 -29
  545. package/src/vite/dev-server.ts +294 -294
  546. package/src/vite/html.ts +52 -52
  547. package/src/vite/index.ts +2 -2
  548. package/src/vite/llms.ts +99 -99
  549. package/src/vite/mdx/rehype-extract-toc-with-jsx-export.ts +19 -19
  550. package/src/vite/mdx/rehype-extract-toc-with-jsx.ts +70 -70
  551. package/src/vite/mdx/remark-code-tabs.ts +47 -47
  552. package/src/vite/mdx/remark-inject-filepath.ts +13 -13
  553. package/src/vite/mdx/remark-last-modified.ts +103 -103
  554. package/src/vite/mdx/remark-link-rewrite.ts +23 -23
  555. package/src/vite/mdx/remark-normalize-image-url.ts +15 -15
  556. package/src/vite/mdx/remark-static-generation.ts +149 -149
  557. package/src/vite/mdx/utils.ts +32 -32
  558. package/src/vite/output.ts +261 -261
  559. package/src/vite/package-root.ts +12 -12
  560. package/src/vite/pagefind-dev-index.ts +100 -100
  561. package/src/vite/pagefind-dev-stub.ts +17 -17
  562. package/src/vite/plugin-api-keys.ts +55 -55
  563. package/src/vite/plugin-api.ts +328 -328
  564. package/src/vite/plugin-auth.ts +41 -41
  565. package/src/vite/plugin-component.ts +45 -45
  566. package/src/vite/plugin-config-reload.ts +47 -47
  567. package/src/vite/plugin-config.ts +131 -131
  568. package/src/vite/plugin-custom-pages.ts +36 -36
  569. package/src/vite/plugin-doc-metadata.ts +45 -45
  570. package/src/vite/plugin-docs.ts +205 -205
  571. package/src/vite/plugin-local-manifest.ts +100 -100
  572. package/src/vite/plugin-markdown-export.ts +214 -214
  573. package/src/vite/plugin-mdx.ts +149 -149
  574. package/src/vite/plugin-metadata.ts +30 -30
  575. package/src/vite/plugin-modules.ts +188 -188
  576. package/src/vite/plugin-navigation.ts +106 -106
  577. package/src/vite/plugin-offroot-resolve.ts +67 -67
  578. package/src/vite/plugin-search.ts +59 -59
  579. package/src/vite/plugin-shiki-register.ts +97 -97
  580. package/src/vite/plugin-theme.ts +458 -458
  581. package/src/vite/plugin.ts +48 -48
  582. package/src/vite/prerender/prerender.ts +242 -242
  583. package/src/vite/prerender/utils.ts +76 -76
  584. package/src/vite/prerender/worker.ts +118 -118
  585. package/src/vite/reporter.ts +34 -34
  586. package/src/vite/shadcn-registry.ts +48 -48
  587. package/src/vite/sitemap.ts +78 -78
  588. package/src/vite/ssr-templates/cloudflare.ts +19 -19
  589. package/src/vite/ssr-templates/node.ts +25 -25
  590. package/src/vite/ssr-templates/vercel.ts +22 -22
  591. package/src/vite/watch-ignore.ts +70 -70
  592. package/src/vite/zuplo.ts +30 -30
  593. package/src/vite-env.d.ts +6 -6
  594. package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -168
  595. package/src/zuplo/enrich-with-zuplo.ts +256 -256
  596. package/src/zuplo/policy-types.ts +46 -46
  597. package/src/zuplo/with-zuplo-processors.ts +36 -36
  598. package/src/zuplo/with-zuplo.ts +14 -14
  599. package/dist/declarations/cli/platform/client/deploy-server.d.ts +0 -16
package/dist/cli/cli.js CHANGED
@@ -459,8 +459,9 @@ function syncAuthentication(normalized) {
459
459
  }
460
460
  const auth = authentication ?? {};
461
461
  auth.enabled = userPanelEnabled;
462
- auth.type = "dev-portal";
463
- if (userPanelEnabled) {
462
+ const keepsOpenId = auth.type === "openid";
463
+ if (!keepsOpenId) auth.type = "dev-portal";
464
+ if (userPanelEnabled && !keepsOpenId) {
464
465
  const native = asRecord(auth.native) ?? {};
465
466
  if (native.enabled === void 0) {
466
467
  native.enabled = true;
@@ -483,7 +484,7 @@ function syncAuthentication(normalized) {
483
484
  }
484
485
  }
485
486
  }
486
- if (normalized.demoMode !== void 0) {
487
+ if (normalized.demoMode !== void 0 && !keepsOpenId) {
487
488
  auth.demoMode = normalized.demoMode !== false;
488
489
  }
489
490
  normalized.authentication = auth;
@@ -8021,7 +8022,11 @@ function buildSiteConfig(resolved, plan2, theme, extras = {}) {
8021
8022
  },
8022
8023
  modules: {
8023
8024
  docs: { enabled: plan2.docs },
8024
- userPanel: { enabled: plan2.userPanel }
8025
+ // The plans pages (pricing, choosing a plan) exist only when billing is on, and the plans service is what makes it so.
8026
+ userPanel: {
8027
+ enabled: plan2.userPanel,
8028
+ ...plan2.plansPlugin ? { plans: { enabled: true } } : {}
8029
+ }
8025
8030
  },
8026
8031
  ...plan2.docs ? {
8027
8032
  docs: {
@@ -8042,10 +8047,21 @@ function buildSiteConfig(resolved, plan2, theme, extras = {}) {
8042
8047
  ...navigation.length > 0 ? { navigation } : {},
8043
8048
  ...redirects.length > 0 ? { redirects } : {},
8044
8049
  ...theme !== void 0 ? { theme } : {},
8045
- ...plan2.auth ? { authentication: { type: "openid", ...plan2.auth } } : {},
8050
+ ...plan2.auth ? { authentication: authenticationFor(plan2) } : {},
8046
8051
  ...plan2.preview ? { preview: true } : {}
8047
8052
  };
8048
8053
  }
8054
+ function authenticationFor(plan2) {
8055
+ if (plan2.plansPlugin)
8056
+ return {
8057
+ type: "dev-portal",
8058
+ apiBaseUrl: plan2.plansPlugin.apiBaseUrl,
8059
+ demoMode: false,
8060
+ // Accounts are made at the identity (its own sign-up page), never at the plans backend.
8061
+ native: { enabled: false }
8062
+ };
8063
+ return { type: "openid", ...plan2.auth };
8064
+ }
8049
8065
  var PREVIEW_BANNER_MESSAGE = "Preview mode: sign-in and plans use a stand-in manifest. Run `apitogo deploy` for the real services.";
8050
8066
  function renderWrapper(plan2) {
8051
8067
  const imports = [
@@ -8194,9 +8210,27 @@ async function preparePortal(resolved, manifest, mode, options = {}) {
8194
8210
 
8195
8211
  // src/config/v2/workspace.ts
8196
8212
  import { createHash as createHash2 } from "node:crypto";
8197
- import { access as access2, lstat, readFile as readFile7, rm as rm3, symlink } from "node:fs/promises";
8213
+ import { access as access2, lstat, readFile as readFile7, rm as rm3 } from "node:fs/promises";
8198
8214
  import path13 from "node:path";
8199
8215
  import { glob as glob3 } from "glob";
8216
+
8217
+ // src/config/v2/link-directory.ts
8218
+ import { symlink } from "node:fs/promises";
8219
+ async function linkDirectory(target, link, options = {}) {
8220
+ const create = options.symlinkFn ?? symlink;
8221
+ const platform = options.platform ?? process.platform;
8222
+ try {
8223
+ await create(target, link, "dir");
8224
+ return "symlink";
8225
+ } catch (error) {
8226
+ if (platform !== "win32" || error.code !== "EPERM")
8227
+ throw error;
8228
+ await create(target, link, "junction");
8229
+ return "junction";
8230
+ }
8231
+ }
8232
+
8233
+ // src/config/v2/workspace.ts
8200
8234
  var exists2 = (file) => access2(file).then(
8201
8235
  () => true,
8202
8236
  () => false
@@ -8207,7 +8241,7 @@ async function relink(target, link) {
8207
8241
  () => false
8208
8242
  ))
8209
8243
  await rm3(link, { recursive: true, force: true });
8210
- await symlink(target, link, "dir");
8244
+ await linkDirectory(target, link);
8211
8245
  }
8212
8246
  async function materializeWorkspace(resolved, prepared) {
8213
8247
  const root = path13.dirname(prepared.wrapperPath);
@@ -9332,6 +9366,34 @@ var PlatformApiClient = class {
9332
9366
  }
9333
9367
  );
9334
9368
  }
9369
+ /**
9370
+ * Adds or updates an upstream login connection of the project's Active identity. The same request twice changes
9371
+ * nothing. The answer carries the redirect address to register with the provider.
9372
+ */
9373
+ putProjectIdentityConnection(projectId, connectionId2, body) {
9374
+ return this.request(
9375
+ "PUT",
9376
+ `/api/v1/projects/${projectId}/identity/connections/${encodeURIComponent(connectionId2)}`,
9377
+ {
9378
+ headers: { "Content-Type": "application/json" },
9379
+ body: JSON.stringify(body)
9380
+ }
9381
+ );
9382
+ }
9383
+ /** The upstream login connections of the project's identity (never their secrets). */
9384
+ listProjectIdentityConnections(projectId) {
9385
+ return this.request(
9386
+ "GET",
9387
+ `/api/v1/projects/${projectId}/identity/connections`
9388
+ );
9389
+ }
9390
+ /** Removes a connection. One that is not there is a success. Users who signed in through it keep their accounts. */
9391
+ async deleteProjectIdentityConnection(projectId, connectionId2) {
9392
+ await this.request(
9393
+ "DELETE",
9394
+ `/api/v1/projects/${projectId}/identity/connections/${encodeURIComponent(connectionId2)}`
9395
+ );
9396
+ }
9335
9397
  /** The state of the project's identity, or null when it has none. */
9336
9398
  async getProjectIdentity(projectId) {
9337
9399
  try {
@@ -9905,7 +9967,7 @@ import {
9905
9967
  // package.json
9906
9968
  var package_default = {
9907
9969
  name: "@lukoweb/apitogo",
9908
- version: "0.2.23",
9970
+ version: "0.2.25",
9909
9971
  type: "module",
9910
9972
  sideEffects: [
9911
9973
  "**/*.css",
@@ -9996,6 +10058,7 @@ var package_default = {
9996
10058
  "@fontsource/ibm-plex-sans": "^5.3.0",
9997
10059
  "@fontsource/jetbrains-mono": "^5.3.0",
9998
10060
  "@fontsource/space-grotesk": "^5.3.0",
10061
+ "@graphql-tools/utils": "12.1.0",
9999
10062
  "@graphql-typed-document-node/core": "3.2.0",
10000
10063
  "@hono/node-server": "1.19.11",
10001
10064
  "@lekoarts/rehype-meta-as-attributes": "3.0.3",
@@ -10069,6 +10132,7 @@ var package_default = {
10069
10132
  "javascript-stringify": "2.1.0",
10070
10133
  "json-schema-to-typescript-lite": "15.0.0",
10071
10134
  loglevel: "1.9.2",
10135
+ "lru-cache": "10.4.3",
10072
10136
  "lucide-react": "0.577.0",
10073
10137
  "mdast-util-from-markdown": "2.0.2",
10074
10138
  "mdast-util-mdx": "3.0.0",
@@ -27480,6 +27544,52 @@ var IdentityDeployError = class extends ApitogoError {
27480
27544
  }
27481
27545
  };
27482
27546
  var IDENTITY_STEPS = ["request", "activate"];
27547
+ var IDENTITY_CONNECTIONS_STEP = "connections";
27548
+ var SECRET_PREFIX = "secret:";
27549
+ function normalizedConnections(resolved) {
27550
+ return [...resolved.identity?.connections ?? []].map((connection) => ({
27551
+ ...connection,
27552
+ authority: connection.authority.trim().replace(/\/+$/, "")
27553
+ })).sort((a, b) => a.id.localeCompare(b.id));
27554
+ }
27555
+ function identityConnectionsHash(projectId, resolved) {
27556
+ return stableJson({
27557
+ projectId,
27558
+ connections: normalizedConnections(resolved)
27559
+ });
27560
+ }
27561
+ async function recordedConnectionIds(resolved) {
27562
+ const ids = stepOf(
27563
+ await readLedger(resolved.state),
27564
+ "identity",
27565
+ IDENTITY_CONNECTIONS_STEP
27566
+ )?.output?.ids;
27567
+ return ids ? ids.split(",").filter(Boolean) : [];
27568
+ }
27569
+ function redirectAddressesOf(output4) {
27570
+ return Object.entries(output4 ?? {}).filter(([key]) => key.startsWith("redirect.")).map(([key, redirectUri]) => ({
27571
+ id: key.slice("redirect.".length),
27572
+ redirectUri
27573
+ }));
27574
+ }
27575
+ function connectionBody(connection) {
27576
+ return {
27577
+ authority: connection.authority,
27578
+ clientId: connection.clientId,
27579
+ clientSecret: connection.clientSecret,
27580
+ scopes: connection.scopes,
27581
+ displayName: connection.displayName
27582
+ };
27583
+ }
27584
+ function referencedSecretNames(connections) {
27585
+ return [
27586
+ ...new Set(
27587
+ connections.map(
27588
+ (connection) => connection.clientSecret.slice(SECRET_PREFIX.length)
27589
+ )
27590
+ )
27591
+ ];
27592
+ }
27483
27593
  var PORTAL_CALLBACK_PATH = "/oauth/callback";
27484
27594
  var defaultSleep2 = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
27485
27595
  function identityNotDeployableReason(resolved) {
@@ -27534,6 +27644,25 @@ function rejected2(error) {
27534
27644
  }
27535
27645
  throw error;
27536
27646
  }
27647
+ function connectionRejected(error, id) {
27648
+ if (error instanceof PlatformApiError && error.status === 409) {
27649
+ throw new IdentityDeployError(
27650
+ "IDENTITY_CONNECTION_REJECTED",
27651
+ `The identity is not active yet, so connection "${id}" cannot be saved.`,
27652
+ "Run deploy again once the identity is Active."
27653
+ );
27654
+ }
27655
+ if (error instanceof PlatformApiError && error.status === 400) {
27656
+ const lines = describePlatformProblem(error);
27657
+ throw new IdentityDeployError(
27658
+ "IDENTITY_CONNECTION_REJECTED",
27659
+ `The platform refused login connection "${id}":
27660
+ ${lines.join("\n ") || error.message}`,
27661
+ "Fix the connection in apitogo.config.json (identity.connections) and run deploy again."
27662
+ );
27663
+ }
27664
+ throw error;
27665
+ }
27537
27666
  async function recordOwnProvider(resolved, projectId) {
27538
27667
  const identity = resolved.identity;
27539
27668
  const issuer = identity?.issuer?.replace(/\/+$/, "");
@@ -27623,10 +27752,14 @@ async function deployIdentity(resolved, projectId, deps, options = {}) {
27623
27752
  },
27624
27753
  stillValid: async () => (await client.getProjectIdentity(projectId))?.status === "Active"
27625
27754
  };
27755
+ const wanted = normalizedConnections(resolved);
27756
+ const steps = [requestStep, activateStep];
27757
+ if (wanted.length > 0 || (await recordedConnectionIds(resolved)).length > 0)
27758
+ steps.push(connectionsStep(resolved, projectId, client, wanted));
27626
27759
  const outcomes = await runPipeline(
27627
27760
  resolved.state,
27628
27761
  "identity",
27629
- [requestStep, activateStep],
27762
+ steps,
27630
27763
  { force: options.force }
27631
27764
  );
27632
27765
  const activate = outcomes.find((outcome) => outcome.step === "activate");
@@ -27649,14 +27782,103 @@ async function deployIdentity(resolved, projectId, deps, options = {}) {
27649
27782
  );
27650
27783
  }
27651
27784
  }
27785
+ const connectionsRan = outcomes.some(
27786
+ (outcome) => outcome.step === IDENTITY_CONNECTIONS_STEP && !outcome.skipped
27787
+ );
27652
27788
  return {
27653
- status: ran ? "deployed" : "unchanged",
27789
+ status: ran || connectionsRan ? "deployed" : "unchanged",
27654
27790
  steps: outcomes.map((outcome) => ({
27655
27791
  step: outcome.step,
27656
27792
  skipped: outcome.skipped
27657
27793
  })),
27658
27794
  issuer: learned?.issuer ?? known?.issuer,
27659
- clientId: learned?.clientId ?? known?.clientId
27795
+ clientId: learned?.clientId ?? known?.clientId,
27796
+ connections: redirectAddressesOf(
27797
+ stepOf(
27798
+ await readLedger(resolved.state),
27799
+ "identity",
27800
+ IDENTITY_CONNECTIONS_STEP
27801
+ )?.output
27802
+ )
27803
+ };
27804
+ }
27805
+ function connectionsStep(resolved, projectId, client, wanted) {
27806
+ const {
27807
+ putProjectIdentityConnection,
27808
+ listProjectIdentityConnections,
27809
+ deleteProjectIdentityConnection,
27810
+ listSecrets
27811
+ } = client;
27812
+ if (!putProjectIdentityConnection || !listProjectIdentityConnections || !deleteProjectIdentityConnection || !listSecrets)
27813
+ throw new Error("The platform client has no login connection calls.");
27814
+ const stamps = async () => {
27815
+ const names = referencedSecretNames(wanted);
27816
+ if (names.length === 0) return {};
27817
+ const listed = await listSecrets.call(client, projectId);
27818
+ const byName2 = new Map(listed.secrets.map((s) => [s.name, s.updatedAtUtc]));
27819
+ const missing = names.filter((name) => !byName2.has(name));
27820
+ if (missing.length > 0)
27821
+ throw new IdentityDeployError(
27822
+ "IDENTITY_SECRET_MISSING",
27823
+ `The secret ${missing.join(", ")} is not set for this project, and a login connection needs it.`,
27824
+ `Run \`apitogo secrets set ${missing[0]}\` with the value from the provider, then deploy again.`
27825
+ );
27826
+ return Object.fromEntries(
27827
+ names.map((name) => [name, byName2.get(name)])
27828
+ );
27829
+ };
27830
+ const sameAddress = (a, b) => a.replace(/\/+$/, "").toLowerCase() === b.replace(/\/+$/, "").toLowerCase();
27831
+ return {
27832
+ name: IDENTITY_CONNECTIONS_STEP,
27833
+ hash: () => identityConnectionsHash(projectId, resolved),
27834
+ run: async () => {
27835
+ const recorded = await stamps();
27836
+ const existing = await listProjectIdentityConnections.call(
27837
+ client,
27838
+ projectId
27839
+ );
27840
+ const redirects = {};
27841
+ for (const connection of wanted) {
27842
+ try {
27843
+ const saved = await putProjectIdentityConnection.call(
27844
+ client,
27845
+ projectId,
27846
+ connection.id,
27847
+ connectionBody(connection)
27848
+ );
27849
+ redirects[`redirect.${connection.id}`] = saved.redirectUri;
27850
+ } catch (error) {
27851
+ return connectionRejected(error, connection.id);
27852
+ }
27853
+ }
27854
+ for (const old of existing)
27855
+ if (!wanted.some((connection) => connection.id === old.id))
27856
+ await deleteProjectIdentityConnection.call(client, projectId, old.id);
27857
+ return {
27858
+ ids: wanted.map((connection) => connection.id).join(","),
27859
+ secretsStamp: stableJson(recorded),
27860
+ ...redirects
27861
+ };
27862
+ },
27863
+ // The platform still has exactly these connections, and none of the secrets was changed since.
27864
+ stillValid: async () => {
27865
+ const found = await listProjectIdentityConnections.call(
27866
+ client,
27867
+ projectId
27868
+ );
27869
+ if (found.length !== wanted.length) return false;
27870
+ for (const connection of wanted) {
27871
+ const there = found.find((f) => f.id === connection.id);
27872
+ if (!there || there.clientId !== connection.clientId || !sameAddress(there.authority, connection.authority))
27873
+ return false;
27874
+ }
27875
+ const before = stepOf(
27876
+ await readLedger(resolved.state),
27877
+ "identity",
27878
+ IDENTITY_CONNECTIONS_STEP
27879
+ )?.output?.secretsStamp;
27880
+ return before === void 0 || before === stableJson(await stamps());
27881
+ }
27660
27882
  };
27661
27883
  }
27662
27884
 
@@ -27938,9 +28160,30 @@ async function planIdentityService(resolved, ledger, manifest) {
27938
28160
  (name) => `step ${name}: ${stepState(stepOf(ledger, "identity", name), hash2)}`
27939
28161
  )
27940
28162
  ];
28163
+ const connections = normalizedConnections(resolved);
28164
+ const leftOnPlatform = (await recordedConnectionIds(resolved)).length > 0;
28165
+ const connectionsHash = projectId ? identityConnectionsHash(projectId, resolved) : void 0;
28166
+ const connectionsRecord = stepOf(
28167
+ ledger,
28168
+ "identity",
28169
+ IDENTITY_CONNECTIONS_STEP
28170
+ );
28171
+ if (connections.length > 0 || leftOnPlatform) {
28172
+ for (const connection of connections)
28173
+ details.push(
28174
+ `login connection ${connection.id}: ${connection.displayName ?? connection.id} (${connection.authority})` + (known?.issuer ? `, register this redirect address with the provider: ${known.issuer.replace(/\/+$/, "")}/account/external/${connection.id}/callback` : "")
28175
+ );
28176
+ if (connections.length === 0)
28177
+ details.push(
28178
+ "login connections: the last deploy's connections will be removed"
28179
+ );
28180
+ details.push(
28181
+ `step ${IDENTITY_CONNECTIONS_STEP}: ${stepState(connectionsRecord, connectionsHash)}`
28182
+ );
28183
+ }
27941
28184
  const allDone = IDENTITY_STEPS.every(
27942
28185
  (name) => isDone(stepOf(ledger, "identity", name), hash2)
27943
- );
28186
+ ) && (connections.length === 0 && !leftOnPlatform ? true : isDone(connectionsRecord, connectionsHash));
27944
28187
  return {
27945
28188
  ...base,
27946
28189
  action: allDone ? "skip" : "deploy",
@@ -28006,7 +28249,7 @@ async function planPlansService(resolved, ledger) {
28006
28249
  }
28007
28250
  var failedStep = (ledger, service, names) => names.map((name) => ({ name, record: stepOf(ledger, service, name) })).find((step2) => step2.record?.status === "failed");
28008
28251
  var unreachable = (error) => `platform: not reachable (${error instanceof Error ? error.message : String(error)}); showing local records only`;
28009
- async function identityStatus(resolved, ledger, manifest, remote) {
28252
+ async function identityStatus(resolved, ledger, manifest, remote, connectionsRemote) {
28010
28253
  const entry = manifest?.services.identity;
28011
28254
  const failed = failedStep(ledger, "identity", IDENTITY_STEPS);
28012
28255
  const details = [];
@@ -28040,6 +28283,15 @@ async function identityStatus(resolved, ledger, manifest, remote) {
28040
28283
  );
28041
28284
  state = "drift";
28042
28285
  }
28286
+ if (connectionsRemote && platform.status === "Active") {
28287
+ const drift = await connectionLines(
28288
+ resolved,
28289
+ projectId,
28290
+ connectionsRemote,
28291
+ details
28292
+ );
28293
+ if (drift && state === "ready") state = "drift";
28294
+ }
28043
28295
  }
28044
28296
  } catch (error) {
28045
28297
  details.push(unreachable(error));
@@ -28055,6 +28307,36 @@ async function identityStatus(resolved, ledger, manifest, remote) {
28055
28307
  }
28056
28308
  return { service: "identity", state, details };
28057
28309
  }
28310
+ async function connectionLines(resolved, projectId, remote, details) {
28311
+ const configured = normalizedConnections(resolved);
28312
+ let there;
28313
+ try {
28314
+ there = await remote(projectId);
28315
+ } catch (error) {
28316
+ details.push(unreachable(error));
28317
+ return false;
28318
+ }
28319
+ for (const connection of there)
28320
+ details.push(
28321
+ `login connection ${connection.id}: ${connection.displayName} (${connection.authority}), register this redirect address with the provider: ${connection.redirectUri}`
28322
+ );
28323
+ let differ = false;
28324
+ for (const connection of configured)
28325
+ if (!there.some((t) => t.id === connection.id)) {
28326
+ details.push(
28327
+ `drift: login connection ${connection.id} is in the config but not on the platform; run deploy`
28328
+ );
28329
+ differ = true;
28330
+ }
28331
+ for (const connection of there)
28332
+ if (!configured.some((c) => c.id === connection.id)) {
28333
+ details.push(
28334
+ `drift: login connection ${connection.id} is on the platform but not in the config; deploy removes it`
28335
+ );
28336
+ differ = true;
28337
+ }
28338
+ return differ;
28339
+ }
28058
28340
  async function plansStatus(resolved, ledger, manifest, remote, wantedSkus2) {
28059
28341
  const entry = manifest?.services.plans;
28060
28342
  const failed = failedStep(ledger, "plans", PLANS_STEPS);
@@ -28490,7 +28772,8 @@ async function statusV2(dir, only, options = {}) {
28490
28772
  resolved,
28491
28773
  ledger,
28492
28774
  manifest,
28493
- options.identityRemote
28775
+ options.identityRemote,
28776
+ options.identityConnectionsRemote
28494
28777
  )
28495
28778
  );
28496
28779
  continue;
@@ -28727,7 +29010,10 @@ async function deployIdentityService(options, deps, projectId, named) {
28727
29010
  service: "identity",
28728
29011
  status: result.status,
28729
29012
  steps: result.steps,
28730
- url: result.issuer
29013
+ url: result.issuer,
29014
+ notes: (result.connections ?? []).map(
29015
+ (connection) => `login connection ${connection.id}: register this redirect address with the provider: ${connection.redirectUri}`
29016
+ )
28731
29017
  };
28732
29018
  }
28733
29019
  async function deployPlansService(options, deps, projectId, named) {
@@ -28824,7 +29110,8 @@ function formatDeploy(output4) {
28824
29110
  head,
28825
29111
  ...result.steps.map(
28826
29112
  (step2) => ` ${step2.step}: ${step2.skipped ? "skipped (unchanged)" : "ran"}`
28827
- )
29113
+ ),
29114
+ ...(result.notes ?? []).map((note) => ` ${note}`)
28828
29115
  ];
28829
29116
  });
28830
29117
  }
@@ -29396,14 +29683,14 @@ async function discoverAndWireDocs(siteDirectory) {
29396
29683
  directory.sourceDirectory,
29397
29684
  usedNames
29398
29685
  );
29399
- const linkDirectory = path89.join(pagesDir, linkName);
29686
+ const linkDirectory2 = path89.join(pagesDir, linkName);
29400
29687
  const linked = [];
29401
29688
  const skipped = [];
29402
29689
  for (const sourcePath of directory.files) {
29403
29690
  const relativeSource = toPosix3(
29404
29691
  path89.relative(directory.sourceDirectory, sourcePath)
29405
29692
  );
29406
- const linkPath = path89.join(linkDirectory, relativeSource);
29693
+ const linkPath = path89.join(linkDirectory2, relativeSource);
29407
29694
  const relativeLink = toPosix3(path89.relative(site, linkPath));
29408
29695
  const route = toRoutePath(relativeLink, PAGES_DIR);
29409
29696
  if (routes.includes(route)) {
@@ -29426,7 +29713,7 @@ async function discoverAndWireDocs(siteDirectory) {
29426
29713
  }
29427
29714
  sources.push({
29428
29715
  sourceDirectory: directory.sourceDirectory,
29429
- linkDirectory,
29716
+ linkDirectory: linkDirectory2,
29430
29717
  linkName,
29431
29718
  files: linked,
29432
29719
  skipped
@@ -30166,6 +30453,14 @@ function identityRemote() {
30166
30453
  return void 0;
30167
30454
  }
30168
30455
  }
30456
+ function identityConnectionsRemote() {
30457
+ try {
30458
+ const client = new PlatformApiClient(loadConfig());
30459
+ return (projectId) => client.listProjectIdentityConnections(projectId);
30460
+ } catch {
30461
+ return void 0;
30462
+ }
30463
+ }
30169
30464
  function plansRemote() {
30170
30465
  try {
30171
30466
  const client = new PlatformApiClient(loadConfig());
@@ -30185,6 +30480,7 @@ var statusOfProject = (argv) => run2(
30185
30480
  (dir, only) => statusV2(dir, only, {
30186
30481
  gatewayRemote: gatewayRemote(),
30187
30482
  identityRemote: identityRemote(),
30483
+ identityConnectionsRemote: identityConnectionsRemote(),
30188
30484
  plansRemote: plansRemote()
30189
30485
  }),
30190
30486
  formatStatus
@@ -30249,7 +30545,9 @@ async function createProjectV2(options, deps) {
30249
30545
  modules,
30250
30546
  wait: options.wait !== false,
30251
30547
  projectId: linkedProjectId,
30252
- onProjectResolved: (projectId) => setProjectId(options.dir, projectId)
30548
+ onProjectResolved: async (projectId) => {
30549
+ await setProjectId(options.dir, projectId);
30550
+ }
30253
30551
  });
30254
30552
  const outcome = parse4(raw);
30255
30553
  if (outcome.requiresPlatformPlanSelection) {
@@ -423,6 +423,21 @@ export interface ProjectIdentityDto {
423
423
  errorMessage?: string | null;
424
424
  nativeSignup: boolean;
425
425
  }
426
+ export interface ProjectIdentityConnectionDto {
427
+ id: string;
428
+ authority: string;
429
+ clientId: string;
430
+ scopes: string[];
431
+ displayName: string;
432
+ redirectUri: string;
433
+ }
434
+ export interface ProjectIdentityConnectionBody {
435
+ authority: string;
436
+ clientId: string;
437
+ clientSecret?: string;
438
+ scopes?: string[];
439
+ displayName?: string;
440
+ }
426
441
  export interface ProjectIdentityRequestBody {
427
442
  audience?: string;
428
443
  portalRedirectUris: string[];
@@ -540,6 +555,9 @@ export declare class PlatformApiClient {
540
555
  }): Promise<GatewayDryRunDto>;
541
556
  deleteGateway(projectId: string): Promise<GatewayTeardownAcceptedDto>;
542
557
  putProjectIdentity(projectId: string, body: ProjectIdentityRequestBody): Promise<ProjectIdentityDto>;
558
+ putProjectIdentityConnection(projectId: string, connectionId: string, body: ProjectIdentityConnectionBody): Promise<ProjectIdentityConnectionDto>;
559
+ listProjectIdentityConnections(projectId: string): Promise<ProjectIdentityConnectionDto[]>;
560
+ deleteProjectIdentityConnection(projectId: string, connectionId: string): Promise<void>;
543
561
  getProjectIdentity(projectId: string): Promise<ProjectIdentityDto | null>;
544
562
  deleteProjectIdentity(projectId: string): Promise<ProjectIdentityDto | null>;
545
563
  linkDevPortalIdentity(projectId: string): Promise<DevPortalIdentityLinkDto>;