@lukoweb/apitogo 0.2.23 → 0.2.24

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 +316 -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 +1 -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.24",
9909
9971
  type: "module",
9910
9972
  sideEffects: [
9911
9973
  "**/*.css",
@@ -27480,6 +27542,52 @@ var IdentityDeployError = class extends ApitogoError {
27480
27542
  }
27481
27543
  };
27482
27544
  var IDENTITY_STEPS = ["request", "activate"];
27545
+ var IDENTITY_CONNECTIONS_STEP = "connections";
27546
+ var SECRET_PREFIX = "secret:";
27547
+ function normalizedConnections(resolved) {
27548
+ return [...resolved.identity?.connections ?? []].map((connection) => ({
27549
+ ...connection,
27550
+ authority: connection.authority.trim().replace(/\/+$/, "")
27551
+ })).sort((a, b) => a.id.localeCompare(b.id));
27552
+ }
27553
+ function identityConnectionsHash(projectId, resolved) {
27554
+ return stableJson({
27555
+ projectId,
27556
+ connections: normalizedConnections(resolved)
27557
+ });
27558
+ }
27559
+ async function recordedConnectionIds(resolved) {
27560
+ const ids = stepOf(
27561
+ await readLedger(resolved.state),
27562
+ "identity",
27563
+ IDENTITY_CONNECTIONS_STEP
27564
+ )?.output?.ids;
27565
+ return ids ? ids.split(",").filter(Boolean) : [];
27566
+ }
27567
+ function redirectAddressesOf(output4) {
27568
+ return Object.entries(output4 ?? {}).filter(([key]) => key.startsWith("redirect.")).map(([key, redirectUri]) => ({
27569
+ id: key.slice("redirect.".length),
27570
+ redirectUri
27571
+ }));
27572
+ }
27573
+ function connectionBody(connection) {
27574
+ return {
27575
+ authority: connection.authority,
27576
+ clientId: connection.clientId,
27577
+ clientSecret: connection.clientSecret,
27578
+ scopes: connection.scopes,
27579
+ displayName: connection.displayName
27580
+ };
27581
+ }
27582
+ function referencedSecretNames(connections) {
27583
+ return [
27584
+ ...new Set(
27585
+ connections.map(
27586
+ (connection) => connection.clientSecret.slice(SECRET_PREFIX.length)
27587
+ )
27588
+ )
27589
+ ];
27590
+ }
27483
27591
  var PORTAL_CALLBACK_PATH = "/oauth/callback";
27484
27592
  var defaultSleep2 = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
27485
27593
  function identityNotDeployableReason(resolved) {
@@ -27534,6 +27642,25 @@ function rejected2(error) {
27534
27642
  }
27535
27643
  throw error;
27536
27644
  }
27645
+ function connectionRejected(error, id) {
27646
+ if (error instanceof PlatformApiError && error.status === 409) {
27647
+ throw new IdentityDeployError(
27648
+ "IDENTITY_CONNECTION_REJECTED",
27649
+ `The identity is not active yet, so connection "${id}" cannot be saved.`,
27650
+ "Run deploy again once the identity is Active."
27651
+ );
27652
+ }
27653
+ if (error instanceof PlatformApiError && error.status === 400) {
27654
+ const lines = describePlatformProblem(error);
27655
+ throw new IdentityDeployError(
27656
+ "IDENTITY_CONNECTION_REJECTED",
27657
+ `The platform refused login connection "${id}":
27658
+ ${lines.join("\n ") || error.message}`,
27659
+ "Fix the connection in apitogo.config.json (identity.connections) and run deploy again."
27660
+ );
27661
+ }
27662
+ throw error;
27663
+ }
27537
27664
  async function recordOwnProvider(resolved, projectId) {
27538
27665
  const identity = resolved.identity;
27539
27666
  const issuer = identity?.issuer?.replace(/\/+$/, "");
@@ -27623,10 +27750,14 @@ async function deployIdentity(resolved, projectId, deps, options = {}) {
27623
27750
  },
27624
27751
  stillValid: async () => (await client.getProjectIdentity(projectId))?.status === "Active"
27625
27752
  };
27753
+ const wanted = normalizedConnections(resolved);
27754
+ const steps = [requestStep, activateStep];
27755
+ if (wanted.length > 0 || (await recordedConnectionIds(resolved)).length > 0)
27756
+ steps.push(connectionsStep(resolved, projectId, client, wanted));
27626
27757
  const outcomes = await runPipeline(
27627
27758
  resolved.state,
27628
27759
  "identity",
27629
- [requestStep, activateStep],
27760
+ steps,
27630
27761
  { force: options.force }
27631
27762
  );
