zudoku 0.1.1-dev.9 → 0.3.0-dev.3
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/dist/app/App.js +15 -6
- package/dist/app/App.js.map +1 -1
- package/dist/app/main.js +10 -2
- package/dist/app/main.js.map +1 -1
- package/dist/cli/build/handler.js +3 -1
- package/dist/cli/build/handler.js.map +1 -1
- package/dist/cli/common/analytics/lib.js +1 -1
- package/dist/cli/common/analytics/lib.js.map +1 -1
- package/dist/cli/common/logger.js +3 -1
- package/dist/cli/common/logger.js.map +1 -1
- package/dist/cli/common/outdated.js +4 -4
- package/dist/cli/common/outdated.js.map +1 -1
- package/dist/cli/common/output.js +4 -4
- package/dist/cli/common/output.js.map +1 -1
- package/dist/cli/common/utils/box.js +2 -2
- package/dist/cli/common/utils/box.js.map +1 -1
- package/dist/cli/dev/handler.js +4 -2
- package/dist/cli/dev/handler.js.map +1 -1
- package/dist/config/config.d.ts +30 -6
- package/dist/config/validators/auth.d.ts +2 -0
- package/dist/config/validators/auth.js +2 -0
- package/dist/config/validators/auth.js.map +1 -0
- package/dist/config/validators/validate.d.ts +2 -0
- package/dist/config/validators/validate.js +4 -0
- package/dist/config/validators/validate.js.map +1 -0
- package/dist/index.d.ts +2 -6
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/authentication/Callback.d.ts +3 -0
- package/dist/lib/authentication/Callback.js +34 -0
- package/dist/lib/authentication/Callback.js.map +1 -0
- package/dist/lib/authentication/authentication.d.ts +14 -0
- package/dist/lib/authentication/authentication.js.map +1 -0
- package/dist/lib/authentication/errors.d.ts +15 -0
- package/dist/lib/authentication/errors.js +10 -0
- package/dist/lib/authentication/errors.js.map +1 -0
- package/dist/lib/authentication/hook.d.ts +7 -0
- package/dist/lib/authentication/hook.js +29 -0
- package/dist/lib/authentication/hook.js.map +1 -0
- package/dist/lib/authentication/providers/auth0.d.ts +4 -0
- package/dist/lib/authentication/providers/auth0.js +40 -0
- package/dist/lib/authentication/providers/auth0.js.map +1 -0
- package/dist/lib/authentication/providers/clerk.d.ts +4 -0
- package/dist/lib/authentication/providers/clerk.js +54 -0
- package/dist/lib/authentication/providers/clerk.js.map +1 -0
- package/dist/lib/authentication/providers/openid.d.ts +35 -0
- package/dist/lib/authentication/providers/openid.js +204 -0
- package/dist/lib/authentication/providers/openid.js.map +1 -0
- package/dist/lib/authentication/state.d.ts +13 -0
- package/dist/lib/authentication/state.js +5 -0
- package/dist/lib/authentication/state.js.map +1 -0
- package/dist/{app → lib}/components/AnchorLink.js.map +1 -1
- package/dist/{app → lib}/components/CategoryHeading.js.map +1 -1
- package/dist/lib/components/DevPortal.d.ts +25 -0
- package/dist/lib/components/DevPortal.js +32 -0
- package/dist/lib/components/DevPortal.js.map +1 -0
- package/dist/{app → lib}/components/Dialog.d.ts +2 -2
- package/dist/{app → lib}/components/Dialog.js +3 -3
- package/dist/lib/components/Dialog.js.map +1 -0
- package/dist/lib/components/Header.d.ts +1 -0
- package/dist/lib/components/Header.js +15 -0
- package/dist/lib/components/Header.js.map +1 -0
- package/dist/{app → lib/components}/Heading.js +2 -2
- package/dist/lib/components/Heading.js.map +1 -0
- package/dist/{app → lib}/components/Input.js.map +1 -1
- package/dist/{app → lib}/components/Layout.js +4 -7
- package/dist/lib/components/Layout.js.map +1 -0
- package/dist/lib/components/Link.d.ts +1 -0
- package/dist/lib/components/Link.js +2 -0
- package/dist/lib/components/Link.js.map +1 -0
- package/dist/{app → lib}/components/Markdown.js.map +1 -1
- package/dist/lib/components/Router.d.ts +4 -0
- package/dist/lib/components/Router.js +20 -0
- package/dist/lib/components/Router.js.map +1 -0
- package/dist/lib/components/Select.d.ts +13 -0
- package/dist/lib/components/Select.js +27 -0
- package/dist/lib/components/Select.js.map +1 -0
- package/dist/lib/components/Spinner.d.ts +3 -0
- package/dist/lib/components/Spinner.js +4 -0
- package/dist/lib/components/Spinner.js.map +1 -0
- package/dist/{app → lib}/components/SyntaxHighlight.d.ts +2 -1
- package/dist/{app → lib}/components/SyntaxHighlight.js +4 -1
- package/dist/lib/components/SyntaxHighlight.js.map +1 -0
- package/dist/{app → lib}/components/TopNavigation.js.map +1 -1
- package/dist/{app → lib}/components/context/ComponentsContext.d.ts +1 -1
- package/dist/{app → lib}/components/context/ComponentsContext.js.map +1 -1
- package/dist/{app → lib}/components/context/DevPortalProvider.js +1 -1
- package/dist/lib/components/context/DevPortalProvider.js.map +1 -0
- package/dist/lib/components/context/PluginSystem.js.map +1 -0
- package/dist/{app → lib}/components/context/ThemeContext.js +1 -1
- package/dist/{app → lib}/components/context/ThemeContext.js.map +1 -1
- package/dist/{app → lib}/components/context/ViewportAnchorContext.js.map +1 -1
- package/dist/lib/components/index.d.ts +3 -0
- package/dist/lib/components/index.js +4 -0
- package/dist/lib/components/index.js.map +1 -0
- package/dist/{app → lib}/components/navigation/SideNavigation.js +1 -1
- package/dist/{app → lib}/components/navigation/SideNavigation.js.map +1 -1
- package/dist/{app → lib}/components/navigation/SideNavigationCategory.js +1 -1
- package/dist/{app → lib}/components/navigation/SideNavigationCategory.js.map +1 -1
- package/dist/{app → lib}/components/navigation/SideNavigationItem.d.ts +2 -1
- package/dist/{app → lib}/components/navigation/SideNavigationItem.js +12 -6
- package/dist/lib/components/navigation/SideNavigationItem.js.map +1 -0
- package/dist/{app → lib}/components/navigation/SideNavigationWrapper.d.ts +3 -0
- package/dist/lib/components/navigation/SideNavigationWrapper.js +7 -0
- package/dist/lib/components/navigation/SideNavigationWrapper.js.map +1 -0
- package/dist/{app → lib}/components/navigation/useNavigationCollapsibleState.js.map +1 -1
- package/dist/{app → lib}/components/navigation/util.js.map +1 -1
- package/dist/{app → lib}/core/DevPortalContext.d.ts +10 -32
- package/dist/lib/core/DevPortalContext.js +48 -0
- package/dist/lib/core/DevPortalContext.js.map +1 -0
- package/dist/{app → lib}/core/helmet.js.map +1 -1
- package/dist/lib/core/icons.js.map +1 -0
- package/dist/{app → lib}/core/plugins.d.ts +2 -7
- package/dist/{app → lib}/core/plugins.js +1 -1
- package/dist/{app → lib}/core/plugins.js.map +1 -1
- package/dist/lib/core/router.js.map +1 -0
- package/dist/{app → lib}/oas/graphql/index.js +2 -2
- package/dist/lib/oas/graphql/index.js.map +1 -0
- package/dist/{app → lib}/oas/parser/dereference/index.js.map +1 -1
- package/dist/{app → lib}/oas/parser/dereference/resolveRef.js.map +1 -1
- package/dist/{app → lib}/oas/parser/index.js.map +1 -1
- package/dist/{app → lib}/oas/parser/upgrade/index.js.map +1 -1
- package/dist/lib/plugins/api-key/CreateApiKey.d.ts +5 -0
- package/dist/lib/plugins/api-key/CreateApiKey.js +37 -0
- package/dist/lib/plugins/api-key/CreateApiKey.js.map +1 -0
- package/dist/lib/plugins/api-key/SettingsApiKeys.d.ts +5 -0
- package/dist/lib/plugins/api-key/SettingsApiKeys.js +38 -0
- package/dist/lib/plugins/api-key/SettingsApiKeys.js.map +1 -0
- package/dist/lib/plugins/api-key/index.d.ts +30 -0
- package/dist/lib/plugins/api-key/index.js +67 -0
- package/dist/lib/plugins/api-key/index.js.map +1 -0
- package/dist/lib/plugins/index.d.ts +4 -0
- package/dist/lib/plugins/index.js +5 -0
- package/dist/lib/plugins/index.js.map +1 -0
- package/dist/lib/plugins/markdown/MdxPage.d.ts +5 -0
- package/dist/lib/plugins/markdown/MdxPage.js +60 -0
- package/dist/lib/plugins/markdown/MdxPage.js.map +1 -0
- package/dist/{app → lib}/plugins/markdown/Toc.js.map +1 -1
- package/dist/{app → lib}/plugins/markdown/generateRoutes.js +1 -6
- package/dist/lib/plugins/markdown/generateRoutes.js.map +1 -0
- package/dist/{app → lib}/plugins/markdown/index.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/ColorizedParam.d.ts +1 -2
- package/dist/{app → lib}/plugins/openapi/ColorizedParam.js +2 -2
- package/dist/lib/plugins/openapi/ColorizedParam.js.map +1 -0
- package/dist/lib/plugins/openapi/MakeRequest.js +43 -0
- package/dist/lib/plugins/openapi/MakeRequest.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/MethodBadge.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/OperationList.js +12 -3
- package/dist/lib/plugins/openapi/OperationList.js.map +1 -0
- package/dist/lib/plugins/openapi/OperationListItem.js +17 -0
- package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/ParameterList.d.ts +2 -2
- package/dist/lib/plugins/openapi/ParameterList.js +5 -0
- package/dist/lib/plugins/openapi/ParameterList.js.map +1 -0
- package/dist/lib/plugins/openapi/ParameterListItem.js +13 -0
- package/dist/{app → lib}/plugins/openapi/ParameterListItem.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/RequestBodySidecarBox.js +1 -1
- package/dist/{app → lib}/plugins/openapi/RequestBodySidecarBox.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/ResponsesSidecarBox.js +3 -3
- package/dist/{app → lib}/plugins/openapi/ResponsesSidecarBox.js.map +1 -1
- package/dist/lib/plugins/openapi/SchemaListView.d.ts +7 -0
- package/dist/lib/plugins/openapi/SchemaListView.js +43 -0
- package/dist/lib/plugins/openapi/SchemaListView.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/Select.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/Sidecar.js +15 -15
- package/dist/{app → lib}/plugins/openapi/Sidecar.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/SidecarBox.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/graphql/fragment-masking.d.ts +1 -1
- package/dist/{app → lib}/plugins/openapi/graphql/fragment-masking.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/graphql/gql.d.ts +5 -5
- package/dist/{app → lib}/plugins/openapi/graphql/gql.js +2 -3
- package/dist/lib/plugins/openapi/graphql/gql.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/graphql/graphql.d.ts +9 -0
- package/dist/{app → lib}/plugins/openapi/graphql/graphql.js +50 -0
- package/dist/lib/plugins/openapi/graphql/graphql.js.map +1 -0
- package/dist/lib/plugins/openapi/graphql/index.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/index.js +3 -1
- package/dist/lib/plugins/openapi/index.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/Editor.d.ts +1 -0
- package/dist/lib/plugins/openapi/playground/Editor.js +5 -0
- package/dist/lib/plugins/openapi/playground/Editor.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/Headers.d.ts +7 -0
- package/dist/lib/plugins/openapi/playground/Headers.js +15 -0
- package/dist/lib/plugins/openapi/playground/Headers.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/InlineInput.d.ts +4 -0
- package/dist/lib/plugins/openapi/playground/InlineInput.js +3 -0
- package/dist/lib/plugins/openapi/playground/InlineInput.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/PathParams.d.ts +6 -0
- package/dist/lib/plugins/openapi/playground/PathParams.js +21 -0
- package/dist/lib/plugins/openapi/playground/PathParams.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/Playground.d.ts +31 -0
- package/dist/lib/plugins/openapi/playground/Playground.js +97 -0
- package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/QueryParams.d.ts +5 -0
- package/dist/lib/plugins/openapi/playground/QueryParams.js +22 -0
- package/dist/lib/plugins/openapi/playground/QueryParams.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/UrlDisplay.d.ts +4 -0
- package/dist/lib/plugins/openapi/playground/UrlDisplay.js +22 -0
- package/dist/lib/plugins/openapi/playground/UrlDisplay.js.map +1 -0
- package/dist/lib/plugins/openapi/playground/createUrl.d.ts +2 -0
- package/dist/lib/plugins/openapi/playground/createUrl.js +15 -0
- package/dist/lib/plugins/openapi/playground/createUrl.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/util/generateSchemaExample.d.ts +1 -1
- package/dist/{app → lib}/plugins/openapi/util/generateSchemaExample.js +17 -9
- package/dist/lib/plugins/openapi/util/generateSchemaExample.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/util/urql.js.map +1 -1
- package/dist/{app → lib}/plugins/openapi/worker/createSharedWorkerClient.js +2 -1
- package/dist/lib/plugins/openapi/worker/createSharedWorkerClient.js.map +1 -0
- package/dist/lib/plugins/openapi/worker/shared-worker.d.ts +1 -0
- package/dist/lib/plugins/openapi/worker/shared-worker.js +6 -0
- package/dist/lib/plugins/openapi/worker/shared-worker.js.map +1 -0
- package/dist/{app → lib}/plugins/openapi/worker/worker.js.map +1 -1
- package/dist/lib/plugins/openapi-worker.d.ts +1 -0
- package/dist/lib/plugins/openapi-worker.js +2 -0
- package/dist/lib/plugins/openapi-worker.js.map +1 -0
- package/dist/{app → lib}/plugins/redirect/index.d.ts +1 -2
- package/dist/{app → lib}/plugins/redirect/index.js.map +1 -1
- package/dist/lib/ui/Button.d.ts +7 -0
- package/dist/lib/ui/Button.js +11 -0
- package/dist/lib/ui/Button.js.map +1 -0
- package/dist/{app → lib}/ui/Callout.js.map +1 -1
- package/dist/{app → lib}/ui/Card.js.map +1 -1
- package/dist/{app → lib}/ui/Note.js.map +1 -1
- package/dist/{app → lib}/ui/Tabs.d.ts +2 -2
- package/dist/{app → lib}/ui/Tabs.js +2 -2
- package/dist/{app → lib}/ui/Tabs.js.map +1 -1
- package/dist/lib/ui/button-variants.d.ts +4 -0
- package/dist/{app/ui/Button.js → lib/ui/button-variants.js} +2 -12
- package/dist/lib/ui/button-variants.js.map +1 -0
- package/dist/{app → lib}/util/MdxComponents.js +9 -9
- package/dist/lib/util/MdxComponents.js.map +1 -0
- package/dist/{app → lib}/util/cn.js.map +1 -1
- package/dist/lib/util/createVariantComponent.d.ts +9 -0
- package/dist/lib/util/createVariantComponent.js +17 -0
- package/dist/lib/util/createVariantComponent.js.map +1 -0
- package/dist/{app → lib}/util/createWaitForNotify.js.map +1 -1
- package/dist/{app → lib}/util/groupBy.js.map +1 -1
- package/dist/{app → lib}/util/joinPath.js.map +1 -1
- package/dist/{app → lib}/util/pastellize.js.map +1 -1
- package/dist/lib/util/slugify.js.map +1 -0
- package/dist/{app → lib}/util/traverseNavigation.js.map +1 -1
- package/dist/{app → lib}/util/useScrollToAnchor.js.map +1 -1
- package/dist/{app → lib}/util/useScrollToTop.js.map +1 -1
- package/dist/ts.js +1 -2
- package/dist/ts.js.map +1 -1
- package/dist/vite/build.js +2 -8
- package/dist/vite/build.js.map +1 -1
- package/dist/vite/common.d.ts +1 -0
- package/dist/vite/common.js +5 -0
- package/dist/vite/common.js.map +1 -0
- package/dist/vite/config.d.ts +9 -2
- package/dist/vite/config.js +69 -28
- package/dist/vite/config.js.map +1 -1
- package/dist/vite/dev-server.d.ts +2 -0
- package/dist/vite/dev-server.js +30 -10
- package/dist/vite/dev-server.js.map +1 -1
- package/dist/vite/plugin-api-keys.d.ts +4 -0
- package/dist/vite/plugin-api-keys.js +33 -0
- package/dist/vite/plugin-api-keys.js.map +1 -0
- package/dist/vite/plugin-api.js +4 -2
- package/dist/vite/plugin-api.js.map +1 -1
- package/dist/vite/plugin-auth.js +3 -2
- package/dist/vite/plugin-auth.js.map +1 -1
- package/dist/vite/plugin-component.d.ts +4 -0
- package/dist/vite/plugin-component.js +16 -0
- package/dist/vite/plugin-component.js.map +1 -0
- package/dist/vite/plugin-config.d.ts +1 -0
- package/dist/vite/plugin-config.js +4 -3
- package/dist/vite/plugin-config.js.map +1 -1
- package/dist/vite/plugin-docs.js +4 -2
- package/dist/vite/plugin-docs.js.map +1 -1
- package/dist/vite/plugin-docs.test.js +1 -2
- package/dist/vite/plugin-docs.test.js.map +1 -1
- package/dist/vite/plugin-html.js +0 -3
- package/dist/vite/plugin-html.js.map +1 -1
- package/dist/vite/plugin-mdx.js +3 -1
- package/dist/vite/plugin-mdx.js.map +1 -1
- package/dist/vite/plugin-metadata.d.ts +6 -0
- package/dist/vite/plugin-metadata.js +24 -0
- package/dist/vite/plugin-metadata.js.map +1 -0
- package/dist/vite/plugin-openapi-worker.d.ts +4 -0
- package/dist/vite/plugin-openapi-worker.js +28 -0
- package/dist/vite/plugin-openapi-worker.js.map +1 -0
- package/dist/vite/plugin-redirect.d.ts +4 -0
- package/dist/vite/plugin-redirect.js +32 -0
- package/dist/vite/plugin-redirect.js.map +1 -0
- package/dist/vite/plugin.js +8 -0
- package/dist/vite/plugin.js.map +1 -1
- package/lib/Spinner-7LezPqGn.js +8393 -0
- package/lib/_commonjsHelpers-BkfeUUK-.js +28 -0
- package/lib/assets/index-BPdJm2ty.js +4764 -0
- package/lib/assets/worker-BCcpCNJ7.js +14473 -0
- package/lib/clerk-Wslx_mPo.js +19685 -0
- package/lib/index-DNx3xWa2.js +3461 -0
- package/lib/prism-bash.min-DadFsM4Z.js +6 -0
- package/lib/prism-java.min-d5iT_mOd.js +6 -0
- package/lib/prism-json.min-B1GJqK1k.js +1 -0
- package/lib/prism-markup-templating-DZrrEs0A.js +61 -0
- package/lib/prism-php.min-o7FpoMP_.js +10 -0
- package/lib/prism-ruby.min-C7LwcKyz.js +9 -0
- package/lib/state-oycsxkHz.js +287 -0
- package/lib/urql-DMlBWUKL.js +1591 -0
- package/lib/zudoku.auth-auth0.js +26 -0
- package/lib/zudoku.auth-clerk.js +47 -0
- package/lib/zudoku.auth-openid.js +1058 -0
- package/lib/zudoku.components.js +925 -0
- package/lib/zudoku.openapi-worker.js +225 -0
- package/lib/zudoku.plugins.js +19863 -0
- package/package.json +69 -39
- package/src/app/App.tsx +16 -6
- package/src/app/main.css +1 -0
- package/src/app/main.tsx +12 -3
- package/src/lib/authentication/Callback.tsx +60 -0
- package/src/lib/authentication/authentication.ts +19 -0
- package/src/lib/authentication/errors.ts +21 -0
- package/src/lib/authentication/hook.ts +33 -0
- package/src/lib/authentication/providers/auth0.tsx +52 -0
- package/src/lib/authentication/providers/clerk.tsx +64 -0
- package/src/lib/authentication/providers/openid.tsx +312 -0
- package/src/lib/authentication/state.ts +19 -0
- package/src/{app → lib/components}/DevPortal.tsx +30 -42
- package/src/{app → lib}/components/Dialog.tsx +37 -37
- package/src/{app → lib}/components/Header.tsx +25 -20
- package/src/{app → lib/components}/Heading.tsx +2 -2
- package/src/{app → lib}/components/Layout.tsx +18 -12
- package/src/lib/components/Link.tsx +1 -0
- package/src/lib/components/Router.tsx +28 -0
- package/src/lib/components/Select.tsx +157 -0
- package/src/lib/components/Spinner.tsx +5 -0
- package/src/{app → lib}/components/SyntaxHighlight.tsx +10 -3
- package/src/{app → lib}/components/context/DevPortalProvider.ts +1 -1
- package/src/lib/components/index.ts +3 -0
- package/src/{app → lib}/components/navigation/SideNavigation.tsx +4 -1
- package/src/{app → lib}/components/navigation/SideNavigationCategory.tsx +3 -1
- package/src/{app → lib}/components/navigation/SideNavigationItem.tsx +16 -7
- package/src/lib/components/navigation/SideNavigationWrapper.tsx +24 -0
- package/src/{app → lib}/core/DevPortalContext.ts +28 -64
- package/src/{app → lib}/core/plugins.ts +5 -5
- package/src/{app → lib}/oas/graphql/index.ts +2 -2
- package/src/lib/plugins/api-key/CreateApiKey.tsx +100 -0
- package/src/lib/plugins/api-key/SettingsApiKeys.tsx +125 -0
- package/src/lib/plugins/api-key/index.tsx +115 -0
- package/src/lib/plugins/index.ts +4 -0
- package/src/{app → lib}/plugins/markdown/MdxPage.tsx +32 -10
- package/src/{app → lib}/plugins/markdown/generateRoutes.tsx +1 -16
- package/src/{app → lib}/plugins/openapi/ColorizedParam.tsx +1 -3
- package/src/lib/plugins/openapi/MakeRequest.tsx +63 -0
- package/src/{app → lib}/plugins/openapi/OperationList.tsx +14 -4
- package/src/{app → lib}/plugins/openapi/OperationListItem.tsx +40 -6
- package/src/{app → lib}/plugins/openapi/ParameterList.tsx +4 -4
- package/src/{app → lib}/plugins/openapi/ParameterListItem.tsx +5 -2
- package/src/{app → lib}/plugins/openapi/RequestBodySidecarBox.tsx +1 -1
- package/src/{app → lib}/plugins/openapi/ResponsesSidecarBox.tsx +2 -3
- package/src/lib/plugins/openapi/SchemaListView.tsx +228 -0
- package/src/{app → lib}/plugins/openapi/Sidecar.tsx +23 -23
- package/src/{app → lib}/plugins/openapi/graphql/gql.ts +7 -7
- package/src/{app → lib}/plugins/openapi/graphql/graphql.ts +59 -0
- package/src/{app → lib}/plugins/openapi/index.tsx +8 -2
- package/src/lib/plugins/openapi/playground/Editor.tsx +4 -0
- package/src/lib/plugins/openapi/playground/Headers.tsx +60 -0
- package/src/lib/plugins/openapi/playground/InlineInput.tsx +6 -0
- package/src/lib/plugins/openapi/playground/PathParams.tsx +63 -0
- package/src/lib/plugins/openapi/playground/Playground.tsx +366 -0
- package/src/lib/plugins/openapi/playground/QueryParams.tsx +89 -0
- package/src/lib/plugins/openapi/playground/UrlDisplay.tsx +32 -0
- package/src/lib/plugins/openapi/playground/createUrl.ts +22 -0
- package/src/{app → lib}/plugins/openapi/util/generateSchemaExample.ts +22 -9
- package/src/{app → lib}/plugins/openapi/worker/createSharedWorkerClient.ts +2 -1
- package/src/lib/plugins/openapi/worker/shared-worker.ts +5 -0
- package/src/lib/plugins/openapi-worker.ts +1 -0
- package/src/{app → lib}/plugins/redirect/index.tsx +1 -1
- package/src/lib/ui/Button.tsx +25 -0
- package/src/{app → lib}/ui/Tabs.tsx +2 -2
- package/src/{app/ui/Button.tsx → lib/ui/button-variants.ts} +4 -29
- package/src/{app → lib}/util/MdxComponents.tsx +33 -8
- package/src/{app → lib}/util/createVariantComponent.tsx +12 -7
- package/dist/app/DevPortal.d.ts +0 -25
- package/dist/app/DevPortal.js +0 -41
- package/dist/app/DevPortal.js.map +0 -1
- package/dist/app/Heading.js.map +0 -1
- package/dist/app/authentication/authentication.d.ts +0 -13
- package/dist/app/authentication/authentication.js.map +0 -1
- package/dist/app/authentication/clerk.d.ts +0 -5
- package/dist/app/authentication/clerk.js +0 -36
- package/dist/app/authentication/clerk.js.map +0 -1
- package/dist/app/authentication/openid.d.ts +0 -11
- package/dist/app/authentication/openid.js +0 -118
- package/dist/app/authentication/openid.js.map +0 -1
- package/dist/app/components/Dialog.js.map +0 -1
- package/dist/app/components/DynamicIcon.d.ts +0 -6
- package/dist/app/components/DynamicIcon.js +0 -6
- package/dist/app/components/DynamicIcon.js.map +0 -1
- package/dist/app/components/Header.d.ts +0 -1
- package/dist/app/components/Header.js +0 -15
- package/dist/app/components/Header.js.map +0 -1
- package/dist/app/components/Layout.js.map +0 -1
- package/dist/app/components/SyntaxHighlight.js.map +0 -1
- package/dist/app/components/context/DevPortalProvider.js.map +0 -1
- package/dist/app/components/context/PluginSystem.js.map +0 -1
- package/dist/app/components/navigation/SideNavigationItem.js.map +0 -1
- package/dist/app/components/navigation/SideNavigationWrapper.js +0 -6
- package/dist/app/components/navigation/SideNavigationWrapper.js.map +0 -1
- package/dist/app/core/DevPortalContext.js +0 -68
- package/dist/app/core/DevPortalContext.js.map +0 -1
- package/dist/app/core/icons.js.map +0 -1
- package/dist/app/core/router.js.map +0 -1
- package/dist/app/core/types/combine.d.ts +0 -4
- package/dist/app/core/types/combine.js +0 -2
- package/dist/app/core/types/combine.js.map +0 -1
- package/dist/app/oas/graphql/index.js.map +0 -1
- package/dist/app/oas/graphql/server.d.ts +0 -1
- package/dist/app/oas/graphql/server.js +0 -8
- package/dist/app/oas/graphql/server.js.map +0 -1
- package/dist/app/plugins/api-key/SettingsApiKeys.d.ts +0 -4
- package/dist/app/plugins/api-key/SettingsApiKeys.js +0 -7
- package/dist/app/plugins/api-key/SettingsApiKeys.js.map +0 -1
- package/dist/app/plugins/api-key/index.d.ts +0 -32
- package/dist/app/plugins/api-key/index.js +0 -55
- package/dist/app/plugins/api-key/index.js.map +0 -1
- package/dist/app/plugins/markdown/MdxPage.d.ts +0 -3
- package/dist/app/plugins/markdown/MdxPage.js +0 -55
- package/dist/app/plugins/markdown/MdxPage.js.map +0 -1
- package/dist/app/plugins/markdown/generateRoutes.js.map +0 -1
- package/dist/app/plugins/openapi/ColorizedParam.js.map +0 -1
- package/dist/app/plugins/openapi/MakeRequest.js +0 -23
- package/dist/app/plugins/openapi/MakeRequest.js.map +0 -1
- package/dist/app/plugins/openapi/OperationList.js.map +0 -1
- package/dist/app/plugins/openapi/OperationListItem.js +0 -15
- package/dist/app/plugins/openapi/OperationListItem.js.map +0 -1
- package/dist/app/plugins/openapi/ParameterList.js +0 -5
- package/dist/app/plugins/openapi/ParameterList.js.map +0 -1
- package/dist/app/plugins/openapi/ParameterListItem.js +0 -13
- package/dist/app/plugins/openapi/graphql/gql.js.map +0 -1
- package/dist/app/plugins/openapi/graphql/graphql.js.map +0 -1
- package/dist/app/plugins/openapi/graphql/index.js.map +0 -1
- package/dist/app/plugins/openapi/index.js.map +0 -1
- package/dist/app/plugins/openapi/playground/Playground.d.ts +0 -8
- package/dist/app/plugins/openapi/playground/Playground.js +0 -98
- package/dist/app/plugins/openapi/playground/Playground.js.map +0 -1
- package/dist/app/plugins/openapi/util/generateSchemaExample.js.map +0 -1
- package/dist/app/plugins/openapi/worker/createSharedWorkerClient.js.map +0 -1
- package/dist/app/ui/Button.d.ts +0 -11
- package/dist/app/ui/Button.js.map +0 -1
- package/dist/app/util/MdxComponents.js.map +0 -1
- package/dist/app/util/createVariantComponent.d.ts +0 -15
- package/dist/app/util/createVariantComponent.js +0 -12
- package/dist/app/util/createVariantComponent.js.map +0 -1
- package/dist/app/util/slugify.js.map +0 -1
- package/dist/auth.d.ts +0 -2
- package/dist/auth.js +0 -3
- package/dist/auth.js.map +0 -1
- package/dist/plugins.d.ts +0 -4
- package/dist/plugins.js +0 -6
- package/dist/plugins.js.map +0 -1
- package/src/app/authentication/authentication.ts +0 -18
- package/src/app/authentication/clerk.ts +0 -47
- package/src/app/authentication/openid.ts +0 -192
- package/src/app/components/DynamicIcon.tsx +0 -60
- package/src/app/components/navigation/SideNavigationWrapper.tsx +0 -15
- package/src/app/core/types/combine.ts +0 -16
- package/src/app/oas/graphql/server.ts +0 -10
- package/src/app/plugins/api-key/SettingsApiKeys.tsx +0 -22
- package/src/app/plugins/api-key/index.tsx +0 -123
- package/src/app/plugins/openapi/MakeRequest.tsx +0 -49
- package/src/app/plugins/openapi/playground/Playground.tsx +0 -309
- package/src/app/plugins/openapi/queries.graphql +0 -6
- package/dist/{app → lib}/authentication/authentication.js +0 -0
- package/dist/{app → lib}/components/AnchorLink.d.ts +0 -0
- package/dist/{app → lib}/components/AnchorLink.js +0 -0
- package/dist/{app → lib}/components/CategoryHeading.d.ts +0 -0
- package/dist/{app → lib}/components/CategoryHeading.js +0 -0
- package/dist/{app → lib/components}/Heading.d.ts +0 -0
- package/dist/{app → lib}/components/Input.d.ts +0 -0
- package/dist/{app → lib}/components/Input.js +0 -0
- package/dist/{app → lib}/components/Layout.d.ts +0 -0
- package/dist/{app → lib}/components/Markdown.d.ts +0 -0
- package/dist/{app → lib}/components/Markdown.js +0 -0
- package/dist/{app → lib}/components/TopNavigation.d.ts +0 -0
- package/dist/{app → lib}/components/TopNavigation.js +0 -0
- package/dist/{app → lib}/components/context/ComponentsContext.js +0 -0
- package/dist/{app → lib}/components/context/DevPortalProvider.d.ts +0 -0
- package/dist/{app → lib}/components/context/PluginSystem.d.ts +0 -0
- package/dist/{app → lib}/components/context/PluginSystem.js +0 -0
- package/dist/{app → lib}/components/context/ThemeContext.d.ts +0 -0
- package/dist/{app → lib}/components/context/ViewportAnchorContext.d.ts +0 -0
- package/dist/{app → lib}/components/context/ViewportAnchorContext.js +0 -0
- package/dist/{app → lib}/components/navigation/SideNavigation.d.ts +0 -0
- package/dist/{app → lib}/components/navigation/SideNavigationCategory.d.ts +0 -0
- package/dist/{app → lib}/components/navigation/useNavigationCollapsibleState.d.ts +0 -0
- package/dist/{app → lib}/components/navigation/useNavigationCollapsibleState.js +0 -0
- package/dist/{app → lib}/components/navigation/util.d.ts +0 -0
- package/dist/{app → lib}/components/navigation/util.js +0 -0
- package/dist/{app → lib}/core/helmet.d.ts +0 -0
- package/dist/{app → lib}/core/helmet.js +0 -0
- package/dist/{app → lib}/core/icons.d.ts +0 -0
- package/dist/{app → lib}/core/icons.js +0 -0
- package/dist/{app → lib}/core/router.d.ts +0 -0
- package/dist/{app → lib}/core/router.js +0 -0
- package/dist/{app → lib}/oas/graphql/index.d.ts +0 -0
- package/dist/{app → lib}/oas/parser/dereference/index.d.ts +0 -0
- package/dist/{app → lib}/oas/parser/dereference/index.js +0 -0
- package/dist/{app → lib}/oas/parser/dereference/resolveRef.d.ts +0 -0
- package/dist/{app → lib}/oas/parser/dereference/resolveRef.js +0 -0
- package/dist/{app → lib}/oas/parser/index.d.ts +0 -0
- package/dist/{app → lib}/oas/parser/index.js +0 -0
- package/dist/{app → lib}/oas/parser/upgrade/index.d.ts +0 -0
- package/dist/{app → lib}/oas/parser/upgrade/index.js +0 -0
- package/dist/{app → lib}/plugins/markdown/Toc.d.ts +0 -0
- package/dist/{app → lib}/plugins/markdown/Toc.js +0 -0
- package/dist/{app → lib}/plugins/markdown/generateRoutes.d.ts +0 -0
- package/dist/{app → lib}/plugins/markdown/index.d.ts +0 -0
- package/dist/{app → lib}/plugins/markdown/index.js +0 -0
- package/dist/{app → lib}/plugins/openapi/MakeRequest.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/MethodBadge.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/MethodBadge.js +0 -0
- package/dist/{app → lib}/plugins/openapi/OperationList.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/OperationListItem.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/ParameterListItem.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/RequestBodySidecarBox.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/ResponsesSidecarBox.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/Select.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/Select.js +0 -0
- package/dist/{app → lib}/plugins/openapi/Sidecar.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/SidecarBox.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/SidecarBox.js +0 -0
- package/dist/{app → lib}/plugins/openapi/graphql/fragment-masking.js +0 -0
- package/dist/{app → lib}/plugins/openapi/graphql/index.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/graphql/index.js +0 -0
- package/dist/{app → lib}/plugins/openapi/index.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/util/urql.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/util/urql.js +0 -0
- package/dist/{app → lib}/plugins/openapi/worker/createSharedWorkerClient.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/worker/worker.d.ts +0 -0
- package/dist/{app → lib}/plugins/openapi/worker/worker.js +0 -0
- package/dist/{app → lib}/plugins/redirect/index.js +0 -0
- package/dist/{app → lib}/ui/Callout.d.ts +0 -0
- package/dist/{app → lib}/ui/Callout.js +0 -0
- package/dist/{app → lib}/ui/Card.d.ts +0 -0
- package/dist/{app → lib}/ui/Card.js +0 -0
- package/dist/{app → lib}/ui/Note.d.ts +0 -0
- package/dist/{app → lib}/ui/Note.js +0 -0
- package/dist/{app → lib}/util/MdxComponents.d.ts +0 -0
- package/dist/{app → lib}/util/cn.d.ts +0 -0
- package/dist/{app → lib}/util/cn.js +0 -0
- package/dist/{app → lib}/util/createWaitForNotify.d.ts +0 -0
- package/dist/{app → lib}/util/createWaitForNotify.js +0 -0
- package/dist/{app → lib}/util/groupBy.d.ts +0 -0
- package/dist/{app → lib}/util/groupBy.js +0 -0
- package/dist/{app → lib}/util/joinPath.d.ts +0 -0
- package/dist/{app → lib}/util/joinPath.js +0 -0
- package/dist/{app → lib}/util/pastellize.d.ts +0 -0
- package/dist/{app → lib}/util/pastellize.js +0 -0
- package/dist/{app → lib}/util/slugify.d.ts +0 -0
- package/dist/{app → lib}/util/slugify.js +0 -0
- package/dist/{app → lib}/util/traverseNavigation.d.ts +0 -0
- package/dist/{app → lib}/util/traverseNavigation.js +0 -0
- package/dist/{app → lib}/util/useScrollToAnchor.d.ts +0 -0
- package/dist/{app → lib}/util/useScrollToAnchor.js +0 -0
- package/dist/{app → lib}/util/useScrollToTop.d.ts +0 -0
- package/dist/{app → lib}/util/useScrollToTop.js +0 -0
- package/src/{app → lib}/components/AnchorLink.tsx +0 -0
- package/src/{app → lib}/components/CategoryHeading.tsx +1 -1
- package/src/{app → lib}/components/Input.tsx +0 -0
- package/src/{app → lib}/components/Markdown.tsx +0 -0
- package/src/{app → lib}/components/TopNavigation.tsx +0 -0
- package/src/{app → lib}/components/context/ComponentsContext.tsx +0 -0
- package/src/{app → lib}/components/context/PluginSystem.ts +0 -0
- package/src/{app → lib}/components/context/ThemeContext.tsx +1 -1
- package/src/{app → lib}/components/context/ViewportAnchorContext.tsx +0 -0
- package/src/{app → lib}/components/navigation/useNavigationCollapsibleState.ts +0 -0
- package/src/{app → lib}/components/navigation/util.ts +0 -0
- package/src/{app → lib}/core/helmet.ts +0 -0
- package/src/{app → lib}/core/icons.tsx +0 -0
- package/src/{app → lib}/core/router.tsx +0 -0
- package/src/{app → lib}/oas/parser/dereference/index.ts +0 -0
- package/src/{app → lib}/oas/parser/dereference/resolveRef.ts +0 -0
- package/src/{app → lib}/oas/parser/index.ts +0 -0
- package/src/{app → lib}/oas/parser/schemas/v3.0.json +0 -0
- package/src/{app → lib}/oas/parser/schemas/v3.1.json +0 -0
- package/src/{app → lib}/oas/parser/upgrade/index.ts +0 -0
- package/src/{app → lib}/plugins/markdown/Toc.tsx +0 -0
- package/src/{app → lib}/plugins/markdown/index.tsx +0 -0
- package/src/{app → lib}/plugins/openapi/MethodBadge.tsx +0 -0
- package/src/{app → lib}/plugins/openapi/Select.tsx +0 -0
- package/src/{app → lib}/plugins/openapi/SidecarBox.tsx +0 -0
- package/src/{app → lib}/plugins/openapi/graphql/fragment-masking.ts +1 -1
- /package/src/{app → lib}/plugins/openapi/graphql/index.ts +0 -0
- /package/src/{app → lib}/plugins/openapi/util/urql.ts +0 -0
- /package/src/{app → lib}/plugins/openapi/worker/worker.ts +0 -0
- /package/src/{app → lib}/ui/Callout.tsx +0 -0
- /package/src/{app → lib}/ui/Card.tsx +0 -0
- /package/src/{app → lib}/ui/Note.tsx +0 -0
- /package/src/{app → lib}/util/cn.ts +0 -0
- /package/src/{app → lib}/util/createWaitForNotify.ts +0 -0
- /package/src/{app → lib}/util/groupBy.ts +0 -0
- /package/src/{app → lib}/util/joinPath.tsx +0 -0
- /package/src/{app → lib}/util/pastellize.ts +0 -0
- /package/src/{app → lib}/util/slugify.ts +0 -0
- /package/src/{app → lib}/util/traverseNavigation.ts +0 -0
- /package/src/{app → lib}/util/useScrollToAnchor.ts +0 -0
- /package/src/{app → lib}/util/useScrollToTop.ts +0 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import logger from "loglevel";
|
|
2
|
+
import * as oauth from "oauth4webapi";
|
|
3
|
+
import { OpenIDAuthenticationConfig } from "../../../config/config.js";
|
|
4
|
+
import { RouteObject } from "../../core/router.js";
|
|
5
|
+
import {
|
|
6
|
+
AuthenticationProvider,
|
|
7
|
+
AuthenticationProviderInitializer,
|
|
8
|
+
} from "../authentication.js";
|
|
9
|
+
import { Callback } from "../Callback.js";
|
|
10
|
+
import { AuthorizationError, OAuthAuthorizationError } from "../errors.js";
|
|
11
|
+
import { useAuthState, UserProfile } from "../state.js";
|
|
12
|
+
|
|
13
|
+
const CODE_VERIFIER_KEY = "code-verifier";
|
|
14
|
+
|
|
15
|
+
interface TokenState {
|
|
16
|
+
accessToken: string;
|
|
17
|
+
refreshToken?: string;
|
|
18
|
+
expiresOn: Date;
|
|
19
|
+
tokenType: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class OpenIDAuthenticationProvider implements AuthenticationProvider {
|
|
23
|
+
protected client: oauth.Client;
|
|
24
|
+
protected issuer: string;
|
|
25
|
+
protected authorizationEndpoint: string | undefined;
|
|
26
|
+
protected tokenEndpoint: string | undefined;
|
|
27
|
+
|
|
28
|
+
protected authorizationServer: oauth.AuthorizationServer | undefined;
|
|
29
|
+
protected tokens: TokenState | undefined;
|
|
30
|
+
|
|
31
|
+
protected callbackUrlPath = "/oauth/callback";
|
|
32
|
+
protected logoutRedirectUrlPath = "/";
|
|
33
|
+
|
|
34
|
+
constructor({
|
|
35
|
+
issuer,
|
|
36
|
+
authorizationEndpoint,
|
|
37
|
+
tokenEndpoint,
|
|
38
|
+
clientId,
|
|
39
|
+
}: OpenIDAuthenticationConfig) {
|
|
40
|
+
this.client = {
|
|
41
|
+
client_id: clientId,
|
|
42
|
+
token_endpoint_auth_method: "none",
|
|
43
|
+
};
|
|
44
|
+
this.issuer = issuer;
|
|
45
|
+
this.authorizationEndpoint = authorizationEndpoint;
|
|
46
|
+
this.tokenEndpoint = tokenEndpoint;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
protected async getAuthServer() {
|
|
50
|
+
if (!this.authorizationServer) {
|
|
51
|
+
if (this.tokenEndpoint && this.authorizationEndpoint) {
|
|
52
|
+
this.authorizationServer = {
|
|
53
|
+
issuer: new URL(this.authorizationEndpoint!).origin,
|
|
54
|
+
authorization_endpoint: this.authorizationEndpoint,
|
|
55
|
+
token_endpoint: this.tokenEndpoint,
|
|
56
|
+
code_challenge_methods_supported: [],
|
|
57
|
+
};
|
|
58
|
+
} else {
|
|
59
|
+
const issuerUrl = new URL(this.issuer);
|
|
60
|
+
const response = await oauth.discoveryRequest(issuerUrl);
|
|
61
|
+
this.authorizationServer = await oauth.processDiscoveryResponse(
|
|
62
|
+
issuerUrl,
|
|
63
|
+
response,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return this.authorizationServer;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Sets the tokens from various OAuth responses
|
|
72
|
+
* @param response
|
|
73
|
+
*/
|
|
74
|
+
protected setTokensFromResponse(
|
|
75
|
+
response: oauth.TokenEndpointResponse | oauth.OAuth2Error,
|
|
76
|
+
) {
|
|
77
|
+
if (oauth.isOAuth2Error(response)) {
|
|
78
|
+
logger.error("Bad Token Response", response);
|
|
79
|
+
throw new OAuthAuthorizationError("Bad Token Response", response);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!response.expires_in) {
|
|
83
|
+
throw new AuthorizationError("No expires_in in response");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
this.tokens = {
|
|
87
|
+
accessToken: response.access_token,
|
|
88
|
+
refreshToken: response.refresh_token,
|
|
89
|
+
expiresOn: new Date(Date.now() + response.expires_in * 1000),
|
|
90
|
+
tokenType: response.token_type,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async initialize() {
|
|
95
|
+
// No init needed
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async login(): Promise<void> {
|
|
99
|
+
const code_challenge_method = "S256";
|
|
100
|
+
const authorizationServer = await this.getAuthServer();
|
|
101
|
+
|
|
102
|
+
if (!authorizationServer.authorization_endpoint) {
|
|
103
|
+
throw new AuthorizationError("No authorization endpoint");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The following MUST be generated for every redirect to the authorization_endpoint. You must store
|
|
108
|
+
* the codeVerifier and nonce in the end-user session such that it can be recovered as the user
|
|
109
|
+
* gets redirected from the authorization server back to your application.
|
|
110
|
+
*/
|
|
111
|
+
const codeVerifier = oauth.generateRandomCodeVerifier();
|
|
112
|
+
const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);
|
|
113
|
+
|
|
114
|
+
localStorage.setItem(CODE_VERIFIER_KEY, codeVerifier);
|
|
115
|
+
|
|
116
|
+
// redirect user to as.authorization_endpoint
|
|
117
|
+
const authorizationUrl = new URL(
|
|
118
|
+
authorizationServer.authorization_endpoint,
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const redirectUrl = new URL(window.location.href);
|
|
122
|
+
redirectUrl.pathname = this.callbackUrlPath;
|
|
123
|
+
redirectUrl.search = "";
|
|
124
|
+
|
|
125
|
+
authorizationUrl.searchParams.set("client_id", this.client.client_id);
|
|
126
|
+
authorizationUrl.searchParams.set("redirect_uri", redirectUrl.toString());
|
|
127
|
+
authorizationUrl.searchParams.set("response_type", "code");
|
|
128
|
+
authorizationUrl.searchParams.set("scope", "openid+profile+email");
|
|
129
|
+
authorizationUrl.searchParams.set("code_challenge", codeChallenge);
|
|
130
|
+
authorizationUrl.searchParams.set(
|
|
131
|
+
"code_challenge_method",
|
|
132
|
+
code_challenge_method,
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* We cannot be sure the AS supports PKCE so we're going to use state too. Use of PKCE is
|
|
137
|
+
* backwards compatible even if the AS doesn't support it which is why we're using it regardless.
|
|
138
|
+
*/
|
|
139
|
+
if (
|
|
140
|
+
authorizationServer.code_challenge_methods_supported?.includes("S256") !==
|
|
141
|
+
true
|
|
142
|
+
) {
|
|
143
|
+
const state = oauth.generateRandomState();
|
|
144
|
+
authorizationUrl.searchParams.set("state", state);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// now redirect the user to authorizationUrl.href
|
|
148
|
+
location.href = authorizationUrl.href;
|
|
149
|
+
}
|
|
150
|
+
async getAccessToken(): Promise<string> {
|
|
151
|
+
const as = await this.getAuthServer();
|
|
152
|
+
if (!this.tokens) {
|
|
153
|
+
throw new AuthorizationError("User is not authenticated");
|
|
154
|
+
}
|
|
155
|
+
if (this.tokens.expiresOn < new Date()) {
|
|
156
|
+
if (!this.tokens.refreshToken) {
|
|
157
|
+
// TODO: Log user bac in
|
|
158
|
+
throw new AuthorizationError(
|
|
159
|
+
"Token expired and no refresh token available",
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const request = await oauth.refreshTokenGrantRequest(
|
|
164
|
+
as,
|
|
165
|
+
this.client,
|
|
166
|
+
this.tokens.refreshToken,
|
|
167
|
+
);
|
|
168
|
+
const response = await oauth.processRefreshTokenResponse(
|
|
169
|
+
as,
|
|
170
|
+
this.client,
|
|
171
|
+
request,
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
this.setTokensFromResponse(response);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return this.tokens.accessToken;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async logout(): Promise<void> {
|
|
181
|
+
useAuthState.setState({
|
|
182
|
+
isAuthenticated: false,
|
|
183
|
+
profile: undefined,
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const as = await this.getAuthServer();
|
|
187
|
+
|
|
188
|
+
const redirectUrl = new URL(window.location.href);
|
|
189
|
+
redirectUrl.pathname = this.logoutRedirectUrlPath;
|
|
190
|
+
|
|
191
|
+
let logoutUrl: URL;
|
|
192
|
+
// The endSessionEndpoint is set, the IdP supports some form of logout,
|
|
193
|
+
// so we use the IdP logout. Otherwise, just redirect the user to home
|
|
194
|
+
if (as.end_session_endpoint) {
|
|
195
|
+
logoutUrl = new URL(as.end_session_endpoint);
|
|
196
|
+
// TODO: get id_token and set hint
|
|
197
|
+
// const { id_token } = session;
|
|
198
|
+
// if (id_token) {
|
|
199
|
+
// logoutUrl.searchParams.set("id_token_hint", id_token);
|
|
200
|
+
// }
|
|
201
|
+
logoutUrl.searchParams.set(
|
|
202
|
+
"post_logout_redirect_uri",
|
|
203
|
+
redirectUrl.toString(),
|
|
204
|
+
);
|
|
205
|
+
} else {
|
|
206
|
+
logoutUrl = redirectUrl;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
getRoutes(): RouteObject[] {
|
|
210
|
+
return [
|
|
211
|
+
{
|
|
212
|
+
path: this.callbackUrlPath,
|
|
213
|
+
element: <Callback handleCallback={this.handleCallback} />,
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
handleCallback = async (): Promise<void> => {
|
|
219
|
+
const url = new URL(window.location.href);
|
|
220
|
+
const state = url.searchParams.get("state");
|
|
221
|
+
|
|
222
|
+
// one eternity later, the user lands back on the redirect_uri
|
|
223
|
+
// Authorization Code Grant Request & Response
|
|
224
|
+
const codeVerifier = localStorage.getItem(CODE_VERIFIER_KEY);
|
|
225
|
+
// localStorage.removeItem(CODE_VERIFIER_KEY);
|
|
226
|
+
|
|
227
|
+
if (!codeVerifier) {
|
|
228
|
+
throw new AuthorizationError(
|
|
229
|
+
"Code verifier not found. Invalid auth state.",
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const authServer = await this.getAuthServer();
|
|
234
|
+
|
|
235
|
+
const params = oauth.validateAuthResponse(
|
|
236
|
+
authServer,
|
|
237
|
+
this.client,
|
|
238
|
+
url.searchParams,
|
|
239
|
+
state ?? undefined,
|
|
240
|
+
);
|
|
241
|
+
if (oauth.isOAuth2Error(params)) {
|
|
242
|
+
logger.error("Error validating OAuth response", params);
|
|
243
|
+
throw new OAuthAuthorizationError(
|
|
244
|
+
"Error validating OAuth response",
|
|
245
|
+
params,
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const redirectUrl = new URL(url);
|
|
250
|
+
redirectUrl.pathname = this.callbackUrlPath;
|
|
251
|
+
redirectUrl.search = "";
|
|
252
|
+
|
|
253
|
+
const response = await oauth.authorizationCodeGrantRequest(
|
|
254
|
+
authServer,
|
|
255
|
+
this.client,
|
|
256
|
+
params,
|
|
257
|
+
redirectUrl.toString(),
|
|
258
|
+
codeVerifier,
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
// TODO: do we need to do these
|
|
262
|
+
// const challenges = oauth.parseWwwAuthenticateChallenges(response);
|
|
263
|
+
// if (challenges) {
|
|
264
|
+
// for (const challenge of challenges) {
|
|
265
|
+
// console.error("WWW-Authenticate Challenge", challenge);
|
|
266
|
+
// }
|
|
267
|
+
// throw new Error(); // Handle WWW-Authenticate Challenges as needed
|
|
268
|
+
// }
|
|
269
|
+
const oauthResult = await oauth.processAuthorizationCodeOAuth2Response(
|
|
270
|
+
authServer,
|
|
271
|
+
this.client,
|
|
272
|
+
response,
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
this.setTokensFromResponse(oauthResult);
|
|
276
|
+
|
|
277
|
+
const accessToken = await this.getAccessToken();
|
|
278
|
+
|
|
279
|
+
const userInfoResponse = await oauth.userInfoRequest(
|
|
280
|
+
authServer,
|
|
281
|
+
this.client,
|
|
282
|
+
accessToken,
|
|
283
|
+
);
|
|
284
|
+
const userInfo = await userInfoResponse.json();
|
|
285
|
+
|
|
286
|
+
const profile: UserProfile = {
|
|
287
|
+
sub: userInfo.sub,
|
|
288
|
+
email: userInfo.email,
|
|
289
|
+
name: userInfo.name,
|
|
290
|
+
emailVerified: userInfo.email_verified ?? false,
|
|
291
|
+
pictureUrl: userInfo.picture,
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
useAuthState.setState({
|
|
295
|
+
isAuthenticated: true,
|
|
296
|
+
profile,
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// // Remove the query strings so react query doesn't keep retrying
|
|
300
|
+
// // to make the token request
|
|
301
|
+
// history.replaceState({}, "", window.location.pathname);
|
|
302
|
+
|
|
303
|
+
// Returning true because we are using react query
|
|
304
|
+
// return true;
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const openIDAuth: AuthenticationProviderInitializer<
|
|
309
|
+
OpenIDAuthenticationConfig
|
|
310
|
+
> = (options) => new OpenIDAuthenticationProvider(options);
|
|
311
|
+
|
|
312
|
+
export default openIDAuth;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { create } from "zustand";
|
|
2
|
+
|
|
3
|
+
export const useAuthState = create<AuthState>(() => ({
|
|
4
|
+
isAuthenticated: false,
|
|
5
|
+
}));
|
|
6
|
+
|
|
7
|
+
export interface AuthState {
|
|
8
|
+
isAuthenticated: boolean;
|
|
9
|
+
profile?: UserProfile;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface UserProfile {
|
|
13
|
+
sub: string;
|
|
14
|
+
email: string | undefined;
|
|
15
|
+
emailVerified: boolean;
|
|
16
|
+
name: string | undefined;
|
|
17
|
+
pictureUrl: string | undefined;
|
|
18
|
+
[key: string]: string | boolean | undefined;
|
|
19
|
+
}
|
|
@@ -1,25 +1,29 @@
|
|
|
1
|
+
/* eslint-disable react/destructuring-assignment */
|
|
1
2
|
import { MDXProvider } from "@mdx-js/react";
|
|
2
3
|
import { QueryClientProvider } from "@tanstack/react-query";
|
|
3
4
|
import { memo, Suspense, useEffect, useMemo } from "react";
|
|
4
|
-
import { createBrowserRouter, RouterProvider } from "react-router-dom";
|
|
5
|
-
import { type AuthProvider } from "./authentication/authentication.js";
|
|
6
|
-
import {
|
|
7
|
-
ComponentsProvider,
|
|
8
|
-
DEFAULT_COMPONENTS,
|
|
9
|
-
type ComponentsContextType,
|
|
10
|
-
} from "./components/context/ComponentsContext.js";
|
|
11
|
-
import { DevPortalProvider } from "./components/context/DevPortalProvider.js";
|
|
12
|
-
import { ThemeProvider } from "./components/context/ThemeContext.js";
|
|
13
|
-
import { ViewportAnchorProvider } from "./components/context/ViewportAnchorContext.js";
|
|
14
|
-
import { Layout } from "./components/Layout.js";
|
|
15
5
|
import {
|
|
16
6
|
DevPortalContext,
|
|
17
7
|
queryClient,
|
|
18
8
|
type NavigationItem,
|
|
19
|
-
} from "
|
|
20
|
-
import { HelmetProvider } from "
|
|
21
|
-
import {
|
|
22
|
-
|
|
9
|
+
} from "../core/DevPortalContext.js";
|
|
10
|
+
import { HelmetProvider } from "../core/helmet.js";
|
|
11
|
+
import { type DevPortalPlugin } from "../core/plugins.js";
|
|
12
|
+
|
|
13
|
+
import { AuthenticationProvider } from "../authentication/authentication.js";
|
|
14
|
+
import {
|
|
15
|
+
MdxComponents,
|
|
16
|
+
type MdxComponentsType,
|
|
17
|
+
} from "../util/MdxComponents.js";
|
|
18
|
+
import {
|
|
19
|
+
ComponentsProvider,
|
|
20
|
+
DEFAULT_COMPONENTS,
|
|
21
|
+
type ComponentsContextType,
|
|
22
|
+
} from "./context/ComponentsContext.js";
|
|
23
|
+
import { DevPortalProvider } from "./context/DevPortalProvider.js";
|
|
24
|
+
import { ThemeProvider } from "./context/ThemeContext.js";
|
|
25
|
+
import { ViewportAnchorProvider } from "./context/ViewportAnchorContext.js";
|
|
26
|
+
import { Router } from "./Router.js";
|
|
23
27
|
|
|
24
28
|
export const DevPortalSystemPaths = {
|
|
25
29
|
Settings: "/settings",
|
|
@@ -37,35 +41,14 @@ export type DevPortalProps = {
|
|
|
37
41
|
logo: string;
|
|
38
42
|
favicon: string;
|
|
39
43
|
}>;
|
|
40
|
-
authentication?:
|
|
44
|
+
authentication?: AuthenticationProvider;
|
|
41
45
|
navigation: NavigationItem[];
|
|
42
46
|
plugins?: DevPortalPlugin[];
|
|
43
47
|
mdxComponents?: MdxComponentsType;
|
|
44
48
|
overrides?: ComponentsContextType;
|
|
45
49
|
};
|
|
46
50
|
|
|
47
|
-
const
|
|
48
|
-
const router = useMemo(() => {
|
|
49
|
-
const routes = (props.plugins ?? []).flatMap((plugin) =>
|
|
50
|
-
isNavigationPlugin(plugin) ? plugin.getRoutes() : [],
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
return createBrowserRouter([
|
|
54
|
-
{
|
|
55
|
-
path: "/",
|
|
56
|
-
element: <Layout />,
|
|
57
|
-
errorElement: (
|
|
58
|
-
<Layout>
|
|
59
|
-
<div className="h-[75vh] flex items-center justify-center">
|
|
60
|
-
Error, look at the console
|
|
61
|
-
</div>
|
|
62
|
-
</Layout>
|
|
63
|
-
),
|
|
64
|
-
children: routes,
|
|
65
|
-
},
|
|
66
|
-
]);
|
|
67
|
-
}, [props.plugins]);
|
|
68
|
-
|
|
51
|
+
const DevPortalInner = (props: DevPortalProps) => {
|
|
69
52
|
const components = useMemo(
|
|
70
53
|
() => ({ ...DEFAULT_COMPONENTS, ...props.overrides }),
|
|
71
54
|
[props.overrides],
|
|
@@ -97,7 +80,12 @@ const DevPortal = (props: DevPortalProps) => {
|
|
|
97
80
|
</div>
|
|
98
81
|
}
|
|
99
82
|
>
|
|
100
|
-
<
|
|
83
|
+
<Router
|
|
84
|
+
plugins={[
|
|
85
|
+
...(props.plugins ?? []),
|
|
86
|
+
...(props.authentication ? [props.authentication] : []),
|
|
87
|
+
]}
|
|
88
|
+
/>
|
|
101
89
|
</Suspense>
|
|
102
90
|
</ViewportAnchorProvider>
|
|
103
91
|
</ComponentsProvider>
|
|
@@ -109,7 +97,7 @@ const DevPortal = (props: DevPortalProps) => {
|
|
|
109
97
|
);
|
|
110
98
|
};
|
|
111
99
|
|
|
112
|
-
const
|
|
113
|
-
|
|
100
|
+
const DevPortal = memo(DevPortalInner);
|
|
101
|
+
DevPortal.displayName = "DevPortal";
|
|
114
102
|
|
|
115
|
-
export
|
|
103
|
+
export { DevPortal };
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
2
|
+
import { XIcon } from "lucide-react";
|
|
3
|
+
import * as React from "react";
|
|
4
4
|
import { cn } from "../util/cn.js";
|
|
5
5
|
|
|
6
|
-
const Dialog = DialogPrimitive.Root
|
|
6
|
+
const Dialog = DialogPrimitive.Root;
|
|
7
7
|
|
|
8
|
-
const DialogTrigger = DialogPrimitive.Trigger
|
|
8
|
+
const DialogTrigger = DialogPrimitive.Trigger;
|
|
9
9
|
|
|
10
|
-
const DialogPortal = DialogPrimitive.Portal
|
|
10
|
+
const DialogPortal = DialogPrimitive.Portal;
|
|
11
11
|
|
|
12
|
-
const DialogClose = DialogPrimitive.Close
|
|
12
|
+
const DialogClose = DialogPrimitive.Close;
|
|
13
13
|
|
|
14
14
|
const DialogOverlay = React.forwardRef<
|
|
15
15
|
React.ElementRef<typeof DialogPrimitive.Overlay>,
|
|
@@ -19,12 +19,12 @@ const DialogOverlay = React.forwardRef<
|
|
|
19
19
|
ref={ref}
|
|
20
20
|
className={cn(
|
|
21
21
|
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
22
|
-
className
|
|
22
|
+
className,
|
|
23
23
|
)}
|
|
24
24
|
{...props}
|
|
25
25
|
/>
|
|
26
|
-
))
|
|
27
|
-
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
|
|
26
|
+
));
|
|
27
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
28
28
|
|
|
29
29
|
const DialogContent = React.forwardRef<
|
|
30
30
|
React.ElementRef<typeof DialogPrimitive.Content>,
|
|
@@ -35,8 +35,8 @@ const DialogContent = React.forwardRef<
|
|
|
35
35
|
<DialogPrimitive.Content
|
|
36
36
|
ref={ref}
|
|
37
37
|
className={cn(
|
|
38
|
-
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
39
|
-
className
|
|
38
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg border-border",
|
|
39
|
+
className,
|
|
40
40
|
)}
|
|
41
41
|
{...props}
|
|
42
42
|
>
|
|
@@ -47,36 +47,36 @@ const DialogContent = React.forwardRef<
|
|
|
47
47
|
</DialogPrimitive.Close>
|
|
48
48
|
</DialogPrimitive.Content>
|
|
49
49
|
</DialogPortal>
|
|
50
|
-
))
|
|
51
|
-
DialogContent.displayName = DialogPrimitive.Content.displayName
|
|
50
|
+
));
|
|
51
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
52
52
|
|
|
53
53
|
const DialogHeader = ({
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
className,
|
|
55
|
+
...props
|
|
56
|
+
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
57
57
|
<div
|
|
58
58
|
className={cn(
|
|
59
59
|
"flex flex-col space-y-1.5 text-center sm:text-left",
|
|
60
|
-
className
|
|
60
|
+
className,
|
|
61
61
|
)}
|
|
62
62
|
{...props}
|
|
63
63
|
/>
|
|
64
|
-
)
|
|
65
|
-
DialogHeader.displayName = "DialogHeader"
|
|
64
|
+
);
|
|
65
|
+
DialogHeader.displayName = "DialogHeader";
|
|
66
66
|
|
|
67
67
|
const DialogFooter = ({
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
className,
|
|
69
|
+
...props
|
|
70
|
+
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
71
71
|
<div
|
|
72
72
|
className={cn(
|
|
73
73
|
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
|
74
|
-
className
|
|
74
|
+
className,
|
|
75
75
|
)}
|
|
76
76
|
{...props}
|
|
77
77
|
/>
|
|
78
|
-
)
|
|
79
|
-
DialogFooter.displayName = "DialogFooter"
|
|
78
|
+
);
|
|
79
|
+
DialogFooter.displayName = "DialogFooter";
|
|
80
80
|
|
|
81
81
|
const DialogTitle = React.forwardRef<
|
|
82
82
|
React.ElementRef<typeof DialogPrimitive.Title>,
|
|
@@ -86,12 +86,12 @@ const DialogTitle = React.forwardRef<
|
|
|
86
86
|
ref={ref}
|
|
87
87
|
className={cn(
|
|
88
88
|
"text-lg font-semibold leading-none tracking-tight",
|
|
89
|
-
className
|
|
89
|
+
className,
|
|
90
90
|
)}
|
|
91
91
|
{...props}
|
|
92
92
|
/>
|
|
93
|
-
))
|
|
94
|
-
DialogTitle.displayName = DialogPrimitive.Title.displayName
|
|
93
|
+
));
|
|
94
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
95
95
|
|
|
96
96
|
const DialogDescription = React.forwardRef<
|
|
97
97
|
React.ElementRef<typeof DialogPrimitive.Description>,
|
|
@@ -102,18 +102,18 @@ const DialogDescription = React.forwardRef<
|
|
|
102
102
|
className={cn("text-sm text-muted-foreground", className)}
|
|
103
103
|
{...props}
|
|
104
104
|
/>
|
|
105
|
-
))
|
|
106
|
-
DialogDescription.displayName = DialogPrimitive.Description.displayName
|
|
105
|
+
));
|
|
106
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
107
107
|
|
|
108
108
|
export {
|
|
109
109
|
Dialog,
|
|
110
|
-
DialogPortal,
|
|
111
|
-
DialogOverlay,
|
|
112
|
-
DialogTrigger,
|
|
113
110
|
DialogClose,
|
|
114
111
|
DialogContent,
|
|
115
|
-
|
|
112
|
+
DialogDescription,
|
|
116
113
|
DialogFooter,
|
|
114
|
+
DialogHeader,
|
|
115
|
+
DialogOverlay,
|
|
116
|
+
DialogPortal,
|
|
117
117
|
DialogTitle,
|
|
118
|
-
|
|
119
|
-
}
|
|
118
|
+
DialogTrigger,
|
|
119
|
+
};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { MoonStarIcon, SearchIcon, SunIcon } from "lucide-react";
|
|
2
2
|
import { memo } from "react";
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
import { useAuth } from "../authentication/hook.js";
|
|
4
5
|
import { TopNavigation } from "./TopNavigation.js";
|
|
5
6
|
import { useDevPortal } from "./context/DevPortalProvider.js";
|
|
6
7
|
import { useTheme } from "./context/ThemeContext.js";
|
|
7
8
|
|
|
8
|
-
export const Header = memo(()
|
|
9
|
+
export const Header = memo(function HeaderInner() {
|
|
9
10
|
const [isDark, toggleTheme] = useTheme();
|
|
10
|
-
const {
|
|
11
|
-
const {
|
|
11
|
+
const { isAuthenticated, profile, isAuthEnabled, login, logout } = useAuth();
|
|
12
|
+
const { meta } = useDevPortal();
|
|
12
13
|
|
|
13
14
|
const ThemeIcon = isDark ? MoonStarIcon : SunIcon;
|
|
14
15
|
|
|
@@ -25,7 +26,7 @@ export const Header = memo(() => {
|
|
|
25
26
|
</span>
|
|
26
27
|
</div>
|
|
27
28
|
<div className="grid grid-cols-[--sidecar-grid-cols] items-center gap-8">
|
|
28
|
-
<div className="w-full max-w-prose
|
|
29
|
+
<div className="w-full max-w-prose">
|
|
29
30
|
<button className="flex items-center border border-input hover:bg-accent hover:text-accent-foreground p-4 relative h-8 justify-start rounded-lg bg-background text-sm text-muted-foreground shadow-none w-40 sm:w-72">
|
|
30
31
|
<div className="flex items-center gap-2 flex-grow">
|
|
31
32
|
<SearchIcon size={14} />
|
|
@@ -36,23 +37,27 @@ export const Header = memo(() => {
|
|
|
36
37
|
</kbd>
|
|
37
38
|
</button>
|
|
38
39
|
</div>
|
|
40
|
+
|
|
39
41
|
<div className="items-center justify-self-end text-sm hidden lg:flex">
|
|
40
|
-
{
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
42
|
+
{isAuthEnabled && (
|
|
43
|
+
<>
|
|
44
|
+
{isAuthenticated ? (
|
|
45
|
+
<button
|
|
46
|
+
className="cursor-pointer hover:bg-secondary p-1 px-2 mx-2 rounded text-nowrap"
|
|
47
|
+
onClick={logout}
|
|
48
|
+
>
|
|
49
|
+
Logout {profile?.email ? `(${profile.email})` : null}
|
|
50
|
+
</button>
|
|
51
|
+
) : (
|
|
52
|
+
<button
|
|
53
|
+
className="cursor-pointer hover:bg-secondary p-1 px-2 mx-2 rounded"
|
|
54
|
+
onClick={login}
|
|
55
|
+
>
|
|
56
|
+
Login
|
|
57
|
+
</button>
|
|
58
|
+
)}
|
|
59
|
+
</>
|
|
54
60
|
)}
|
|
55
|
-
|
|
56
61
|
<button
|
|
57
62
|
className="cursor-pointer hover:bg-secondary p-2.5 -m-2.5 rounded-full"
|
|
58
63
|
onClick={toggleTheme}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { cn } from "../util/cn.js";
|
|
3
|
+
import { useRegisterAnchorElement } from "./context/ViewportAnchorContext.js";
|
|
4
4
|
|
|
5
5
|
const getComponent = (level: number) => {
|
|
6
6
|
switch (level) {
|