zudoku 0.0.2-dev.0
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/cli.js +1 -0
- package/dist/app/DevPortal.d.ts +26 -0
- package/dist/app/DevPortal.js +41 -0
- package/dist/app/DevPortal.js.map +1 -0
- package/dist/app/Heading.d.ts +9 -0
- package/dist/app/Heading.js +27 -0
- package/dist/app/Heading.js.map +1 -0
- package/dist/app/app.d.ts +2 -0
- package/dist/app/app.js +69 -0
- package/dist/app/app.js.map +1 -0
- package/dist/app/authentication/authentication.d.ts +13 -0
- package/dist/app/authentication/authentication.js +2 -0
- package/dist/app/authentication/authentication.js.map +1 -0
- package/dist/app/authentication/clerk.d.ts +5 -0
- package/dist/app/authentication/clerk.js +36 -0
- package/dist/app/authentication/clerk.js.map +1 -0
- package/dist/app/authentication/openid.d.ts +11 -0
- package/dist/app/authentication/openid.js +118 -0
- package/dist/app/authentication/openid.js.map +1 -0
- package/dist/app/components/AnchorLink.d.ts +5 -0
- package/dist/app/components/AnchorLink.js +17 -0
- package/dist/app/components/AnchorLink.js.map +1 -0
- package/dist/app/components/CategoryHeading.d.ts +5 -0
- package/dist/app/components/CategoryHeading.js +6 -0
- package/dist/app/components/CategoryHeading.js.map +1 -0
- package/dist/app/components/DynamicIcon.d.ts +6 -0
- package/dist/app/components/DynamicIcon.js +6 -0
- package/dist/app/components/DynamicIcon.js.map +1 -0
- package/dist/app/components/Header.d.ts +2 -0
- package/dist/app/components/Header.js +15 -0
- package/dist/app/components/Header.js.map +1 -0
- package/dist/app/components/Layout.d.ts +4 -0
- package/dist/app/components/Layout.js +31 -0
- package/dist/app/components/Layout.js.map +1 -0
- package/dist/app/components/Markdown.d.ts +5 -0
- package/dist/app/components/Markdown.js +20 -0
- package/dist/app/components/Markdown.js.map +1 -0
- package/dist/app/components/SyntaxHighlight.d.ts +9 -0
- package/dist/app/components/SyntaxHighlight.js +31 -0
- package/dist/app/components/SyntaxHighlight.js.map +1 -0
- package/dist/app/components/TopNavigation.d.ts +1 -0
- package/dist/app/components/TopNavigation.js +11 -0
- package/dist/app/components/TopNavigation.js.map +1 -0
- package/dist/app/components/context/ComponentsContext.d.ts +10 -0
- package/dist/app/components/context/ComponentsContext.js +11 -0
- package/dist/app/components/context/ComponentsContext.js.map +1 -0
- package/dist/app/components/context/DevPortalProvider.d.ts +10 -0
- package/dist/app/components/context/DevPortalProvider.js +39 -0
- package/dist/app/components/context/DevPortalProvider.js.map +1 -0
- package/dist/app/components/context/PluginSystem.d.ts +1 -0
- package/dist/app/components/context/PluginSystem.js +2 -0
- package/dist/app/components/context/PluginSystem.js.map +1 -0
- package/dist/app/components/context/ThemeContext.d.ts +5 -0
- package/dist/app/components/context/ThemeContext.js +33 -0
- package/dist/app/components/context/ThemeContext.js.map +1 -0
- package/dist/app/components/context/ViewportAnchorContext.d.ts +15 -0
- package/dist/app/components/context/ViewportAnchorContext.js +89 -0
- package/dist/app/components/context/ViewportAnchorContext.js.map +1 -0
- package/dist/app/components/navigation/SideNavigation.d.ts +1 -0
- package/dist/app/components/navigation/SideNavigation.js +11 -0
- package/dist/app/components/navigation/SideNavigation.js.map +1 -0
- package/dist/app/components/navigation/SideNavigationCategory.d.ts +4 -0
- package/dist/app/components/navigation/SideNavigationCategory.js +26 -0
- package/dist/app/components/navigation/SideNavigationCategory.js.map +1 -0
- package/dist/app/components/navigation/SideNavigationItem.d.ts +12 -0
- package/dist/app/components/navigation/SideNavigationItem.js +38 -0
- package/dist/app/components/navigation/SideNavigationItem.js.map +1 -0
- package/dist/app/components/navigation/SideNavigationWrapper.d.ts +4 -0
- package/dist/app/components/navigation/SideNavigationWrapper.js +6 -0
- package/dist/app/components/navigation/SideNavigationWrapper.js.map +1 -0
- package/dist/app/components/navigation/useNavigationCollapsibleState.d.ts +7 -0
- package/dist/app/components/navigation/useNavigationCollapsibleState.js +16 -0
- package/dist/app/components/navigation/useNavigationCollapsibleState.js.map +1 -0
- package/dist/app/components/navigation/util.d.ts +8 -0
- package/dist/app/components/navigation/util.js +15 -0
- package/dist/app/components/navigation/util.js.map +1 -0
- package/dist/app/config.d.ts +3 -0
- package/dist/app/config.js +9 -0
- package/dist/app/config.js.map +1 -0
- package/dist/app/core/DevPortalContext.d.ts +80 -0
- package/dist/app/core/DevPortalContext.js +68 -0
- package/dist/app/core/DevPortalContext.js.map +1 -0
- package/dist/app/core/helmet.d.ts +4 -0
- package/dist/app/core/helmet.js +5 -0
- package/dist/app/core/helmet.js.map +1 -0
- package/dist/app/core/icons.d.ts +1 -0
- package/dist/app/core/icons.js +2 -0
- package/dist/app/core/icons.js.map +1 -0
- package/dist/app/core/plugins.d.ts +24 -0
- package/dist/app/core/plugins.js +4 -0
- package/dist/app/core/plugins.js.map +1 -0
- package/dist/app/core/router.d.ts +1 -0
- package/dist/app/core/router.js +2 -0
- package/dist/app/core/router.js.map +1 -0
- package/dist/app/core/types/combine.d.ts +4 -0
- package/dist/app/core/types/combine.js +2 -0
- package/dist/app/core/types/combine.js.map +1 -0
- package/dist/app/main.d.ts +1 -0
- package/dist/app/main.js +18 -0
- package/dist/app/main.js.map +1 -0
- package/dist/app/markdowns.d.ts +3 -0
- package/dist/app/markdowns.js +5 -0
- package/dist/app/markdowns.js.map +1 -0
- package/dist/app/oas/graphql/index.d.ts +12 -0
- package/dist/app/oas/graphql/index.js +290 -0
- package/dist/app/oas/graphql/index.js.map +1 -0
- package/dist/app/oas/graphql/server.d.ts +1 -0
- package/dist/app/oas/graphql/server.js +8 -0
- package/dist/app/oas/graphql/server.js.map +1 -0
- package/dist/app/oas/parser/dereference/index.d.ts +5 -0
- package/dist/app/oas/parser/dereference/index.js +43 -0
- package/dist/app/oas/parser/dereference/index.js.map +1 -0
- package/dist/app/oas/parser/dereference/resolveRef.d.ts +5 -0
- package/dist/app/oas/parser/dereference/resolveRef.js +26 -0
- package/dist/app/oas/parser/dereference/resolveRef.js.map +1 -0
- package/dist/app/oas/parser/index.d.ts +21 -0
- package/dist/app/oas/parser/index.js +58 -0
- package/dist/app/oas/parser/index.js.map +1 -0
- package/dist/app/oas/parser/schemas/v3.0.json +1489 -0
- package/dist/app/oas/parser/schemas/v3.1.json +1298 -0
- package/dist/app/oas/parser/upgrade/index.d.ts +9 -0
- package/dist/app/oas/parser/upgrade/index.js +90 -0
- package/dist/app/oas/parser/upgrade/index.js.map +1 -0
- package/dist/app/plugins/api-key/SettingsApiKeys.d.ts +4 -0
- package/dist/app/plugins/api-key/SettingsApiKeys.js +7 -0
- package/dist/app/plugins/api-key/SettingsApiKeys.js.map +1 -0
- package/dist/app/plugins/api-key/index.d.ts +32 -0
- package/dist/app/plugins/api-key/index.js +55 -0
- package/dist/app/plugins/api-key/index.js.map +1 -0
- package/dist/app/plugins/markdown/MdxPage.d.ts +3 -0
- package/dist/app/plugins/markdown/MdxPage.js +55 -0
- package/dist/app/plugins/markdown/MdxPage.js.map +1 -0
- package/dist/app/plugins/markdown/Toc.d.ts +4 -0
- package/dist/app/plugins/markdown/Toc.js +40 -0
- package/dist/app/plugins/markdown/Toc.js.map +1 -0
- package/dist/app/plugins/markdown/generateRoutes.d.ts +3 -0
- package/dist/app/plugins/markdown/generateRoutes.js +50 -0
- package/dist/app/plugins/markdown/generateRoutes.js.map +1 -0
- package/dist/app/plugins/markdown/index.d.ts +19 -0
- package/dist/app/plugins/markdown/index.js +9 -0
- package/dist/app/plugins/markdown/index.js.map +1 -0
- package/dist/app/plugins/openapi/ColorizedParam.d.ts +8 -0
- package/dist/app/plugins/openapi/ColorizedParam.js +40 -0
- package/dist/app/plugins/openapi/ColorizedParam.js.map +1 -0
- package/dist/app/plugins/openapi/MakeRequest.d.ts +4 -0
- package/dist/app/plugins/openapi/MakeRequest.js +11 -0
- package/dist/app/plugins/openapi/MakeRequest.js.map +1 -0
- package/dist/app/plugins/openapi/MethodBadge.d.ts +13 -0
- package/dist/app/plugins/openapi/MethodBadge.js +26 -0
- package/dist/app/plugins/openapi/MethodBadge.js.map +1 -0
- package/dist/app/plugins/openapi/OperationList.d.ts +47 -0
- package/dist/app/plugins/openapi/OperationList.js +82 -0
- package/dist/app/plugins/openapi/OperationList.js.map +1 -0
- package/dist/app/plugins/openapi/OperationListItem.d.ts +7 -0
- package/dist/app/plugins/openapi/OperationListItem.js +15 -0
- package/dist/app/plugins/openapi/OperationListItem.js.map +1 -0
- package/dist/app/plugins/openapi/ParameterList.d.ts +7 -0
- package/dist/app/plugins/openapi/ParameterList.js +5 -0
- package/dist/app/plugins/openapi/ParameterList.js.map +1 -0
- package/dist/app/plugins/openapi/ParameterListItem.d.ts +8 -0
- package/dist/app/plugins/openapi/ParameterListItem.js +13 -0
- package/dist/app/plugins/openapi/ParameterListItem.js.map +1 -0
- package/dist/app/plugins/openapi/RequestBodySidecarBox.d.ts +6 -0
- package/dist/app/plugins/openapi/RequestBodySidecarBox.js +19 -0
- package/dist/app/plugins/openapi/RequestBodySidecarBox.js.map +1 -0
- package/dist/app/plugins/openapi/ResponsesSidecarBox.d.ts +6 -0
- package/dist/app/plugins/openapi/ResponsesSidecarBox.js +15 -0
- package/dist/app/plugins/openapi/ResponsesSidecarBox.js.map +1 -0
- package/dist/app/plugins/openapi/Select.d.ts +9 -0
- package/dist/app/plugins/openapi/Select.js +5 -0
- package/dist/app/plugins/openapi/Select.js.map +1 -0
- package/dist/app/plugins/openapi/Sidecar.d.ts +4 -0
- package/dist/app/plugins/openapi/Sidecar.js +39 -0
- package/dist/app/plugins/openapi/Sidecar.js.map +1 -0
- package/dist/app/plugins/openapi/SidecarBox.d.ts +10 -0
- package/dist/app/plugins/openapi/SidecarBox.js +8 -0
- package/dist/app/plugins/openapi/SidecarBox.js.map +1 -0
- package/dist/app/plugins/openapi/graphql/index.d.ts +836 -0
- package/dist/app/plugins/openapi/graphql/index.js +4 -0
- package/dist/app/plugins/openapi/graphql/index.js.map +1 -0
- package/dist/app/plugins/openapi/index.d.ts +22 -0
- package/dist/app/plugins/openapi/index.js +91 -0
- package/dist/app/plugins/openapi/index.js.map +1 -0
- package/dist/app/plugins/openapi/util/generateSchemaExample.d.ts +3 -0
- package/dist/app/plugins/openapi/util/generateSchemaExample.js +52 -0
- package/dist/app/plugins/openapi/util/generateSchemaExample.js.map +1 -0
- package/dist/app/plugins/openapi/util/getCode.d.ts +2 -0
- package/dist/app/plugins/openapi/util/getCode.js +54 -0
- package/dist/app/plugins/openapi/util/getCode.js.map +1 -0
- package/dist/app/plugins/openapi/util/urql.d.ts +8 -0
- package/dist/app/plugins/openapi/util/urql.js +8 -0
- package/dist/app/plugins/openapi/util/urql.js.map +1 -0
- package/dist/app/plugins/openapi/worker/createSharedWorkerClient.d.ts +5 -0
- package/dist/app/plugins/openapi/worker/createSharedWorkerClient.js +47 -0
- package/dist/app/plugins/openapi/worker/createSharedWorkerClient.js.map +1 -0
- package/dist/app/plugins/openapi/worker/worker.d.ts +1 -0
- package/dist/app/plugins/openapi/worker/worker.js +20 -0
- package/dist/app/plugins/openapi/worker/worker.js.map +1 -0
- package/dist/app/plugins/redirect/index.d.ts +10 -0
- package/dist/app/plugins/redirect/index.js +11 -0
- package/dist/app/plugins/redirect/index.js.map +1 -0
- package/dist/app/tailwind.d.ts +3 -0
- package/dist/app/tailwind.js +69 -0
- package/dist/app/tailwind.js.map +1 -0
- package/dist/app/ui/Callout.d.ts +51 -0
- package/dist/app/ui/Callout.js +50 -0
- package/dist/app/ui/Callout.js.map +1 -0
- package/dist/app/ui/Card.d.ts +8 -0
- package/dist/app/ui/Card.js +17 -0
- package/dist/app/ui/Card.js.map +1 -0
- package/dist/app/ui/Note.d.ts +8 -0
- package/dist/app/ui/Note.js +23 -0
- package/dist/app/ui/Note.js.map +1 -0
- package/dist/app/util/MdxComponents.d.ts +27 -0
- package/dist/app/util/MdxComponents.js +40 -0
- package/dist/app/util/MdxComponents.js.map +1 -0
- package/dist/app/util/cn.d.ts +2 -0
- package/dist/app/util/cn.js +6 -0
- package/dist/app/util/cn.js.map +1 -0
- package/dist/app/util/createWaitForNotify.d.ts +1 -0
- package/dist/app/util/createWaitForNotify.js +15 -0
- package/dist/app/util/createWaitForNotify.js.map +1 -0
- package/dist/app/util/groupBy.d.ts +6 -0
- package/dist/app/util/groupBy.js +9 -0
- package/dist/app/util/groupBy.js.map +1 -0
- package/dist/app/util/joinPath.d.ts +1 -0
- package/dist/app/util/joinPath.js +8 -0
- package/dist/app/util/joinPath.js.map +1 -0
- package/dist/app/util/pastellize.d.ts +4 -0
- package/dist/app/util/pastellize.js +14 -0
- package/dist/app/util/pastellize.js.map +1 -0
- package/dist/app/util/slugify.d.ts +3 -0
- package/dist/app/util/slugify.js +3 -0
- package/dist/app/util/slugify.js.map +1 -0
- package/dist/app/util/traverseNavigation.d.ts +6 -0
- package/dist/app/util/traverseNavigation.js +30 -0
- package/dist/app/util/traverseNavigation.js.map +1 -0
- package/dist/app/util/useScrollToAnchor.d.ts +1 -0
- package/dist/app/util/useScrollToAnchor.js +33 -0
- package/dist/app/util/useScrollToAnchor.js.map +1 -0
- package/dist/app/util/useScrollToTop.d.ts +1 -0
- package/dist/app/util/useScrollToTop.js +13 -0
- package/dist/app/util/useScrollToTop.js.map +1 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.js +3 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli/build/handler.d.ts +4 -0
- package/dist/cli/build/handler.js +9 -0
- package/dist/cli/build/handler.js.map +1 -0
- package/dist/cli/cli.d.ts +1 -0
- package/dist/cli/cli.js +64 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/cmds/build.d.ts +8 -0
- package/dist/cli/cmds/build.js +23 -0
- package/dist/cli/cmds/build.js.map +1 -0
- package/dist/cli/cmds/dev.d.ts +8 -0
- package/dist/cli/cmds/dev.js +29 -0
- package/dist/cli/cmds/dev.js.map +1 -0
- package/dist/cli/common/analytics/lib.d.ts +17 -0
- package/dist/cli/common/analytics/lib.js +53 -0
- package/dist/cli/common/analytics/lib.js.map +1 -0
- package/dist/cli/common/constants.d.ts +5 -0
- package/dist/cli/common/constants.js +9 -0
- package/dist/cli/common/constants.js.map +1 -0
- package/dist/cli/common/logger.d.ts +2 -0
- package/dist/cli/common/logger.js +14 -0
- package/dist/cli/common/logger.js.map +1 -0
- package/dist/cli/common/machine-id/lib.d.ts +1 -0
- package/dist/cli/common/machine-id/lib.js +74 -0
- package/dist/cli/common/machine-id/lib.js.map +1 -0
- package/dist/cli/common/outdated.d.ts +1 -0
- package/dist/cli/common/outdated.js +70 -0
- package/dist/cli/common/outdated.js.map +1 -0
- package/dist/cli/common/output.d.ts +9 -0
- package/dist/cli/common/output.js +65 -0
- package/dist/cli/common/output.js.map +1 -0
- package/dist/cli/common/utils/box.d.ts +33 -0
- package/dist/cli/common/utils/box.js +81 -0
- package/dist/cli/common/utils/box.js.map +1 -0
- package/dist/cli/common/utils/ports.d.ts +1 -0
- package/dist/cli/common/utils/ports.js +18 -0
- package/dist/cli/common/utils/ports.js.map +1 -0
- package/dist/cli/common/validators/lib.d.ts +20 -0
- package/dist/cli/common/validators/lib.js +31 -0
- package/dist/cli/common/validators/lib.js.map +1 -0
- package/dist/cli/common/xdg/lib.d.ts +6 -0
- package/dist/cli/common/xdg/lib.js +18 -0
- package/dist/cli/common/xdg/lib.js.map +1 -0
- package/dist/cli/dev/handler.d.ts +5 -0
- package/dist/cli/dev/handler.js +22 -0
- package/dist/cli/dev/handler.js.map +1 -0
- package/dist/config/config.d.ts +37 -0
- package/dist/config/config.js +2 -0
- package/dist/config/config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins.d.ts +4 -0
- package/dist/plugins.js +6 -0
- package/dist/plugins.js.map +1 -0
- package/dist/vite/build.d.ts +3 -0
- package/dist/vite/build.js +29 -0
- package/dist/vite/build.js.map +1 -0
- package/dist/vite/config.d.ts +6 -0
- package/dist/vite/config.js +74 -0
- package/dist/vite/config.js.map +1 -0
- package/dist/vite/dev-server.d.ts +10 -0
- package/dist/vite/dev-server.js +53 -0
- package/dist/vite/dev-server.js.map +1 -0
- package/dist/vite/html.d.ts +5 -0
- package/dist/vite/html.js +32 -0
- package/dist/vite/html.js.map +1 -0
- package/dist/vite/import-auth-plugin.d.ts +3 -0
- package/dist/vite/import-auth-plugin.js +28 -0
- package/dist/vite/import-auth-plugin.js.map +1 -0
- package/dist/vite/plugin.d.ts +7 -0
- package/dist/vite/plugin.js +109 -0
- package/dist/vite/plugin.js.map +1 -0
- package/package.json +118 -0
- package/src/app/DevPortal.tsx +115 -0
- package/src/app/Heading.tsx +60 -0
- package/src/app/app.tsx +85 -0
- package/src/app/authentication/authentication.ts +18 -0
- package/src/app/authentication/clerk.ts +47 -0
- package/src/app/authentication/openid.ts +192 -0
- package/src/app/components/AnchorLink.tsx +19 -0
- package/src/app/components/CategoryHeading.tsx +16 -0
- package/src/app/components/DynamicIcon.tsx +60 -0
- package/src/app/components/Header.tsx +69 -0
- package/src/app/components/Layout.tsx +56 -0
- package/src/app/components/Markdown.tsx +37 -0
- package/src/app/components/SyntaxHighlight.tsx +92 -0
- package/src/app/components/TopNavigation.tsx +32 -0
- package/src/app/components/context/ComponentsContext.tsx +24 -0
- package/src/app/components/context/DevPortalProvider.ts +54 -0
- package/src/app/components/context/PluginSystem.ts +0 -0
- package/src/app/components/context/ThemeContext.tsx +46 -0
- package/src/app/components/context/ViewportAnchorContext.tsx +139 -0
- package/src/app/components/navigation/SideNavigation.tsx +18 -0
- package/src/app/components/navigation/SideNavigationCategory.tsx +74 -0
- package/src/app/components/navigation/SideNavigationItem.tsx +143 -0
- package/src/app/components/navigation/SideNavigationWrapper.tsx +15 -0
- package/src/app/components/navigation/useNavigationCollapsibleState.ts +27 -0
- package/src/app/components/navigation/util.ts +38 -0
- package/src/app/config.ts +20 -0
- package/src/app/core/DevPortalContext.ts +164 -0
- package/src/app/core/helmet.ts +5 -0
- package/src/app/core/icons.tsx +1 -0
- package/src/app/core/plugins.ts +43 -0
- package/src/app/core/router.tsx +1 -0
- package/src/app/core/types/combine.ts +16 -0
- package/src/app/main.css +137 -0
- package/src/app/main.tsx +22 -0
- package/src/app/markdowns.ts +7 -0
- package/src/app/oas/graphql/index.ts +422 -0
- package/src/app/oas/graphql/server.ts +10 -0
- package/src/app/oas/parser/dereference/index.ts +59 -0
- package/src/app/oas/parser/dereference/resolveRef.ts +32 -0
- package/src/app/oas/parser/index.ts +94 -0
- package/src/app/oas/parser/schemas/v3.0.json +1489 -0
- package/src/app/oas/parser/schemas/v3.1.json +1298 -0
- package/src/app/oas/parser/upgrade/index.ts +108 -0
- package/src/app/plugins/api-key/SettingsApiKeys.tsx +22 -0
- package/src/app/plugins/api-key/index.tsx +123 -0
- package/src/app/plugins/markdown/MdxPage.tsx +128 -0
- package/src/app/plugins/markdown/Toc.tsx +122 -0
- package/src/app/plugins/markdown/generateRoutes.tsx +72 -0
- package/src/app/plugins/markdown/index.tsx +31 -0
- package/src/app/plugins/openapi/ColorizedParam.tsx +73 -0
- package/src/app/plugins/openapi/MakeRequest.tsx +30 -0
- package/src/app/plugins/openapi/MethodBadge.tsx +36 -0
- package/src/app/plugins/openapi/OperationList.tsx +119 -0
- package/src/app/plugins/openapi/OperationListItem.tsx +55 -0
- package/src/app/plugins/openapi/ParameterList.tsx +32 -0
- package/src/app/plugins/openapi/ParameterListItem.tsx +60 -0
- package/src/app/plugins/openapi/RequestBodySidecarBox.tsx +48 -0
- package/src/app/plugins/openapi/ResponsesSidecarBox.tsx +60 -0
- package/src/app/plugins/openapi/Select.tsx +35 -0
- package/src/app/plugins/openapi/Sidecar.tsx +99 -0
- package/src/app/plugins/openapi/SidecarBox.tsx +35 -0
- package/src/app/plugins/openapi/graphql/env.d.ts +48 -0
- package/src/app/plugins/openapi/graphql/index.ts +13 -0
- package/src/app/plugins/openapi/index.tsx +142 -0
- package/src/app/plugins/openapi/util/generateSchemaExample.ts +59 -0
- package/src/app/plugins/openapi/util/getCode.tsx +69 -0
- package/src/app/plugins/openapi/util/urql.ts +8 -0
- package/src/app/plugins/openapi/worker/createSharedWorkerClient.ts +60 -0
- package/src/app/plugins/openapi/worker/worker.ts +30 -0
- package/src/app/plugins/redirect/index.tsx +20 -0
- package/src/app/tailwind.ts +72 -0
- package/src/app/ui/Callout.tsx +87 -0
- package/src/app/ui/Card.tsx +82 -0
- package/src/app/ui/Note.tsx +58 -0
- package/src/app/util/MdxComponents.tsx +70 -0
- package/src/app/util/cn.ts +6 -0
- package/src/app/util/createWaitForNotify.ts +18 -0
- package/src/app/util/groupBy.ts +24 -0
- package/src/app/util/joinPath.tsx +10 -0
- package/src/app/util/pastellize.ts +25 -0
- package/src/app/util/slugify.ts +3 -0
- package/src/app/util/traverseNavigation.ts +55 -0
- package/src/app/util/useScrollToAnchor.ts +38 -0
- package/src/app/util/useScrollToTop.ts +13 -0
package/cli.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./dist/cli/cli.js";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/// <reference types="react" resolution-mode="require"/>
|
|
2
|
+
import { type AuthProvider } from "./authentication/authentication.js";
|
|
3
|
+
import { type ComponentsContextType } from "./components/context/ComponentsContext.js";
|
|
4
|
+
import { type NavigationItem } from "./core/DevPortalContext.js";
|
|
5
|
+
import { type DevPortalPlugin } from "./core/plugins.js";
|
|
6
|
+
import { type MdxComponentsType } from "./util/MdxComponents.js";
|
|
7
|
+
export declare const DevPortalSystemPaths: {
|
|
8
|
+
readonly Settings: "/settings";
|
|
9
|
+
};
|
|
10
|
+
export type DevPortalPath = string | (typeof DevPortalSystemPaths)[keyof typeof DevPortalSystemPaths];
|
|
11
|
+
export type DevPortalProps = {
|
|
12
|
+
meta?: Partial<{
|
|
13
|
+
headerTitle: string;
|
|
14
|
+
pageTitle: string;
|
|
15
|
+
description: string;
|
|
16
|
+
logo: string;
|
|
17
|
+
favicon: string;
|
|
18
|
+
}>;
|
|
19
|
+
authentication?: AuthProvider;
|
|
20
|
+
navigation: NavigationItem[];
|
|
21
|
+
plugins?: DevPortalPlugin[];
|
|
22
|
+
mdxComponents?: MdxComponentsType;
|
|
23
|
+
overrides?: ComponentsContextType;
|
|
24
|
+
};
|
|
25
|
+
declare const MemoDevPortal: import("react").MemoExoticComponent<(props: DevPortalProps) => import("react/jsx-runtime").JSX.Element>;
|
|
26
|
+
export default MemoDevPortal;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { MDXProvider } from "@mdx-js/react";
|
|
3
|
+
import { QueryClientProvider } from "@tanstack/react-query";
|
|
4
|
+
import { memo, Suspense, useEffect, useMemo } from "react";
|
|
5
|
+
import { createBrowserRouter, RouterProvider } from "react-router-dom";
|
|
6
|
+
import { ComponentsProvider, DEFAULT_COMPONENTS, } from "./components/context/ComponentsContext.js";
|
|
7
|
+
import { DevPortalProvider } from "./components/context/DevPortalProvider.js";
|
|
8
|
+
import { ThemeProvider } from "./components/context/ThemeContext.js";
|
|
9
|
+
import { ViewportAnchorProvider } from "./components/context/ViewportAnchorContext.js";
|
|
10
|
+
import { Layout } from "./components/Layout.js";
|
|
11
|
+
import { DevPortalContext, queryClient, } from "./core/DevPortalContext.js";
|
|
12
|
+
import { HelmetProvider } from "./core/helmet.js";
|
|
13
|
+
import { isNavigationPlugin } from "./core/plugins.js";
|
|
14
|
+
import { MdxComponents } from "./util/MdxComponents.js";
|
|
15
|
+
export const DevPortalSystemPaths = {
|
|
16
|
+
Settings: "/settings",
|
|
17
|
+
};
|
|
18
|
+
const DevPortal = (props) => {
|
|
19
|
+
const router = useMemo(() => {
|
|
20
|
+
const routes = (props.plugins ?? []).flatMap((plugin) => isNavigationPlugin(plugin) ? plugin.getRoutes() : []);
|
|
21
|
+
return createBrowserRouter([
|
|
22
|
+
{
|
|
23
|
+
path: "/",
|
|
24
|
+
element: _jsx(Layout, {}),
|
|
25
|
+
errorElement: (_jsx(Layout, { children: _jsx("div", { className: "h-[75vh] flex items-center justify-center", children: "Error, look at the console" }) })),
|
|
26
|
+
children: routes,
|
|
27
|
+
},
|
|
28
|
+
]);
|
|
29
|
+
}, [props.plugins]);
|
|
30
|
+
const components = useMemo(() => ({ ...DEFAULT_COMPONENTS, ...props.overrides }), [props.overrides]);
|
|
31
|
+
const mdxComponents = useMemo(() => ({ ...MdxComponents, ...props.mdxComponents }), [props.mdxComponents]);
|
|
32
|
+
const devPortalContext = useMemo(() => new DevPortalContext(props), [props]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
void devPortalContext.initialize();
|
|
35
|
+
}, [devPortalContext]);
|
|
36
|
+
return (_jsx(QueryClientProvider, { client: queryClient, children: _jsx(HelmetProvider, { children: _jsx(DevPortalProvider, { value: devPortalContext, children: _jsx(MDXProvider, { components: mdxComponents, children: _jsx(ThemeProvider, { children: _jsx(ComponentsProvider, { value: components, children: _jsx(ViewportAnchorProvider, { children: _jsx(Suspense, { fallback: _jsx("div", { className: "grid place-items-center h-full", children: "Loading..." }), children: _jsx(RouterProvider, { router: router }) }) }) }) }) }) }) }) }));
|
|
37
|
+
};
|
|
38
|
+
const MemoDevPortal = memo(DevPortal);
|
|
39
|
+
MemoDevPortal.displayName = "DevPortal";
|
|
40
|
+
export default MemoDevPortal;
|
|
41
|
+
//# sourceMappingURL=DevPortal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevPortal.js","sourceRoot":"","sources":["../../src/app/DevPortal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export type HeadingProps = {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
id?: string;
|
|
6
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
7
|
+
registerSidebarAnchor?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare const Heading: ({ level, children, id, className, registerSidebarAnchor, }: HeadingProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRegisterAnchorElement } from "./components/context/ViewportAnchorContext.js";
|
|
3
|
+
import { cn } from "./util/cn.js";
|
|
4
|
+
const getComponent = (level) => {
|
|
5
|
+
switch (level) {
|
|
6
|
+
case 1:
|
|
7
|
+
return "h1";
|
|
8
|
+
case 2:
|
|
9
|
+
return "h2";
|
|
10
|
+
case 3:
|
|
11
|
+
return "h3";
|
|
12
|
+
case 4:
|
|
13
|
+
return "h4";
|
|
14
|
+
case 5:
|
|
15
|
+
return "h5";
|
|
16
|
+
case 6:
|
|
17
|
+
return "h6";
|
|
18
|
+
default:
|
|
19
|
+
return "h1";
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
export const Heading = ({ level, children, id, className, registerSidebarAnchor, }) => {
|
|
23
|
+
const Component = getComponent(level ?? 1);
|
|
24
|
+
const { ref } = useRegisterAnchorElement();
|
|
25
|
+
return (_jsxs(Component, { className: cn("group relative", className), ref: registerSidebarAnchor ? ref : undefined, id: id, children: [id && (_jsx("a", { href: `#${id}`, className: "no-underline absolute text-primary -left-[0.8em] pr-2.5 opacity-0 group-hover:opacity-50 hover:!opacity-100 transition-opacity duration-200", "aria-label": `Link to ${id}`, children: "#" })), children] }));
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=Heading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Heading.js","sourceRoot":"","sources":["../../src/app/Heading.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;IACrC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,IAAI,CAAC;QACd;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAUF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,EAAE,EACF,SAAS,EACT,qBAAqB,GACR,EAAE,EAAE;IACjB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,EAAE,GAAG,wBAAwB,EAAE,CAAC;IAE3C,OAAO,CACL,MAAC,SAAS,IACR,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAC1C,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAC5C,EAAE,EAAE,EAAE,aAEL,EAAE,IAAI,CACL,YACE,IAAI,EAAE,IAAI,EAAE,EAAE,EACd,SAAS,EAAC,6IAA6I,gBAC3I,WAAW,EAAE,EAAE,kBAGzB,CACL,EACA,QAAQ,IACC,CACb,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/app/app.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import "./main.css";
|
|
3
|
+
import DevPortal from "./DevPortal.js";
|
|
4
|
+
import { markdownPlugin } from "./plugins/markdown/index.js";
|
|
5
|
+
import { openApiPlugin } from "./plugins/openapi/index.js";
|
|
6
|
+
import config from "./config.js";
|
|
7
|
+
// async function getAuthProvider(authConfig: AuthenticationConfig) {
|
|
8
|
+
// if (authConfig.type === "clerk") {
|
|
9
|
+
// const clerkProvider = import("./authentication/clerk.js");
|
|
10
|
+
// return clerkProvider(authConfig);
|
|
11
|
+
// } else {
|
|
12
|
+
// throw new Error(
|
|
13
|
+
// `The authentication type "${authConfig.type}" is not supported.`,
|
|
14
|
+
// );
|
|
15
|
+
// }
|
|
16
|
+
// //openIdAuth({
|
|
17
|
+
// // clientId: oauth.client_id,
|
|
18
|
+
// // authorizationEndpoint: oauth.authorize_url,
|
|
19
|
+
// // tokenEndpoint: oauth.token_fetch_url,
|
|
20
|
+
// // })
|
|
21
|
+
// }
|
|
22
|
+
export default function App() {
|
|
23
|
+
return (_jsx(DevPortal, { meta: {
|
|
24
|
+
headerTitle: config?.ui?.headerTitle ?? "Developer Portal",
|
|
25
|
+
pageTitle: config?.ui?.pageTitle ?? "%s | Dev Portal",
|
|
26
|
+
logo: config?.ui?.logo ?? "https://cdn.zuplo.com/www/favicon.png",
|
|
27
|
+
favicon: config?.ui?.metadata?.favicon ??
|
|
28
|
+
"https://cdn.zuplo.com/www/favicon.png",
|
|
29
|
+
}, navigation: config.navigation ?? [],
|
|
30
|
+
// authentication={
|
|
31
|
+
// config.authentication
|
|
32
|
+
// ? getAuthProvider(config.authentication)
|
|
33
|
+
// : undefined
|
|
34
|
+
// }
|
|
35
|
+
plugins: [
|
|
36
|
+
...(config.docs
|
|
37
|
+
? Array.isArray(config.docs)
|
|
38
|
+
? config.docs
|
|
39
|
+
: [config.docs]
|
|
40
|
+
: []).map((docs) => markdownPlugin({
|
|
41
|
+
markdownFiles: docs?.files ?? {},
|
|
42
|
+
})),
|
|
43
|
+
...(config.apis
|
|
44
|
+
? Array.isArray(config.apis)
|
|
45
|
+
? config.apis
|
|
46
|
+
: [config.apis]
|
|
47
|
+
: []).map((api) => openApiPlugin(api)),
|
|
48
|
+
// apiKeyPlugin({
|
|
49
|
+
// // consumerEndpoint:
|
|
50
|
+
// // "https://zudoku-customer-main-b36fa2f.d2.zuplo.dev/v1/developer/api-keys",
|
|
51
|
+
// getConsumers: async (ctx) => {
|
|
52
|
+
// const accessToken = await ctx.authentication?.getToken?.(ctx);
|
|
53
|
+
// if (!accessToken) {
|
|
54
|
+
// return;
|
|
55
|
+
// }
|
|
56
|
+
// const consumers = await fetch(
|
|
57
|
+
// "https://zudoku-customer-main-b36fa2f.d2.zuplo.dev/v1/developer/api-keys",
|
|
58
|
+
// {
|
|
59
|
+
// headers: {
|
|
60
|
+
// Authorization: `Bearer ${accessToken}`,
|
|
61
|
+
// },
|
|
62
|
+
// },
|
|
63
|
+
// );
|
|
64
|
+
// return { consumers: [await consumers.json()] };
|
|
65
|
+
// },
|
|
66
|
+
// }),
|
|
67
|
+
] }));
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app/app.tsx"],"names":[],"mappings":";AAAA,OAAO,YAAY,CAAC;AAEpB,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,qEAAqE;AACrE,uCAAuC;AACvC,iEAAiE;AACjE,wCAAwC;AACxC,aAAa;AACb,uBAAuB;AACvB,0EAA0E;AAC1E,SAAS;AACT,MAAM;AACN,mBAAmB;AACnB,oCAAoC;AACpC,qDAAqD;AACrD,+CAA+C;AAC/C,UAAU;AACV,IAAI;AAEJ,MAAM,CAAC,OAAO,UAAU,GAAG;IACzB,OAAO,CACL,KAAC,SAAS,IACR,IAAI,EAAE;YACJ,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,IAAI,kBAAkB;YAC1D,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,IAAI,iBAAiB;YACrD,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,uCAAuC;YACjE,OAAO,EACL,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO;gBAC7B,uCAAuC;SAC1C,EACD,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QACnC,mBAAmB;QACnB,0BAA0B;QAC1B,+CAA+C;QAC/C,kBAAkB;QAClB,IAAI;QACJ,OAAO,EAAE;YACP,GAAG,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAC1B,CAAC,CAAC,MAAM,CAAC,IAAI;oBACb,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,CAAC,CAAC,EAAE,CACL,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACb,cAAc,CAAC;gBACb,aAAa,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;aACjC,CAAC,CACH;YACD,GAAG,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAC1B,CAAC,CAAC,MAAM,CAAC,IAAI;oBACb,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,CAAC,CAAC,EAAE,CACL,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAElC,iBAAiB;YACjB,yBAAyB;YACzB,oFAAoF;YACpF,mCAAmC;YACnC,qEAAqE;YAErE,0BAA0B;YAC1B,gBAAgB;YAChB,QAAQ;YAER,qCAAqC;YACrC,mFAAmF;YACnF,UAAU;YACV,qBAAqB;YACrB,oDAAoD;YACpD,aAAa;YACb,WAAW;YACX,SAAS;YAET,sDAAsD;YACtD,OAAO;YACP,MAAM;SACP,GACD,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DevPortalContext } from "../core/DevPortalContext.js";
|
|
2
|
+
export interface AuthProvider {
|
|
3
|
+
initialize(context: DevPortalContext): Promise<unknown>;
|
|
4
|
+
login(context: DevPortalContext): Promise<unknown>;
|
|
5
|
+
getToken?: (context: DevPortalContext) => Promise<string | undefined>;
|
|
6
|
+
handleAuthenticationResponse?: (path: Path, context: DevPortalContext) => Promise<unknown>;
|
|
7
|
+
signOut(context: DevPortalContext): void;
|
|
8
|
+
}
|
|
9
|
+
export type Path = {
|
|
10
|
+
pathname: string;
|
|
11
|
+
search: string;
|
|
12
|
+
hash: string;
|
|
13
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../../../src/app/authentication/authentication.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Clerk } from "@clerk/clerk-js";
|
|
2
|
+
const clerkProvider = ({ clerkPubKey, }) => {
|
|
3
|
+
const clerkApi = new Clerk(clerkPubKey);
|
|
4
|
+
const clerkIsLoaded = clerkApi.load({});
|
|
5
|
+
return {
|
|
6
|
+
initialize: async (context) => {
|
|
7
|
+
await clerkIsLoaded;
|
|
8
|
+
if (clerkApi.session) {
|
|
9
|
+
await context.setUserProfile({
|
|
10
|
+
isLoggedIn: true,
|
|
11
|
+
name: clerkApi.session.user.fullName ?? undefined,
|
|
12
|
+
email: clerkApi.session.user.emailAddresses.at(0)?.emailAddress ??
|
|
13
|
+
undefined,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
await context.setUserProfile({
|
|
18
|
+
isLoggedIn: false,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
getToken: async () => {
|
|
23
|
+
await clerkIsLoaded;
|
|
24
|
+
const token = await clerkApi.session?.getToken();
|
|
25
|
+
return token ?? undefined;
|
|
26
|
+
},
|
|
27
|
+
signOut() {
|
|
28
|
+
clerkApi.signOut();
|
|
29
|
+
},
|
|
30
|
+
login: async () => {
|
|
31
|
+
await clerkApi.redirectToSignIn();
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export default clerkProvider;
|
|
36
|
+
//# sourceMappingURL=clerk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clerk.js","sourceRoot":"","sources":["../../../src/app/authentication/clerk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,MAAM,aAAa,GAAG,CAAC,EACrB,WAAW,GAGZ,EAAgB,EAAE;IACjB,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAExC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAExC,OAAO;QACL,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC5B,MAAM,aAAa,CAAC;YAEpB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,OAAO,CAAC,cAAc,CAAC;oBAC3B,UAAU,EAAE,IAAI;oBAChB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS;oBACjD,KAAK,EACH,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY;wBACxD,SAAS;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,CAAC,cAAc,CAAC;oBAC3B,UAAU,EAAE,KAAK;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,MAAM,aAAa,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACjD,OAAO,KAAK,IAAI,SAAS,CAAC;QAC5B,CAAC;QAED,OAAO;YACL,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type AuthProvider } from "./authentication.js";
|
|
2
|
+
export type AuthServerOption = {
|
|
3
|
+
issuer?: string;
|
|
4
|
+
authorizationEndpoint?: string;
|
|
5
|
+
tokenEndpoint?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const openIdAuth: ({ clientId, clientSecret, issuer, authorizationEndpoint, tokenEndpoint, }: {
|
|
8
|
+
clientId: string;
|
|
9
|
+
clientSecret?: string;
|
|
10
|
+
audience?: string;
|
|
11
|
+
} & AuthServerOption) => AuthProvider;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import * as oauth from "oauth4webapi";
|
|
2
|
+
const algorithm = "oauth2";
|
|
3
|
+
const getAuthServerByIssuer = async (issuer) => {
|
|
4
|
+
const authorizationServer = await oauth
|
|
5
|
+
.discoveryRequest(new URL(issuer), { algorithm })
|
|
6
|
+
.then((response) => oauth.processDiscoveryResponse(new URL(issuer), response));
|
|
7
|
+
return authorizationServer;
|
|
8
|
+
};
|
|
9
|
+
const getAuthServer = async ({ issuer, authorizationEndpoint, tokenEndpoint, }) => {
|
|
10
|
+
return issuer
|
|
11
|
+
? await getAuthServerByIssuer(issuer)
|
|
12
|
+
: ({
|
|
13
|
+
issuer: new URL(authorizationEndpoint).origin,
|
|
14
|
+
authorization_endpoint: authorizationEndpoint,
|
|
15
|
+
token_endpoint: tokenEndpoint,
|
|
16
|
+
code_challenge_methods_supported: [],
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
export const openIdAuth = ({ clientId, clientSecret, issuer, authorizationEndpoint, tokenEndpoint, }) => {
|
|
20
|
+
const client = {
|
|
21
|
+
client_id: clientId,
|
|
22
|
+
client_secret: clientSecret,
|
|
23
|
+
token_endpoint_auth_method: "none",
|
|
24
|
+
};
|
|
25
|
+
const redirect_uri = "http://localhost:5173/oauth/callback";
|
|
26
|
+
return {
|
|
27
|
+
initialize() {
|
|
28
|
+
return Promise.resolve();
|
|
29
|
+
},
|
|
30
|
+
signOut() { },
|
|
31
|
+
login: async (context) => {
|
|
32
|
+
const code_challenge_method = "S256";
|
|
33
|
+
const authorizationServer = await getAuthServer({
|
|
34
|
+
issuer,
|
|
35
|
+
authorizationEndpoint,
|
|
36
|
+
tokenEndpoint,
|
|
37
|
+
});
|
|
38
|
+
if (!authorizationServer.authorization_endpoint) {
|
|
39
|
+
throw new Error("No authorization endpoint");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The following MUST be generated for every redirect to the authorization_endpoint. You must store
|
|
43
|
+
* the codeVerifier and nonce in the end-user session such that it can be recovered as the user
|
|
44
|
+
* gets redirected from the authorization server back to your application.
|
|
45
|
+
*/
|
|
46
|
+
const codeVerifier = oauth.generateRandomCodeVerifier();
|
|
47
|
+
const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);
|
|
48
|
+
await context.sessionStorage.set("codeVerifier", codeVerifier);
|
|
49
|
+
// redirect user to as.authorization_endpoint
|
|
50
|
+
const authorizationUrl = new URL(authorizationServer.authorization_endpoint);
|
|
51
|
+
authorizationUrl.searchParams.set("client_id", client.client_id);
|
|
52
|
+
authorizationUrl.searchParams.set("redirect_uri", redirect_uri);
|
|
53
|
+
authorizationUrl.searchParams.set("response_type", "code");
|
|
54
|
+
// authorizationUrl.searchParams.set("scope", "api:read");
|
|
55
|
+
authorizationUrl.searchParams.set("code_challenge", codeChallenge);
|
|
56
|
+
authorizationUrl.searchParams.set("code_challenge_method", code_challenge_method);
|
|
57
|
+
/**
|
|
58
|
+
* We cannot be sure the AS supports PKCE so we're going to use state too. Use of PKCE is
|
|
59
|
+
* backwards compatible even if the AS doesn't support it which is why we're using it regardless.
|
|
60
|
+
*/
|
|
61
|
+
if (authorizationServer.code_challenge_methods_supported?.includes("S256") !== true) {
|
|
62
|
+
const state = oauth.generateRandomState();
|
|
63
|
+
authorizationUrl.searchParams.set("state", state);
|
|
64
|
+
}
|
|
65
|
+
// now redirect the user to authorizationUrl.href
|
|
66
|
+
location.href = authorizationUrl.href;
|
|
67
|
+
},
|
|
68
|
+
handleAuthenticationResponse: async ({ search }, { sessionStorage }) => {
|
|
69
|
+
const searchParams = new URLSearchParams(search);
|
|
70
|
+
const state = searchParams.get("state");
|
|
71
|
+
if (!state) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// one eternity later, the user lands back on the redirect_uri
|
|
75
|
+
// Authorization Code Grant Request & Response
|
|
76
|
+
const codeVerifier = await sessionStorage.get("codeVerifier");
|
|
77
|
+
if (!codeVerifier) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const as = await getAuthServer({
|
|
81
|
+
issuer,
|
|
82
|
+
authorizationEndpoint,
|
|
83
|
+
tokenEndpoint,
|
|
84
|
+
});
|
|
85
|
+
const params = oauth.validateAuthResponse(as, client, searchParams, state);
|
|
86
|
+
if (oauth.isOAuth2Error(params)) {
|
|
87
|
+
console.error("Error Response", params);
|
|
88
|
+
throw new Error(); // Handle OAuth 2.0 redirect error
|
|
89
|
+
}
|
|
90
|
+
const response = await oauth.authorizationCodeGrantRequest(as, client, params, redirect_uri, codeVerifier);
|
|
91
|
+
// @todo do we need to do these
|
|
92
|
+
// const challenges = oauth.parseWwwAuthenticateChallenges(response);
|
|
93
|
+
// if (challenges) {
|
|
94
|
+
// for (const challenge of challenges) {
|
|
95
|
+
// console.error("WWW-Authenticate Challenge", challenge);
|
|
96
|
+
// }
|
|
97
|
+
// throw new Error(); // Handle WWW-Authenticate Challenges as needed
|
|
98
|
+
// }
|
|
99
|
+
const oauthResult = await oauth.processAuthorizationCodeOpenIDResponse(as, client, response);
|
|
100
|
+
if (oauth.isOAuth2Error(oauthResult)) {
|
|
101
|
+
console.error("Error Response", oauthResult);
|
|
102
|
+
throw new Error(oauthResult.error);
|
|
103
|
+
}
|
|
104
|
+
const userInfoResponse = await oauth.userInfoRequest(as, client, oauthResult.access_token);
|
|
105
|
+
const userInfo = await userInfoResponse.json();
|
|
106
|
+
// void storage.setProfile({
|
|
107
|
+
// sub: userInfo.sub,
|
|
108
|
+
// email: userInfo.email,
|
|
109
|
+
// name: userInfo.name,
|
|
110
|
+
// email_verified: userInfo.email_verified ?? false,
|
|
111
|
+
// picture: userInfo.picture,
|
|
112
|
+
// id_token: oauthResult.id_token,
|
|
113
|
+
// access_token: oauthResult.access_token,
|
|
114
|
+
// });
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=openid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openid.js","sourceRoot":"","sources":["../../../src/app/authentication/openid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Link, useLocation } from "react-router-dom";
|
|
3
|
+
/**
|
|
4
|
+
* Link that scrolls to anchor even if the hash is already set in the URL.
|
|
5
|
+
*/
|
|
6
|
+
export const AnchorLink = (props) => {
|
|
7
|
+
const location = useLocation();
|
|
8
|
+
const hash = typeof props.to === "string" ? props.to : props.to.hash;
|
|
9
|
+
const handleClick = (event) => {
|
|
10
|
+
if (!hash?.startsWith("#") || hash !== location.hash)
|
|
11
|
+
return;
|
|
12
|
+
event.preventDefault();
|
|
13
|
+
document.getElementById(hash.slice(1))?.scrollIntoView();
|
|
14
|
+
};
|
|
15
|
+
return _jsx(Link, { onClick: handleClick, ...props });
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=AnchorLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnchorLink.js","sourceRoot":"","sources":["../../../src/app/components/AnchorLink.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAkB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAgB,EAAE,EAAE;IAC7C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC;IAErE,MAAM,WAAW,GAAG,CAAC,KAA0C,EAAE,EAAE;QACjE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI;YAAE,OAAO;QAE7D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3D,CAAC,CAAC;IAEF,OAAO,KAAC,IAAI,IAAC,OAAO,EAAE,WAAW,KAAM,KAAK,GAAI,CAAC;AACnD,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "class-variance-authority";
|
|
3
|
+
export const CategoryHeading = ({ children, className, }) => {
|
|
4
|
+
return (_jsx("div", { className: cx("text-sm font-semibold text-primary mb-2", className), children: children }));
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=CategoryHeading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CategoryHeading.js","sourceRoot":"","sources":["../../../src/app/components/CategoryHeading.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC9B,QAAQ,EACR,SAAS,GAIV,EAAE,EAAE;IACH,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,yCAAyC,EAAE,SAAS,CAAC,YACrE,QAAQ,GACL,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicIcon.js","sourceRoot":"","sources":["../../../src/app/components/DynamicIcon.tsx"],"names":[],"mappings":";AAqDA,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAsC,EAAE,EAAE,CAAC,CACrE,eAAW,CACZ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { MoonStarIcon, SearchIcon, SunIcon } from "lucide-react";
|
|
3
|
+
import { memo } from "react";
|
|
4
|
+
import { useDevPortalState } from "../core/DevPortalContext.js";
|
|
5
|
+
import { TopNavigation } from "./TopNavigation.js";
|
|
6
|
+
import { useDevPortal } from "./context/DevPortalProvider.js";
|
|
7
|
+
import { useTheme } from "./context/ThemeContext.js";
|
|
8
|
+
export const Header = memo(() => {
|
|
9
|
+
const [isDark, toggleTheme] = useTheme();
|
|
10
|
+
const { isLoggedIn, email } = useDevPortalState();
|
|
11
|
+
const { login, logout, meta } = useDevPortal();
|
|
12
|
+
const ThemeIcon = isDark ? MoonStarIcon : SunIcon;
|
|
13
|
+
return (_jsx("header", { className: "fixed top-0 w-full z-10 bg-background/80 backdrop-blur", children: _jsxs("div", { className: "max-w-screen-2xl mx-auto", children: [_jsxs("div", { className: "grid grid-cols-[calc(var(--side-nav-width))_1fr] lg:gap-12 items-center border-b border-border px-12 h-[--top-header-height]", children: [_jsxs("div", { className: "flex items-center gap-3.5", children: [meta?.logo && (_jsx("img", { src: meta.logo, alt: "My Dev Portal", className: "h-10" })), _jsx("span", { className: "font-bold text-2xl text-foreground/85 tracking-wide", children: meta?.headerTitle })] }), _jsxs("div", { className: "grid grid-cols-[--sidecar-grid-cols] items-center gap-8", children: [_jsx("div", { className: "w-full max-w-prose mx-auto", children: _jsxs("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", children: [_jsxs("div", { className: "flex items-center gap-2 flex-grow", children: [_jsx(SearchIcon, { size: 14 }), "Search"] }), _jsx("kbd", { className: "absolute right-[0.3rem] top-[0.3rem] hidden h-5 select-none items-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[11px] font-medium opacity-100 sm:flex", children: "\u2318K" })] }) }), _jsxs("div", { className: "items-center justify-self-end text-sm hidden lg:flex", children: [!isLoggedIn ? (_jsxs("button", { className: "cursor-pointer hover:bg-secondary p-1 px-2 mx-2 rounded", onClick: logout, children: ["Logout ", email ? `(${email})` : null] })) : (_jsx("button", { className: "cursor-pointer hover:bg-secondary p-1 px-2 mx-2 rounded", onClick: login, children: "Login" })), _jsx("button", { className: "cursor-pointer hover:bg-secondary p-2.5 -m-2.5 rounded-full", onClick: toggleTheme, children: _jsx(ThemeIcon, { size: 18 }) })] })] })] }), _jsx(TopNavigation, {})] }) }));
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/app/components/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;IAC9B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAE,CAAC;IACzC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAClD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IAE/C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;IAElD,OAAO,CACL,iBAAQ,SAAS,EAAC,wDAAwD,YACxE,eAAK,SAAS,EAAC,0BAA0B,aACvC,eAAK,SAAS,EAAC,8HAA8H,aAC3I,eAAK,SAAS,EAAC,2BAA2B,aACvC,IAAI,EAAE,IAAI,IAAI,CACb,cAAK,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAC,eAAe,EAAC,SAAS,EAAC,MAAM,GAAG,CAC7D,EACD,eAAM,SAAS,EAAC,qDAAqD,YAClE,IAAI,EAAE,WAAW,GACb,IACH,EACN,eAAK,SAAS,EAAC,yDAAyD,aACtE,cAAK,SAAS,EAAC,4BAA4B,YACzC,kBAAQ,SAAS,EAAC,mMAAmM,aACnN,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,cAEpB,EACN,cAAK,SAAS,EAAC,mLAAmL,wBAE5L,IACC,GACL,EACN,eAAK,SAAS,EAAC,sDAAsD,aAClE,CAAC,UAAU,CAAC,CAAC,CAAC,CACb,kBACE,SAAS,EAAC,yDAAyD,EACnE,OAAO,EAAE,MAAM,wBAEP,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAC5B,CACV,CAAC,CAAC,CAAC,CACF,iBACE,SAAS,EAAC,yDAAyD,EACnE,OAAO,EAAE,KAAK,sBAGP,CACV,EAED,iBACE,SAAS,EAAC,6DAA6D,EACvE,OAAO,EAAE,WAAW,YAEpB,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,GAChB,IACL,IACF,IACF,EACN,KAAC,aAAa,KAAG,IACb,GACC,CACV,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense, useEffect, useRef } from "react";
|
|
3
|
+
import { Outlet, useLocation } from "react-router-dom";
|
|
4
|
+
import { Helmet } from "../core/helmet.js";
|
|
5
|
+
import { useScrollToAnchor } from "../util/useScrollToAnchor.js";
|
|
6
|
+
import { useScrollToTop } from "../util/useScrollToTop.js";
|
|
7
|
+
import { Header } from "./Header.js";
|
|
8
|
+
import { useDevPortal } from "./context/DevPortalProvider.js";
|
|
9
|
+
import { useViewportAnchor } from "./context/ViewportAnchorContext.js";
|
|
10
|
+
import { SideNavigation } from "./navigation/SideNavigation.js";
|
|
11
|
+
import { SideNavigationWrapper } from "./navigation/SideNavigationWrapper.js";
|
|
12
|
+
export const Layout = ({ children }) => {
|
|
13
|
+
const location = useLocation();
|
|
14
|
+
const { setActiveAnchor } = useViewportAnchor();
|
|
15
|
+
const { meta, handleAuthenticationResponse } = useDevPortal();
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
void handleAuthenticationResponse(location);
|
|
18
|
+
}, [handleAuthenticationResponse, location]);
|
|
19
|
+
useScrollToAnchor();
|
|
20
|
+
useScrollToTop();
|
|
21
|
+
const previousLocationPath = useRef(location.pathname);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
// always reset on location change
|
|
24
|
+
if (location.pathname !== previousLocationPath.current) {
|
|
25
|
+
setActiveAnchor("");
|
|
26
|
+
}
|
|
27
|
+
previousLocationPath.current = location.pathname;
|
|
28
|
+
}, [location.pathname, setActiveAnchor]);
|
|
29
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Helmet, { titleTemplate: meta?.pageTitle, children: [_jsx("title", { children: "Home" }), meta?.description && (_jsx("meta", { name: "description", content: meta.description })), meta?.favicon && _jsx("link", { rel: "icon", href: meta.favicon })] }), _jsx(Header, {}), _jsxs("div", { className: "max-w-screen-2xl mx-auto pt-[--header-height] px-10 lg:px-12", children: [_jsx(Suspense, { fallback: _jsx(SideNavigationWrapper, { children: "Loading..." }), children: _jsx(SideNavigation, {}) }), _jsx("main", { className: "dark:border-white/10 lg:overflow-visible translate-x-0 lg:w-[calc(100%-var(--side-nav-width))] lg:translate-x-[--side-nav-width] pl-12", children: children ?? _jsx(Outlet, {}) })] })] }));
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=Layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/app/components/Layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAA4B,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAChD,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,YAAY,EAAE,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7C,iBAAiB,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC;IAEjB,MAAM,oBAAoB,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,kCAAkC;QAClC,IAAI,QAAQ,CAAC,QAAQ,KAAK,oBAAoB,CAAC,OAAO,EAAE,CAAC;YACvD,eAAe,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QACD,oBAAoB,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnD,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAEzC,OAAO,CACL,8BACE,MAAC,MAAM,IAAC,aAAa,EAAE,IAAI,EAAE,SAAS,aACpC,mCAAmB,EAClB,IAAI,EAAE,WAAW,IAAI,CACpB,eAAM,IAAI,EAAC,aAAa,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW,GAAI,CACvD,EACA,IAAI,EAAE,OAAO,IAAI,eAAM,GAAG,EAAC,MAAM,EAAC,IAAI,EAAE,IAAI,CAAC,OAAO,GAAI,IAClD,EACT,KAAC,MAAM,KAAG,EACV,eAAK,SAAS,EAAC,8DAA8D,aAC3E,KAAC,QAAQ,IACP,QAAQ,EAAE,KAAC,qBAAqB,6BAAmC,YAEnE,KAAC,cAAc,KAAG,GACT,EACX,eAAM,SAAS,EAAC,wIAAwI,YACrJ,QAAQ,IAAI,KAAC,MAAM,KAAG,GAClB,IACH,IACL,CACJ,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import ReactMarkdown from "react-markdown";
|
|
3
|
+
import remarkGfm from "remark-gfm";
|
|
4
|
+
import { visit } from "unist-util-visit";
|
|
5
|
+
import { MdxComponents } from "../util/MdxComponents.js";
|
|
6
|
+
// same as in packages/dev-portal/framework/vite.ts
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
const rehypeCodeBlockPlugin = () => (tree) => {
|
|
9
|
+
visit(tree, "element", (node, _index, parent) => {
|
|
10
|
+
if (node.tagName === "code") {
|
|
11
|
+
node.properties.inline = parent?.tagName !== "pre";
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
const remarkPlugins = [remarkGfm];
|
|
16
|
+
const rehypePlugins = [rehypeCodeBlockPlugin];
|
|
17
|
+
// other styles are defined in main.css .prose
|
|
18
|
+
export const ProseClasses = "prose dark:prose-invert prose-neutral";
|
|
19
|
+
export const Markdown = ({ content, className, }) => (_jsx(ReactMarkdown, { remarkPlugins: remarkPlugins, rehypePlugins: rehypePlugins, components: MdxComponents, className: className, children: content }));
|
|
20
|
+
//# sourceMappingURL=Markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../../src/app/components/Markdown.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,mDAAmD;AACnD,8DAA8D;AAC9D,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,CAAC,IAAS,EAAE,EAAE;IAChD,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC9C,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,SAAS,CAAC,CAAC;AAClC,MAAM,aAAa,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAE9C,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG,uCAAuC,CAAC;AAEpE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,EACP,SAAS,GAIV,EAAE,EAAE,CAAC,CACJ,KAAC,aAAa,IACZ,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,aAAa,EACzB,SAAS,EAAE,SAAS,YAEnB,OAAO,GACM,CACjB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type HighlightProps } from "prism-react-renderer";
|
|
2
|
+
type SyntaxHighlightProps = {
|
|
3
|
+
className?: string;
|
|
4
|
+
noBackground?: boolean;
|
|
5
|
+
wrapLines?: boolean;
|
|
6
|
+
copyable?: boolean;
|
|
7
|
+
} & Omit<HighlightProps, "children">;
|
|
8
|
+
export declare const SyntaxHighlight: ({ copyable, ...props }: SyntaxHighlightProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|