zudoku 0.0.0-f40ea27 → 0.0.0-f42e3678
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/app/demo.js +16 -1
- package/dist/app/demo.js.map +1 -1
- package/dist/app/main.js +3 -9
- package/dist/app/main.js.map +1 -1
- package/dist/cli/build/handler.js +9 -1
- package/dist/cli/build/handler.js.map +1 -1
- package/dist/config/config.d.ts +1 -0
- package/dist/config/loader.js +2 -5
- package/dist/config/loader.js.map +1 -1
- package/dist/config/validators/BuildSchema.js +5 -0
- package/dist/config/validators/BuildSchema.js.map +1 -1
- package/dist/config/validators/InputNavigationSchema.d.ts +254 -163
- package/dist/config/validators/InputNavigationSchema.js +4 -4
- package/dist/config/validators/InputNavigationSchema.js.map +1 -1
- package/dist/config/validators/InputNavigationSchema.test-d.js +0 -1
- package/dist/config/validators/InputNavigationSchema.test-d.js.map +1 -1
- package/dist/config/validators/NavigationSchema.js +3 -2
- package/dist/config/validators/NavigationSchema.js.map +1 -1
- package/dist/config/validators/ProtectedRoutesSchema.d.ts +12 -0
- package/dist/config/validators/ProtectedRoutesSchema.js +19 -0
- package/dist/config/validators/ProtectedRoutesSchema.js.map +1 -0
- package/dist/config/validators/icon-types.d.ts +1 -1
- package/dist/config/validators/icon-types.js +16 -0
- package/dist/config/validators/icon-types.js.map +1 -1
- package/dist/config/validators/validate.d.ts +36 -20
- package/dist/config/validators/validate.js +18 -4
- package/dist/config/validators/validate.js.map +1 -1
- package/dist/config/validators/validate.test.js +65 -2
- package/dist/config/validators/validate.test.js.map +1 -1
- package/dist/flat-config.d.ts +8 -6
- package/dist/lib/authentication/authentication.d.ts +2 -0
- package/dist/lib/authentication/components/CallbackHandler.js +11 -9
- package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
- package/dist/lib/authentication/components/OAuthErrorPage.d.ts +3 -0
- package/dist/lib/authentication/components/OAuthErrorPage.js +99 -0
- package/dist/lib/authentication/components/OAuthErrorPage.js.map +1 -0
- package/dist/lib/authentication/components/SignIn.js +4 -3
- package/dist/lib/authentication/components/SignIn.js.map +1 -1
- package/dist/lib/authentication/errors.d.ts +6 -12
- package/dist/lib/authentication/errors.js +2 -1
- package/dist/lib/authentication/errors.js.map +1 -1
- package/dist/lib/authentication/hook.d.ts +1 -0
- package/dist/lib/authentication/hook.js.map +1 -1
- package/dist/lib/authentication/providers/azureb2c.js +4 -2
- package/dist/lib/authentication/providers/azureb2c.js.map +1 -1
- package/dist/lib/authentication/providers/clerk.js +4 -2
- package/dist/lib/authentication/providers/clerk.js.map +1 -1
- package/dist/lib/authentication/providers/openid.d.ts +4 -2
- package/dist/lib/authentication/providers/openid.js +14 -6
- package/dist/lib/authentication/providers/openid.js.map +1 -1
- package/dist/lib/components/Banner.js +1 -1
- package/dist/lib/components/Banner.js.map +1 -1
- package/dist/lib/components/CategoryHeading.js +1 -1
- package/dist/lib/components/CategoryHeading.js.map +1 -1
- package/dist/lib/components/Header.js +1 -1
- package/dist/lib/components/Header.js.map +1 -1
- package/dist/lib/components/Heading.js +1 -1
- package/dist/lib/components/Heading.js.map +1 -1
- package/dist/lib/components/Markdown.js +2 -2
- package/dist/lib/components/Markdown.js.map +1 -1
- package/dist/lib/components/MobileTopNavigation.js +11 -6
- package/dist/lib/components/MobileTopNavigation.js.map +1 -1
- package/dist/lib/components/NotFoundPage.js +1 -1
- package/dist/lib/components/NotFoundPage.js.map +1 -1
- package/dist/lib/components/Pagination.js +1 -1
- package/dist/lib/components/Pagination.js.map +1 -1
- package/dist/lib/components/StatusPage.js +4 -0
- package/dist/lib/components/StatusPage.js.map +1 -1
- package/dist/lib/components/TopNavigation.d.ts +5 -0
- package/dist/lib/components/TopNavigation.js +20 -15
- package/dist/lib/components/TopNavigation.js.map +1 -1
- package/dist/lib/components/Typography.d.ts +1 -1
- package/dist/lib/components/Typography.js +1 -1
- package/dist/lib/components/Typography.js.map +1 -1
- package/dist/lib/components/context/ZudokuContext.js +21 -13
- package/dist/lib/components/context/ZudokuContext.js.map +1 -1
- package/dist/lib/components/navigation/NavigationItem.d.ts +1 -1
- package/dist/lib/components/navigation/NavigationItem.js +8 -1
- package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
- package/dist/lib/components/navigation/NavigationWrapper.js +1 -1
- package/dist/lib/components/navigation/NavigationWrapper.js.map +1 -1
- package/dist/lib/components/navigation/utils.d.ts +3 -1
- package/dist/lib/components/navigation/utils.js +6 -3
- package/dist/lib/components/navigation/utils.js.map +1 -1
- package/dist/lib/core/RouteGuard.js +9 -9
- package/dist/lib/core/RouteGuard.js.map +1 -1
- package/dist/lib/core/ZudokuContext.d.ts +5 -2
- package/dist/lib/core/ZudokuContext.js +27 -2
- package/dist/lib/core/ZudokuContext.js.map +1 -1
- package/dist/lib/core/plugins.d.ts +2 -1
- package/dist/lib/core/plugins.js.map +1 -1
- package/dist/lib/errors/ErrorAlert.js +1 -1
- package/dist/lib/errors/ErrorAlert.js.map +1 -1
- package/dist/lib/plugins/api-keys/CreateApiKey.js +7 -3
- package/dist/lib/plugins/api-keys/CreateApiKey.js.map +1 -1
- package/dist/lib/plugins/api-keys/SettingsApiKeys.js +6 -4
- package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
- package/dist/lib/plugins/api-keys/index.d.ts +1 -0
- package/dist/lib/plugins/api-keys/index.js +4 -8
- package/dist/lib/plugins/api-keys/index.js.map +1 -1
- package/dist/lib/plugins/markdown/MdxPage.js +4 -3
- package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
- package/dist/lib/plugins/openapi/OperationList.js +2 -1
- package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
- package/dist/lib/plugins/openapi/Sidecar.js +1 -1
- package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
- package/dist/lib/plugins/openapi/SidecarExamples.js +1 -1
- package/dist/lib/plugins/openapi/SidecarExamples.js.map +1 -1
- package/dist/lib/plugins/openapi/graphql/gql.d.ts +1 -1
- package/dist/lib/plugins/openapi/graphql/gql.js +1 -1
- package/dist/lib/plugins/openapi/graphql/gql.js.map +1 -1
- package/dist/lib/plugins/openapi/graphql/graphql.d.ts +1 -0
- package/dist/lib/plugins/openapi/graphql/graphql.js +1 -0
- package/dist/lib/plugins/openapi/graphql/graphql.js.map +1 -1
- package/dist/lib/plugins/openapi/index.js +43 -11
- package/dist/lib/plugins/openapi/index.js.map +1 -1
- package/dist/lib/plugins/openapi/playground/PathParams.js +1 -1
- package/dist/lib/plugins/openapi/playground/PathParams.js.map +1 -1
- package/dist/lib/plugins/openapi/playground/Playground.js +4 -2
- package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
- package/dist/lib/plugins/search-inkeep/index.d.ts +5 -22
- package/dist/lib/plugins/search-inkeep/index.js +35 -29
- package/dist/lib/plugins/search-inkeep/index.js.map +1 -1
- package/dist/lib/plugins/search-inkeep/inkeep.d.ts +5 -21
- package/dist/lib/plugins/search-inkeep/inkeep.js +10 -19
- package/dist/lib/plugins/search-inkeep/inkeep.js.map +1 -1
- package/dist/lib/plugins/search-pagefind/PagefindSearch.js +1 -1
- package/dist/lib/plugins/search-pagefind/PagefindSearch.js.map +1 -1
- package/dist/lib/plugins/search-pagefind/ResultList.d.ts +1 -1
- package/dist/lib/plugins/search-pagefind/ResultList.js +12 -5
- package/dist/lib/plugins/search-pagefind/ResultList.js.map +1 -1
- package/dist/lib/ui/ActionButton.js +1 -1
- package/dist/lib/ui/ActionButton.js.map +1 -1
- package/dist/lib/ui/Alert.d.ts +1 -1
- package/dist/lib/ui/Badge.d.ts +1 -1
- package/dist/lib/ui/Button.d.ts +2 -2
- package/dist/lib/ui/CodeBlock.js +1 -1
- package/dist/lib/ui/CodeBlock.js.map +1 -1
- package/dist/lib/ui/Command.d.ts +1 -1
- package/dist/lib/ui/EmbeddedCodeBlock.js +1 -1
- package/dist/lib/ui/EmbeddedCodeBlock.js.map +1 -1
- package/dist/lib/util/invariant.d.ts +6 -5
- package/dist/lib/util/invariant.js +1 -1
- package/dist/lib/util/invariant.js.map +1 -1
- package/dist/vite/build.js +7 -1
- package/dist/vite/build.js.map +1 -1
- package/dist/vite/dev-server.js +9 -1
- package/dist/vite/dev-server.js.map +1 -1
- package/dist/vite/mdx/remark-last-modified.js +1 -28
- package/dist/vite/mdx/remark-last-modified.js.map +1 -1
- package/dist/vite/plugin-docs.js +20 -13
- package/dist/vite/plugin-docs.js.map +1 -1
- package/dist/vite/plugin-mdx.js +2 -3
- package/dist/vite/plugin-mdx.js.map +1 -1
- package/dist/vite/plugin-theme.js +88 -49
- package/dist/vite/plugin-theme.js.map +1 -1
- package/dist/vite/plugin-theme.test.js +25 -4
- package/dist/vite/plugin-theme.test.js.map +1 -1
- package/dist/vite/prerender/worker.js +5 -1
- package/dist/vite/prerender/worker.js.map +1 -1
- package/dist/vite/shadcn-registry.d.ts +8 -8
- package/lib/{Button-BE9IVkWV.js → Button-B3o-2Xdf.js} +2 -2
- package/lib/{Button-BE9IVkWV.js.map → Button-B3o-2Xdf.js.map} +1 -1
- package/lib/{Card-DPhGbYUM.js → Card-CMDQUPM4.js} +2 -2
- package/lib/{Card-DPhGbYUM.js.map → Card-CMDQUPM4.js.map} +1 -1
- package/lib/ClientOnly-E7hGysn1.js.map +1 -1
- package/lib/{CodeBlock-DAKxs_Tu.js → CodeBlock-B-G0eKtw.js} +3 -3
- package/lib/{CodeBlock-DAKxs_Tu.js.map → CodeBlock-B-G0eKtw.js.map} +1 -1
- package/lib/{Command-xsbs2uhf.js → Command-BYukybsa.js} +3 -3
- package/lib/{Command-xsbs2uhf.js.map → Command-BYukybsa.js.map} +1 -1
- package/lib/{Dialog-CiIdyz6a.js → Dialog-u9Uz9sTt.js} +5 -5
- package/lib/{Dialog-CiIdyz6a.js.map → Dialog-u9Uz9sTt.js.map} +1 -1
- package/lib/{Drawer-BzkOKwgC.js → Drawer-DJ05s2pH.js} +86 -86
- package/lib/{Drawer-BzkOKwgC.js.map → Drawer-DJ05s2pH.js.map} +1 -1
- package/lib/{MdxPage-swXPJ0gf.js → MdxPage-Bsko6_kb.js} +34 -34
- package/lib/MdxPage-Bsko6_kb.js.map +1 -0
- package/lib/OAuthErrorPage-DJzGiIBt.js +150 -0
- package/lib/OAuthErrorPage-DJzGiIBt.js.map +1 -0
- package/lib/{OasProvider-CDAM3TB1.js → OasProvider-DQQRt3oS.js} +3 -3
- package/lib/{OasProvider-CDAM3TB1.js.map → OasProvider-DQQRt3oS.js.map} +1 -1
- package/lib/{OperationList-C9Hb9ql8.js → OperationList-DpmkHf26.js} +212 -210
- package/lib/OperationList-DpmkHf26.js.map +1 -0
- package/lib/{Pagination-VGlgeCmS.js → Pagination-kqFNgtnI.js} +10 -9
- package/lib/Pagination-kqFNgtnI.js.map +1 -0
- package/lib/{RouteGuard-CbKd7_9h.js → RouteGuard-0wPUKdxJ.js} +166 -165
- package/lib/{RouteGuard-CbKd7_9h.js.map → RouteGuard-0wPUKdxJ.js.map} +1 -1
- package/lib/{SchemaList-BAbh1BXO.js → SchemaList-DS-pMd6B.js} +9 -9
- package/lib/{SchemaList-BAbh1BXO.js.map → SchemaList-DS-pMd6B.js.map} +1 -1
- package/lib/{SchemaView-C2Io712T.js → SchemaView-BnN6WHjw.js} +6 -6
- package/lib/{SchemaView-C2Io712T.js.map → SchemaView-BnN6WHjw.js.map} +1 -1
- package/lib/Select-BmTTKNPp.js +273 -0
- package/lib/Select-BmTTKNPp.js.map +1 -0
- package/lib/SignUp-BwOSCD-6.js +56 -0
- package/lib/SignUp-BwOSCD-6.js.map +1 -0
- package/lib/{Slot-DwZlQ-vX.js → Slot-DAyXieeZ.js} +1634 -1643
- package/lib/Slot-DAyXieeZ.js.map +1 -0
- package/lib/Spinner-mNLZ6awP.js.map +1 -1
- package/lib/{SyntaxHighlight-CrjhGEwT.js → SyntaxHighlight-BMKR4pl6.js} +757 -757
- package/lib/SyntaxHighlight-BMKR4pl6.js.map +1 -0
- package/lib/{Toc-WCmwFkX-.js → Toc-BKDRCQzU.js} +3 -3
- package/lib/{Toc-WCmwFkX-.js.map → Toc-BKDRCQzU.js.map} +1 -1
- package/lib/ZudokuContext-CLl5w57E.js +1278 -0
- package/lib/ZudokuContext-CLl5w57E.js.map +1 -0
- package/lib/{chunk-DQRVZFIR-DHK7_Ilc.js → chunk-QMGIS6GS-CEOk3lro.js} +3 -3
- package/lib/chunk-QMGIS6GS-CEOk3lro.js.map +1 -0
- package/lib/{circular-B42RaanD.js → circular-8GWQDvCW.js} +2 -2
- package/lib/{circular-B42RaanD.js.map → circular-8GWQDvCW.js.map} +1 -1
- package/lib/{cn-wvCW-ho6.js → cn-dYga0KKN.js} +2 -2
- package/lib/cn-dYga0KKN.js.map +1 -0
- package/lib/{createServer-BKFsRuuk.js → createServer-BsezSzvV.js} +3398 -3552
- package/lib/createServer-BsezSzvV.js.map +1 -0
- package/lib/errors-Cs7hKmdL.js +45 -0
- package/lib/errors-Cs7hKmdL.js.map +1 -0
- package/lib/hook-DbUCLQNg.js +247 -0
- package/lib/hook-DbUCLQNg.js.map +1 -0
- package/lib/index-A5Qdwj1B.js +4081 -0
- package/lib/index-A5Qdwj1B.js.map +1 -0
- package/lib/{index-B6Re5_cx.js → index-Bg7Js3jB.js} +873 -951
- package/lib/index-Bg7Js3jB.js.map +1 -0
- package/lib/{index-CcV90rin.js → index-BkW9tJ6j.js} +2 -2
- package/lib/{index-CcV90rin.js.map → index-BkW9tJ6j.js.map} +1 -1
- package/lib/index-Bm35Tkgf.js +107 -0
- package/lib/index-Bm35Tkgf.js.map +1 -0
- package/lib/index-CrcNWbel.js.map +1 -1
- package/lib/index-DI5SPFK9.js.map +1 -1
- package/lib/index-DmNq2fbN.js.map +1 -1
- package/lib/index.esm-CdzlRw50.js +1254 -0
- package/lib/index.esm-CdzlRw50.js.map +1 -0
- package/lib/{invariant-DAFpPywt.js → invariant-Bm-FVUQE.js} +2 -6
- package/lib/invariant-Bm-FVUQE.js.map +1 -0
- package/lib/jsx-runtime-C5mzlN2N.js.map +1 -1
- package/lib/processors/removeExtensions.js.map +1 -1
- package/lib/processors/removeParameters.js.map +1 -1
- package/lib/processors/removePaths.js.map +1 -1
- package/lib/processors/traverse.js.map +1 -1
- package/lib/ui/Accordion.js +1 -1
- package/lib/ui/Accordion.js.map +1 -1
- package/lib/ui/ActionButton.js +10 -10
- package/lib/ui/ActionButton.js.map +1 -1
- package/lib/ui/Alert.js +1 -1
- package/lib/ui/Alert.js.map +1 -1
- package/lib/ui/AlertDialog.js +1 -1
- package/lib/ui/AlertDialog.js.map +1 -1
- package/lib/ui/Badge.js +1 -1
- package/lib/ui/Badge.js.map +1 -1
- package/lib/ui/Breadcrumb.js +1 -1
- package/lib/ui/Breadcrumb.js.map +1 -1
- package/lib/ui/Button.js +1 -1
- package/lib/ui/Button.js.map +1 -1
- package/lib/ui/Callout.js +1 -1
- package/lib/ui/Callout.js.map +1 -1
- package/lib/ui/Card.js +1 -1
- package/lib/ui/Card.js.map +1 -1
- package/lib/ui/Carousel.js +1 -1
- package/lib/ui/Carousel.js.map +1 -1
- package/lib/ui/Checkbox.js +1 -1
- package/lib/ui/Checkbox.js.map +1 -1
- package/lib/ui/CodeBlock.js +2 -2
- package/lib/ui/Command.js +2 -2
- package/lib/ui/Command.js.map +1 -1
- package/lib/ui/Dialog.js +1 -1
- package/lib/ui/Dialog.js.map +1 -1
- package/lib/ui/Drawer.js +2 -2
- package/lib/ui/DropdownMenu.js +1 -1
- package/lib/ui/DropdownMenu.js.map +1 -1
- package/lib/ui/EmbeddedCodeBlock.js +2 -2
- package/lib/ui/EmbeddedCodeBlock.js.map +1 -1
- package/lib/ui/Form.js +2 -2
- package/lib/ui/Form.js.map +1 -1
- package/lib/ui/HoverCard.js +1 -1
- package/lib/ui/HoverCard.js.map +1 -1
- package/lib/ui/Input.js +1 -1
- package/lib/ui/Input.js.map +1 -1
- package/lib/ui/Label.js +1 -1
- package/lib/ui/Label.js.map +1 -1
- package/lib/ui/Pagination.js +1 -1
- package/lib/ui/Pagination.js.map +1 -1
- package/lib/ui/Popover.js +1 -1
- package/lib/ui/Popover.js.map +1 -1
- package/lib/ui/Progress.js +1 -1
- package/lib/ui/Progress.js.map +1 -1
- package/lib/ui/RadioGroup.js +1 -1
- package/lib/ui/RadioGroup.js.map +1 -1
- package/lib/ui/ScrollArea.js +1 -1
- package/lib/ui/ScrollArea.js.map +1 -1
- package/lib/ui/Select.js +1 -1
- package/lib/ui/Select.js.map +1 -1
- package/lib/ui/Skeleton.js +1 -1
- package/lib/ui/Skeleton.js.map +1 -1
- package/lib/ui/Slider.js +1 -1
- package/lib/ui/Slider.js.map +1 -1
- package/lib/ui/Stepper.js.map +1 -1
- package/lib/ui/Switch.js +1 -1
- package/lib/ui/Switch.js.map +1 -1
- package/lib/ui/SyntaxHighlight.js +4 -4
- package/lib/ui/Tabs.js +1 -1
- package/lib/ui/Tabs.js.map +1 -1
- package/lib/ui/Textarea.js +1 -1
- package/lib/ui/Textarea.js.map +1 -1
- package/lib/ui/Toggle.js +1 -1
- package/lib/ui/Toggle.js.map +1 -1
- package/lib/ui/ToggleGroup.js +1 -1
- package/lib/ui/ToggleGroup.js.map +1 -1
- package/lib/ui/Tooltip.js +1 -1
- package/lib/ui/Tooltip.js.map +1 -1
- package/lib/ui/util.js +1 -1
- package/lib/{useExposedProps-BIYjecPD.js → useExposedProps-KcgXHKeE.js} +2 -2
- package/lib/{useExposedProps-BIYjecPD.js.map → useExposedProps-KcgXHKeE.js.map} +1 -1
- package/lib/zudoku.auth-auth0.js +1 -1
- package/lib/zudoku.auth-auth0.js.map +1 -1
- package/lib/zudoku.auth-azureb2c.js +46 -9883
- package/lib/zudoku.auth-azureb2c.js.map +1 -1
- package/lib/zudoku.auth-clerk.js +25 -22
- package/lib/zudoku.auth-clerk.js.map +1 -1
- package/lib/zudoku.auth-openid.js +249 -231
- package/lib/zudoku.auth-openid.js.map +1 -1
- package/lib/zudoku.auth-supabase.js +97 -0
- package/lib/zudoku.auth-supabase.js.map +1 -0
- package/lib/zudoku.components.js +30 -29
- package/lib/zudoku.components.js.map +1 -1
- package/lib/zudoku.hooks.js +17 -16
- package/lib/zudoku.hooks.js.map +1 -1
- package/lib/zudoku.icons.js.map +1 -1
- package/lib/zudoku.plugin-api-catalog.js +26 -25
- package/lib/zudoku.plugin-api-catalog.js.map +1 -1
- package/lib/zudoku.plugin-api-keys.js +428 -299
- package/lib/zudoku.plugin-api-keys.js.map +1 -1
- package/lib/zudoku.plugin-custom-pages.js +1 -1
- package/lib/zudoku.plugin-custom-pages.js.map +1 -1
- package/lib/zudoku.plugin-markdown.js +1 -1
- package/lib/zudoku.plugin-markdown.js.map +1 -1
- package/lib/zudoku.plugin-openapi.js +7 -6
- package/lib/zudoku.plugin-openapi.js.map +1 -1
- package/lib/zudoku.plugin-redirect.js +1 -1
- package/lib/zudoku.plugin-redirect.js.map +1 -1
- package/lib/zudoku.plugin-search-inkeep.js +54 -57
- package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
- package/lib/zudoku.plugin-search-pagefind.js +123 -118
- package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
- package/lib/zudoku.plugins.js.map +1 -1
- package/package.json +34 -33
- package/src/app/demo.tsx +19 -2
- package/src/app/main.css +26 -5
- package/src/app/main.tsx +6 -14
- package/src/lib/authentication/authentication.ts +2 -2
- package/src/lib/authentication/components/CallbackHandler.tsx +22 -15
- package/src/lib/authentication/components/OAuthErrorPage.tsx +171 -0
- package/src/lib/authentication/components/SignIn.tsx +5 -12
- package/src/lib/authentication/errors.ts +27 -13
- package/src/lib/authentication/hook.ts +2 -0
- package/src/lib/authentication/providers/azureb2c.tsx +8 -3
- package/src/lib/authentication/providers/clerk.tsx +4 -1
- package/src/lib/authentication/providers/openid.tsx +30 -5
- package/src/lib/components/Banner.tsx +0 -1
- package/src/lib/components/CategoryHeading.tsx +4 -1
- package/src/lib/components/Header.tsx +5 -2
- package/src/lib/components/Heading.tsx +1 -1
- package/src/lib/components/Markdown.tsx +3 -3
- package/src/lib/components/MobileTopNavigation.tsx +60 -8
- package/src/lib/components/NotFoundPage.tsx +3 -2
- package/src/lib/components/Pagination.tsx +1 -0
- package/src/lib/components/StatusPage.tsx +5 -0
- package/src/lib/components/TopNavigation.tsx +34 -18
- package/src/lib/components/Typography.tsx +1 -1
- package/src/lib/components/context/ZudokuContext.ts +25 -18
- package/src/lib/components/navigation/NavigationItem.tsx +9 -1
- package/src/lib/components/navigation/NavigationWrapper.tsx +4 -1
- package/src/lib/components/navigation/utils.ts +9 -3
- package/src/lib/core/RouteGuard.tsx +13 -13
- package/src/lib/core/ZudokuContext.ts +40 -5
- package/src/lib/core/plugins.ts +2 -1
- package/src/lib/errors/ErrorAlert.tsx +5 -7
- package/src/lib/plugins/api-keys/CreateApiKey.tsx +12 -1
- package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +37 -13
- package/src/lib/plugins/api-keys/index.tsx +8 -9
- package/src/lib/plugins/markdown/MdxPage.tsx +4 -3
- package/src/lib/plugins/openapi/OperationList.tsx +4 -2
- package/src/lib/plugins/openapi/Sidecar.tsx +1 -1
- package/src/lib/plugins/openapi/SidecarExamples.tsx +1 -1
- package/src/lib/plugins/openapi/graphql/gql.ts +3 -3
- package/src/lib/plugins/openapi/graphql/graphql.ts +2 -0
- package/src/lib/plugins/openapi/index.tsx +67 -17
- package/src/lib/plugins/openapi/playground/PathParams.tsx +1 -1
- package/src/lib/plugins/openapi/playground/Playground.tsx +8 -2
- package/src/lib/plugins/search-inkeep/index.tsx +54 -58
- package/src/lib/plugins/search-inkeep/inkeep.ts +19 -21
- package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +1 -0
- package/src/lib/plugins/search-pagefind/ResultList.tsx +13 -4
- package/src/lib/ui/ActionButton.tsx +3 -1
- package/src/lib/ui/Alert.tsx +1 -1
- package/src/lib/ui/CodeBlock.tsx +1 -1
- package/src/lib/ui/EmbeddedCodeBlock.tsx +1 -1
- package/src/lib/util/invariant.ts +7 -5
- package/lib/Alert-CT_ViLrJ.js +0 -161
- package/lib/Alert-CT_ViLrJ.js.map +0 -1
- package/lib/MdxPage-swXPJ0gf.js.map +0 -1
- package/lib/OperationList-C9Hb9ql8.js.map +0 -1
- package/lib/Pagination-VGlgeCmS.js.map +0 -1
- package/lib/SignUp-5RUdVhnq.js +0 -63
- package/lib/SignUp-5RUdVhnq.js.map +0 -1
- package/lib/Slot-DwZlQ-vX.js.map +0 -1
- package/lib/SyntaxHighlight-CrjhGEwT.js.map +0 -1
- package/lib/chunk-DQRVZFIR-DHK7_Ilc.js.map +0 -1
- package/lib/clerk-BDZ31hjU.js +0 -25190
- package/lib/clerk-BDZ31hjU.js.map +0 -1
- package/lib/cn-wvCW-ho6.js.map +0 -1
- package/lib/createServer-BKFsRuuk.js.map +0 -1
- package/lib/errors-CF2X_x5o.js +0 -78
- package/lib/errors-CF2X_x5o.js.map +0 -1
- package/lib/hook-Bd0yS8M0.js +0 -1503
- package/lib/hook-Bd0yS8M0.js.map +0 -1
- package/lib/index-B6Re5_cx.js.map +0 -1
- package/lib/index-CLy1XyH0.js +0 -3919
- package/lib/index-CLy1XyH0.js.map +0 -1
- package/lib/index-ClhS5TxS.js +0 -107
- package/lib/index-ClhS5TxS.js.map +0 -1
- package/lib/index.esm-Cp4wkyud.js +0 -1236
- package/lib/index.esm-Cp4wkyud.js.map +0 -1
- package/lib/invariant-DAFpPywt.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logger from "loglevel";
|
|
2
2
|
import * as oauth from "oauth4webapi";
|
|
3
|
+
import { ErrorBoundary } from "react-error-boundary";
|
|
3
4
|
import { type OpenIDAuthenticationConfig } from "../../../config/config.js";
|
|
4
5
|
import { ClientOnly } from "../../components/ClientOnly.js";
|
|
5
6
|
import { joinUrl } from "../../util/joinUrl.js";
|
|
@@ -9,6 +10,7 @@ import {
|
|
|
9
10
|
} from "../authentication.js";
|
|
10
11
|
import { CoreAuthenticationPlugin } from "../AuthenticationPlugin.js";
|
|
11
12
|
import { CallbackHandler } from "../components/CallbackHandler.js";
|
|
13
|
+
import { OAuthErrorPage } from "../components/OAuthErrorPage.js";
|
|
12
14
|
import { AuthorizationError, OAuthAuthorizationError } from "../errors.js";
|
|
13
15
|
import { useAuthState, type UserProfile } from "../state.js";
|
|
14
16
|
|
|
@@ -113,25 +115,41 @@ export class OpenIDAuthenticationProvider
|
|
|
113
115
|
});
|
|
114
116
|
}
|
|
115
117
|
|
|
116
|
-
async signUp({
|
|
118
|
+
async signUp({
|
|
119
|
+
redirectTo,
|
|
120
|
+
replace = false,
|
|
121
|
+
}: {
|
|
122
|
+
redirectTo?: string;
|
|
123
|
+
replace?: boolean;
|
|
124
|
+
} = {}) {
|
|
117
125
|
return this.authorize({
|
|
118
126
|
redirectTo: this.redirectToAfterSignUp ?? redirectTo ?? "/",
|
|
127
|
+
replace,
|
|
119
128
|
isSignUp: true,
|
|
120
129
|
});
|
|
121
130
|
}
|
|
122
131
|
|
|
123
|
-
async signIn({
|
|
132
|
+
async signIn({
|
|
133
|
+
redirectTo,
|
|
134
|
+
replace = false,
|
|
135
|
+
}: {
|
|
136
|
+
redirectTo?: string;
|
|
137
|
+
replace?: boolean;
|
|
138
|
+
} = {}) {
|
|
124
139
|
return this.authorize({
|
|
125
140
|
redirectTo: this.redirectToAfterSignIn ?? redirectTo ?? "/",
|
|
141
|
+
replace,
|
|
126
142
|
});
|
|
127
143
|
}
|
|
128
144
|
|
|
129
145
|
private async authorize({
|
|
130
146
|
redirectTo,
|
|
131
147
|
isSignUp = false,
|
|
148
|
+
replace = false,
|
|
132
149
|
}: {
|
|
133
150
|
redirectTo: string;
|
|
134
151
|
isSignUp?: boolean;
|
|
152
|
+
replace?: boolean;
|
|
135
153
|
}): Promise<void> {
|
|
136
154
|
const code_challenge_method = "S256";
|
|
137
155
|
const authorizationServer = await this.getAuthServer();
|
|
@@ -187,8 +205,11 @@ export class OpenIDAuthenticationProvider
|
|
|
187
205
|
sessionStorage.setItem(STATE_KEY, state);
|
|
188
206
|
authorizationUrl.searchParams.set("state", state);
|
|
189
207
|
|
|
190
|
-
|
|
191
|
-
|
|
208
|
+
if (replace) {
|
|
209
|
+
location.replace(authorizationUrl.href);
|
|
210
|
+
} else {
|
|
211
|
+
location.href = authorizationUrl.href;
|
|
212
|
+
}
|
|
192
213
|
}
|
|
193
214
|
|
|
194
215
|
async getAccessToken(): Promise<string> {
|
|
@@ -423,7 +444,11 @@ export class OpenIDAuthenticationProvider
|
|
|
423
444
|
path: OPENID_CALLBACK_PATH,
|
|
424
445
|
element: (
|
|
425
446
|
<ClientOnly>
|
|
426
|
-
<
|
|
447
|
+
<ErrorBoundary
|
|
448
|
+
fallbackRender={({ error }) => <OAuthErrorPage error={error} />}
|
|
449
|
+
>
|
|
450
|
+
<CallbackHandler handleCallback={this.handleCallback} />
|
|
451
|
+
</ErrorBoundary>
|
|
427
452
|
</ClientOnly>
|
|
428
453
|
),
|
|
429
454
|
},
|
|
@@ -34,7 +34,6 @@ export const Banner = () => {
|
|
|
34
34
|
"relative text-primary-foreground text-sm font-medium px-4 py-2 flex gap-2 items-center lg:h-(--banner-height)",
|
|
35
35
|
mappedColor,
|
|
36
36
|
)}
|
|
37
|
-
data-pagefind-ignore="all"
|
|
38
37
|
style={style}
|
|
39
38
|
>
|
|
40
39
|
<div className="w-full">{page.banner.message}</div>
|
|
@@ -9,7 +9,10 @@ export const CategoryHeading = ({
|
|
|
9
9
|
className?: string;
|
|
10
10
|
}) => {
|
|
11
11
|
return (
|
|
12
|
-
<div
|
|
12
|
+
<div
|
|
13
|
+
className={cx("text-sm font-semibold text-primary mb-2", className)}
|
|
14
|
+
data-pagefind-ignore="all"
|
|
15
|
+
>
|
|
13
16
|
{children}
|
|
14
17
|
</div>
|
|
15
18
|
);
|
|
@@ -81,13 +81,16 @@ export const Header = memo(function HeaderInner() {
|
|
|
81
81
|
const borderBottom = "inset-shadow-[0_-1px_0_0_var(--border)]";
|
|
82
82
|
|
|
83
83
|
return (
|
|
84
|
-
<header
|
|
84
|
+
<header
|
|
85
|
+
className="sticky lg:top-0 z-10 bg-background/80 backdrop-blur w-full"
|
|
86
|
+
data-pagefind-ignore="all"
|
|
87
|
+
>
|
|
85
88
|
<Banner />
|
|
86
89
|
<div className={cn(borderBottom, "relative")}>
|
|
87
90
|
<PageProgress />
|
|
88
91
|
<div className="max-w-screen-2xl mx-auto flex items-center justify-between h-(--top-header-height) px-4 lg:px-8 border-transparent">
|
|
89
92
|
<div className="flex">
|
|
90
|
-
<Link to="/">
|
|
93
|
+
<Link to={site?.logo?.href ?? "/"}>
|
|
91
94
|
<div className="flex items-center gap-3.5">
|
|
92
95
|
{site?.logo && (
|
|
93
96
|
<>
|
|
@@ -66,7 +66,7 @@ export const Heading = ({
|
|
|
66
66
|
return (
|
|
67
67
|
<Component
|
|
68
68
|
className={heading({
|
|
69
|
-
className: cn(
|
|
69
|
+
className: cn("flex items-center gap-[0.33em]", className),
|
|
70
70
|
level,
|
|
71
71
|
})}
|
|
72
72
|
ref={registerNavigationAnchor ? ref : undefined}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { memo, useMemo } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import ReactMarkdown, { type Components } from "react-markdown";
|
|
3
3
|
import rehypeRaw from "rehype-raw";
|
|
4
4
|
import remarkGfm from "remark-gfm";
|
|
5
5
|
import { createConfiguredShikiRehypePlugins } from "../shiki.js";
|
|
@@ -35,13 +35,13 @@ export const Markdown = memo(
|
|
|
35
35
|
|
|
36
36
|
return (
|
|
37
37
|
<Typography className={className}>
|
|
38
|
-
<
|
|
38
|
+
<ReactMarkdown
|
|
39
39
|
remarkPlugins={remarkPlugins}
|
|
40
40
|
rehypePlugins={rehypePlugins}
|
|
41
41
|
components={mdComponents}
|
|
42
42
|
>
|
|
43
43
|
{content}
|
|
44
|
-
</
|
|
44
|
+
</ReactMarkdown>
|
|
45
45
|
</Typography>
|
|
46
46
|
);
|
|
47
47
|
},
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
|
|
2
2
|
import { MenuIcon } from "lucide-react";
|
|
3
|
-
import { useState } from "react";
|
|
3
|
+
import { Fragment, useState } from "react";
|
|
4
|
+
import { Skeleton } from "zudoku/ui/Skeleton.js";
|
|
4
5
|
import { useAuth } from "../authentication/hook.js";
|
|
5
6
|
import {
|
|
6
7
|
Drawer,
|
|
@@ -8,6 +9,7 @@ import {
|
|
|
8
9
|
DrawerTitle,
|
|
9
10
|
DrawerTrigger,
|
|
10
11
|
} from "../ui/Drawer.js";
|
|
12
|
+
import { ClientOnly } from "./ClientOnly.js";
|
|
11
13
|
import { useZudoku } from "./context/ZudokuContext.js";
|
|
12
14
|
import { PoweredByZudoku } from "./navigation/PoweredByZudoku.js";
|
|
13
15
|
import { isHiddenItem } from "./navigation/utils.js";
|
|
@@ -15,14 +17,18 @@ import { PageProgress } from "./PageProgress.js";
|
|
|
15
17
|
import { Search } from "./Search.js";
|
|
16
18
|
import { Slot } from "./Slot.js";
|
|
17
19
|
import { ThemeSwitch } from "./ThemeSwitch.js";
|
|
18
|
-
import { TopNavItem } from "./TopNavigation.js";
|
|
20
|
+
import { TopNavItem, TopNavLink } from "./TopNavigation.js";
|
|
19
21
|
|
|
20
22
|
export const MobileTopNavigation = () => {
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
+
const context = useZudoku();
|
|
24
|
+
const authState = useAuth();
|
|
25
|
+
|
|
26
|
+
const { navigation, options, getProfileMenuItems } = context;
|
|
27
|
+
const { isAuthenticated, profile, isAuthEnabled } = authState;
|
|
23
28
|
const [drawerOpen, setDrawerOpen] = useState(false);
|
|
24
29
|
|
|
25
|
-
const
|
|
30
|
+
const accountItems = getProfileMenuItems();
|
|
31
|
+
const filteredItems = navigation.filter(isHiddenItem(authState, context));
|
|
26
32
|
|
|
27
33
|
return (
|
|
28
34
|
<Drawer
|
|
@@ -50,9 +56,36 @@ export const MobileTopNavigation = () => {
|
|
|
50
56
|
<li className="empty:hidden">
|
|
51
57
|
<Slot.Target name="top-navigation-side" />
|
|
52
58
|
</li>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
|
|
60
|
+
{isAuthEnabled && (
|
|
61
|
+
<ClientOnly
|
|
62
|
+
fallback={<Skeleton className="rounded-sm h-5 w-24 mr-4" />}
|
|
63
|
+
>
|
|
64
|
+
{!isAuthenticated ? (
|
|
65
|
+
<li>
|
|
66
|
+
<TopNavLink
|
|
67
|
+
to="/signin"
|
|
68
|
+
onClick={() => setDrawerOpen(false)}
|
|
69
|
+
>
|
|
70
|
+
Login
|
|
71
|
+
</TopNavLink>
|
|
72
|
+
</li>
|
|
73
|
+
) : (
|
|
74
|
+
Object.values(getProfileMenuItems()).length > 0 && (
|
|
75
|
+
<Fragment>
|
|
76
|
+
<li>
|
|
77
|
+
{profile?.name ? `${profile.name}` : "My Account"}
|
|
78
|
+
{profile?.email && (
|
|
79
|
+
<div className="font-normal text-muted-foreground">
|
|
80
|
+
{profile.email}
|
|
81
|
+
</div>
|
|
82
|
+
)}
|
|
83
|
+
</li>
|
|
84
|
+
</Fragment>
|
|
85
|
+
)
|
|
86
|
+
)}
|
|
87
|
+
</ClientOnly>
|
|
88
|
+
)}
|
|
56
89
|
{filteredItems.map((item) => (
|
|
57
90
|
<li key={item.label}>
|
|
58
91
|
<button type="button" onClick={() => setDrawerOpen(false)}>
|
|
@@ -60,6 +93,25 @@ export const MobileTopNavigation = () => {
|
|
|
60
93
|
</button>
|
|
61
94
|
</li>
|
|
62
95
|
))}
|
|
96
|
+
{isAuthEnabled && isAuthenticated && accountItems.length > 0 && (
|
|
97
|
+
<ClientOnly
|
|
98
|
+
fallback={<Skeleton className="rounded-sm h-5 w-24 mr-4" />}
|
|
99
|
+
>
|
|
100
|
+
{accountItems.map((i) => (
|
|
101
|
+
<li key={i.label}>
|
|
102
|
+
<TopNavLink
|
|
103
|
+
to={i.path ?? ""}
|
|
104
|
+
onClick={() => setDrawerOpen(false)}
|
|
105
|
+
>
|
|
106
|
+
{i.label}
|
|
107
|
+
</TopNavLink>
|
|
108
|
+
</li>
|
|
109
|
+
))}
|
|
110
|
+
</ClientOnly>
|
|
111
|
+
)}
|
|
112
|
+
<li>
|
|
113
|
+
<ThemeSwitch />
|
|
114
|
+
</li>
|
|
63
115
|
</ul>
|
|
64
116
|
</div>
|
|
65
117
|
{options.site?.showPoweredBy !== false && (
|
|
@@ -18,9 +18,10 @@ export const NotFoundPage = () => {
|
|
|
18
18
|
<DeveloperHint>
|
|
19
19
|
Start by adding a file at{" "}
|
|
20
20
|
<code>
|
|
21
|
-
{"{
|
|
21
|
+
{"{DOCUMENT_ROOT}"}/{params["*"]}.mdx
|
|
22
22
|
</code>{" "}
|
|
23
|
-
and add some content to make this error go away.
|
|
23
|
+
and add some content to make this error go away. By default{" "}
|
|
24
|
+
<code>DOCUMENT_ROOT</code> is the `pages` directory.
|
|
24
25
|
</DeveloperHint>
|
|
25
26
|
<p>
|
|
26
27
|
It seems that the page you are looking for does not exist or may have
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import { ErrorPage } from "./ErrorPage.js";
|
|
3
|
+
import { NotFoundPage } from "./NotFoundPage.js";
|
|
3
4
|
|
|
4
5
|
type StatusPageProps = {
|
|
5
6
|
statusCode: number;
|
|
@@ -79,6 +80,10 @@ const getDefaultContent = (
|
|
|
79
80
|
};
|
|
80
81
|
|
|
81
82
|
export const StatusPage = ({ statusCode, message }: StatusPageProps) => {
|
|
83
|
+
if (statusCode === 404) {
|
|
84
|
+
return <NotFoundPage />;
|
|
85
|
+
}
|
|
86
|
+
|
|
82
87
|
const defaultContent = getDefaultContent(statusCode);
|
|
83
88
|
|
|
84
89
|
return (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cx } from "class-variance-authority";
|
|
2
2
|
import { deepEqual } from "fast-equals";
|
|
3
3
|
import { Suspense } from "react";
|
|
4
|
-
import { NavLink } from "react-router";
|
|
4
|
+
import { NavLink, type NavLinkProps } from "react-router";
|
|
5
5
|
import { type NavigationItem } from "../../config/validators/NavigationSchema.js";
|
|
6
6
|
import { useAuth } from "../authentication/hook.js";
|
|
7
7
|
import { joinUrl } from "../util/joinUrl.js";
|
|
@@ -10,10 +10,10 @@ import { isHiddenItem, traverseNavigationItem } from "./navigation/utils.js";
|
|
|
10
10
|
import { Slot } from "./Slot.js";
|
|
11
11
|
|
|
12
12
|
export const TopNavigation = () => {
|
|
13
|
-
const
|
|
14
|
-
const {
|
|
15
|
-
|
|
16
|
-
const filteredItems = navigation.filter(isHiddenItem(
|
|
13
|
+
const context = useZudoku();
|
|
14
|
+
const { navigation } = context;
|
|
15
|
+
const auth = useAuth();
|
|
16
|
+
const filteredItems = navigation.filter(isHiddenItem(auth, context));
|
|
17
17
|
|
|
18
18
|
if (filteredItems.length === 0 || import.meta.env.MODE === "standalone") {
|
|
19
19
|
return <style>{`:root { --top-nav-height: 0px; }`}</style>;
|
|
@@ -62,37 +62,53 @@ const getPathForItem = (item: NavigationItem): string => {
|
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
-
export const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
export const TopNavLink = ({
|
|
66
|
+
isActive,
|
|
67
|
+
children,
|
|
68
|
+
...props
|
|
69
|
+
}: {
|
|
70
|
+
isActive?: boolean;
|
|
71
|
+
children: React.ReactNode;
|
|
72
|
+
} & NavLinkProps) => {
|
|
71
73
|
return (
|
|
72
|
-
// We don't use isActive here because it has to be inside the navigation,
|
|
73
|
-
// the top nav id doesn't necessarily start with the navigation id
|
|
74
74
|
<NavLink
|
|
75
75
|
viewTransition
|
|
76
|
-
to={path}
|
|
77
76
|
className={({ isActive: isActiveNavLink, isPending }) => {
|
|
78
|
-
const
|
|
77
|
+
const isActiveReal = isActiveNavLink || isActive;
|
|
79
78
|
return cx(
|
|
80
79
|
"flex items-center gap-2 lg:py-3.5 font-medium -mb-px transition duration-150 delay-75 relative",
|
|
81
|
-
|
|
80
|
+
isActiveReal || isPending
|
|
82
81
|
? [
|
|
83
82
|
"text-foreground",
|
|
84
83
|
// underline with view transition animation
|
|
85
84
|
"after:content-[''] after:absolute after:bottom-0 after:left-0 after:right-0",
|
|
86
85
|
"after:h-0.5 after:bg-primary",
|
|
87
|
-
|
|
86
|
+
isActiveReal &&
|
|
87
|
+
"after:[view-transition-name:top-nav-underline]",
|
|
88
88
|
isPending && "after:bg-primary/25",
|
|
89
89
|
]
|
|
90
90
|
: "text-foreground/75 hover:text-foreground",
|
|
91
91
|
);
|
|
92
92
|
}}
|
|
93
|
+
{...props}
|
|
93
94
|
>
|
|
95
|
+
{children}
|
|
96
|
+
</NavLink>
|
|
97
|
+
);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const TopNavItem = (item: NavigationItem) => {
|
|
101
|
+
const currentNav = useCurrentNavigation();
|
|
102
|
+
const isActiveTopNavItem = deepEqual(currentNav.topNavItem, item);
|
|
103
|
+
|
|
104
|
+
const path = getPathForItem(item);
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
// We don't use isActive here because it has to be inside the navigation,
|
|
108
|
+
// the top nav id doesn't necessarily start with the navigation id
|
|
109
|
+
<TopNavLink to={path} isActive={isActiveTopNavItem}>
|
|
94
110
|
{item.icon && <item.icon size={16} className="align-[-0.125em]" />}
|
|
95
111
|
{item.label}
|
|
96
|
-
</
|
|
112
|
+
</TopNavLink>
|
|
97
113
|
);
|
|
98
114
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cn } from "../util/cn.js";
|
|
2
2
|
|
|
3
3
|
// other styles are defined in main.css .prose
|
|
4
|
-
export const ProseClasses = "prose dark:prose-invert prose-neutral";
|
|
4
|
+
export const ProseClasses = "prose dark:prose-invert prose-neutral typography";
|
|
5
5
|
|
|
6
6
|
export const Typography = ({
|
|
7
7
|
children,
|
|
@@ -2,7 +2,6 @@ import { useQuery, useSuspenseQuery } from "@tanstack/react-query";
|
|
|
2
2
|
import { createContext, useContext } from "react";
|
|
3
3
|
import { matchPath, useLocation } from "react-router";
|
|
4
4
|
import { type NavigationItem } from "../../../config/validators/NavigationSchema.js";
|
|
5
|
-
import { useAuth } from "../../authentication/hook.js";
|
|
6
5
|
import type { ZudokuContext } from "../../core/ZudokuContext.js";
|
|
7
6
|
import { joinUrl } from "../../util/joinUrl.js";
|
|
8
7
|
import { CACHE_KEYS } from "../cache.js";
|
|
@@ -45,14 +44,28 @@ const getItemPath = (item: NavigationItem) => {
|
|
|
45
44
|
return undefined;
|
|
46
45
|
}
|
|
47
46
|
};
|
|
47
|
+
|
|
48
|
+
const extractAllPaths = (items: NavigationItem[]) => {
|
|
49
|
+
const paths = new Set<string>();
|
|
50
|
+
|
|
51
|
+
const collectPaths = (items: NavigationItem[]) => {
|
|
52
|
+
for (const item of items) {
|
|
53
|
+
const itemPath = getItemPath(item)?.split("?").at(0)?.split("#").at(0);
|
|
54
|
+
|
|
55
|
+
if (itemPath) paths.add(itemPath);
|
|
56
|
+
if (item.type === "category") {
|
|
57
|
+
collectPaths(item.items);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
collectPaths(items);
|
|
62
|
+
|
|
63
|
+
return [...paths];
|
|
64
|
+
};
|
|
65
|
+
|
|
48
66
|
export const useCurrentNavigation = () => {
|
|
49
|
-
const { getPluginNavigation, navigation
|
|
67
|
+
const { getPluginNavigation, navigation } = useZudoku();
|
|
50
68
|
const location = useLocation();
|
|
51
|
-
const auth = useAuth();
|
|
52
|
-
|
|
53
|
-
const isProtectedRoute = options.protectedRoutes?.some((route) =>
|
|
54
|
-
matchPath(route, location.pathname),
|
|
55
|
-
);
|
|
56
69
|
|
|
57
70
|
const navItem = traverseNavigation(navigation, (item, parentCategories) => {
|
|
58
71
|
if (getItemPath(item) === location.pathname) {
|
|
@@ -67,12 +80,8 @@ export const useCurrentNavigation = () => {
|
|
|
67
80
|
|
|
68
81
|
let topNavItem = navItem;
|
|
69
82
|
if (!navItem && data.length > 0) {
|
|
70
|
-
|
|
71
|
-
const pluginBasePaths = data.flatMap((item) => {
|
|
72
|
-
return getItemPath(item)?.split("?").at(0)?.split("#").at(0) ?? [];
|
|
73
|
-
});
|
|
83
|
+
const pluginBasePaths = extractAllPaths(data);
|
|
74
84
|
|
|
75
|
-
// Find top-level nav item that matches any plugin base path
|
|
76
85
|
topNavItem = navigation
|
|
77
86
|
.flatMap((item) => {
|
|
78
87
|
const itemPath = getItemPath(item);
|
|
@@ -88,13 +97,11 @@ export const useCurrentNavigation = () => {
|
|
|
88
97
|
})?.item;
|
|
89
98
|
}
|
|
90
99
|
|
|
91
|
-
const hasNavigation =
|
|
92
|
-
auth.isAuthEnabled && !auth.isAuthenticated && isProtectedRoute;
|
|
93
|
-
|
|
94
100
|
return {
|
|
95
|
-
navigation:
|
|
96
|
-
? []
|
|
97
|
-
|
|
101
|
+
navigation: [
|
|
102
|
+
...(navItem?.type === "category" ? navItem.items : []),
|
|
103
|
+
...data,
|
|
104
|
+
],
|
|
98
105
|
topNavItem,
|
|
99
106
|
};
|
|
100
107
|
};
|
|
@@ -9,13 +9,15 @@ import {
|
|
|
9
9
|
TooltipTrigger,
|
|
10
10
|
} from "zudoku/ui/Tooltip.js";
|
|
11
11
|
import type { NavigationItem as NavigationItemType } from "../../../config/validators/NavigationSchema.js";
|
|
12
|
+
import { useAuth } from "../../authentication/hook.js";
|
|
12
13
|
import { cn } from "../../util/cn.js";
|
|
13
14
|
import { joinUrl } from "../../util/joinUrl.js";
|
|
14
15
|
import { AnchorLink } from "../AnchorLink.js";
|
|
15
16
|
import { useViewportAnchor } from "../context/ViewportAnchorContext.js";
|
|
17
|
+
import { useZudoku } from "../context/ZudokuContext.js";
|
|
16
18
|
import { NavigationBadge } from "./NavigationBadge.js";
|
|
17
19
|
import { NavigationCategory } from "./NavigationCategory.js";
|
|
18
|
-
import { navigationListItem } from "./utils.js";
|
|
20
|
+
import { isHiddenItem, navigationListItem } from "./utils.js";
|
|
19
21
|
|
|
20
22
|
const TruncatedLabel = ({
|
|
21
23
|
label,
|
|
@@ -74,6 +76,12 @@ export const NavigationItem = ({
|
|
|
74
76
|
}) => {
|
|
75
77
|
const location = useLocation();
|
|
76
78
|
const { activeAnchor } = useViewportAnchor();
|
|
79
|
+
const auth = useAuth();
|
|
80
|
+
const context = useZudoku();
|
|
81
|
+
|
|
82
|
+
if (!isHiddenItem(auth, context)(item)) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
77
85
|
|
|
78
86
|
switch (item.type) {
|
|
79
87
|
case "category":
|
|
@@ -19,7 +19,10 @@ export const NavigationWrapper = ({
|
|
|
19
19
|
}, []);
|
|
20
20
|
|
|
21
21
|
return (
|
|
22
|
-
<div
|
|
22
|
+
<div
|
|
23
|
+
className="grid sticky top-(--header-height) lg:h-[calc(100vh-var(--header-height))] grid-rows-[1fr_min-content] border-r"
|
|
24
|
+
data-pagefind-ignore="all"
|
|
25
|
+
>
|
|
23
26
|
<nav
|
|
24
27
|
ref={navRef}
|
|
25
28
|
className={cn(
|
|
@@ -4,6 +4,8 @@ import type {
|
|
|
4
4
|
NavigationCategory,
|
|
5
5
|
NavigationItem,
|
|
6
6
|
} from "../../../config/validators/NavigationSchema.js";
|
|
7
|
+
import type { UseAuthReturn } from "../../authentication/hook.js";
|
|
8
|
+
import type { ZudokuContext } from "../../core/ZudokuContext.js";
|
|
7
9
|
import { joinUrl } from "../../util/joinUrl.js";
|
|
8
10
|
import { useCurrentNavigation } from "../context/ZudokuContext.js";
|
|
9
11
|
|
|
@@ -133,14 +135,18 @@ export const navigationListItem = cva(
|
|
|
133
135
|
);
|
|
134
136
|
|
|
135
137
|
export const isHiddenItem =
|
|
136
|
-
(
|
|
138
|
+
(auth: UseAuthReturn, context: ZudokuContext) =>
|
|
137
139
|
(item: NavigationItem): boolean => {
|
|
140
|
+
if (typeof item.display === "function") {
|
|
141
|
+
return item.display({ context, auth });
|
|
142
|
+
}
|
|
143
|
+
|
|
138
144
|
if (item.display === "hide") return false;
|
|
139
145
|
if (!item.label) return false;
|
|
140
146
|
|
|
141
147
|
return (
|
|
142
|
-
(item.display === "auth" && isAuthenticated) ||
|
|
143
|
-
(item.display === "anon" && !isAuthenticated) ||
|
|
148
|
+
(item.display === "auth" && auth.isAuthenticated) ||
|
|
149
|
+
(item.display === "anon" && !auth.isAuthenticated) ||
|
|
144
150
|
!item.display ||
|
|
145
151
|
item.display === "always"
|
|
146
152
|
);
|
|
@@ -24,14 +24,18 @@ export const RouteGuard = () => {
|
|
|
24
24
|
const location = useLocation();
|
|
25
25
|
const latestPath = useLatest(location.pathname);
|
|
26
26
|
const shouldBypass = use(BypassProtectedRoutesContext);
|
|
27
|
+
const { protectedRoutes } = zudoku.options;
|
|
27
28
|
|
|
28
|
-
const
|
|
29
|
+
const authCheckFn =
|
|
30
|
+
!shouldBypass && protectedRoutes
|
|
31
|
+
? Object.entries(protectedRoutes).find(([path]) =>
|
|
32
|
+
matchPath({ path, end: true }, location.pathname),
|
|
33
|
+
)?.[1]
|
|
34
|
+
: undefined;
|
|
29
35
|
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
matchPath({ path, end: true }, location.pathname),
|
|
34
|
-
);
|
|
36
|
+
const isProtectedRoute = authCheckFn !== undefined;
|
|
37
|
+
const needsToSignIn =
|
|
38
|
+
isProtectedRoute && !authCheckFn({ auth, context: zudoku });
|
|
35
39
|
|
|
36
40
|
useQuery({
|
|
37
41
|
queryKey: ["login-redirect"],
|
|
@@ -42,14 +46,10 @@ export const RouteGuard = () => {
|
|
|
42
46
|
});
|
|
43
47
|
return true;
|
|
44
48
|
},
|
|
45
|
-
enabled:
|
|
46
|
-
typeof window !== "undefined" &&
|
|
47
|
-
isProtected &&
|
|
48
|
-
!auth.isPending &&
|
|
49
|
-
!auth.isAuthenticated,
|
|
49
|
+
enabled: typeof window !== "undefined" && needsToSignIn && !auth.isPending,
|
|
50
50
|
});
|
|
51
51
|
|
|
52
|
-
if (
|
|
52
|
+
if (needsToSignIn) {
|
|
53
53
|
return (
|
|
54
54
|
<Dialog
|
|
55
55
|
open={true}
|
|
@@ -71,7 +71,7 @@ export const RouteGuard = () => {
|
|
|
71
71
|
);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
if (
|
|
74
|
+
if (isProtectedRoute && !auth.isAuthEnabled) {
|
|
75
75
|
throw new ZudokuError("Authentication is not enabled", {
|
|
76
76
|
title: "Authentication is not enabled",
|
|
77
77
|
developerHint:
|