@lukoweb/apitogo 0.2.22 → 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 +561 -232
- 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
|
@@ -1,502 +1,502 @@
|
|
|
1
|
-
import type { ComponentType, ReactNode } from "react";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
|
|
4
|
-
const ModuleToggleSchema = z
|
|
5
|
-
.object({
|
|
6
|
-
enabled: z
|
|
7
|
-
.boolean()
|
|
8
|
-
.describe("Whether this module is active in the application."),
|
|
9
|
-
})
|
|
10
|
-
.partial();
|
|
11
|
-
|
|
12
|
-
export const DocsModuleSchema = ModuleToggleSchema.extend({
|
|
13
|
-
files: z.union([z.string(), z.array(z.string())]).optional(),
|
|
14
|
-
publishMarkdown: z.boolean().optional(),
|
|
15
|
-
defaultOptions: z
|
|
16
|
-
.object({
|
|
17
|
-
toc: z.boolean(),
|
|
18
|
-
copyPage: z.boolean().optional(),
|
|
19
|
-
disablePager: z.boolean(),
|
|
20
|
-
showLastModified: z.boolean(),
|
|
21
|
-
suggestEdit: z
|
|
22
|
-
.object({
|
|
23
|
-
url: z.string(),
|
|
24
|
-
text: z.string().optional(),
|
|
25
|
-
})
|
|
26
|
-
.optional(),
|
|
27
|
-
})
|
|
28
|
-
.partial()
|
|
29
|
-
.optional(),
|
|
30
|
-
llms: z
|
|
31
|
-
.object({
|
|
32
|
-
llmsTxt: z.boolean().optional(),
|
|
33
|
-
llmsTxtFull: z.boolean().optional(),
|
|
34
|
-
includeProtected: z.boolean().optional(),
|
|
35
|
-
})
|
|
36
|
-
.optional(),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
export const LandingLinkSchema = z.object({
|
|
40
|
-
label: z.string(),
|
|
41
|
-
href: z.string(),
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
export const LandingFeatureSchema = z.object({
|
|
45
|
-
title: z.string(),
|
|
46
|
-
description: z.string(),
|
|
47
|
-
icon: z.string().optional(),
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
export const LandingCodeExampleSchema = z
|
|
51
|
-
.object({
|
|
52
|
-
filename: z.string().optional(),
|
|
53
|
-
language: z.string().optional(),
|
|
54
|
-
code: z.string(),
|
|
55
|
-
})
|
|
56
|
-
.optional();
|
|
57
|
-
|
|
58
|
-
export const LandingHeroSchema = z
|
|
59
|
-
.object({
|
|
60
|
-
title: z.string().optional(),
|
|
61
|
-
titleAccent: z
|
|
62
|
-
.string()
|
|
63
|
-
.optional()
|
|
64
|
-
.describe(
|
|
65
|
-
"Accent-colored word or phrase shown on a new line after the title.",
|
|
66
|
-
),
|
|
67
|
-
subtitle: z.string().optional(),
|
|
68
|
-
description: z.string().optional(),
|
|
69
|
-
badge: z.string().optional(),
|
|
70
|
-
highlights: z.array(z.string()).optional(),
|
|
71
|
-
codeExample: LandingCodeExampleSchema,
|
|
72
|
-
})
|
|
73
|
-
.optional();
|
|
74
|
-
|
|
75
|
-
export const LandingFeaturesSectionSchema = z
|
|
76
|
-
.object({
|
|
77
|
-
label: z.string().optional(),
|
|
78
|
-
title: z.string().optional(),
|
|
79
|
-
description: z.string().optional(),
|
|
80
|
-
})
|
|
81
|
-
.optional();
|
|
82
|
-
|
|
83
|
-
export const LandingTrustSchema = z
|
|
84
|
-
.object({
|
|
85
|
-
enabled: z.boolean().optional(),
|
|
86
|
-
title: z.string().optional(),
|
|
87
|
-
logos: z.array(z.string()).optional(),
|
|
88
|
-
})
|
|
89
|
-
.optional();
|
|
90
|
-
|
|
91
|
-
export const LandingApiShowcaseItemSchema = z.object({
|
|
92
|
-
name: z.string(),
|
|
93
|
-
path: z.string(),
|
|
94
|
-
icon: z.string().optional(),
|
|
95
|
-
latency: z.string().optional(),
|
|
96
|
-
summary: z.string().optional(),
|
|
97
|
-
method: z.string().optional(),
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
export const LandingApiShowcaseSchema = z
|
|
101
|
-
.object({
|
|
102
|
-
enabled: z.boolean().optional(),
|
|
103
|
-
title: z.string().optional(),
|
|
104
|
-
subtitle: z.string().optional(),
|
|
105
|
-
browseAllHref: z.string().optional(),
|
|
106
|
-
browseAllLabel: z.string().optional(),
|
|
107
|
-
autoFromOpenApi: z.boolean().optional(),
|
|
108
|
-
layout: z.enum(["grid", "list"]).optional(),
|
|
109
|
-
items: z.array(LandingApiShowcaseItemSchema).optional(),
|
|
110
|
-
})
|
|
111
|
-
.optional();
|
|
112
|
-
|
|
113
|
-
export const LandingPricingCtaSchema = z
|
|
114
|
-
.object({
|
|
115
|
-
enabled: z.boolean().optional(),
|
|
116
|
-
title: z.string().optional(),
|
|
117
|
-
description: z.string().optional(),
|
|
118
|
-
primaryAction: LandingLinkSchema.optional(),
|
|
119
|
-
secondaryAction: LandingLinkSchema.optional(),
|
|
120
|
-
})
|
|
121
|
-
.optional();
|
|
122
|
-
|
|
123
|
-
export const LandingFooterBrandSchema = z
|
|
124
|
-
.object({
|
|
125
|
-
name: z.string().optional(),
|
|
126
|
-
tagline: z.string().optional(),
|
|
127
|
-
logoSrc: z.string().optional(),
|
|
128
|
-
})
|
|
129
|
-
.optional();
|
|
130
|
-
|
|
131
|
-
export const LandingFooterColumnSchema = z.object({
|
|
132
|
-
title: z.string(),
|
|
133
|
-
links: z.array(LandingLinkSchema),
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
export const LandingFooterSocialSchema = z.object({
|
|
137
|
-
icon: z.string(),
|
|
138
|
-
href: z.string(),
|
|
139
|
-
label: z.string().optional(),
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
export const LandingFooterSchema = z
|
|
143
|
-
.object({
|
|
144
|
-
enabled: z.boolean().optional(),
|
|
145
|
-
brand: LandingFooterBrandSchema,
|
|
146
|
-
columns: z.array(LandingFooterColumnSchema).optional(),
|
|
147
|
-
copyright: z.string().optional(),
|
|
148
|
-
social: z.array(LandingFooterSocialSchema).optional(),
|
|
149
|
-
})
|
|
150
|
-
.optional();
|
|
151
|
-
|
|
152
|
-
export const LandingContentSchema = z
|
|
153
|
-
.object({
|
|
154
|
-
hero: LandingHeroSchema,
|
|
155
|
-
featuresSection: LandingFeaturesSectionSchema,
|
|
156
|
-
features: z.array(LandingFeatureSchema).optional(),
|
|
157
|
-
primaryAction: LandingLinkSchema.optional(),
|
|
158
|
-
secondaryAction: LandingLinkSchema.optional(),
|
|
159
|
-
trust: LandingTrustSchema,
|
|
160
|
-
apiShowcase: LandingApiShowcaseSchema,
|
|
161
|
-
pricingCta: LandingPricingCtaSchema,
|
|
162
|
-
footer: LandingFooterSchema,
|
|
163
|
-
showPoweredBy: z.boolean().optional(),
|
|
164
|
-
})
|
|
165
|
-
.optional();
|
|
166
|
-
|
|
167
|
-
export const DashboardContentSchema = z
|
|
168
|
-
.object({
|
|
169
|
-
title: z.string().optional(),
|
|
170
|
-
subtitle: z.string().optional(),
|
|
171
|
-
description: z.string().optional(),
|
|
172
|
-
quickLinks: z.array(LandingLinkSchema).optional(),
|
|
173
|
-
})
|
|
174
|
-
.optional();
|
|
175
|
-
|
|
176
|
-
export const ProfileContentSchema = z
|
|
177
|
-
.object({
|
|
178
|
-
title: z.string().optional(),
|
|
179
|
-
description: z.string().optional(),
|
|
180
|
-
})
|
|
181
|
-
.optional();
|
|
182
|
-
|
|
183
|
-
export const PlanTierSchema = z.object({
|
|
184
|
-
name: z.string(),
|
|
185
|
-
price: z.string().optional(),
|
|
186
|
-
description: z.string().optional(),
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
export const PlansContentSchema = z
|
|
190
|
-
.object({
|
|
191
|
-
title: z.string().optional(),
|
|
192
|
-
description: z.string().optional(),
|
|
193
|
-
tiers: z.array(PlanTierSchema).optional(),
|
|
194
|
-
})
|
|
195
|
-
.optional();
|
|
196
|
-
|
|
197
|
-
export const SubmodulePageFields = {
|
|
198
|
-
page: z
|
|
199
|
-
.string()
|
|
200
|
-
.optional()
|
|
201
|
-
.describe(
|
|
202
|
-
"Path to a custom page component file, relative to the project root.",
|
|
203
|
-
),
|
|
204
|
-
component: z
|
|
205
|
-
.custom<ComponentType | ReactNode>()
|
|
206
|
-
.optional()
|
|
207
|
-
.describe("Custom React component for this sub-module page."),
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
export const LandingModuleSchema = ModuleToggleSchema.extend({
|
|
211
|
-
path: z.string().default("/").describe("Route path for the landing page."),
|
|
212
|
-
component: z
|
|
213
|
-
.custom<ComponentType | ReactNode>()
|
|
214
|
-
.optional()
|
|
215
|
-
.describe("Custom React component for the landing page."),
|
|
216
|
-
page: z
|
|
217
|
-
.string()
|
|
218
|
-
.optional()
|
|
219
|
-
.describe(
|
|
220
|
-
"Path to a custom landing page component file, relative to the project root.",
|
|
221
|
-
),
|
|
222
|
-
layout: z
|
|
223
|
-
.enum(["default", "landing", "none"])
|
|
224
|
-
.default("landing")
|
|
225
|
-
.describe(
|
|
226
|
-
"Layout wrapper: landing (header + footer), default (docs layout), or none.",
|
|
227
|
-
),
|
|
228
|
-
content: LandingContentSchema.describe(
|
|
229
|
-
"Default landing page content when no custom component is provided.",
|
|
230
|
-
),
|
|
231
|
-
useDefaults: z
|
|
232
|
-
.boolean()
|
|
233
|
-
.optional()
|
|
234
|
-
.describe(
|
|
235
|
-
"When true, merge DEFAULT_LANDING_CONTENT for unset sections. When false or omitted, only configured sections are shown.",
|
|
236
|
-
),
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
export const UserManagementModuleSchema = ModuleToggleSchema.extend({
|
|
240
|
-
routes: z
|
|
241
|
-
.object({
|
|
242
|
-
login: z.string().default("/signin"),
|
|
243
|
-
register: z.string().default("/signup"),
|
|
244
|
-
profile: z.string().default("profile"),
|
|
245
|
-
logout: z.string().default("/signout"),
|
|
246
|
-
})
|
|
247
|
-
.partial()
|
|
248
|
-
.optional(),
|
|
249
|
-
page: SubmodulePageFields.page,
|
|
250
|
-
component: SubmodulePageFields.component,
|
|
251
|
-
content: ProfileContentSchema.describe(
|
|
252
|
-
"Default profile page content when no custom component is provided.",
|
|
253
|
-
),
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
export const ApiKeysModuleSchema = ModuleToggleSchema.extend({
|
|
257
|
-
path: z
|
|
258
|
-
.string()
|
|
259
|
-
.default("settings/api-keys")
|
|
260
|
-
.describe("Route path for API key management."),
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
const PlanCatalogItemSchema = z.object({
|
|
264
|
-
sku: z.string(),
|
|
265
|
-
displayName: z.string(),
|
|
266
|
-
priceAmount: z.number().default(0),
|
|
267
|
-
pricingModel: z
|
|
268
|
-
.enum(["fixed", "custom"])
|
|
269
|
-
.optional()
|
|
270
|
-
.describe(
|
|
271
|
-
'"custom" shows a contact-sales form instead of checkout; priceAmount must be 0.',
|
|
272
|
-
),
|
|
273
|
-
priceLabel: z
|
|
274
|
-
.string()
|
|
275
|
-
.max(64)
|
|
276
|
-
.optional()
|
|
277
|
-
.describe('Text shown instead of the price, e.g. "Custom".'),
|
|
278
|
-
priceCurrency: z
|
|
279
|
-
.string()
|
|
280
|
-
.trim()
|
|
281
|
-
.toLowerCase()
|
|
282
|
-
.regex(
|
|
283
|
-
/^[a-z]{3}$/,
|
|
284
|
-
"priceCurrency must be a 3-letter ISO 4217 code (lowercase)",
|
|
285
|
-
)
|
|
286
|
-
.optional(),
|
|
287
|
-
billingPeriod: z.string().optional(),
|
|
288
|
-
limits: z
|
|
289
|
-
.object({
|
|
290
|
-
rateLimit: z
|
|
291
|
-
.object({
|
|
292
|
-
calls: z.number(),
|
|
293
|
-
renewalPeriodSeconds: z.number().optional(),
|
|
294
|
-
})
|
|
295
|
-
.passthrough()
|
|
296
|
-
.optional(),
|
|
297
|
-
quota: z
|
|
298
|
-
.object({
|
|
299
|
-
calls: z.number(),
|
|
300
|
-
renewalPeriodDays: z.number().optional(),
|
|
301
|
-
})
|
|
302
|
-
.passthrough()
|
|
303
|
-
.optional(),
|
|
304
|
-
})
|
|
305
|
-
.passthrough()
|
|
306
|
-
.optional(),
|
|
307
|
-
limitsJson: z.string().optional(),
|
|
308
|
-
includedActionKeys: z.array(z.string()).optional(),
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
export const PlansModuleSchema = ModuleToggleSchema.extend({
|
|
312
|
-
path: z
|
|
313
|
-
.string()
|
|
314
|
-
.default("plans")
|
|
315
|
-
.describe("Route path for plans and subscription management."),
|
|
316
|
-
page: SubmodulePageFields.page,
|
|
317
|
-
component: SubmodulePageFields.component,
|
|
318
|
-
content: PlansContentSchema.describe(
|
|
319
|
-
"Default plans page content when no custom component is provided.",
|
|
320
|
-
),
|
|
321
|
-
items: z
|
|
322
|
-
.array(PlanCatalogItemSchema)
|
|
323
|
-
.optional()
|
|
324
|
-
.describe(
|
|
325
|
-
"Gateway plan catalog for /pricing preview and publish (canonical storage).",
|
|
326
|
-
),
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
export const DashboardModuleSchema = ModuleToggleSchema.extend({
|
|
330
|
-
path: z
|
|
331
|
-
.string()
|
|
332
|
-
.default("dashboard")
|
|
333
|
-
.describe("Route path for the user dashboard."),
|
|
334
|
-
page: SubmodulePageFields.page,
|
|
335
|
-
component: SubmodulePageFields.component,
|
|
336
|
-
content: DashboardContentSchema.describe(
|
|
337
|
-
"Default dashboard page content when no custom component is provided.",
|
|
338
|
-
),
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
export const UserPanelModuleSchema = ModuleToggleSchema.extend({
|
|
342
|
-
basePath: z
|
|
343
|
-
.string()
|
|
344
|
-
.default("/account")
|
|
345
|
-
.describe("Base path prefix for user panel routes."),
|
|
346
|
-
dashboard: DashboardModuleSchema.optional(),
|
|
347
|
-
userManagement: UserManagementModuleSchema.optional(),
|
|
348
|
-
apiKeys: ApiKeysModuleSchema.optional(),
|
|
349
|
-
plans: PlansModuleSchema.optional(),
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
export const ModulesSchema = z
|
|
353
|
-
.object({
|
|
354
|
-
docs: DocsModuleSchema.optional().describe(
|
|
355
|
-
"Documentation module — MD/MDX pages and OpenAPI reference.",
|
|
356
|
-
),
|
|
357
|
-
landing: LandingModuleSchema.optional().describe(
|
|
358
|
-
"Landing page module — marketing or home page.",
|
|
359
|
-
),
|
|
360
|
-
userPanel: UserPanelModuleSchema.optional().describe(
|
|
361
|
-
"User panel module — authenticated user area with sub-modules.",
|
|
362
|
-
),
|
|
363
|
-
})
|
|
364
|
-
.optional();
|
|
365
|
-
|
|
366
|
-
export type DocsModuleConfig = z.infer<typeof DocsModuleSchema>;
|
|
367
|
-
export type LandingModuleConfig = z.infer<typeof LandingModuleSchema>;
|
|
368
|
-
export type UserManagementModuleConfig = z.infer<
|
|
369
|
-
typeof UserManagementModuleSchema
|
|
370
|
-
>;
|
|
371
|
-
export type ApiKeysModuleConfig = z.infer<typeof ApiKeysModuleSchema>;
|
|
372
|
-
export type PlansModuleConfig = z.infer<typeof PlansModuleSchema>;
|
|
373
|
-
export type DashboardModuleConfig = z.infer<typeof DashboardModuleSchema>;
|
|
374
|
-
export type UserPanelModuleConfig = z.infer<typeof UserPanelModuleSchema>;
|
|
375
|
-
export type ModulesConfig = z.infer<typeof ModulesSchema>;
|
|
376
|
-
|
|
377
|
-
export type ResolvedDocsModule = {
|
|
378
|
-
enabled: boolean;
|
|
379
|
-
files?: string | string[];
|
|
380
|
-
publishMarkdown?: boolean;
|
|
381
|
-
defaultOptions?: DocsModuleConfig["defaultOptions"];
|
|
382
|
-
llms?: DocsModuleConfig["llms"];
|
|
383
|
-
};
|
|
384
|
-
|
|
385
|
-
export type LandingLinkConfig = z.infer<typeof LandingLinkSchema>;
|
|
386
|
-
export type LandingFeatureConfig = z.infer<typeof LandingFeatureSchema>;
|
|
387
|
-
export type LandingContentConfig = z.infer<typeof LandingContentSchema>;
|
|
388
|
-
export type DashboardContentConfig = z.infer<typeof DashboardContentSchema>;
|
|
389
|
-
export type ProfileContentConfig = z.infer<typeof ProfileContentSchema>;
|
|
390
|
-
export type PlansContentConfig = z.infer<typeof PlansContentSchema>;
|
|
391
|
-
export type PlanTierConfig = z.infer<typeof PlanTierSchema>;
|
|
392
|
-
|
|
393
|
-
export type LandingCodeExampleConfig = z.infer<typeof LandingCodeExampleSchema>;
|
|
394
|
-
export type LandingTrustConfig = z.infer<typeof LandingTrustSchema>;
|
|
395
|
-
export type LandingApiShowcaseItemConfig = z.infer<
|
|
396
|
-
typeof LandingApiShowcaseItemSchema
|
|
397
|
-
>;
|
|
398
|
-
export type LandingApiShowcaseConfig = z.infer<typeof LandingApiShowcaseSchema>;
|
|
399
|
-
export type LandingPricingCtaConfig = z.infer<typeof LandingPricingCtaSchema>;
|
|
400
|
-
export type LandingFooterBrandConfig = z.infer<typeof LandingFooterBrandSchema>;
|
|
401
|
-
export type LandingFooterColumnConfig = z.infer<
|
|
402
|
-
typeof LandingFooterColumnSchema
|
|
403
|
-
>;
|
|
404
|
-
export type LandingFooterSocialConfig = z.infer<
|
|
405
|
-
typeof LandingFooterSocialSchema
|
|
406
|
-
>;
|
|
407
|
-
export type LandingFooterConfig = z.infer<typeof LandingFooterSchema>;
|
|
408
|
-
|
|
409
|
-
export type ResolvedLandingContent = {
|
|
410
|
-
hero?: {
|
|
411
|
-
title?: string;
|
|
412
|
-
titleAccent?: string;
|
|
413
|
-
subtitle?: string;
|
|
414
|
-
description?: string;
|
|
415
|
-
badge?: string;
|
|
416
|
-
highlights?: string[];
|
|
417
|
-
codeExample?: NonNullable<LandingCodeExampleConfig>;
|
|
418
|
-
};
|
|
419
|
-
featuresSection?: {
|
|
420
|
-
label?: string;
|
|
421
|
-
title?: string;
|
|
422
|
-
description?: string;
|
|
423
|
-
};
|
|
424
|
-
features?: LandingFeatureConfig[];
|
|
425
|
-
primaryAction?: LandingLinkConfig;
|
|
426
|
-
secondaryAction?: LandingLinkConfig;
|
|
427
|
-
trust?: LandingTrustConfig;
|
|
428
|
-
apiShowcase?: LandingApiShowcaseConfig;
|
|
429
|
-
pricingCta?: LandingPricingCtaConfig;
|
|
430
|
-
footer?: LandingFooterConfig;
|
|
431
|
-
showPoweredBy?: boolean;
|
|
432
|
-
};
|
|
433
|
-
|
|
434
|
-
export type ResolvedLandingModule = {
|
|
435
|
-
enabled: boolean;
|
|
436
|
-
path: string;
|
|
437
|
-
component?: ComponentType | ReactNode;
|
|
438
|
-
layout: "default" | "landing" | "none";
|
|
439
|
-
content: ResolvedLandingContent;
|
|
440
|
-
};
|
|
441
|
-
|
|
442
|
-
export type ResolvedDashboardContent = {
|
|
443
|
-
title?: string;
|
|
444
|
-
subtitle?: string;
|
|
445
|
-
description?: string;
|
|
446
|
-
quickLinks?: LandingLinkConfig[];
|
|
447
|
-
};
|
|
448
|
-
|
|
449
|
-
export type ResolvedProfileContent = {
|
|
450
|
-
title?: string;
|
|
451
|
-
description?: string;
|
|
452
|
-
};
|
|
453
|
-
|
|
454
|
-
export type ResolvedPlansContent = {
|
|
455
|
-
title?: string;
|
|
456
|
-
description?: string;
|
|
457
|
-
tiers?: PlanTierConfig[];
|
|
458
|
-
};
|
|
459
|
-
|
|
460
|
-
export type ResolvedUserManagementModule = {
|
|
461
|
-
enabled: boolean;
|
|
462
|
-
routes: {
|
|
463
|
-
login: string;
|
|
464
|
-
register: string;
|
|
465
|
-
profile: string;
|
|
466
|
-
logout: string;
|
|
467
|
-
};
|
|
468
|
-
content: ResolvedProfileContent;
|
|
469
|
-
};
|
|
470
|
-
|
|
471
|
-
export type ResolvedApiKeysModule = {
|
|
472
|
-
enabled: boolean;
|
|
473
|
-
path: string;
|
|
474
|
-
};
|
|
475
|
-
|
|
476
|
-
export type ResolvedPlansModule = {
|
|
477
|
-
enabled: boolean;
|
|
478
|
-
path: string;
|
|
479
|
-
content: ResolvedPlansContent;
|
|
480
|
-
items?: z.infer<typeof PlanCatalogItemSchema>[];
|
|
481
|
-
};
|
|
482
|
-
|
|
483
|
-
export type ResolvedDashboardModule = {
|
|
484
|
-
enabled: boolean;
|
|
485
|
-
path: string;
|
|
486
|
-
content: ResolvedDashboardContent;
|
|
487
|
-
};
|
|
488
|
-
|
|
489
|
-
export type ResolvedUserPanelModule = {
|
|
490
|
-
enabled: boolean;
|
|
491
|
-
basePath: string;
|
|
492
|
-
dashboard: ResolvedDashboardModule;
|
|
493
|
-
userManagement: ResolvedUserManagementModule;
|
|
494
|
-
apiKeys: ResolvedApiKeysModule;
|
|
495
|
-
plans: ResolvedPlansModule;
|
|
496
|
-
};
|
|
497
|
-
|
|
498
|
-
export type ResolvedModulesConfig = {
|
|
499
|
-
docs: ResolvedDocsModule;
|
|
500
|
-
landing: ResolvedLandingModule;
|
|
501
|
-
userPanel: ResolvedUserPanelModule;
|
|
502
|
-
};
|
|
1
|
+
import type { ComponentType, ReactNode } from "react";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
const ModuleToggleSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
enabled: z
|
|
7
|
+
.boolean()
|
|
8
|
+
.describe("Whether this module is active in the application."),
|
|
9
|
+
})
|
|
10
|
+
.partial();
|
|
11
|
+
|
|
12
|
+
export const DocsModuleSchema = ModuleToggleSchema.extend({
|
|
13
|
+
files: z.union([z.string(), z.array(z.string())]).optional(),
|
|
14
|
+
publishMarkdown: z.boolean().optional(),
|
|
15
|
+
defaultOptions: z
|
|
16
|
+
.object({
|
|
17
|
+
toc: z.boolean(),
|
|
18
|
+
copyPage: z.boolean().optional(),
|
|
19
|
+
disablePager: z.boolean(),
|
|
20
|
+
showLastModified: z.boolean(),
|
|
21
|
+
suggestEdit: z
|
|
22
|
+
.object({
|
|
23
|
+
url: z.string(),
|
|
24
|
+
text: z.string().optional(),
|
|
25
|
+
})
|
|
26
|
+
.optional(),
|
|
27
|
+
})
|
|
28
|
+
.partial()
|
|
29
|
+
.optional(),
|
|
30
|
+
llms: z
|
|
31
|
+
.object({
|
|
32
|
+
llmsTxt: z.boolean().optional(),
|
|
33
|
+
llmsTxtFull: z.boolean().optional(),
|
|
34
|
+
includeProtected: z.boolean().optional(),
|
|
35
|
+
})
|
|
36
|
+
.optional(),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const LandingLinkSchema = z.object({
|
|
40
|
+
label: z.string(),
|
|
41
|
+
href: z.string(),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export const LandingFeatureSchema = z.object({
|
|
45
|
+
title: z.string(),
|
|
46
|
+
description: z.string(),
|
|
47
|
+
icon: z.string().optional(),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export const LandingCodeExampleSchema = z
|
|
51
|
+
.object({
|
|
52
|
+
filename: z.string().optional(),
|
|
53
|
+
language: z.string().optional(),
|
|
54
|
+
code: z.string(),
|
|
55
|
+
})
|
|
56
|
+
.optional();
|
|
57
|
+
|
|
58
|
+
export const LandingHeroSchema = z
|
|
59
|
+
.object({
|
|
60
|
+
title: z.string().optional(),
|
|
61
|
+
titleAccent: z
|
|
62
|
+
.string()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe(
|
|
65
|
+
"Accent-colored word or phrase shown on a new line after the title.",
|
|
66
|
+
),
|
|
67
|
+
subtitle: z.string().optional(),
|
|
68
|
+
description: z.string().optional(),
|
|
69
|
+
badge: z.string().optional(),
|
|
70
|
+
highlights: z.array(z.string()).optional(),
|
|
71
|
+
codeExample: LandingCodeExampleSchema,
|
|
72
|
+
})
|
|
73
|
+
.optional();
|
|
74
|
+
|
|
75
|
+
export const LandingFeaturesSectionSchema = z
|
|
76
|
+
.object({
|
|
77
|
+
label: z.string().optional(),
|
|
78
|
+
title: z.string().optional(),
|
|
79
|
+
description: z.string().optional(),
|
|
80
|
+
})
|
|
81
|
+
.optional();
|
|
82
|
+
|
|
83
|
+
export const LandingTrustSchema = z
|
|
84
|
+
.object({
|
|
85
|
+
enabled: z.boolean().optional(),
|
|
86
|
+
title: z.string().optional(),
|
|
87
|
+
logos: z.array(z.string()).optional(),
|
|
88
|
+
})
|
|
89
|
+
.optional();
|
|
90
|
+
|
|
91
|
+
export const LandingApiShowcaseItemSchema = z.object({
|
|
92
|
+
name: z.string(),
|
|
93
|
+
path: z.string(),
|
|
94
|
+
icon: z.string().optional(),
|
|
95
|
+
latency: z.string().optional(),
|
|
96
|
+
summary: z.string().optional(),
|
|
97
|
+
method: z.string().optional(),
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
export const LandingApiShowcaseSchema = z
|
|
101
|
+
.object({
|
|
102
|
+
enabled: z.boolean().optional(),
|
|
103
|
+
title: z.string().optional(),
|
|
104
|
+
subtitle: z.string().optional(),
|
|
105
|
+
browseAllHref: z.string().optional(),
|
|
106
|
+
browseAllLabel: z.string().optional(),
|
|
107
|
+
autoFromOpenApi: z.boolean().optional(),
|
|
108
|
+
layout: z.enum(["grid", "list"]).optional(),
|
|
109
|
+
items: z.array(LandingApiShowcaseItemSchema).optional(),
|
|
110
|
+
})
|
|
111
|
+
.optional();
|
|
112
|
+
|
|
113
|
+
export const LandingPricingCtaSchema = z
|
|
114
|
+
.object({
|
|
115
|
+
enabled: z.boolean().optional(),
|
|
116
|
+
title: z.string().optional(),
|
|
117
|
+
description: z.string().optional(),
|
|
118
|
+
primaryAction: LandingLinkSchema.optional(),
|
|
119
|
+
secondaryAction: LandingLinkSchema.optional(),
|
|
120
|
+
})
|
|
121
|
+
.optional();
|
|
122
|
+
|
|
123
|
+
export const LandingFooterBrandSchema = z
|
|
124
|
+
.object({
|
|
125
|
+
name: z.string().optional(),
|
|
126
|
+
tagline: z.string().optional(),
|
|
127
|
+
logoSrc: z.string().optional(),
|
|
128
|
+
})
|
|
129
|
+
.optional();
|
|
130
|
+
|
|
131
|
+
export const LandingFooterColumnSchema = z.object({
|
|
132
|
+
title: z.string(),
|
|
133
|
+
links: z.array(LandingLinkSchema),
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
export const LandingFooterSocialSchema = z.object({
|
|
137
|
+
icon: z.string(),
|
|
138
|
+
href: z.string(),
|
|
139
|
+
label: z.string().optional(),
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
export const LandingFooterSchema = z
|
|
143
|
+
.object({
|
|
144
|
+
enabled: z.boolean().optional(),
|
|
145
|
+
brand: LandingFooterBrandSchema,
|
|
146
|
+
columns: z.array(LandingFooterColumnSchema).optional(),
|
|
147
|
+
copyright: z.string().optional(),
|
|
148
|
+
social: z.array(LandingFooterSocialSchema).optional(),
|
|
149
|
+
})
|
|
150
|
+
.optional();
|
|
151
|
+
|
|
152
|
+
export const LandingContentSchema = z
|
|
153
|
+
.object({
|
|
154
|
+
hero: LandingHeroSchema,
|
|
155
|
+
featuresSection: LandingFeaturesSectionSchema,
|
|
156
|
+
features: z.array(LandingFeatureSchema).optional(),
|
|
157
|
+
primaryAction: LandingLinkSchema.optional(),
|
|
158
|
+
secondaryAction: LandingLinkSchema.optional(),
|
|
159
|
+
trust: LandingTrustSchema,
|
|
160
|
+
apiShowcase: LandingApiShowcaseSchema,
|
|
161
|
+
pricingCta: LandingPricingCtaSchema,
|
|
162
|
+
footer: LandingFooterSchema,
|
|
163
|
+
showPoweredBy: z.boolean().optional(),
|
|
164
|
+
})
|
|
165
|
+
.optional();
|
|
166
|
+
|
|
167
|
+
export const DashboardContentSchema = z
|
|
168
|
+
.object({
|
|
169
|
+
title: z.string().optional(),
|
|
170
|
+
subtitle: z.string().optional(),
|
|
171
|
+
description: z.string().optional(),
|
|
172
|
+
quickLinks: z.array(LandingLinkSchema).optional(),
|
|
173
|
+
})
|
|
174
|
+
.optional();
|
|
175
|
+
|
|
176
|
+
export const ProfileContentSchema = z
|
|
177
|
+
.object({
|
|
178
|
+
title: z.string().optional(),
|
|
179
|
+
description: z.string().optional(),
|
|
180
|
+
})
|
|
181
|
+
.optional();
|
|
182
|
+
|
|
183
|
+
export const PlanTierSchema = z.object({
|
|
184
|
+
name: z.string(),
|
|
185
|
+
price: z.string().optional(),
|
|
186
|
+
description: z.string().optional(),
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
export const PlansContentSchema = z
|
|
190
|
+
.object({
|
|
191
|
+
title: z.string().optional(),
|
|
192
|
+
description: z.string().optional(),
|
|
193
|
+
tiers: z.array(PlanTierSchema).optional(),
|
|
194
|
+
})
|
|
195
|
+
.optional();
|
|
196
|
+
|
|
197
|
+
export const SubmodulePageFields = {
|
|
198
|
+
page: z
|
|
199
|
+
.string()
|
|
200
|
+
.optional()
|
|
201
|
+
.describe(
|
|
202
|
+
"Path to a custom page component file, relative to the project root.",
|
|
203
|
+
),
|
|
204
|
+
component: z
|
|
205
|
+
.custom<ComponentType | ReactNode>()
|
|
206
|
+
.optional()
|
|
207
|
+
.describe("Custom React component for this sub-module page."),
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
export const LandingModuleSchema = ModuleToggleSchema.extend({
|
|
211
|
+
path: z.string().default("/").describe("Route path for the landing page."),
|
|
212
|
+
component: z
|
|
213
|
+
.custom<ComponentType | ReactNode>()
|
|
214
|
+
.optional()
|
|
215
|
+
.describe("Custom React component for the landing page."),
|
|
216
|
+
page: z
|
|
217
|
+
.string()
|
|
218
|
+
.optional()
|
|
219
|
+
.describe(
|
|
220
|
+
"Path to a custom landing page component file, relative to the project root.",
|
|
221
|
+
),
|
|
222
|
+
layout: z
|
|
223
|
+
.enum(["default", "landing", "none"])
|
|
224
|
+
.default("landing")
|
|
225
|
+
.describe(
|
|
226
|
+
"Layout wrapper: landing (header + footer), default (docs layout), or none.",
|
|
227
|
+
),
|
|
228
|
+
content: LandingContentSchema.describe(
|
|
229
|
+
"Default landing page content when no custom component is provided.",
|
|
230
|
+
),
|
|
231
|
+
useDefaults: z
|
|
232
|
+
.boolean()
|
|
233
|
+
.optional()
|
|
234
|
+
.describe(
|
|
235
|
+
"When true, merge DEFAULT_LANDING_CONTENT for unset sections. When false or omitted, only configured sections are shown.",
|
|
236
|
+
),
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
export const UserManagementModuleSchema = ModuleToggleSchema.extend({
|
|
240
|
+
routes: z
|
|
241
|
+
.object({
|
|
242
|
+
login: z.string().default("/signin"),
|
|
243
|
+
register: z.string().default("/signup"),
|
|
244
|
+
profile: z.string().default("profile"),
|
|
245
|
+
logout: z.string().default("/signout"),
|
|
246
|
+
})
|
|
247
|
+
.partial()
|
|
248
|
+
.optional(),
|
|
249
|
+
page: SubmodulePageFields.page,
|
|
250
|
+
component: SubmodulePageFields.component,
|
|
251
|
+
content: ProfileContentSchema.describe(
|
|
252
|
+
"Default profile page content when no custom component is provided.",
|
|
253
|
+
),
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
export const ApiKeysModuleSchema = ModuleToggleSchema.extend({
|
|
257
|
+
path: z
|
|
258
|
+
.string()
|
|
259
|
+
.default("settings/api-keys")
|
|
260
|
+
.describe("Route path for API key management."),
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
const PlanCatalogItemSchema = z.object({
|
|
264
|
+
sku: z.string(),
|
|
265
|
+
displayName: z.string(),
|
|
266
|
+
priceAmount: z.number().default(0),
|
|
267
|
+
pricingModel: z
|
|
268
|
+
.enum(["fixed", "custom"])
|
|
269
|
+
.optional()
|
|
270
|
+
.describe(
|
|
271
|
+
'"custom" shows a contact-sales form instead of checkout; priceAmount must be 0.',
|
|
272
|
+
),
|
|
273
|
+
priceLabel: z
|
|
274
|
+
.string()
|
|
275
|
+
.max(64)
|
|
276
|
+
.optional()
|
|
277
|
+
.describe('Text shown instead of the price, e.g. "Custom".'),
|
|
278
|
+
priceCurrency: z
|
|
279
|
+
.string()
|
|
280
|
+
.trim()
|
|
281
|
+
.toLowerCase()
|
|
282
|
+
.regex(
|
|
283
|
+
/^[a-z]{3}$/,
|
|
284
|
+
"priceCurrency must be a 3-letter ISO 4217 code (lowercase)",
|
|
285
|
+
)
|
|
286
|
+
.optional(),
|
|
287
|
+
billingPeriod: z.string().optional(),
|
|
288
|
+
limits: z
|
|
289
|
+
.object({
|
|
290
|
+
rateLimit: z
|
|
291
|
+
.object({
|
|
292
|
+
calls: z.number(),
|
|
293
|
+
renewalPeriodSeconds: z.number().optional(),
|
|
294
|
+
})
|
|
295
|
+
.passthrough()
|
|
296
|
+
.optional(),
|
|
297
|
+
quota: z
|
|
298
|
+
.object({
|
|
299
|
+
calls: z.number(),
|
|
300
|
+
renewalPeriodDays: z.number().optional(),
|
|
301
|
+
})
|
|
302
|
+
.passthrough()
|
|
303
|
+
.optional(),
|
|
304
|
+
})
|
|
305
|
+
.passthrough()
|
|
306
|
+
.optional(),
|
|
307
|
+
limitsJson: z.string().optional(),
|
|
308
|
+
includedActionKeys: z.array(z.string()).optional(),
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
export const PlansModuleSchema = ModuleToggleSchema.extend({
|
|
312
|
+
path: z
|
|
313
|
+
.string()
|
|
314
|
+
.default("plans")
|
|
315
|
+
.describe("Route path for plans and subscription management."),
|
|
316
|
+
page: SubmodulePageFields.page,
|
|
317
|
+
component: SubmodulePageFields.component,
|
|
318
|
+
content: PlansContentSchema.describe(
|
|
319
|
+
"Default plans page content when no custom component is provided.",
|
|
320
|
+
),
|
|
321
|
+
items: z
|
|
322
|
+
.array(PlanCatalogItemSchema)
|
|
323
|
+
.optional()
|
|
324
|
+
.describe(
|
|
325
|
+
"Gateway plan catalog for /pricing preview and publish (canonical storage).",
|
|
326
|
+
),
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
export const DashboardModuleSchema = ModuleToggleSchema.extend({
|
|
330
|
+
path: z
|
|
331
|
+
.string()
|
|
332
|
+
.default("dashboard")
|
|
333
|
+
.describe("Route path for the user dashboard."),
|
|
334
|
+
page: SubmodulePageFields.page,
|
|
335
|
+
component: SubmodulePageFields.component,
|
|
336
|
+
content: DashboardContentSchema.describe(
|
|
337
|
+
"Default dashboard page content when no custom component is provided.",
|
|
338
|
+
),
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
export const UserPanelModuleSchema = ModuleToggleSchema.extend({
|
|
342
|
+
basePath: z
|
|
343
|
+
.string()
|
|
344
|
+
.default("/account")
|
|
345
|
+
.describe("Base path prefix for user panel routes."),
|
|
346
|
+
dashboard: DashboardModuleSchema.optional(),
|
|
347
|
+
userManagement: UserManagementModuleSchema.optional(),
|
|
348
|
+
apiKeys: ApiKeysModuleSchema.optional(),
|
|
349
|
+
plans: PlansModuleSchema.optional(),
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
export const ModulesSchema = z
|
|
353
|
+
.object({
|
|
354
|
+
docs: DocsModuleSchema.optional().describe(
|
|
355
|
+
"Documentation module — MD/MDX pages and OpenAPI reference.",
|
|
356
|
+
),
|
|
357
|
+
landing: LandingModuleSchema.optional().describe(
|
|
358
|
+
"Landing page module — marketing or home page.",
|
|
359
|
+
),
|
|
360
|
+
userPanel: UserPanelModuleSchema.optional().describe(
|
|
361
|
+
"User panel module — authenticated user area with sub-modules.",
|
|
362
|
+
),
|
|
363
|
+
})
|
|
364
|
+
.optional();
|
|
365
|
+
|
|
366
|
+
export type DocsModuleConfig = z.infer<typeof DocsModuleSchema>;
|
|
367
|
+
export type LandingModuleConfig = z.infer<typeof LandingModuleSchema>;
|
|
368
|
+
export type UserManagementModuleConfig = z.infer<
|
|
369
|
+
typeof UserManagementModuleSchema
|
|
370
|
+
>;
|
|
371
|
+
export type ApiKeysModuleConfig = z.infer<typeof ApiKeysModuleSchema>;
|
|
372
|
+
export type PlansModuleConfig = z.infer<typeof PlansModuleSchema>;
|
|
373
|
+
export type DashboardModuleConfig = z.infer<typeof DashboardModuleSchema>;
|
|
374
|
+
export type UserPanelModuleConfig = z.infer<typeof UserPanelModuleSchema>;
|
|
375
|
+
export type ModulesConfig = z.infer<typeof ModulesSchema>;
|
|
376
|
+
|
|
377
|
+
export type ResolvedDocsModule = {
|
|
378
|
+
enabled: boolean;
|
|
379
|
+
files?: string | string[];
|
|
380
|
+
publishMarkdown?: boolean;
|
|
381
|
+
defaultOptions?: DocsModuleConfig["defaultOptions"];
|
|
382
|
+
llms?: DocsModuleConfig["llms"];
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
export type LandingLinkConfig = z.infer<typeof LandingLinkSchema>;
|
|
386
|
+
export type LandingFeatureConfig = z.infer<typeof LandingFeatureSchema>;
|
|
387
|
+
export type LandingContentConfig = z.infer<typeof LandingContentSchema>;
|
|
388
|
+
export type DashboardContentConfig = z.infer<typeof DashboardContentSchema>;
|
|
389
|
+
export type ProfileContentConfig = z.infer<typeof ProfileContentSchema>;
|
|
390
|
+
export type PlansContentConfig = z.infer<typeof PlansContentSchema>;
|
|
391
|
+
export type PlanTierConfig = z.infer<typeof PlanTierSchema>;
|
|
392
|
+
|
|
393
|
+
export type LandingCodeExampleConfig = z.infer<typeof LandingCodeExampleSchema>;
|
|
394
|
+
export type LandingTrustConfig = z.infer<typeof LandingTrustSchema>;
|
|
395
|
+
export type LandingApiShowcaseItemConfig = z.infer<
|
|
396
|
+
typeof LandingApiShowcaseItemSchema
|
|
397
|
+
>;
|
|
398
|
+
export type LandingApiShowcaseConfig = z.infer<typeof LandingApiShowcaseSchema>;
|
|
399
|
+
export type LandingPricingCtaConfig = z.infer<typeof LandingPricingCtaSchema>;
|
|
400
|
+
export type LandingFooterBrandConfig = z.infer<typeof LandingFooterBrandSchema>;
|
|
401
|
+
export type LandingFooterColumnConfig = z.infer<
|
|
402
|
+
typeof LandingFooterColumnSchema
|
|
403
|
+
>;
|
|
404
|
+
export type LandingFooterSocialConfig = z.infer<
|
|
405
|
+
typeof LandingFooterSocialSchema
|
|
406
|
+
>;
|
|
407
|
+
export type LandingFooterConfig = z.infer<typeof LandingFooterSchema>;
|
|
408
|
+
|
|
409
|
+
export type ResolvedLandingContent = {
|
|
410
|
+
hero?: {
|
|
411
|
+
title?: string;
|
|
412
|
+
titleAccent?: string;
|
|
413
|
+
subtitle?: string;
|
|
414
|
+
description?: string;
|
|
415
|
+
badge?: string;
|
|
416
|
+
highlights?: string[];
|
|
417
|
+
codeExample?: NonNullable<LandingCodeExampleConfig>;
|
|
418
|
+
};
|
|
419
|
+
featuresSection?: {
|
|
420
|
+
label?: string;
|
|
421
|
+
title?: string;
|
|
422
|
+
description?: string;
|
|
423
|
+
};
|
|
424
|
+
features?: LandingFeatureConfig[];
|
|
425
|
+
primaryAction?: LandingLinkConfig;
|
|
426
|
+
secondaryAction?: LandingLinkConfig;
|
|
427
|
+
trust?: LandingTrustConfig;
|
|
428
|
+
apiShowcase?: LandingApiShowcaseConfig;
|
|
429
|
+
pricingCta?: LandingPricingCtaConfig;
|
|
430
|
+
footer?: LandingFooterConfig;
|
|
431
|
+
showPoweredBy?: boolean;
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
export type ResolvedLandingModule = {
|
|
435
|
+
enabled: boolean;
|
|
436
|
+
path: string;
|
|
437
|
+
component?: ComponentType | ReactNode;
|
|
438
|
+
layout: "default" | "landing" | "none";
|
|
439
|
+
content: ResolvedLandingContent;
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
export type ResolvedDashboardContent = {
|
|
443
|
+
title?: string;
|
|
444
|
+
subtitle?: string;
|
|
445
|
+
description?: string;
|
|
446
|
+
quickLinks?: LandingLinkConfig[];
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
export type ResolvedProfileContent = {
|
|
450
|
+
title?: string;
|
|
451
|
+
description?: string;
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
export type ResolvedPlansContent = {
|
|
455
|
+
title?: string;
|
|
456
|
+
description?: string;
|
|
457
|
+
tiers?: PlanTierConfig[];
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
export type ResolvedUserManagementModule = {
|
|
461
|
+
enabled: boolean;
|
|
462
|
+
routes: {
|
|
463
|
+
login: string;
|
|
464
|
+
register: string;
|
|
465
|
+
profile: string;
|
|
466
|
+
logout: string;
|
|
467
|
+
};
|
|
468
|
+
content: ResolvedProfileContent;
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
export type ResolvedApiKeysModule = {
|
|
472
|
+
enabled: boolean;
|
|
473
|
+
path: string;
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
export type ResolvedPlansModule = {
|
|
477
|
+
enabled: boolean;
|
|
478
|
+
path: string;
|
|
479
|
+
content: ResolvedPlansContent;
|
|
480
|
+
items?: z.infer<typeof PlanCatalogItemSchema>[];
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
export type ResolvedDashboardModule = {
|
|
484
|
+
enabled: boolean;
|
|
485
|
+
path: string;
|
|
486
|
+
content: ResolvedDashboardContent;
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
export type ResolvedUserPanelModule = {
|
|
490
|
+
enabled: boolean;
|
|
491
|
+
basePath: string;
|
|
492
|
+
dashboard: ResolvedDashboardModule;
|
|
493
|
+
userManagement: ResolvedUserManagementModule;
|
|
494
|
+
apiKeys: ResolvedApiKeysModule;
|
|
495
|
+
plans: ResolvedPlansModule;
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
export type ResolvedModulesConfig = {
|
|
499
|
+
docs: ResolvedDocsModule;
|
|
500
|
+
landing: ResolvedLandingModule;
|
|
501
|
+
userPanel: ResolvedUserPanelModule;
|
|
502
|
+
};
|