@lukoweb/apitogo 0.2.23 → 0.2.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -94
- package/cli.js +13 -13
- package/client.d.ts +8 -8
- package/dist/cli/cli.js +318 -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 +3 -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.25",
|
|
9909
9971
|
type: "module",
|
|
9910
9972
|
sideEffects: [
|
|
9911
9973
|
"**/*.css",
|
|
@@ -9996,6 +10058,7 @@ var package_default = {
|
|
|
9996
10058
|
"@fontsource/ibm-plex-sans": "^5.3.0",
|
|
9997
10059
|
"@fontsource/jetbrains-mono": "^5.3.0",
|
|
9998
10060
|
"@fontsource/space-grotesk": "^5.3.0",
|
|
10061
|
+
"@graphql-tools/utils": "12.1.0",
|
|
9999
10062
|
"@graphql-typed-document-node/core": "3.2.0",
|
|
10000
10063
|
"@hono/node-server": "1.19.11",
|
|
10001
10064
|
"@lekoarts/rehype-meta-as-attributes": "3.0.3",
|
|
@@ -10069,6 +10132,7 @@ var package_default = {
|
|
|
10069
10132
|
"javascript-stringify": "2.1.0",
|
|
10070
10133
|
"json-schema-to-typescript-lite": "15.0.0",
|
|
10071
10134
|
loglevel: "1.9.2",
|
|
10135
|
+
"lru-cache": "10.4.3",
|
|
10072
10136
|
"lucide-react": "0.577.0",
|
|
10073
10137
|
"mdast-util-from-markdown": "2.0.2",
|
|
10074
10138
|
"mdast-util-mdx": "3.0.0",
|
|
@@ -27480,6 +27544,52 @@ var IdentityDeployError = class extends ApitogoError {
|
|
|
27480
27544
|
}
|
|
27481
27545
|
};
|
|
27482
27546
|
var IDENTITY_STEPS = ["request", "activate"];
|
|
27547
|
+
var IDENTITY_CONNECTIONS_STEP = "connections";
|
|
27548
|
+
var SECRET_PREFIX = "secret:";
|
|
27549
|
+
function normalizedConnections(resolved) {
|
|
27550
|
+
return [...resolved.identity?.connections ?? []].map((connection) => ({
|
|
27551
|
+
...connection,
|
|
27552
|
+
authority: connection.authority.trim().replace(/\/+$/, "")
|
|
27553
|
+
})).sort((a, b) => a.id.localeCompare(b.id));
|
|
27554
|
+
}
|
|
27555
|
+
function identityConnectionsHash(projectId, resolved) {
|
|
27556
|
+
return stableJson({
|
|
27557
|
+
projectId,
|
|
27558
|
+
connections: normalizedConnections(resolved)
|
|
27559
|
+
});
|
|
27560
|
+
}
|
|
27561
|
+
async function recordedConnectionIds(resolved) {
|
|
27562
|
+
const ids = stepOf(
|
|
27563
|
+
await readLedger(resolved.state),
|
|
27564
|
+
"identity",
|
|
27565
|
+
IDENTITY_CONNECTIONS_STEP
|
|
27566
|
+
)?.output?.ids;
|
|
27567
|
+
return ids ? ids.split(",").filter(Boolean) : [];
|
|
27568
|
+
}
|
|
27569
|
+
function redirectAddressesOf(output4) {
|
|
27570
|
+
return Object.entries(output4 ?? {}).filter(([key]) => key.startsWith("redirect.")).map(([key, redirectUri]) => ({
|
|
27571
|
+
id: key.slice("redirect.".length),
|
|
27572
|
+
redirectUri
|
|
27573
|
+
}));
|
|
27574
|
+
}
|
|
27575
|
+
function connectionBody(connection) {
|
|
27576
|
+
return {
|
|
27577
|
+
authority: connection.authority,
|
|
27578
|
+
clientId: connection.clientId,
|
|
27579
|
+
clientSecret: connection.clientSecret,
|
|
27580
|
+
scopes: connection.scopes,
|
|
27581
|
+
displayName: connection.displayName
|
|
27582
|
+
};
|
|
27583
|
+
}
|
|
27584
|
+
function referencedSecretNames(connections) {
|
|
27585
|
+
return [
|
|
27586
|
+
...new Set(
|
|
27587
|
+
connections.map(
|
|
27588
|
+
(connection) => connection.clientSecret.slice(SECRET_PREFIX.length)
|
|
27589
|
+
)
|
|
27590
|
+
)
|
|
27591
|
+
];
|
|
27592
|
+
}
|
|
27483
27593
|
var PORTAL_CALLBACK_PATH = "/oauth/callback";
|
|
27484
27594
|
var defaultSleep2 = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
27485
27595
|
function identityNotDeployableReason(resolved) {
|
|
@@ -27534,6 +27644,25 @@ function rejected2(error) {
|
|
|
27534
27644
|
}
|
|
27535
27645
|
throw error;
|
|
27536
27646
|
}
|
|
27647
|
+
function connectionRejected(error, id) {
|
|
27648
|
+
if (error instanceof PlatformApiError && error.status === 409) {
|
|
27649
|
+
throw new IdentityDeployError(
|
|
27650
|
+
"IDENTITY_CONNECTION_REJECTED",
|
|
27651
|
+
`The identity is not active yet, so connection "${id}" cannot be saved.`,
|
|
27652
|
+
"Run deploy again once the identity is Active."
|
|
27653
|
+
);
|
|
27654
|
+
}
|
|
27655
|
+
if (error instanceof PlatformApiError && error.status === 400) {
|
|
27656
|
+
const lines = describePlatformProblem(error);
|
|
27657
|
+
throw new IdentityDeployError(
|
|
27658
|
+
"IDENTITY_CONNECTION_REJECTED",
|
|
27659
|
+
`The platform refused login connection "${id}":
|
|
27660
|
+
${lines.join("\n ") || error.message}`,
|
|
27661
|
+
"Fix the connection in apitogo.config.json (identity.connections) and run deploy again."
|
|
27662
|
+
);
|
|
27663
|
+
}
|
|
27664
|
+
throw error;
|
|
27665
|
+
}
|
|
27537
27666
|
async function recordOwnProvider(resolved, projectId) {
|
|
27538
27667
|
const identity = resolved.identity;
|
|
27539
27668
|
const issuer = identity?.issuer?.replace(/\/+$/, "");
|
|
@@ -27623,10 +27752,14 @@ async function deployIdentity(resolved, projectId, deps, options = {}) {
|
|
|
27623
27752
|
},
|
|
27624
27753
|
stillValid: async () => (await client.getProjectIdentity(projectId))?.status === "Active"
|
|
27625
27754
|
};
|
|
27755
|
+
const wanted = normalizedConnections(resolved);
|
|
27756
|
+
const steps = [requestStep, activateStep];
|
|
27757
|
+
if (wanted.length > 0 || (await recordedConnectionIds(resolved)).length > 0)
|
|
27758
|
+
steps.push(connectionsStep(resolved, projectId, client, wanted));
|
|
27626
27759
|
const outcomes = await runPipeline(
|
|
27627
27760
|
resolved.state,
|
|
27628
27761
|
"identity",
|
|
27629
|
-
|
|
27762
|
+
steps,
|
|
27630
27763
|
{ force: options.force }
|
|
27631
27764
|
);
|
|
27632
27765
|
const activate = outcomes.find((outcome) => outcome.step === "activate");
|
|
@@ -27649,14 +27782,103 @@ async function deployIdentity(resolved, projectId, deps, options = {}) {
|
|
|
27649
27782
|
);
|
|
27650
27783
|
}
|
|
27651
27784
|
}
|
|
27785
|
+
const connectionsRan = outcomes.some(
|
|
27786
|
+
(outcome) => outcome.step === IDENTITY_CONNECTIONS_STEP && !outcome.skipped
|
|
27787
|
+
);
|
|
27652
27788
|
return {
|
|
27653
|
-
status: ran ? "deployed" : "unchanged",
|
|
27789
|
+
status: ran || connectionsRan ? "deployed" : "unchanged",
|
|
27654
27790
|
steps: outcomes.map((outcome) => ({
|
|
27655
27791
|
step: outcome.step,
|
|
27656
27792
|
skipped: outcome.skipped
|
|
27657
27793
|
})),
|
|
27658
27794
|
issuer: learned?.issuer ?? known?.issuer,
|
|
27659
|
-
clientId: learned?.clientId ?? known?.clientId
|
|
27795
|
+
clientId: learned?.clientId ?? known?.clientId,
|
|
27796
|
+
connections: redirectAddressesOf(
|
|
27797
|
+
stepOf(
|
|
27798
|
+
await readLedger(resolved.state),
|
|
27799
|
+
"identity",
|
|
27800
|
+
IDENTITY_CONNECTIONS_STEP
|
|
27801
|
+
)?.output
|
|
27802
|
+
)
|
|
27803
|
+
};
|
|
27804
|
+
}
|
|
27805
|
+
function connectionsStep(resolved, projectId, client, wanted) {
|
|
27806
|
+
const {
|
|
27807
|
+
putProjectIdentityConnection,
|
|
27808
|
+
listProjectIdentityConnections,
|
|
27809
|
+
deleteProjectIdentityConnection,
|
|
27810
|
+
listSecrets
|
|
27811
|
+
} = client;
|
|
27812
|
+
if (!putProjectIdentityConnection || !listProjectIdentityConnections || !deleteProjectIdentityConnection || !listSecrets)
|
|
27813
|
+
throw new Error("The platform client has no login connection calls.");
|
|
27814
|
+
const stamps = async () => {
|
|
27815
|
+
const names = referencedSecretNames(wanted);
|
|
27816
|
+
if (names.length === 0) return {};
|
|
27817
|
+
const listed = await listSecrets.call(client, projectId);
|
|
27818
|
+
const byName2 = new Map(listed.secrets.map((s) => [s.name, s.updatedAtUtc]));
|
|
27819
|
+
const missing = names.filter((name) => !byName2.has(name));
|
|
27820
|
+
if (missing.length > 0)
|
|
27821
|
+
throw new IdentityDeployError(
|
|
27822
|
+
"IDENTITY_SECRET_MISSING",
|
|
27823
|
+
`The secret ${missing.join(", ")} is not set for this project, and a login connection needs it.`,
|
|
27824
|
+
`Run \`apitogo secrets set ${missing[0]}\` with the value from the provider, then deploy again.`
|
|
27825
|
+
);
|
|
27826
|
+
return Object.fromEntries(
|
|
27827
|
+
names.map((name) => [name, byName2.get(name)])
|
|
27828
|
+
);
|
|
27829
|
+
};
|
|
27830
|
+
const sameAddress = (a, b) => a.replace(/\/+$/, "").toLowerCase() === b.replace(/\/+$/, "").toLowerCase();
|
|
27831
|
+
return {
|
|
27832
|
+
name: IDENTITY_CONNECTIONS_STEP,
|
|
27833
|
+
hash: () => identityConnectionsHash(projectId, resolved),
|
|
27834
|
+
run: async () => {
|
|
27835
|
+
const recorded = await stamps();
|
|
27836
|
+
const existing = await listProjectIdentityConnections.call(
|
|
27837
|
+
client,
|
|
27838
|
+
projectId
|
|
27839
|
+
);
|
|
27840
|
+
const redirects = {};
|
|
27841
|
+
for (const connection of wanted) {
|
|
27842
|
+
try {
|
|
27843
|
+
const saved = await putProjectIdentityConnection.call(
|
|
27844
|
+
client,
|
|
27845
|
+
projectId,
|
|
27846
|
+
connection.id,
|
|
27847
|
+
connectionBody(connection)
|
|
27848
|
+
);
|
|
27849
|
+
redirects[`redirect.${connection.id}`] = saved.redirectUri;
|
|
27850
|
+
} catch (error) {
|
|
27851
|
+
return connectionRejected(error, connection.id);
|
|
27852
|
+
}
|
|
27853
|
+
}
|
|
27854
|
+
for (const old of existing)
|
|
27855
|
+
if (!wanted.some((connection) => connection.id === old.id))
|
|
27856
|
+
await deleteProjectIdentityConnection.call(client, projectId, old.id);
|
|
27857
|
+
return {
|
|
27858
|
+
ids: wanted.map((connection) => connection.id).join(","),
|
|
27859
|
+
secretsStamp: stableJson(recorded),
|
|
27860
|
+
...redirects
|
|
27861
|
+
};
|
|
27862
|
+
},
|
|
27863
|
+
// The platform still has exactly these connections, and none of the secrets was changed since.
|
|
27864
|
+
stillValid: async () => {
|
|
27865
|
+
const found = await listProjectIdentityConnections.call(
|
|
27866
|
+
client,
|
|
27867
|
+
projectId
|
|
27868
|
+
);
|
|
27869
|
+
if (found.length !== wanted.length) return false;
|
|
27870
|
+
for (const connection of wanted) {
|
|
27871
|
+
const there = found.find((f) => f.id === connection.id);
|
|
27872
|
+
if (!there || there.clientId !== connection.clientId || !sameAddress(there.authority, connection.authority))
|
|
27873
|
+
return false;
|
|
27874
|
+
}
|
|
27875
|
+
const before = stepOf(
|
|
27876
|
+
await readLedger(resolved.state),
|
|
27877
|
+
"identity",
|
|
27878
|
+
IDENTITY_CONNECTIONS_STEP
|
|
27879
|
+
)?.output?.secretsStamp;
|
|
27880
|
+
return before === void 0 || before === stableJson(await stamps());
|
|
27881
|
+
}
|
|
27660
27882
|
};
|
|
27661
27883
|
}
|
|
27662
27884
|
|
|
@@ -27938,9 +28160,30 @@ async function planIdentityService(resolved, ledger, manifest) {
|
|
|
27938
28160
|
(name) => `step ${name}: ${stepState(stepOf(ledger, "identity", name), hash2)}`
|
|
27939
28161
|
)
|
|
27940
28162
|
];
|
|
28163
|
+
const connections = normalizedConnections(resolved);
|
|
28164
|
+
const leftOnPlatform = (await recordedConnectionIds(resolved)).length > 0;
|
|
28165
|
+
const connectionsHash = projectId ? identityConnectionsHash(projectId, resolved) : void 0;
|
|
28166
|
+
const connectionsRecord = stepOf(
|
|
28167
|
+
ledger,
|
|
28168
|
+
"identity",
|
|
28169
|
+
IDENTITY_CONNECTIONS_STEP
|
|
28170
|
+
);
|
|
28171
|
+
if (connections.length > 0 || leftOnPlatform) {
|
|
28172
|
+
for (const connection of connections)
|
|
28173
|
+
details.push(
|
|
28174
|
+
`login connection ${connection.id}: ${connection.displayName ?? connection.id} (${connection.authority})` + (known?.issuer ? `, register this redirect address with the provider: ${known.issuer.replace(/\/+$/, "")}/account/external/${connection.id}/callback` : "")
|
|
28175
|
+
);
|
|
28176
|
+
if (connections.length === 0)
|
|
28177
|
+
details.push(
|
|
28178
|
+
"login connections: the last deploy's connections will be removed"
|
|
28179
|
+
);
|
|
28180
|
+
details.push(
|
|
28181
|
+
`step ${IDENTITY_CONNECTIONS_STEP}: ${stepState(connectionsRecord, connectionsHash)}`
|
|
28182
|
+
);
|
|
28183
|
+
}
|
|
27941
28184
|
const allDone = IDENTITY_STEPS.every(
|
|
27942
28185
|
(name) => isDone(stepOf(ledger, "identity", name), hash2)
|
|
27943
|
-
);
|
|
28186
|
+
) && (connections.length === 0 && !leftOnPlatform ? true : isDone(connectionsRecord, connectionsHash));
|
|
27944
28187
|
return {
|
|
27945
28188
|
...base,
|
|
27946
28189
|
action: allDone ? "skip" : "deploy",
|
|
@@ -28006,7 +28249,7 @@ async function planPlansService(resolved, ledger) {
|
|
|
28006
28249
|
}
|
|
28007
28250
|
var failedStep = (ledger, service, names) => names.map((name) => ({ name, record: stepOf(ledger, service, name) })).find((step2) => step2.record?.status === "failed");
|
|
28008
28251
|
var unreachable = (error) => `platform: not reachable (${error instanceof Error ? error.message : String(error)}); showing local records only`;
|
|
28009
|
-
async function identityStatus(resolved, ledger, manifest, remote) {
|
|
28252
|
+
async function identityStatus(resolved, ledger, manifest, remote, connectionsRemote) {
|
|
28010
28253
|
const entry = manifest?.services.identity;
|
|
28011
28254
|
const failed = failedStep(ledger, "identity", IDENTITY_STEPS);
|
|
28012
28255
|
const details = [];
|
|
@@ -28040,6 +28283,15 @@ async function identityStatus(resolved, ledger, manifest, remote) {
|
|
|
28040
28283
|
);
|
|
28041
28284
|
state = "drift";
|
|
28042
28285
|
}
|
|
28286
|
+
if (connectionsRemote && platform.status === "Active") {
|
|
28287
|
+
const drift = await connectionLines(
|
|
28288
|
+
resolved,
|
|
28289
|
+
projectId,
|
|
28290
|
+
connectionsRemote,
|
|
28291
|
+
details
|
|
28292
|
+
);
|
|
28293
|
+
if (drift && state === "ready") state = "drift";
|
|
28294
|
+
}
|
|
28043
28295
|
}
|
|
28044
28296
|
} catch (error) {
|
|
28045
28297
|
details.push(unreachable(error));
|
|
@@ -28055,6 +28307,36 @@ async function identityStatus(resolved, ledger, manifest, remote) {
|
|
|
28055
28307
|
}
|
|
28056
28308
|
return { service: "identity", state, details };
|
|
28057
28309
|
}
|
|
28310
|
+
async function connectionLines(resolved, projectId, remote, details) {
|
|
28311
|
+
const configured = normalizedConnections(resolved);
|
|
28312
|
+
let there;
|
|
28313
|
+
try {
|
|
28314
|
+
there = await remote(projectId);
|
|
28315
|
+
} catch (error) {
|
|
28316
|
+
details.push(unreachable(error));
|
|
28317
|
+
return false;
|
|
28318
|
+
}
|
|
28319
|
+
for (const connection of there)
|
|
28320
|
+
details.push(
|
|
28321
|
+
`login connection ${connection.id}: ${connection.displayName} (${connection.authority}), register this redirect address with the provider: ${connection.redirectUri}`
|
|
28322
|
+
);
|
|
28323
|
+
let differ = false;
|
|
28324
|
+
for (const connection of configured)
|
|
28325
|
+
if (!there.some((t) => t.id === connection.id)) {
|
|
28326
|
+
details.push(
|
|
28327
|
+
`drift: login connection ${connection.id} is in the config but not on the platform; run deploy`
|
|
28328
|
+
);
|
|
28329
|
+
differ = true;
|
|
28330
|
+
}
|
|
28331
|
+
for (const connection of there)
|
|
28332
|
+
if (!configured.some((c) => c.id === connection.id)) {
|
|
28333
|
+
details.push(
|
|
28334
|
+
`drift: login connection ${connection.id} is on the platform but not in the config; deploy removes it`
|
|
28335
|
+
);
|
|
28336
|
+
differ = true;
|
|
28337
|
+
}
|
|
28338
|
+
return differ;
|
|
28339
|
+
}
|
|
28058
28340
|
async function plansStatus(resolved, ledger, manifest, remote, wantedSkus2) {
|
|
28059
28341
|
const entry = manifest?.services.plans;
|
|
28060
28342
|
const failed = failedStep(ledger, "plans", PLANS_STEPS);
|
|
@@ -28490,7 +28772,8 @@ async function statusV2(dir, only, options = {}) {
|
|
|
28490
28772
|
resolved,
|
|
28491
28773
|
ledger,
|
|
28492
28774
|
manifest,
|
|
28493
|
-
options.identityRemote
|
|
28775
|
+
options.identityRemote,
|
|
28776
|
+
options.identityConnectionsRemote
|
|
28494
28777
|
)
|
|
28495
28778
|
);
|
|
28496
28779
|
continue;
|
|
@@ -28727,7 +29010,10 @@ async function deployIdentityService(options, deps, projectId, named) {
|
|
|
28727
29010
|
service: "identity",
|
|
28728
29011
|
status: result.status,
|
|
28729
29012
|
steps: result.steps,
|
|
28730
|
-
url: result.issuer
|
|
29013
|
+
url: result.issuer,
|
|
29014
|
+
notes: (result.connections ?? []).map(
|
|
29015
|
+
(connection) => `login connection ${connection.id}: register this redirect address with the provider: ${connection.redirectUri}`
|
|
29016
|
+
)
|
|
28731
29017
|
};
|
|
28732
29018
|
}
|
|
28733
29019
|
async function deployPlansService(options, deps, projectId, named) {
|
|
@@ -28824,7 +29110,8 @@ function formatDeploy(output4) {
|
|
|
28824
29110
|
head,
|
|
28825
29111
|
...result.steps.map(
|
|
28826
29112
|
(step2) => ` ${step2.step}: ${step2.skipped ? "skipped (unchanged)" : "ran"}`
|
|
28827
|
-
)
|
|
29113
|
+
),
|
|
29114
|
+
...(result.notes ?? []).map((note) => ` ${note}`)
|
|
28828
29115
|
];
|
|
28829
29116
|
});
|
|
28830
29117
|
}
|
|
@@ -29396,14 +29683,14 @@ async function discoverAndWireDocs(siteDirectory) {
|
|
|
29396
29683
|
directory.sourceDirectory,
|
|
29397
29684
|
usedNames
|
|
29398
29685
|
);
|
|
29399
|
-
const
|
|
29686
|
+
const linkDirectory2 = path89.join(pagesDir, linkName);
|
|
29400
29687
|
const linked = [];
|
|
29401
29688
|
const skipped = [];
|
|
29402
29689
|
for (const sourcePath of directory.files) {
|
|
29403
29690
|
const relativeSource = toPosix3(
|
|
29404
29691
|
path89.relative(directory.sourceDirectory, sourcePath)
|
|
29405
29692
|
);
|
|
29406
|
-
const linkPath = path89.join(
|
|
29693
|
+
const linkPath = path89.join(linkDirectory2, relativeSource);
|
|
29407
29694
|
const relativeLink = toPosix3(path89.relative(site, linkPath));
|
|
29408
29695
|
const route = toRoutePath(relativeLink, PAGES_DIR);
|
|
29409
29696
|
if (routes.includes(route)) {
|
|
@@ -29426,7 +29713,7 @@ async function discoverAndWireDocs(siteDirectory) {
|
|
|
29426
29713
|
}
|
|
29427
29714
|
sources.push({
|
|
29428
29715
|
sourceDirectory: directory.sourceDirectory,
|
|
29429
|
-
linkDirectory,
|
|
29716
|
+
linkDirectory: linkDirectory2,
|
|
29430
29717
|
linkName,
|
|
29431
29718
|
files: linked,
|
|
29432
29719
|
skipped
|
|
@@ -30166,6 +30453,14 @@ function identityRemote() {
|
|
|
30166
30453
|
return void 0;
|
|
30167
30454
|
}
|
|
30168
30455
|
}
|
|
30456
|
+
function identityConnectionsRemote() {
|
|
30457
|
+
try {
|
|
30458
|
+
const client = new PlatformApiClient(loadConfig());
|
|
30459
|
+
return (projectId) => client.listProjectIdentityConnections(projectId);
|
|
30460
|
+
} catch {
|
|
30461
|
+
return void 0;
|
|
30462
|
+
}
|
|
30463
|
+
}
|
|
30169
30464
|
function plansRemote() {
|
|
30170
30465
|
try {
|
|
30171
30466
|
const client = new PlatformApiClient(loadConfig());
|
|
@@ -30185,6 +30480,7 @@ var statusOfProject = (argv) => run2(
|
|
|
30185
30480
|
(dir, only) => statusV2(dir, only, {
|
|
30186
30481
|
gatewayRemote: gatewayRemote(),
|
|
30187
30482
|
identityRemote: identityRemote(),
|
|
30483
|
+
identityConnectionsRemote: identityConnectionsRemote(),
|
|
30188
30484
|
plansRemote: plansRemote()
|
|
30189
30485
|
}),
|
|
30190
30486
|
formatStatus
|
|
@@ -30249,7 +30545,9 @@ async function createProjectV2(options, deps) {
|
|
|
30249
30545
|
modules,
|
|
30250
30546
|
wait: options.wait !== false,
|
|
30251
30547
|
projectId: linkedProjectId,
|
|
30252
|
-
onProjectResolved: (projectId) =>
|
|
30548
|
+
onProjectResolved: async (projectId) => {
|
|
30549
|
+
await setProjectId(options.dir, projectId);
|
|
30550
|
+
}
|
|
30253
30551
|
});
|
|
30254
30552
|
const outcome = parse4(raw);
|
|
30255
30553
|
if (outcome.requiresPlatformPlanSelection) {
|
|
@@ -423,6 +423,21 @@ export interface ProjectIdentityDto {
|
|
|
423
423
|
errorMessage?: string | null;
|
|
424
424
|
nativeSignup: boolean;
|
|
425
425
|
}
|
|
426
|
+
export interface ProjectIdentityConnectionDto {
|
|
427
|
+
id: string;
|
|
428
|
+
authority: string;
|
|
429
|
+
clientId: string;
|
|
430
|
+
scopes: string[];
|
|
431
|
+
displayName: string;
|
|
432
|
+
redirectUri: string;
|
|
433
|
+
}
|
|
434
|
+
export interface ProjectIdentityConnectionBody {
|
|
435
|
+
authority: string;
|
|
436
|
+
clientId: string;
|
|
437
|
+
clientSecret?: string;
|
|
438
|
+
scopes?: string[];
|
|
439
|
+
displayName?: string;
|
|
440
|
+
}
|
|
426
441
|
export interface ProjectIdentityRequestBody {
|
|
427
442
|
audience?: string;
|
|
428
443
|
portalRedirectUris: string[];
|
|
@@ -540,6 +555,9 @@ export declare class PlatformApiClient {
|
|
|
540
555
|
}): Promise<GatewayDryRunDto>;
|
|
541
556
|
deleteGateway(projectId: string): Promise<GatewayTeardownAcceptedDto>;
|
|
542
557
|
putProjectIdentity(projectId: string, body: ProjectIdentityRequestBody): Promise<ProjectIdentityDto>;
|
|
558
|
+
putProjectIdentityConnection(projectId: string, connectionId: string, body: ProjectIdentityConnectionBody): Promise<ProjectIdentityConnectionDto>;
|
|
559
|
+
listProjectIdentityConnections(projectId: string): Promise<ProjectIdentityConnectionDto[]>;
|
|
560
|
+
deleteProjectIdentityConnection(projectId: string, connectionId: string): Promise<void>;
|
|
543
561
|
getProjectIdentity(projectId: string): Promise<ProjectIdentityDto | null>;
|
|
544
562
|
deleteProjectIdentity(projectId: string): Promise<ProjectIdentityDto | null>;
|
|
545
563
|
linkDevPortalIdentity(projectId: string): Promise<DevPortalIdentityLinkDto>;
|