@lukoweb/apitogo 0.1.23 → 0.1.37
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 +92 -0
- package/cli.js +13 -13
- package/client.d.ts +8 -8
- package/dist/cli/cli.js +1117 -624
- package/dist/declarations/config/config.d.ts +4 -0
- package/dist/declarations/config/loader.d.ts +2 -0
- package/dist/declarations/config/resolve-modules.d.ts +34 -0
- package/dist/declarations/config/validators/InputNavigationSchema.d.ts +7 -7
- package/dist/declarations/config/validators/ModulesSchema.d.ts +417 -0
- package/dist/declarations/config/validators/ZudokuConfig.d.ts +123 -4
- package/dist/declarations/index.d.ts +3 -1
- package/dist/declarations/lib/authentication/components/ProductionUnlockPage.d.ts +1 -0
- package/dist/declarations/lib/authentication/hook.d.ts +3 -19
- package/dist/declarations/lib/authentication/providers/dev-portal-constants.d.ts +16 -0
- package/dist/declarations/lib/authentication/providers/dev-portal-utils.d.ts +9 -0
- package/dist/declarations/lib/authentication/providers/dev-portal.d.ts +39 -0
- package/dist/declarations/lib/authentication/state.d.ts +12 -26
- package/dist/declarations/lib/components/LandingLayout.d.ts +4 -0
- package/dist/declarations/lib/components/index.d.ts +2 -0
- package/dist/declarations/lib/plugins/api-keys/index.d.ts +2 -1
- package/dist/flat-config.d.ts +209 -24
- package/docs/components/alert.mdx +130 -0
- package/docs/components/badge.mdx +70 -0
- package/docs/components/button.mdx +132 -0
- package/docs/components/callout.mdx +112 -0
- package/docs/components/card.mdx +104 -0
- package/docs/components/checkbox.mdx +72 -0
- package/docs/components/client-only.mdx +79 -0
- package/docs/components/code-tabs.mdx +179 -0
- package/docs/components/dialog.mdx +167 -0
- package/docs/components/head.mdx +200 -0
- package/docs/components/icons.mdx +27 -0
- package/docs/components/input.mdx +96 -0
- package/docs/components/label.mdx +86 -0
- package/docs/components/link.mdx +242 -0
- package/docs/components/markdown.mdx +151 -0
- package/docs/components/mermaid.mdx +81 -0
- package/docs/components/playground.mdx +87 -0
- package/docs/components/secret.mdx +79 -0
- package/docs/components/select.mdx +176 -0
- package/docs/components/shadcn.mdx +73 -0
- package/docs/components/slider.mdx +108 -0
- package/docs/components/slot.mdx +119 -0
- package/docs/components/stepper.mdx +138 -0
- package/docs/components/switch.mdx +96 -0
- package/docs/components/syntax-highlight.mdx +602 -0
- package/docs/components/textarea.mdx +78 -0
- package/docs/components/tooltip.mdx +195 -0
- package/docs/components/typography.mdx +61 -0
- package/docs/concepts/auth-provider-api-identities.md +109 -0
- package/docs/configuration/ai-assistants.md +65 -0
- package/docs/configuration/api-catalog.md +109 -0
- package/docs/configuration/api-reference.md +397 -0
- package/docs/configuration/authentication-auth0.md +174 -0
- package/docs/configuration/authentication-azure-ad.md +238 -0
- package/docs/configuration/authentication-clerk.md +110 -0
- package/docs/configuration/authentication-firebase.md +62 -0
- package/docs/configuration/authentication-pingfederate.md +136 -0
- package/docs/configuration/authentication-supabase.md +226 -0
- package/docs/configuration/authentication.md +231 -0
- package/docs/configuration/build-configuration.mdx +147 -0
- package/docs/configuration/docs.md +282 -0
- package/docs/configuration/footer.mdx +214 -0
- package/docs/configuration/llms.md +90 -0
- package/docs/configuration/make-config.mdx +90 -0
- package/docs/configuration/navigation.mdx +422 -0
- package/docs/configuration/overview.md +380 -0
- package/docs/configuration/protected-routes.md +150 -0
- package/docs/configuration/search.md +163 -0
- package/docs/configuration/sentry.mdx +44 -0
- package/docs/configuration/site.md +124 -0
- package/docs/configuration/slots.mdx +125 -0
- package/docs/configuration/vite-config.md +18 -0
- package/docs/custom-plugins.md +285 -0
- package/docs/customization/colors-theme.mdx +276 -0
- package/docs/customization/fonts.md +110 -0
- package/docs/deploy/apache-nginx.md +41 -0
- package/docs/deploy/apitogo.md +139 -0
- package/docs/deploy/cloudflare-pages.md +75 -0
- package/docs/deploy/direct-upload.md +18 -0
- package/docs/deploy/github-pages.md +50 -0
- package/docs/deploy/vercel.md +103 -0
- package/docs/deployment.md +21 -0
- package/docs/extending/events.md +124 -0
- package/docs/guides/custom-pages.md +106 -0
- package/docs/guides/environment-variables.md +99 -0
- package/docs/guides/managing-api-keys-and-identities.md +172 -0
- package/docs/guides/mermaid.mdx +70 -0
- package/docs/guides/navigation-migration.md +87 -0
- package/docs/guides/navigation-rules.mdx +203 -0
- package/docs/guides/processors.mdx +234 -0
- package/docs/guides/static-files.md +55 -0
- package/docs/guides/transforming-examples.md +156 -0
- package/docs/guides/using-multiple-apis.md +87 -0
- package/docs/markdown/admonitions.md +128 -0
- package/docs/markdown/code-blocks.md +196 -0
- package/docs/markdown/frontmatter.md +173 -0
- package/docs/markdown/mdx.md +68 -0
- package/docs/markdown/overview.md +275 -0
- package/docs/plugins.md +5 -0
- package/docs/quickstart.md +87 -0
- package/docs/writing.mdx +72 -0
- package/package.json +170 -116
- package/src/app/ZuploBuildConfig.ts +36 -36
- 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 +118 -118
- package/src/app/entry.server.tsx +160 -160
- package/src/app/env.ts +40 -40
- package/src/app/font.geist.css +73 -73
- package/src/app/main.css +390 -390
- package/src/app/main.tsx +8 -1
- package/src/app/polyfills.ts +47 -47
- package/src/app/processRoutes.tsx +51 -25
- 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/config.ts +32 -0
- package/src/config/create-plugin.ts +71 -71
- package/src/config/file-exists.ts +6 -6
- package/src/config/loader.ts +11 -1
- package/src/config/resolve-modules.ts +260 -0
- package/src/config/validators/BuildSchema.ts +95 -95
- package/src/config/validators/HeaderNavigationSchema.ts +41 -41
- package/src/config/validators/InputNavigationSchema.test-d.ts +178 -178
- package/src/config/validators/InputNavigationSchema.ts +206 -206
- package/src/config/validators/ModulesSchema.ts +312 -0
- package/src/config/validators/ProtectedRoutesSchema.ts +35 -35
- package/src/config/validators/ZudokuConfig.ts +766 -729
- 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 +31 -0
- 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 -31
- package/src/lib/authentication/AuthenticationPlugin.tsx +33 -33
- package/src/lib/authentication/authentication.ts +48 -48
- package/src/lib/authentication/components/OAuthErrorPage.tsx +197 -197
- package/src/lib/authentication/components/ProductionUnlockPage.tsx +27 -0
- package/src/lib/authentication/components/SignOut.tsx +15 -15
- package/src/lib/authentication/constants.ts +1 -1
- package/src/lib/authentication/errors.ts +34 -34
- package/src/lib/authentication/hook.ts +141 -139
- package/src/lib/authentication/providers/auth0.tsx +91 -91
- package/src/lib/authentication/providers/azureb2c.tsx +223 -223
- package/src/lib/authentication/providers/dev-portal-constants.ts +21 -0
- package/src/lib/authentication/providers/dev-portal-utils.ts +107 -0
- package/src/lib/authentication/providers/dev-portal.tsx +270 -0
- 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 +179 -91
- 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/AnchorLink.tsx +24 -24
- 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/ErrorPage.tsx +26 -26
- package/src/lib/components/Footer.tsx +140 -140
- package/src/lib/components/Framed.tsx +51 -51
- package/src/lib/components/Header.tsx +11 -3
- package/src/lib/components/HeaderNavigation.tsx +148 -148
- package/src/lib/components/Heading.tsx +84 -84
- package/src/lib/components/InlineCode.tsx +15 -15
- package/src/lib/components/LandingLayout.tsx +21 -0
- package/src/lib/components/LanguageIcon.tsx +199 -199
- package/src/lib/components/Markdown.tsx +55 -55
- package/src/lib/components/Meta.tsx +46 -46
- package/src/lib/components/MobileTopNavigation.tsx +11 -3
- 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/Slot.tsx +64 -64
- package/src/lib/components/Spinner.tsx +5 -5
- package/src/lib/components/StatusPage.tsx +96 -96
- package/src/lib/components/ThemeSwitch.tsx +49 -49
- package/src/lib/components/Typography.tsx +12 -12
- package/src/lib/components/Zudoku.tsx +106 -106
- 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 +22 -22
- package/src/lib/components/context/ZudokuReactContext.tsx +17 -17
- package/src/lib/components/index.ts +2 -0
- package/src/lib/components/navigation/Navigation.tsx +51 -51
- package/src/lib/components/navigation/NavigationBadge.tsx +48 -48
- package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -28
- package/src/lib/components/navigation/NavigationWrapper.tsx +49 -49
- 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 +11 -1
- package/src/lib/core/ZudokuContext.ts +271 -271
- package/src/lib/core/plugins.ts +138 -138
- 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/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/index.tsx +119 -119
- package/src/lib/plugins/api-keys/ProtectedRoute.tsx +33 -33
- package/src/lib/plugins/api-keys/index.tsx +274 -272
- package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -67
- package/src/lib/plugins/custom-pages/index.tsx +32 -32
- 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 +62 -62
- package/src/lib/plugins/openapi/ColorizedParam.tsx +115 -115
- package/src/lib/plugins/openapi/Endpoint.tsx +85 -85
- 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/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/SidecarBox.tsx +57 -57
- 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/NonHighlightedCode.tsx +22 -22
- 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/Headers.tsx +6 -6
- package/src/lib/plugins/openapi/playground/PathParams.tsx +53 -53
- 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/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/ResponseStatusBar.tsx +117 -117
- 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/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/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/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/testing/index.tsx +146 -146
- package/src/lib/ui/Accordion.tsx +55 -55
- 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/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/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 +70 -70
- package/src/lib/util/useScrollToTop.ts +18 -18
- package/src/types.d.ts +57 -53
- package/src/vite/api/SchemaManager.ts +371 -371
- package/src/vite/api/schema-codegen.ts +163 -163
- package/src/vite/config.ts +5 -1
- 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 +93 -0
- package/src/vite/html.ts +54 -54
- package/src/vite/index.ts +2 -2
- 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/plugin-api-keys.ts +6 -1
- package/src/vite/plugin-api.ts +4 -1
- package/src/vite/plugin-auth.ts +5 -1
- package/src/vite/plugin-component.ts +1 -1
- package/src/vite/plugin-config-reload.ts +49 -49
- package/src/vite/plugin-doc-metadata.ts +45 -45
- package/src/vite/plugin-docs.ts +4 -1
- package/src/vite/plugin-metadata.ts +30 -30
- package/src/vite/plugin-modules.ts +144 -0
- package/src/vite/plugin-shiki-register.ts +97 -97
- package/src/vite/plugin-theme.ts +399 -399
- package/src/vite/plugin.ts +2 -0
- 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/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/LICENSE.md +0 -18
- package/dist/declarations/lib/components/navigation/ZudokuLogo.d.ts +0 -6
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
import type { JSONSchema4, JSONSchema6 } from "json-schema";
|
|
2
|
-
import { CIRCULAR_REF } from "../../graphql/constants.js";
|
|
3
|
-
import { resolveLocalRef } from "./resolveRef.js";
|
|
4
|
-
|
|
5
|
-
export type JSONSchema = JSONSchema4 | JSONSchema6;
|
|
6
|
-
|
|
7
|
-
type CustomResolver = (ref: string) => Promise<JSONSchema | undefined>;
|
|
8
|
-
|
|
9
|
-
const cache = new Map<JSONSchema, JSONSchema>();
|
|
10
|
-
|
|
11
|
-
// biome-ignore lint/suspicious/noExplicitAny: Allow any type
|
|
12
|
-
const isIndexableObject = (obj: any): obj is Record<string, any> =>
|
|
13
|
-
obj !== null && typeof obj === "object";
|
|
14
|
-
|
|
15
|
-
// Taken and inspired from `dereference-json-schema` package.
|
|
16
|
-
export const dereference = async (
|
|
17
|
-
schema: JSONSchema,
|
|
18
|
-
resolvers: CustomResolver[] = [],
|
|
19
|
-
) => {
|
|
20
|
-
if (cache.has(schema)) {
|
|
21
|
-
// biome-ignore lint/style/noNonNullAssertion: Cache is guaranteed to have a value
|
|
22
|
-
return cache.get(schema)!;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const cloned = structuredClone(schema);
|
|
26
|
-
const visited = new Set<unknown>();
|
|
27
|
-
|
|
28
|
-
const resolve = async (current: unknown, path: string) => {
|
|
29
|
-
if (isIndexableObject(current)) {
|
|
30
|
-
if (visited.has(current)) {
|
|
31
|
-
return CIRCULAR_REF;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
visited.add(current);
|
|
35
|
-
|
|
36
|
-
if (Array.isArray(current)) {
|
|
37
|
-
for (let index = 0; index < current.length; index++) {
|
|
38
|
-
current[index] = await resolve(current[index], `${path}/${index}`);
|
|
39
|
-
}
|
|
40
|
-
} else {
|
|
41
|
-
if ("$ref" in current && typeof current.$ref === "string") {
|
|
42
|
-
const { $ref, ...siblings } = current;
|
|
43
|
-
current.__$ref = $ref;
|
|
44
|
-
const hasSiblings = Object.keys(siblings).length > 0;
|
|
45
|
-
|
|
46
|
-
let result: unknown;
|
|
47
|
-
for (const resolver of resolvers) {
|
|
48
|
-
const resolved = await resolver($ref);
|
|
49
|
-
if (resolved) {
|
|
50
|
-
result = await resolve(resolved, path);
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (result === undefined) {
|
|
55
|
-
const resolved = await resolveLocalRef(cloned, $ref);
|
|
56
|
-
result = await resolve(resolved, path);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (hasSiblings) {
|
|
60
|
-
if (result === CIRCULAR_REF) {
|
|
61
|
-
return { ...siblings };
|
|
62
|
-
}
|
|
63
|
-
if (isIndexableObject(result)) {
|
|
64
|
-
return { ...result, ...siblings };
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return result;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
for (const key in current) {
|
|
71
|
-
current[key] = await resolve(current[key], `${path}/${key}`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
visited.delete(current);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return current;
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
const result = (await resolve(cloned, "#")) as JSONSchema;
|
|
82
|
-
cache.set(schema, result);
|
|
83
|
-
return result;
|
|
84
|
-
};
|
|
1
|
+
import type { JSONSchema4, JSONSchema6 } from "json-schema";
|
|
2
|
+
import { CIRCULAR_REF } from "../../graphql/constants.js";
|
|
3
|
+
import { resolveLocalRef } from "./resolveRef.js";
|
|
4
|
+
|
|
5
|
+
export type JSONSchema = JSONSchema4 | JSONSchema6;
|
|
6
|
+
|
|
7
|
+
type CustomResolver = (ref: string) => Promise<JSONSchema | undefined>;
|
|
8
|
+
|
|
9
|
+
const cache = new Map<JSONSchema, JSONSchema>();
|
|
10
|
+
|
|
11
|
+
// biome-ignore lint/suspicious/noExplicitAny: Allow any type
|
|
12
|
+
const isIndexableObject = (obj: any): obj is Record<string, any> =>
|
|
13
|
+
obj !== null && typeof obj === "object";
|
|
14
|
+
|
|
15
|
+
// Taken and inspired from `dereference-json-schema` package.
|
|
16
|
+
export const dereference = async (
|
|
17
|
+
schema: JSONSchema,
|
|
18
|
+
resolvers: CustomResolver[] = [],
|
|
19
|
+
) => {
|
|
20
|
+
if (cache.has(schema)) {
|
|
21
|
+
// biome-ignore lint/style/noNonNullAssertion: Cache is guaranteed to have a value
|
|
22
|
+
return cache.get(schema)!;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const cloned = structuredClone(schema);
|
|
26
|
+
const visited = new Set<unknown>();
|
|
27
|
+
|
|
28
|
+
const resolve = async (current: unknown, path: string) => {
|
|
29
|
+
if (isIndexableObject(current)) {
|
|
30
|
+
if (visited.has(current)) {
|
|
31
|
+
return CIRCULAR_REF;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
visited.add(current);
|
|
35
|
+
|
|
36
|
+
if (Array.isArray(current)) {
|
|
37
|
+
for (let index = 0; index < current.length; index++) {
|
|
38
|
+
current[index] = await resolve(current[index], `${path}/${index}`);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
if ("$ref" in current && typeof current.$ref === "string") {
|
|
42
|
+
const { $ref, ...siblings } = current;
|
|
43
|
+
current.__$ref = $ref;
|
|
44
|
+
const hasSiblings = Object.keys(siblings).length > 0;
|
|
45
|
+
|
|
46
|
+
let result: unknown;
|
|
47
|
+
for (const resolver of resolvers) {
|
|
48
|
+
const resolved = await resolver($ref);
|
|
49
|
+
if (resolved) {
|
|
50
|
+
result = await resolve(resolved, path);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (result === undefined) {
|
|
55
|
+
const resolved = await resolveLocalRef(cloned, $ref);
|
|
56
|
+
result = await resolve(resolved, path);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (hasSiblings) {
|
|
60
|
+
if (result === CIRCULAR_REF) {
|
|
61
|
+
return { ...siblings };
|
|
62
|
+
}
|
|
63
|
+
if (isIndexableObject(result)) {
|
|
64
|
+
return { ...result, ...siblings };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
for (const key in current) {
|
|
71
|
+
current[key] = await resolve(current[key], `${path}/${key}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
visited.delete(current);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return current;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const result = (await resolve(cloned, "#")) as JSONSchema;
|
|
82
|
+
cache.set(schema, result);
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import type { JSONSchema } from "./index.js";
|
|
2
|
-
|
|
3
|
-
const cache = new Map<JSONSchema, Map<string, unknown>>();
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Resolves a $ref pointer in a schema and returns the referenced value.
|
|
7
|
-
*/
|
|
8
|
-
export const resolveLocalRef = (schema: JSONSchema, ref: string): unknown => {
|
|
9
|
-
if (!cache.has(schema)) {
|
|
10
|
-
cache.set(schema, new Map<string, unknown>());
|
|
11
|
-
}
|
|
12
|
-
const schemaCache = cache.get(schema);
|
|
13
|
-
|
|
14
|
-
if (schemaCache?.has(ref)) {
|
|
15
|
-
return schemaCache.get(ref);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const path = ref.split("/").slice(1);
|
|
19
|
-
|
|
20
|
-
// biome-ignore lint/suspicious/noExplicitAny: Allow any type
|
|
21
|
-
let current: any = schema;
|
|
22
|
-
for (const segment of path) {
|
|
23
|
-
if (!current || typeof current !== "object") {
|
|
24
|
-
// we've reached a dead end
|
|
25
|
-
current = null;
|
|
26
|
-
}
|
|
27
|
-
current = current[segment] ?? null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
schemaCache?.set(ref, current);
|
|
31
|
-
return current;
|
|
32
|
-
};
|
|
1
|
+
import type { JSONSchema } from "./index.js";
|
|
2
|
+
|
|
3
|
+
const cache = new Map<JSONSchema, Map<string, unknown>>();
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Resolves a $ref pointer in a schema and returns the referenced value.
|
|
7
|
+
*/
|
|
8
|
+
export const resolveLocalRef = (schema: JSONSchema, ref: string): unknown => {
|
|
9
|
+
if (!cache.has(schema)) {
|
|
10
|
+
cache.set(schema, new Map<string, unknown>());
|
|
11
|
+
}
|
|
12
|
+
const schemaCache = cache.get(schema);
|
|
13
|
+
|
|
14
|
+
if (schemaCache?.has(ref)) {
|
|
15
|
+
return schemaCache.get(ref);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const path = ref.split("/").slice(1);
|
|
19
|
+
|
|
20
|
+
// biome-ignore lint/suspicious/noExplicitAny: Allow any type
|
|
21
|
+
let current: any = schema;
|
|
22
|
+
for (const segment of path) {
|
|
23
|
+
if (!current || typeof current !== "object") {
|
|
24
|
+
// we've reached a dead end
|
|
25
|
+
current = null;
|
|
26
|
+
}
|
|
27
|
+
current = current[segment] ?? null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
schemaCache?.set(ref, current);
|
|
31
|
+
return current;
|
|
32
|
+
};
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
import { GraphQLError } from "graphql/error/index.js";
|
|
2
|
-
import { OpenAPIV3, type OpenAPIV3_1 } from "openapi-types";
|
|
3
|
-
import { flattenAllOf } from "../../util/flattenAllOf.js";
|
|
4
|
-
import { traverse } from "../../util/traverse.js";
|
|
5
|
-
import { dereference, type JSONSchema } from "./dereference/index.js";
|
|
6
|
-
import { upgradeSchema } from "./upgrade/index.js";
|
|
7
|
-
|
|
8
|
-
// Must be an interface (not a type) to allow merging with OpenAPI types with index signatures
|
|
9
|
-
interface WithRef {
|
|
10
|
-
__$ref?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
type DeepOmitReference<T> = T extends OpenAPIV3_1.ReferenceObject
|
|
14
|
-
? never
|
|
15
|
-
: T extends object
|
|
16
|
-
? { [K in keyof T]: DeepOmitReference<T[K]> } & WithRef
|
|
17
|
-
: T;
|
|
18
|
-
|
|
19
|
-
export type OpenAPIDocument = DeepOmitReference<OpenAPIV3_1.Document>;
|
|
20
|
-
export type ResponseObject = DeepOmitReference<OpenAPIV3_1.ResponseObject>;
|
|
21
|
-
export type OperationObject = DeepOmitReference<OpenAPIV3_1.OperationObject>;
|
|
22
|
-
export type PathsObject = DeepOmitReference<OpenAPIV3_1.PathsObject>;
|
|
23
|
-
export type PathItemObject = DeepOmitReference<OpenAPIV3_1.PathItemObject>;
|
|
24
|
-
export type ParameterObject = DeepOmitReference<OpenAPIV3_1.ParameterObject>;
|
|
25
|
-
export type TagObject = DeepOmitReference<OpenAPIV3_1.TagObject>;
|
|
26
|
-
export type ExampleObject = DeepOmitReference<OpenAPIV3_1.ExampleObject>;
|
|
27
|
-
export type EncodingObject = DeepOmitReference<OpenAPIV3_1.EncodingObject>;
|
|
28
|
-
export type SchemaObject = DeepOmitReference<OpenAPIV3_1.SchemaObject>;
|
|
29
|
-
export type ArraySchemaObject =
|
|
30
|
-
DeepOmitReference<OpenAPIV3_1.ArraySchemaObject>;
|
|
31
|
-
export type ServerObject = DeepOmitReference<OpenAPIV3_1.ServerObject>;
|
|
32
|
-
export type ContactObject = DeepOmitReference<OpenAPIV3_1.ContactObject>;
|
|
33
|
-
export type LicenseObject = DeepOmitReference<OpenAPIV3_1.LicenseObject>;
|
|
34
|
-
export type ExternalDocumentationObject =
|
|
35
|
-
DeepOmitReference<OpenAPIV3_1.ExternalDocumentationObject>;
|
|
36
|
-
|
|
37
|
-
export const HttpMethods = Object.values(OpenAPIV3.HttpMethods);
|
|
38
|
-
|
|
39
|
-
const parseSchemaInput = async (
|
|
40
|
-
schemaInput: unknown,
|
|
41
|
-
): Promise<JSONSchema & { openapi?: string }> => {
|
|
42
|
-
if (typeof schemaInput === "string") {
|
|
43
|
-
if (schemaInput.trim().startsWith("{")) {
|
|
44
|
-
try {
|
|
45
|
-
return JSON.parse(schemaInput);
|
|
46
|
-
} catch (err) {
|
|
47
|
-
throw new GraphQLError("Invalid JSON schema", {
|
|
48
|
-
originalError: err,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
if (schemaInput.includes("://")) {
|
|
53
|
-
let response: Response;
|
|
54
|
-
try {
|
|
55
|
-
response = await fetch(schemaInput, {
|
|
56
|
-
cache: "force-cache",
|
|
57
|
-
});
|
|
58
|
-
} catch (err) {
|
|
59
|
-
throw new GraphQLError("Failed to fetch schema", {
|
|
60
|
-
originalError: err,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (!response.ok) {
|
|
65
|
-
throw new GraphQLError(
|
|
66
|
-
`Failed to fetch schema: ${response.statusText}`,
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const schemaText = await response.text();
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
if (schemaText.trim().startsWith("{")) {
|
|
74
|
-
return JSON.parse(schemaText) as JSONSchema;
|
|
75
|
-
} else {
|
|
76
|
-
const yaml = await import("yaml");
|
|
77
|
-
return yaml.parse(schemaText) as JSONSchema;
|
|
78
|
-
}
|
|
79
|
-
} catch (err) {
|
|
80
|
-
throw new GraphQLError("Fetched invalid schema", {
|
|
81
|
-
originalError: err,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
const yaml = await import("yaml");
|
|
86
|
-
const parsed = yaml.parse(schemaInput);
|
|
87
|
-
|
|
88
|
-
if (typeof parsed === "object") return parsed;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (typeof schemaInput === "object") return schemaInput as JSONSchema;
|
|
92
|
-
|
|
93
|
-
throw new GraphQLError(`Unsupported schema input: ${schemaInput}`);
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Validates, dereferences and upgrades the OpenAPI schema (to v3.1) if necessary.
|
|
98
|
-
*
|
|
99
|
-
* This only happens for URL schemas (or in standalone mode).
|
|
100
|
-
* File schemas are pre-processed by the SchemaManager
|
|
101
|
-
*/
|
|
102
|
-
export const validate = async (schemaInput: unknown) => {
|
|
103
|
-
const schema = await parseSchemaInput(schemaInput);
|
|
104
|
-
|
|
105
|
-
if (!schema.openapi) {
|
|
106
|
-
throw new GraphQLError("OpenAPI version is not defined");
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const dereferenced = await dereference(schema);
|
|
110
|
-
const upgraded = upgradeSchema(dereferenced);
|
|
111
|
-
|
|
112
|
-
const flattened = traverse(upgraded, (spec) => {
|
|
113
|
-
if (!spec || typeof spec !== "object" || Array.isArray(spec)) {
|
|
114
|
-
return spec;
|
|
115
|
-
}
|
|
116
|
-
const isSchemaObject =
|
|
117
|
-
"type" in spec ||
|
|
118
|
-
"properties" in spec ||
|
|
119
|
-
"allOf" in spec ||
|
|
120
|
-
"anyOf" in spec ||
|
|
121
|
-
"oneOf" in spec;
|
|
122
|
-
|
|
123
|
-
if (!isSchemaObject) return spec;
|
|
124
|
-
|
|
125
|
-
return flattenAllOf(spec) as typeof spec;
|
|
126
|
-
}) as OpenAPIDocument;
|
|
127
|
-
|
|
128
|
-
return flattened;
|
|
129
|
-
};
|
|
1
|
+
import { GraphQLError } from "graphql/error/index.js";
|
|
2
|
+
import { OpenAPIV3, type OpenAPIV3_1 } from "openapi-types";
|
|
3
|
+
import { flattenAllOf } from "../../util/flattenAllOf.js";
|
|
4
|
+
import { traverse } from "../../util/traverse.js";
|
|
5
|
+
import { dereference, type JSONSchema } from "./dereference/index.js";
|
|
6
|
+
import { upgradeSchema } from "./upgrade/index.js";
|
|
7
|
+
|
|
8
|
+
// Must be an interface (not a type) to allow merging with OpenAPI types with index signatures
|
|
9
|
+
interface WithRef {
|
|
10
|
+
__$ref?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
type DeepOmitReference<T> = T extends OpenAPIV3_1.ReferenceObject
|
|
14
|
+
? never
|
|
15
|
+
: T extends object
|
|
16
|
+
? { [K in keyof T]: DeepOmitReference<T[K]> } & WithRef
|
|
17
|
+
: T;
|
|
18
|
+
|
|
19
|
+
export type OpenAPIDocument = DeepOmitReference<OpenAPIV3_1.Document>;
|
|
20
|
+
export type ResponseObject = DeepOmitReference<OpenAPIV3_1.ResponseObject>;
|
|
21
|
+
export type OperationObject = DeepOmitReference<OpenAPIV3_1.OperationObject>;
|
|
22
|
+
export type PathsObject = DeepOmitReference<OpenAPIV3_1.PathsObject>;
|
|
23
|
+
export type PathItemObject = DeepOmitReference<OpenAPIV3_1.PathItemObject>;
|
|
24
|
+
export type ParameterObject = DeepOmitReference<OpenAPIV3_1.ParameterObject>;
|
|
25
|
+
export type TagObject = DeepOmitReference<OpenAPIV3_1.TagObject>;
|
|
26
|
+
export type ExampleObject = DeepOmitReference<OpenAPIV3_1.ExampleObject>;
|
|
27
|
+
export type EncodingObject = DeepOmitReference<OpenAPIV3_1.EncodingObject>;
|
|
28
|
+
export type SchemaObject = DeepOmitReference<OpenAPIV3_1.SchemaObject>;
|
|
29
|
+
export type ArraySchemaObject =
|
|
30
|
+
DeepOmitReference<OpenAPIV3_1.ArraySchemaObject>;
|
|
31
|
+
export type ServerObject = DeepOmitReference<OpenAPIV3_1.ServerObject>;
|
|
32
|
+
export type ContactObject = DeepOmitReference<OpenAPIV3_1.ContactObject>;
|
|
33
|
+
export type LicenseObject = DeepOmitReference<OpenAPIV3_1.LicenseObject>;
|
|
34
|
+
export type ExternalDocumentationObject =
|
|
35
|
+
DeepOmitReference<OpenAPIV3_1.ExternalDocumentationObject>;
|
|
36
|
+
|
|
37
|
+
export const HttpMethods = Object.values(OpenAPIV3.HttpMethods);
|
|
38
|
+
|
|
39
|
+
const parseSchemaInput = async (
|
|
40
|
+
schemaInput: unknown,
|
|
41
|
+
): Promise<JSONSchema & { openapi?: string }> => {
|
|
42
|
+
if (typeof schemaInput === "string") {
|
|
43
|
+
if (schemaInput.trim().startsWith("{")) {
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(schemaInput);
|
|
46
|
+
} catch (err) {
|
|
47
|
+
throw new GraphQLError("Invalid JSON schema", {
|
|
48
|
+
originalError: err,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (schemaInput.includes("://")) {
|
|
53
|
+
let response: Response;
|
|
54
|
+
try {
|
|
55
|
+
response = await fetch(schemaInput, {
|
|
56
|
+
cache: "force-cache",
|
|
57
|
+
});
|
|
58
|
+
} catch (err) {
|
|
59
|
+
throw new GraphQLError("Failed to fetch schema", {
|
|
60
|
+
originalError: err,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
throw new GraphQLError(
|
|
66
|
+
`Failed to fetch schema: ${response.statusText}`,
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const schemaText = await response.text();
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
if (schemaText.trim().startsWith("{")) {
|
|
74
|
+
return JSON.parse(schemaText) as JSONSchema;
|
|
75
|
+
} else {
|
|
76
|
+
const yaml = await import("yaml");
|
|
77
|
+
return yaml.parse(schemaText) as JSONSchema;
|
|
78
|
+
}
|
|
79
|
+
} catch (err) {
|
|
80
|
+
throw new GraphQLError("Fetched invalid schema", {
|
|
81
|
+
originalError: err,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const yaml = await import("yaml");
|
|
86
|
+
const parsed = yaml.parse(schemaInput);
|
|
87
|
+
|
|
88
|
+
if (typeof parsed === "object") return parsed;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (typeof schemaInput === "object") return schemaInput as JSONSchema;
|
|
92
|
+
|
|
93
|
+
throw new GraphQLError(`Unsupported schema input: ${schemaInput}`);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Validates, dereferences and upgrades the OpenAPI schema (to v3.1) if necessary.
|
|
98
|
+
*
|
|
99
|
+
* This only happens for URL schemas (or in standalone mode).
|
|
100
|
+
* File schemas are pre-processed by the SchemaManager
|
|
101
|
+
*/
|
|
102
|
+
export const validate = async (schemaInput: unknown) => {
|
|
103
|
+
const schema = await parseSchemaInput(schemaInput);
|
|
104
|
+
|
|
105
|
+
if (!schema.openapi) {
|
|
106
|
+
throw new GraphQLError("OpenAPI version is not defined");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const dereferenced = await dereference(schema);
|
|
110
|
+
const upgraded = upgradeSchema(dereferenced);
|
|
111
|
+
|
|
112
|
+
const flattened = traverse(upgraded, (spec) => {
|
|
113
|
+
if (!spec || typeof spec !== "object" || Array.isArray(spec)) {
|
|
114
|
+
return spec;
|
|
115
|
+
}
|
|
116
|
+
const isSchemaObject =
|
|
117
|
+
"type" in spec ||
|
|
118
|
+
"properties" in spec ||
|
|
119
|
+
"allOf" in spec ||
|
|
120
|
+
"anyOf" in spec ||
|
|
121
|
+
"oneOf" in spec;
|
|
122
|
+
|
|
123
|
+
if (!isSchemaObject) return spec;
|
|
124
|
+
|
|
125
|
+
return flattenAllOf(spec) as typeof spec;
|
|
126
|
+
}) as OpenAPIDocument;
|
|
127
|
+
|
|
128
|
+
return flattened;
|
|
129
|
+
};
|