@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.
- package/README.md +94 -94
- package/cli.js +13 -13
- package/client.d.ts +8 -8
- package/dist/cli/cli.js +316 -20
- package/dist/declarations/cli/platform/client/platform-api.d.ts +18 -0
- package/dist/declarations/config/validators/InputNavigationSchema.d.ts +7 -7
- package/dist/declarations/config/validators/ZudokuConfig.d.ts +1 -1
- package/docs/cli/commands.md +75 -75
- package/docs/cli/go-live.md +123 -123
- package/docs/cli/overview.md +91 -91
- package/docs/cli/setup.md +141 -141
- package/docs/cli/shape.md +127 -127
- package/docs/components/alert.mdx +130 -130
- package/docs/components/badge.mdx +70 -70
- package/docs/components/button.mdx +132 -132
- package/docs/components/callout.mdx +112 -112
- package/docs/components/card.mdx +104 -104
- package/docs/components/checkbox.mdx +72 -72
- package/docs/components/client-only.mdx +79 -79
- package/docs/components/code-tabs.mdx +179 -179
- package/docs/components/dialog.mdx +167 -167
- package/docs/components/head.mdx +200 -200
- package/docs/components/icons.mdx +27 -27
- package/docs/components/input.mdx +96 -96
- package/docs/components/label.mdx +86 -86
- package/docs/components/link.mdx +242 -242
- package/docs/components/markdown.mdx +151 -151
- package/docs/components/mermaid.mdx +81 -81
- package/docs/components/playground.mdx +85 -85
- package/docs/components/secret.mdx +79 -79
- package/docs/components/select.mdx +176 -176
- package/docs/components/shadcn.mdx +73 -73
- package/docs/components/slider.mdx +108 -108
- package/docs/components/slot.mdx +119 -119
- package/docs/components/stepper.mdx +138 -138
- package/docs/components/switch.mdx +96 -96
- package/docs/components/syntax-highlight.mdx +602 -602
- package/docs/components/textarea.mdx +78 -78
- package/docs/components/tooltip.mdx +195 -195
- package/docs/components/typography.mdx +61 -61
- package/docs/components.mdx +60 -60
- package/docs/concepts/auth-provider-api-identities.md +105 -105
- package/docs/configuration/ai-assistants.md +65 -65
- package/docs/configuration/api-catalog.md +109 -109
- package/docs/configuration/api-reference.md +397 -397
- package/docs/configuration/authentication-auth0.md +181 -181
- package/docs/configuration/authentication-azure-ad.md +245 -245
- package/docs/configuration/authentication-clerk.md +117 -117
- package/docs/configuration/authentication-firebase.md +69 -69
- package/docs/configuration/authentication-pingfederate.md +143 -143
- package/docs/configuration/authentication-supabase.md +233 -233
- package/docs/configuration/authentication.md +159 -159
- package/docs/configuration/build-configuration.mdx +147 -147
- package/docs/configuration/docs.md +282 -282
- package/docs/configuration/footer.mdx +118 -118
- package/docs/configuration/gateway.md +221 -221
- package/docs/configuration/llms.md +90 -90
- package/docs/configuration/make-config.mdx +124 -124
- package/docs/configuration/manifest.md +128 -128
- package/docs/configuration/navigation.mdx +421 -421
- package/docs/configuration/overview.md +166 -166
- package/docs/configuration/plans.md +153 -153
- package/docs/configuration/protected-routes.md +150 -150
- package/docs/configuration/search.md +164 -164
- package/docs/configuration/sentry.mdx +44 -44
- package/docs/configuration/site.md +124 -124
- package/docs/configuration/slots.mdx +125 -125
- package/docs/configuration/vite-config.md +18 -18
- package/docs/custom-plugins.md +285 -285
- package/docs/customization/colors-theme.mdx +278 -278
- package/docs/customization/fonts.md +110 -110
- package/docs/customization/landing-page.md +188 -188
- package/docs/deploy/apache-nginx.md +41 -41
- package/docs/deploy/apitogo.md +17 -17
- package/docs/deploy/cloudflare-pages.md +74 -74
- package/docs/deploy/direct-upload.md +17 -17
- package/docs/deploy/github-pages.md +49 -49
- package/docs/deploy/vercel.md +101 -101
- package/docs/deployment.md +9 -9
- package/docs/extending/events.md +124 -124
- package/docs/guides/custom-pages.md +110 -110
- package/docs/guides/environment-variables.md +94 -94
- package/docs/guides/managing-api-keys-and-identities.md +89 -89
- package/docs/guides/mermaid.mdx +70 -70
- package/docs/guides/navigation-rules.mdx +203 -203
- package/docs/guides/processors.mdx +234 -234
- package/docs/guides/static-files.md +55 -55
- package/docs/guides/transforming-examples.md +156 -156
- package/docs/guides/using-multiple-apis.md +87 -87
- package/docs/markdown/admonitions.md +128 -128
- package/docs/markdown/code-blocks.md +196 -196
- package/docs/markdown/frontmatter.md +173 -173
- package/docs/markdown/mdx.md +68 -68
- package/docs/markdown/overview.md +275 -275
- package/docs/mcp/go-live.md +100 -100
- package/docs/mcp/overview.md +76 -76
- package/docs/mcp/setup.md +173 -173
- package/docs/mcp/shape.md +77 -77
- package/docs/mcp/tools.md +102 -102
- package/docs/plugins.md +24 -24
- package/docs/quickstart.md +72 -72
- package/docs/writing.mdx +72 -72
- package/package.json +1 -1
- package/src/app/ZuploBuildConfig.ts +36 -36
- package/src/app/apitogoBrandTheme.ts +47 -47
- package/src/app/defaultTheme.css +77 -77
- package/src/app/demo-cdn.html +37 -37
- package/src/app/demo.html +21 -21
- package/src/app/demo.tsx +77 -77
- package/src/app/entry.client.tsx +107 -107
- package/src/app/entry.server.tsx +160 -160
- package/src/app/env.ts +40 -40
- package/src/app/main.css +400 -400
- package/src/app/main.tsx +167 -167
- package/src/app/polyfills.ts +47 -47
- package/src/app/processRoutes.tsx +51 -51
- package/src/app/sentry.ts +24 -24
- package/src/app/standalone.html +23 -23
- package/src/app/standalone.tsx +60 -60
- package/src/app/utils/createRedirectRoutes.ts +11 -11
- package/src/config/apitogo-config-core.ts +7 -3
- package/src/config/apitogo-config-loader.browser.ts +17 -17
- package/src/config/apitogo-config-loader.node.ts +88 -88
- package/src/config/apitogo-config-loader.ts +6 -6
- package/src/config/build-apitogo-config.ts +61 -61
- package/src/config/config.ts +74 -74
- package/src/config/create-plugin.ts +71 -71
- package/src/config/default-landing-content.ts +149 -149
- package/src/config/file-exists.ts +6 -6
- package/src/config/gateway-limits.ts +128 -128
- package/src/config/landing-manifest.ts +11 -11
- package/src/config/landing-openapi-showcase.ts +124 -124
- package/src/config/loader.ts +375 -375
- package/src/config/local-manifest.ts +545 -545
- package/src/config/resolve-modules.ts +354 -354
- package/src/config/v2/__fixtures__/scenario-a-docs-only.json +6 -6
- package/src/config/v2/__fixtures__/scenario-b-managed-origin.json +14 -14
- package/src/config/v2/__fixtures__/scenario-c-proxy-oidc.json +15 -15
- package/src/config/v2/__fixtures__/scenario-h-full-stack.json +28 -28
- package/src/config/v2/docs-navigation.ts +72 -72
- package/src/config/v2/errors.ts +42 -42
- package/src/config/v2/gateway-reference.ts +220 -220
- package/src/config/v2/gateway-request.ts +123 -123
- package/src/config/v2/home-redirect.ts +98 -98
- package/src/config/v2/index.ts +126 -126
- package/src/config/v2/init.ts +273 -273
- package/src/config/v2/layout.ts +237 -237
- package/src/config/v2/ledger.ts +235 -235
- package/src/config/v2/link-directory.ts +34 -0
- package/src/config/v2/load.ts +70 -70
- package/src/config/v2/manifest.ts +452 -452
- package/src/config/v2/parse.ts +214 -214
- package/src/config/v2/paths.ts +54 -54
- package/src/config/v2/portal-profile.ts +88 -88
- package/src/config/v2/resolve.ts +188 -188
- package/src/config/v2/rules.ts +714 -714
- package/src/config/v2/schema.ts +245 -245
- package/src/config/v2/services.ts +663 -663
- package/src/config/v2/workspace.ts +3 -2
- package/src/config/v2/wrapper.ts +24 -2
- package/src/config/validators/BuildSchema.ts +95 -95
- package/src/config/validators/HeaderNavigationSchema.ts +44 -44
- package/src/config/validators/InputNavigationSchema.test-d.ts +178 -178
- package/src/config/validators/InputNavigationSchema.ts +206 -206
- package/src/config/validators/ModulesSchema.ts +502 -502
- package/src/config/validators/NavigationSchema.ts +352 -352
- package/src/config/validators/ProtectedRoutesSchema.ts +35 -35
- package/src/config/validators/ZudokuConfig.ts +792 -792
- package/src/config/validators/auth.ts +3 -3
- package/src/config/validators/reason-codes.ts +7 -7
- package/src/env.d.ts +11 -11
- package/src/index.ts +83 -83
- package/src/lib/MissingIcon.tsx +22 -22
- package/src/lib/assets/language-icons/bun.tsx +50 -50
- package/src/lib/assets/language-icons/c.tsx +31 -31
- package/src/lib/assets/language-icons/commonlisp.tsx +22 -22
- package/src/lib/assets/language-icons/cpp.tsx +35 -35
- package/src/lib/assets/language-icons/csharp.tsx +35 -35
- package/src/lib/assets/language-icons/css.tsx +36 -36
- package/src/lib/assets/language-icons/dart.tsx +39 -39
- package/src/lib/assets/language-icons/elixir.tsx +19 -19
- package/src/lib/assets/language-icons/go.tsx +19 -19
- package/src/lib/assets/language-icons/graphql.tsx +19 -19
- package/src/lib/assets/language-icons/html.tsx +24 -24
- package/src/lib/assets/language-icons/java.tsx +35 -35
- package/src/lib/assets/language-icons/javascript.tsx +11 -11
- package/src/lib/assets/language-icons/json.tsx +19 -19
- package/src/lib/assets/language-icons/kotlin.tsx +30 -30
- package/src/lib/assets/language-icons/markdown.tsx +19 -19
- package/src/lib/assets/language-icons/mdx.tsx +23 -23
- package/src/lib/assets/language-icons/npm.tsx +15 -15
- package/src/lib/assets/language-icons/objectivec.tsx +23 -23
- package/src/lib/assets/language-icons/ocaml.tsx +34 -34
- package/src/lib/assets/language-icons/php.tsx +19 -19
- package/src/lib/assets/language-icons/pnpm.tsx +32 -32
- package/src/lib/assets/language-icons/powershell.tsx +27 -27
- package/src/lib/assets/language-icons/python.tsx +23 -23
- package/src/lib/assets/language-icons/react.tsx +21 -21
- package/src/lib/assets/language-icons/ruby.tsx +19 -19
- package/src/lib/assets/language-icons/rust.tsx +19 -19
- package/src/lib/assets/language-icons/scala.tsx +19 -19
- package/src/lib/assets/language-icons/shell.tsx +19 -19
- package/src/lib/assets/language-icons/swift.tsx +19 -19
- package/src/lib/assets/language-icons/toml.tsx +23 -23
- package/src/lib/assets/language-icons/typescript.tsx +23 -23
- package/src/lib/assets/language-icons/xml.tsx +19 -19
- package/src/lib/assets/language-icons/yaml.tsx +23 -23
- package/src/lib/assets/language-icons/yarn.tsx +17 -17
- package/src/lib/assets/language-icons/zig.tsx +32 -32
- package/src/lib/auth/issuer.ts +34 -34
- package/src/lib/authentication/AuthenticationPlugin.tsx +33 -33
- package/src/lib/authentication/auth-header-nav.ts +46 -46
- package/src/lib/authentication/authentication.ts +51 -51
- package/src/lib/authentication/components/CallbackHandler.tsx +45 -45
- package/src/lib/authentication/components/OAuthErrorPage.tsx +197 -197
- package/src/lib/authentication/components/ProductionUnlockPage.tsx +26 -26
- package/src/lib/authentication/components/SignIn.tsx +46 -46
- package/src/lib/authentication/components/SignOut.tsx +15 -15
- package/src/lib/authentication/components/SignUp.tsx +48 -48
- package/src/lib/authentication/constants.ts +1 -1
- package/src/lib/authentication/errors.ts +34 -34
- package/src/lib/authentication/header-nav-filter.ts +35 -35
- package/src/lib/authentication/hook.ts +141 -141
- package/src/lib/authentication/providers/auth0.tsx +91 -91
- package/src/lib/authentication/providers/azureb2c.tsx +223 -223
- package/src/lib/authentication/providers/clerk.tsx +224 -224
- package/src/lib/authentication/providers/dev-portal-auth-pages.tsx +602 -602
- package/src/lib/authentication/providers/dev-portal-constants.ts +38 -38
- package/src/lib/authentication/providers/dev-portal-demo.ts +151 -151
- package/src/lib/authentication/providers/dev-portal-utils.ts +279 -279
- package/src/lib/authentication/providers/dev-portal.tsx +448 -448
- package/src/lib/authentication/providers/firebase.tsx +486 -486
- package/src/lib/authentication/providers/openid.tsx +516 -516
- package/src/lib/authentication/providers/supabase.tsx +412 -412
- package/src/lib/authentication/providers/util.ts +26 -26
- package/src/lib/authentication/state.ts +180 -180
- package/src/lib/authentication/ui/AuthCard.tsx +7 -7
- package/src/lib/authentication/ui/EmailLinkCallbackUi.tsx +129 -129
- package/src/lib/authentication/ui/EmailLinkSentUi.tsx +105 -105
- package/src/lib/authentication/ui/EmailLinkSignInUi.tsx +100 -100
- package/src/lib/authentication/ui/EmailVerificationUi.tsx +128 -128
- package/src/lib/authentication/ui/ZudokuAuthUi.tsx +620 -620
- package/src/lib/authentication/ui/icons/Apple.tsx +10 -10
- package/src/lib/authentication/ui/icons/Facebook.tsx +15 -15
- package/src/lib/authentication/ui/icons/Github.tsx +16 -16
- package/src/lib/authentication/ui/icons/Google.tsx +16 -16
- package/src/lib/authentication/ui/icons/Microsoft.tsx +12 -12
- package/src/lib/authentication/ui/icons/X.tsx +10 -10
- package/src/lib/authentication/utils/relativeRedirectUrl.ts +16 -16
- package/src/lib/components/AiAssistantMenuItems.tsx +102 -102
- package/src/lib/components/AnchorLink.tsx +24 -24
- package/src/lib/components/Autocomplete.tsx +123 -123
- package/src/lib/components/Banner.tsx +52 -52
- package/src/lib/components/Bootstrap.tsx +77 -77
- package/src/lib/components/BuildCheck.tsx +87 -87
- package/src/lib/components/CategoryHeading.tsx +19 -19
- package/src/lib/components/ClientOnly.tsx +19 -19
- package/src/lib/components/DeveloperHint.tsx +39 -39
- package/src/lib/components/ErrorPage.tsx +26 -26
- package/src/lib/components/Footer.tsx +146 -146
- package/src/lib/components/Framed.tsx +51 -51
- package/src/lib/components/Header.tsx +261 -261
- package/src/lib/components/HeaderAuthActions.tsx +32 -32
- package/src/lib/components/HeaderNavigation.tsx +176 -176
- package/src/lib/components/Heading.tsx +84 -84
- package/src/lib/components/InlineCode.tsx +15 -15
- package/src/lib/components/LandingLayout.tsx +27 -27
- package/src/lib/components/LanguageIcon.tsx +199 -199
- package/src/lib/components/Layout.tsx +59 -59
- package/src/lib/components/Main.tsx +52 -52
- package/src/lib/components/Markdown.tsx +55 -55
- package/src/lib/components/Mermaid.tsx +74 -74
- package/src/lib/components/Meta.tsx +46 -46
- package/src/lib/components/MobileTopNavigation.tsx +283 -283
- package/src/lib/components/MultiSelect.tsx +86 -86
- package/src/lib/components/NotFoundPage.tsx +37 -37
- package/src/lib/components/PageProgress.tsx +28 -28
- package/src/lib/components/PagefindSearchMeta.tsx +14 -14
- package/src/lib/components/Pagination.tsx +44 -44
- package/src/lib/components/PathRenderer.tsx +61 -61
- package/src/lib/components/PluginHeads.tsx +17 -17
- package/src/lib/components/Search.tsx +70 -70
- package/src/lib/components/SiteTitle.tsx +58 -58
- package/src/lib/components/Slot.tsx +65 -65
- package/src/lib/components/Spinner.tsx +5 -5
- package/src/lib/components/StatusPage.tsx +96 -96
- package/src/lib/components/ThemeSwitch.tsx +99 -99
- package/src/lib/components/TopNavigation.tsx +90 -90
- package/src/lib/components/Typography.tsx +12 -12
- package/src/lib/components/Zudoku.tsx +105 -105
- package/src/lib/components/cache.ts +27 -27
- package/src/lib/components/context/RenderContext.ts +11 -11
- package/src/lib/components/context/RouterEventsEmitter.tsx +19 -19
- package/src/lib/components/context/SlotProvider.tsx +149 -149
- package/src/lib/components/context/ViewportAnchorContext.tsx +137 -137
- package/src/lib/components/context/ZudokuContext.ts +140 -140
- package/src/lib/components/context/ZudokuProvider.tsx +20 -20
- package/src/lib/components/context/ZudokuReactContext.tsx +17 -17
- package/src/lib/components/index.ts +36 -36
- package/src/lib/components/navigation/Navigation.tsx +51 -51
- package/src/lib/components/navigation/NavigationBadge.tsx +48 -48
- package/src/lib/components/navigation/NavigationCategory.tsx +157 -157
- package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -28
- package/src/lib/components/navigation/NavigationFilterInput.tsx +35 -35
- package/src/lib/components/navigation/NavigationItem.tsx +181 -181
- package/src/lib/components/navigation/NavigationWrapper.tsx +49 -49
- package/src/lib/components/navigation/PoweredByZudoku.tsx +39 -39
- package/src/lib/components/navigation/Toc.tsx +137 -137
- package/src/lib/components/navigation/ZudokuLogo.tsx +25 -25
- package/src/lib/components/navigation/ZuploLogo.tsx +14 -14
- package/src/lib/components/navigation/utils.ts +234 -234
- package/src/lib/core/RouteGuard.tsx +260 -260
- package/src/lib/core/ZudokuContext.ts +272 -272
- package/src/lib/core/plugins.ts +139 -139
- package/src/lib/core/react-query.ts +1 -1
- package/src/lib/core/router.ts +1 -1
- package/src/lib/core/transform-config.ts +67 -67
- package/src/lib/demo/DemoAnnouncement.tsx +17 -17
- package/src/lib/errors/ErrorAlert.tsx +28 -28
- package/src/lib/errors/ErrorMessage.tsx +50 -50
- package/src/lib/errors/RouterError.tsx +18 -18
- package/src/lib/errors/ServerError.tsx +5 -5
- package/src/lib/errors/TopLevelError.tsx +6 -6
- package/src/lib/hooks/index.ts +13 -13
- package/src/lib/hooks/useEvent.ts +41 -41
- package/src/lib/hooks/useHighlighter.ts +15 -15
- package/src/lib/hooks/useHotkey.ts +70 -70
- package/src/lib/icons.ts +2 -2
- package/src/lib/navigation/applyRules.ts +127 -127
- package/src/lib/navigation/pathMatcher.ts +81 -81
- package/src/lib/oas/graphql/circular.ts +69 -69
- package/src/lib/oas/graphql/constants.ts +2 -2
- package/src/lib/oas/graphql/index.ts +791 -791
- package/src/lib/oas/parser/dereference/index.ts +84 -84
- package/src/lib/oas/parser/dereference/resolveRef.ts +32 -32
- package/src/lib/oas/parser/index.ts +129 -129
- package/src/lib/oas/parser/schemas/v3.0.json +1489 -1489
- package/src/lib/oas/parser/schemas/v3.1.json +1298 -1298
- package/src/lib/oas/parser/upgrade/index.ts +174 -174
- package/src/lib/plugins/api-catalog/Catalog.tsx +80 -80
- package/src/lib/plugins/api-catalog/index.tsx +119 -119
- package/src/lib/plugins/api-keys/CreateApiKey.tsx +128 -128
- package/src/lib/plugins/api-keys/CreateApiKeyDialog.tsx +49 -49
- package/src/lib/plugins/api-keys/ProtectedRoute.tsx +33 -33
- package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +72 -72
- package/src/lib/plugins/api-keys/index.tsx +274 -274
- package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +342 -342
- package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -67
- package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +127 -127
- package/src/lib/plugins/custom-pages/index.tsx +32 -32
- package/src/lib/plugins/markdown/MdxPage.tsx +260 -260
- package/src/lib/plugins/markdown/assets/ChatGPTLogo.tsx +11 -11
- package/src/lib/plugins/markdown/assets/ClaudeLogo.tsx +19 -19
- package/src/lib/plugins/markdown/index.tsx +82 -82
- package/src/lib/plugins/openapi/ApiHeader.tsx +96 -96
- package/src/lib/plugins/openapi/CollapsibleCode.tsx +88 -88
- package/src/lib/plugins/openapi/ColorizedParam.tsx +115 -115
- package/src/lib/plugins/openapi/DownloadSchemaButton.tsx +94 -94
- package/src/lib/plugins/openapi/Endpoint.tsx +85 -85
- package/src/lib/plugins/openapi/GeneratedExampleSidecarBox.tsx +52 -52
- package/src/lib/plugins/openapi/MCPEndpoint.tsx +273 -273
- package/src/lib/plugins/openapi/OasProvider.tsx +74 -74
- package/src/lib/plugins/openapi/OperationList.tsx +275 -275
- package/src/lib/plugins/openapi/OperationListItem.tsx +183 -183
- package/src/lib/plugins/openapi/ParamInfos.tsx +96 -96
- package/src/lib/plugins/openapi/ParameterList.tsx +53 -53
- package/src/lib/plugins/openapi/ParameterListItem.tsx +161 -161
- package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +67 -67
- package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +63 -63
- package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +120 -120
- package/src/lib/plugins/openapi/SchemaInfo.tsx +344 -344
- package/src/lib/plugins/openapi/SchemaList.tsx +113 -113
- package/src/lib/plugins/openapi/Sidecar.tsx +314 -314
- package/src/lib/plugins/openapi/SidecarBox.tsx +57 -57
- package/src/lib/plugins/openapi/SidecarExamples.tsx +177 -177
- package/src/lib/plugins/openapi/SimpleSelect.tsx +46 -46
- package/src/lib/plugins/openapi/client/GraphQLClient.tsx +73 -73
- package/src/lib/plugins/openapi/client/GraphQLContext.tsx +16 -16
- package/src/lib/plugins/openapi/client/createServer.ts +35 -35
- package/src/lib/plugins/openapi/client/useCreateQuery.ts +44 -44
- package/src/lib/plugins/openapi/components/ConstValue.tsx +24 -24
- package/src/lib/plugins/openapi/components/EnumValues.tsx +58 -58
- package/src/lib/plugins/openapi/components/NonHighlightedCode.tsx +22 -22
- package/src/lib/plugins/openapi/components/ResponseContent.tsx +117 -117
- package/src/lib/plugins/openapi/components/SelectOnClick.tsx +29 -29
- package/src/lib/plugins/openapi/context.tsx +16 -16
- package/src/lib/plugins/openapi/graphql/fragment-masking.ts +104 -104
- package/src/lib/plugins/openapi/graphql/gql.ts +95 -95
- package/src/lib/plugins/openapi/graphql/graphql.ts +835 -835
- package/src/lib/plugins/openapi/graphql/index.ts +2 -2
- package/src/lib/plugins/openapi/index.tsx +221 -221
- package/src/lib/plugins/openapi/interfaces.ts +100 -100
- package/src/lib/plugins/openapi/playground/BodyPanel.tsx +274 -274
- package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +51 -51
- package/src/lib/plugins/openapi/playground/ExamplesDropdown.tsx +60 -60
- package/src/lib/plugins/openapi/playground/Headers.tsx +194 -194
- package/src/lib/plugins/openapi/playground/IdentityDialog.tsx +75 -75
- package/src/lib/plugins/openapi/playground/IdentitySelector.tsx +38 -38
- package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +45 -45
- package/src/lib/plugins/openapi/playground/PathParams.tsx +53 -53
- package/src/lib/plugins/openapi/playground/Playground.tsx +602 -602
- package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +62 -62
- package/src/lib/plugins/openapi/playground/QueryParams.tsx +151 -151
- package/src/lib/plugins/openapi/playground/RequestLoginDialog.tsx +70 -70
- package/src/lib/plugins/openapi/playground/Spinner.tsx +87 -87
- package/src/lib/plugins/openapi/playground/createUrl.ts +25 -25
- package/src/lib/plugins/openapi/playground/fileUtils.ts +36 -36
- package/src/lib/plugins/openapi/playground/rememberedIdentity.ts +26 -26
- package/src/lib/plugins/openapi/playground/request-panel/MultipartField.tsx +91 -91
- package/src/lib/plugins/openapi/playground/request-panel/UrlPath.tsx +31 -31
- package/src/lib/plugins/openapi/playground/request-panel/UrlQueryParams.tsx +29 -29
- package/src/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.ts +340 -340
- package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +50 -50
- package/src/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.tsx +117 -117
- package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +355 -355
- package/src/lib/plugins/openapi/playground/result-panel/ResultPanel.tsx +106 -106
- package/src/lib/plugins/openapi/playground/result-panel/convertToTypes.ts +36 -36
- package/src/lib/plugins/openapi/playground/serializeQueryParams.ts +125 -125
- package/src/lib/plugins/openapi/playground/useRememberSkipLoginDialog.tsx +23 -23
- package/src/lib/plugins/openapi/processors/injectApitogoGatewayServer.ts +36 -36
- package/src/lib/plugins/openapi/processors/removeExtensions.ts +29 -29
- package/src/lib/plugins/openapi/processors/removeParameters.ts +103 -103
- package/src/lib/plugins/openapi/processors/removePaths.ts +57 -57
- package/src/lib/plugins/openapi/processors/traverse.ts +1 -1
- package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +39 -39
- package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +189 -189
- package/src/lib/plugins/openapi/schema/SchemaView.tsx +299 -299
- package/src/lib/plugins/openapi/schema/UnionView.tsx +132 -132
- package/src/lib/plugins/openapi/schema/union-helpers.ts +123 -123
- package/src/lib/plugins/openapi/schema/utils.ts +49 -49
- package/src/lib/plugins/openapi/state.ts +36 -36
- package/src/lib/plugins/openapi/util/buildTagCategories.ts +54 -54
- package/src/lib/plugins/openapi/util/createHttpSnippet.ts +135 -135
- package/src/lib/plugins/openapi/util/createNavigationCategory.tsx +39 -39
- package/src/lib/plugins/openapi/util/generateSchemaExample.ts +191 -191
- package/src/lib/plugins/openapi/util/getRoutes.tsx +265 -265
- package/src/lib/plugins/openapi/util/methodColorMap.tsx +11 -11
- package/src/lib/plugins/openapi/util/methodToColor.ts +27 -27
- package/src/lib/plugins/openapi/util/sanitizeMarkdownForMetatag.tsx +32 -32
- package/src/lib/plugins/openapi/util/useWarmupSchema.ts +23 -23
- package/src/lib/plugins/search-inkeep/index.tsx +108 -108
- package/src/lib/plugins/search-inkeep/inkeep.ts +24 -24
- package/src/lib/plugins/search-pagefind/IndexingDialog.tsx +162 -162
- package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +202 -202
- package/src/lib/plugins/search-pagefind/ResultList.tsx +122 -122
- package/src/lib/plugins/search-pagefind/get-results.tsx +74 -74
- package/src/lib/plugins/search-pagefind/index.tsx +21 -21
- package/src/lib/plugins/search-pagefind/types.ts +118 -118
- package/src/lib/shiki-constants.ts +24 -24
- package/src/lib/shiki.ts +179 -179
- package/src/lib/testing/index.tsx +147 -147
- package/src/lib/ui/Accordion.tsx +55 -55
- package/src/lib/ui/ActionButton.tsx +21 -21
- package/src/lib/ui/Alert.tsx +84 -84
- package/src/lib/ui/AlertDialog.tsx +195 -195
- package/src/lib/ui/AspectRatio.tsx +5 -5
- package/src/lib/ui/Badge.tsx +48 -48
- package/src/lib/ui/Breadcrumb.tsx +115 -115
- package/src/lib/ui/Button.tsx +65 -65
- package/src/lib/ui/ButtonGroup.tsx +80 -80
- package/src/lib/ui/Callout.tsx +113 -113
- package/src/lib/ui/Card.tsx +95 -95
- package/src/lib/ui/Carousel.tsx +259 -259
- package/src/lib/ui/Checkbox.tsx +28 -28
- package/src/lib/ui/CodeBlock.tsx +92 -92
- package/src/lib/ui/CodeTabPanel.tsx +13 -13
- package/src/lib/ui/CodeTabs.tsx +161 -161
- package/src/lib/ui/Collapsible.tsx +31 -31
- package/src/lib/ui/Command.tsx +191 -191
- package/src/lib/ui/Dialog.tsx +138 -138
- package/src/lib/ui/DismissibleAlert.tsx +74 -74
- package/src/lib/ui/Drawer.tsx +121 -121
- package/src/lib/ui/DropdownMenu.tsx +254 -254
- package/src/lib/ui/EmbeddedCodeBlock.tsx +99 -99
- package/src/lib/ui/Form.tsx +176 -176
- package/src/lib/ui/Frame.tsx +81 -81
- package/src/lib/ui/HoverCard.tsx +26 -26
- package/src/lib/ui/Input.tsx +23 -23
- package/src/lib/ui/InputGroup.tsx +168 -168
- package/src/lib/ui/Item.tsx +213 -213
- package/src/lib/ui/Kbd.tsx +28 -28
- package/src/lib/ui/Label.tsx +23 -23
- package/src/lib/ui/NativeSelect.tsx +48 -48
- package/src/lib/ui/NavigationMenu.tsx +169 -169
- package/src/lib/ui/Pagination.tsx +115 -115
- package/src/lib/ui/Popover.tsx +28 -28
- package/src/lib/ui/Progress.tsx +25 -25
- package/src/lib/ui/RadioGroup.tsx +41 -41
- package/src/lib/ui/ReactComponentDoc.tsx +68 -68
- package/src/lib/ui/ScrollArea.tsx +45 -45
- package/src/lib/ui/Secret.tsx +133 -133
- package/src/lib/ui/Select.tsx +184 -184
- package/src/lib/ui/Separator.tsx +25 -25
- package/src/lib/ui/Skeleton.tsx +15 -15
- package/src/lib/ui/Slider.tsx +25 -25
- package/src/lib/ui/Stepper.tsx +8 -8
- package/src/lib/ui/Switch.tsx +26 -26
- package/src/lib/ui/SyntaxHighlight.tsx +54 -54
- package/src/lib/ui/Tabs.tsx +52 -52
- package/src/lib/ui/Textarea.tsx +22 -22
- package/src/lib/ui/Toggle.tsx +42 -42
- package/src/lib/ui/ToggleGroup.tsx +58 -58
- package/src/lib/ui/Tooltip.tsx +65 -65
- package/src/lib/ui/Value.tsx +42 -42
- package/src/lib/ui/util.tsx +8 -8
- package/src/lib/util/MdxComponents.tsx +150 -150
- package/src/lib/util/cn.ts +6 -6
- package/src/lib/util/createVariantComponent.tsx +61 -61
- package/src/lib/util/ensureArray.ts +3 -3
- package/src/lib/util/flattenAllOf.ts +72 -72
- package/src/lib/util/flattenAllOfProcessor.ts +74 -74
- package/src/lib/util/hastToJsx.tsx +67 -67
- package/src/lib/util/humanFileSize.ts +15 -15
- package/src/lib/util/invariant.ts +52 -52
- package/src/lib/util/joinUrl.ts +60 -60
- package/src/lib/util/logInit.ts +9 -9
- package/src/lib/util/objectEntries.ts +5 -5
- package/src/lib/util/os.ts +18 -18
- package/src/lib/util/pastellize.ts +25 -25
- package/src/lib/util/problemJson.ts +63 -63
- package/src/lib/util/readFrontmatter.ts +14 -14
- package/src/lib/util/renderIf.ts +4 -4
- package/src/lib/util/scrollIntoViewIfNeeded.ts +18 -18
- package/src/lib/util/slugify.ts +21 -21
- package/src/lib/util/syncZustandState.ts +22 -22
- package/src/lib/util/traverse.ts +70 -70
- package/src/lib/util/types.ts +7 -7
- package/src/lib/util/url.ts +18 -18
- package/src/lib/util/useCopyToClipboard.ts +17 -17
- package/src/lib/util/useExposedProps.tsx +27 -27
- package/src/lib/util/useIsomorphicLayoutEffect.ts +6 -6
- package/src/lib/util/useLatest.ts +18 -18
- package/src/lib/util/useOnScreen.ts +34 -34
- package/src/lib/util/useScrollToAnchor.ts +75 -75
- package/src/lib/util/useScrollToTop.ts +18 -18
- package/src/types.d.ts +66 -66
- package/src/vite/api/SchemaManager.ts +371 -371
- package/src/vite/api/schema-codegen.ts +163 -163
- package/src/vite/build.ts +237 -237
- package/src/vite/config.ts +273 -273
- package/src/vite/css/collect.ts +42 -42
- package/src/vite/css/plugin.ts +105 -105
- package/src/vite/debug.ts +18 -18
- package/src/vite/dev-portal-env.ts +29 -29
- package/src/vite/dev-server.ts +294 -294
- package/src/vite/html.ts +52 -52
- package/src/vite/index.ts +2 -2
- package/src/vite/llms.ts +99 -99
- package/src/vite/mdx/rehype-extract-toc-with-jsx-export.ts +19 -19
- package/src/vite/mdx/rehype-extract-toc-with-jsx.ts +70 -70
- package/src/vite/mdx/remark-code-tabs.ts +47 -47
- package/src/vite/mdx/remark-inject-filepath.ts +13 -13
- package/src/vite/mdx/remark-last-modified.ts +103 -103
- package/src/vite/mdx/remark-link-rewrite.ts +23 -23
- package/src/vite/mdx/remark-normalize-image-url.ts +15 -15
- package/src/vite/mdx/remark-static-generation.ts +149 -149
- package/src/vite/mdx/utils.ts +32 -32
- package/src/vite/output.ts +261 -261
- package/src/vite/package-root.ts +12 -12
- package/src/vite/pagefind-dev-index.ts +100 -100
- package/src/vite/pagefind-dev-stub.ts +17 -17
- package/src/vite/plugin-api-keys.ts +55 -55
- package/src/vite/plugin-api.ts +328 -328
- package/src/vite/plugin-auth.ts +41 -41
- package/src/vite/plugin-component.ts +45 -45
- package/src/vite/plugin-config-reload.ts +47 -47
- package/src/vite/plugin-config.ts +131 -131
- package/src/vite/plugin-custom-pages.ts +36 -36
- package/src/vite/plugin-doc-metadata.ts +45 -45
- package/src/vite/plugin-docs.ts +205 -205
- package/src/vite/plugin-local-manifest.ts +100 -100
- package/src/vite/plugin-markdown-export.ts +214 -214
- package/src/vite/plugin-mdx.ts +149 -149
- package/src/vite/plugin-metadata.ts +30 -30
- package/src/vite/plugin-modules.ts +188 -188
- package/src/vite/plugin-navigation.ts +106 -106
- package/src/vite/plugin-offroot-resolve.ts +67 -67
- package/src/vite/plugin-search.ts +59 -59
- package/src/vite/plugin-shiki-register.ts +97 -97
- package/src/vite/plugin-theme.ts +458 -458
- package/src/vite/plugin.ts +48 -48
- package/src/vite/prerender/prerender.ts +242 -242
- package/src/vite/prerender/utils.ts +76 -76
- package/src/vite/prerender/worker.ts +118 -118
- package/src/vite/reporter.ts +34 -34
- package/src/vite/shadcn-registry.ts +48 -48
- package/src/vite/sitemap.ts +78 -78
- package/src/vite/ssr-templates/cloudflare.ts +19 -19
- package/src/vite/ssr-templates/node.ts +25 -25
- package/src/vite/ssr-templates/vercel.ts +22 -22
- package/src/vite/watch-ignore.ts +70 -70
- package/src/vite/zuplo.ts +30 -30
- package/src/vite-env.d.ts +6 -6
- package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -168
- package/src/zuplo/enrich-with-zuplo.ts +256 -256
- package/src/zuplo/policy-types.ts +46 -46
- package/src/zuplo/with-zuplo-processors.ts +36 -36
- package/src/zuplo/with-zuplo.ts +14 -14
- 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
|
|
463
|
-
if (
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
|
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(
|
|
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) =>
|
|
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>;
|