27632
27763
  const activate = outcomes.find((outcome) => outcome.step === "activate");
@@ -27649,14 +27780,103 @@ async function deployIdentity(resolved, projectId, deps, options = {}) {
27649
27780
  );
27650
27781
  }
27651
27782
  }
27783
+ const connectionsRan = outcomes.some(
27784
+ (outcome) => outcome.step === IDENTITY_CONNECTIONS_STEP && !outcome.skipped
27785
+ );
27652
27786
  return {
27653
- status: ran ? "deployed" : "unchanged",
27787
+ status: ran || connectionsRan ? "deployed" : "unchanged",
27654
27788
  steps: outcomes.map((outcome) => ({
27655
27789
  step: outcome.step,
27656
27790
  skipped: outcome.skipped
27657
27791
  })),
27658
27792
  issuer: learned?.issuer ?? known?.issuer,
27659
- clientId: learned?.clientId ?? known?.clientId
27793
+ clientId: learned?.clientId ?? known?.clientId,
27794
+ connections: redirectAddressesOf(
27795
+ stepOf(
27796
+ await readLedger(resolved.state),
27797
+ "identity",
27798
+ IDENTITY_CONNECTIONS_STEP
27799
+ )?.output
27800
+ )
27801
+ };
27802
+ }
27803
+ function connectionsStep(resolved, projectId, client, wanted) {
27804
+ const {
27805
+ putProjectIdentityConnection,
27806
+ listProjectIdentityConnections,
27807
+ deleteProjectIdentityConnection,
27808
+ listSecrets
27809
+ } = client;
27810
+ if (!putProjectIdentityConnection || !listProjectIdentityConnections || !deleteProjectIdentityConnection || !listSecrets)
27811
+ throw new Error("The platform client has no login connection calls.");
27812
+ const stamps = async () => {
27813
+ const names = referencedSecretNames(wanted);
27814
+ if (names.length === 0) return {};
27815
+ const listed = await listSecrets.call(client, projectId);
27816
+ const byName2 = new Map(listed.secrets.map((s) => [s.name, s.updatedAtUtc]));
27817
+ const missing = names.filter((name) => !byName2.has(name));
27818
+ if (missing.length > 0)
27819
+ throw new IdentityDeployError(
27820
+ "IDENTITY_SECRET_MISSING",
27821
+ `The secret ${missing.join(", ")} is not set for this project, and a login connection needs it.`,
27822
+ `Run \`apitogo secrets set ${missing[0]}\` with the value from the provider, then deploy again.`
27823
+ );
27824
+ return Object.fromEntries(
27825
+ names.map((name) => [name, byName2.get(name)])
27826
+ );
27827
+ };
27828
+ const sameAddress = (a, b) => a.replace(/\/+$/, "").toLowerCase() === b.replace(/\/+$/, "").toLowerCase();
27829
+ return {
27830
+ name: IDENTITY_CONNECTIONS_STEP,
27831
+ hash: () => identityConnectionsHash(projectId, resolved),
27832
+ run: async () => {
27833
+ const recorded = await stamps();
27834
+ const existing = await listProjectIdentityConnections.call(
27835
+ client,
27836
+ projectId
27837
+ );
27838
+ const redirects = {};
27839
+ for (const connection of wanted) {
27840
+ try {
27841
+ const saved = await putProjectIdentityConnection.call(
27842
+ client,
27843
+ projectId,
27844
+ connection.id,
27845
+ connectionBody(connection)
27846
+ );
27847
+ redirects[`redirect.${connection.id}`] = saved.redirectUri;
27848
+ } catch (error) {
27849
+ return connectionRejected(error, connection.id);
27850
+ }
27851
+ }
27852
+ for (const old of existing)
27853
+ if (!wanted.some((connection) => connection.id === old.id))
27854
+ await deleteProjectIdentityConnection.call(client, projectId, old.id);
27855
+ return {
27856
+ ids: wanted.map((connection) => connection.id).join(","),
27857
+ secretsStamp: stableJson(recorded),
27858
+ ...redirects
27859
+ };
27860
+ },
27861
+ // The platform still has exactly these connections, and none of the secrets was changed since.
27862
+ stillValid: async () => {
27863
+ const found = await listProjectIdentityConnections.call(
27864
+ client,
27865
+ projectId
27866
+ );
27867
+ if (found.length !== wanted.length) return false;
27868
+ for (const connection of wanted) {
27869
+ const there = found.find((f) => f.id === connection.id);
27870
+ if (!there || there.clientId !== connection.clientId || !sameAddress(there.authority, connection.authority))
27871
+ return false;
27872
+ }
27873
+ const before = stepOf(
27874
+ await readLedger(resolved.state),
27875
+ "identity",
27876
+ IDENTITY_CONNECTIONS_STEP
27877
+ )?.output?.secretsStamp;
27878
+ return before === void 0 || before === stableJson(await stamps());
27879
+ }
27660
27880
  };
27661
27881
  }
27662
27882
 
@@ -27938,9 +28158,30 @@ async function planIdentityService(resolved, ledger, manifest) {
27938
28158
  (name) => `step ${name}: ${stepState(stepOf(ledger, "identity", name), hash2)}`
27939
28159
  )
27940
28160
  ];
28161
+ const connections = normalizedConnections(resolved);
28162
+ const leftOnPlatform = (await recordedConnectionIds(resolved)).length > 0;
28163
+ const connectionsHash = projectId ? identityConnectionsHash(projectId, resolved) : void 0;
28164
+ const connectionsRecord = stepOf(
28165
+ ledger,
28166
+ "identity",
28167
+ IDENTITY_CONNECTIONS_STEP
28168
+ );
28169
+ if (connections.length > 0 || leftOnPlatform) {
28170
+ for (const connection of connections)
28171
+ details.push(
28172
+ `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` : "")
28173
+ );
28174
+ if (connections.length === 0)
28175
+ details.push(
28176
+ "login connections: the last deploy's connections will be removed"
28177
+ );
28178
+ details.push(
28179
+ `step ${IDENTITY_CONNECTIONS_STEP}: ${stepState(connectionsRecord, connectionsHash)}`
28180
+ );
28181
+ }
27941
28182
  const allDone = IDENTITY_STEPS.every(
27942
28183
  (name) => isDone(stepOf(ledger, "identity", name), hash2)
27943
- );
28184
+ ) && (connections.length === 0 && !leftOnPlatform ? true : isDone(connectionsRecord, connectionsHash));
27944
28185
  return {
27945
28186
  ...base,
27946
28187
  action: allDone ? "skip" : "deploy",
@@ -28006,7 +28247,7 @@ async function planPlansService(resolved, ledger) {
28006
28247
  }
28007
28248
  var failedStep = (ledger, service, names) => names.map((name) => ({ name, record: stepOf(ledger, service, name) })).find((step2) => step2.record?.status === "failed");
28008
28249
  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) {
28250
+ async function identityStatus(resolved, ledger, manifest, remote, connectionsRemote) {
28010
28251
  const entry = manifest?.services.identity;
28011
28252
  const failed = failedStep(ledger, "identity", IDENTITY_STEPS);
28012
28253
  const details = [];
@@ -28040,6 +28281,15 @@ async function identityStatus(resolved, ledger, manifest, remote) {
28040
28281
  );
28041
28282
  state = "drift";
28042
28283
  }
28284
+ if (connectionsRemote && platform.status === "Active") {
28285
+ const drift = await connectionLines(
28286
+ resolved,
28287
+ projectId,
28288
+ connectionsRemote,
28289
+ details
28290
+ );
28291
+ if (drift && state === "ready") state = "drift";
28292
+ }
28043
28293
  }
28044
28294
  } catch (error) {
28045
28295
  details.push(unreachable(error));
@@ -28055,6 +28305,36 @@ async function identityStatus(resolved, ledger, manifest, remote) {
28055
28305
  }
28056
28306
  return { service: "identity", state, details };
28057
28307
  }
28308
+ async function connectionLines(resolved, projectId, remote, details) {
28309
+ const configured = normalizedConnections(resolved);
28310
+ let there;
28311
+ try {
28312
+ there = await remote(projectId);
28313
+ } catch (error) {
28314
+ details.push(unreachable(error));
28315
+ return false;
28316
+ }
28317
+ for (const connection of there)
28318
+ details.push(
28319
+ `login connection ${connection.id}: ${connection.displayName} (${connection.authority}), register this redirect address with the provider: ${connection.redirectUri}`
28320
+ );
28321
+ let differ = false;
28322
+ for (const connection of configured)
28323
+ if (!there.some((t) => t.id === connection.id)) {
28324
+ details.push(
28325
+ `drift: login connection ${connection.id} is in the config but not on the platform; run deploy`
28326
+ );
28327
+ differ = true;
28328
+ }
28329
+ for (const connection of there)
28330
+ if (!configured.some((c) => c.id === connection.id)) {
28331
+ details.push(
28332
+ `drift: login connection ${connection.id} is on the platform but not in the config; deploy removes it`
28333
+ );
28334
+ differ = true;
28335
+ }
28336
+ return differ;
28337
+ }
28058
28338
  async function plansStatus(resolved, ledger, manifest, remote, wantedSkus2) {
28059
28339
  const entry = manifest?.services.plans;
28060
28340
  const failed = failedStep(ledger, "plans", PLANS_STEPS);
@@ -28490,7 +28770,8 @@ async function statusV2(dir, only, options = {}) {
28490
28770
  resolved,
28491
28771
  ledger,
28492
28772
  manifest,
28493
- options.identityRemote
28773
+ options.identityRemote,
28774
+ options.identityConnectionsRemote
28494
28775
  )
28495
28776
  );
28496
28777
  continue;
@@ -28727,7 +29008,10 @@ async function deployIdentityService(options, deps, projectId, named) {
28727
29008
  service: "identity",
28728
29009
  status: result.status,
28729
29010
  steps: result.steps,
28730
- url: result.issuer
29011
+ url: result.issuer,
29012
+ notes: (result.connections ?? []).map(
29013
+ (connection) => `login connection ${connection.id}: register this redirect address with the provider: ${connection.redirectUri}`
29014
+ )
28731
29015
  };
28732
29016
  }
28733
29017
  async function deployPlansService(options, deps, projectId, named) {
@@ -28824,7 +29108,8 @@ function formatDeploy(output4) {
28824
29108
  head,
28825
29109
  ...result.steps.map(
28826
29110
  (step2) => ` ${step2.step}: ${step2.skipped ? "skipped (unchanged)" : "ran"}`
28827
- )
29111
+ ),
29112
+ ...(result.notes ?? []).map((note) => ` ${note}`)
28828
29113
  ];
28829
29114
  });
28830
29115
  }
@@ -29396,14 +29681,14 @@ async function discoverAndWireDocs(siteDirectory) {
29396
29681
  directory.sourceDirectory,
29397
29682
  usedNames
29398
29683
  );
29399
- const linkDirectory = path89.join(pagesDir, linkName);
29684
+ const linkDirectory2 = path89.join(pagesDir, linkName);
29400
29685
  const linked = [];
29401
29686
  const skipped = [];
29402
29687
  for (const sourcePath of directory.files) {
29403
29688
  const relativeSource = toPosix3(
29404
29689
  path89.relative(directory.sourceDirectory, sourcePath)
29405
29690
  );
29406
- const linkPath = path89.join(linkDirectory, relativeSource);
29691
+ const linkPath = path89.join(linkDirectory2, relativeSource);
29407
29692
  const relativeLink = toPosix3(path89.relative(site, linkPath));
29408
29693
  const route = toRoutePath(relativeLink, PAGES_DIR);
29409
29694
  if (routes.includes(route)) {
@@ -29426,7 +29711,7 @@ async function discoverAndWireDocs(siteDirectory) {
29426
29711
  }
29427
29712
  sources.push({
29428
29713
  sourceDirectory: directory.sourceDirectory,
29429
- linkDirectory,
29714
+ linkDirectory: linkDirectory2,
29430
29715
  linkName,
29431
29716
  files: linked,
29432
29717
  skipped
@@ -30166,6 +30451,14 @@ function identityRemote() {
30166
30451
  return void 0;
30167
30452
  }
30168
30453
  }
30454
+ function identityConnectionsRemote() {
30455
+ try {
30456
+ const client = new PlatformApiClient(loadConfig());
30457
+ return (projectId) => client.listProjectIdentityConnections(projectId);
30458
+ } catch {
30459
+ return void 0;
30460
+ }
30461
+ }
30169
30462
  function plansRemote() {
30170
30463
  try {
30171
30464
  const client = new PlatformApiClient(loadConfig());
@@ -30185,6 +30478,7 @@ var statusOfProject = (argv) => run2(
30185
30478
  (dir, only) => statusV2(dir, only, {
30186
30479
  gatewayRemote: gatewayRemote(),
30187
30480
  identityRemote: identityRemote(),
30481
+ identityConnectionsRemote: identityConnectionsRemote(),
30188
30482
  plansRemote: plansRemote()
30189
30483
  }),
30190
30484
  formatStatus
@@ -30249,7 +30543,9 @@ async function createProjectV2(options, deps) {
30249
30543
  modules,
30250
30544
  wait: options.wait !== false,
30251
30545
  projectId: linkedProjectId,
30252
- onProjectResolved: (projectId) => setProjectId(options.dir, projectId)
30546
+ onProjectResolved: async (projectId) => {
30547
+ await setProjectId(options.dir, projectId);
30548
+ }
30253
30549
  });
30254
30550
  const outcome = parse4(raw);
30255
30551
  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>;