zudoku 0.0.0-fix-firebase-export.f8270825 → 0.0.0-fix-circular-ref-false-positives.zbe02c6a6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/main.d.ts +6 -6
- package/dist/cli/common/version-check.js +12 -3
- package/dist/cli/common/version-check.js.map +1 -1
- package/dist/config/loader.js +3 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/validators/InputNavigationSchema.d.ts +77 -75
- package/dist/config/validators/InputNavigationSchema.js +1 -0
- package/dist/config/validators/InputNavigationSchema.js.map +1 -1
- package/dist/config/validators/NavigationSchema.js +6 -1
- package/dist/config/validators/NavigationSchema.js.map +1 -1
- package/dist/config/validators/validate.d.ts +59 -12
- package/dist/config/validators/validate.js +7 -4
- package/dist/config/validators/validate.js.map +1 -1
- package/dist/flat-config.d.ts +28 -26
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/auth/issuer.js +1 -1
- package/dist/lib/auth/issuer.js.map +1 -1
- package/dist/lib/authentication/authentication.d.ts +3 -2
- package/dist/lib/authentication/components/CallbackHandler.js +1 -1
- package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
- package/dist/lib/authentication/components/SignIn.js +4 -2
- package/dist/lib/authentication/components/SignIn.js.map +1 -1
- package/dist/lib/authentication/components/SignUp.js +4 -2
- package/dist/lib/authentication/components/SignUp.js.map +1 -1
- package/dist/lib/authentication/hook.d.ts +2 -0
- package/dist/lib/authentication/hook.js +10 -0
- package/dist/lib/authentication/hook.js.map +1 -1
- package/dist/lib/authentication/providers/auth0.js +11 -7
- package/dist/lib/authentication/providers/auth0.js.map +1 -1
- package/dist/lib/authentication/providers/clerk.js +0 -22
- package/dist/lib/authentication/providers/clerk.js.map +1 -1
- package/dist/lib/authentication/providers/firebase.js +67 -9
- package/dist/lib/authentication/providers/firebase.js.map +1 -1
- package/dist/lib/authentication/providers/supabase.js +6 -15
- package/dist/lib/authentication/providers/supabase.js.map +1 -1
- package/dist/lib/authentication/ui/EmailVerificationUi.d.ts +4 -0
- package/dist/lib/authentication/ui/EmailVerificationUi.js +34 -0
- package/dist/lib/authentication/ui/EmailVerificationUi.js.map +1 -0
- package/dist/lib/authentication/ui/ZudokuAuthUi.d.ts +7 -2
- package/dist/lib/authentication/ui/ZudokuAuthUi.js +43 -11
- package/dist/lib/authentication/ui/ZudokuAuthUi.js.map +1 -1
- package/dist/lib/authentication/utils/relativeRedirectUrl.d.ts +1 -0
- package/dist/lib/authentication/utils/relativeRedirectUrl.js +8 -0
- package/dist/lib/authentication/utils/relativeRedirectUrl.js.map +1 -0
- package/dist/lib/components/Pagination.js +2 -2
- package/dist/lib/components/Pagination.js.map +1 -1
- package/dist/lib/components/index.d.ts +5 -0
- package/dist/lib/components/index.js +4 -0
- package/dist/lib/components/index.js.map +1 -1
- package/dist/lib/components/navigation/NavigationItem.js +2 -2
- package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
- package/dist/lib/core/RouteGuard.js +12 -7
- package/dist/lib/core/RouteGuard.js.map +1 -1
- package/dist/lib/core/plugins.d.ts +11 -1
- package/dist/lib/core/plugins.js +1 -0
- package/dist/lib/core/plugins.js.map +1 -1
- package/dist/lib/core/react-query.d.ts +1 -0
- package/dist/lib/core/react-query.js +2 -0
- package/dist/lib/core/react-query.js.map +1 -0
- package/dist/lib/core/transform-config.d.ts +2 -0
- package/dist/lib/core/transform-config.js +22 -0
- package/dist/lib/core/transform-config.js.map +1 -0
- package/dist/lib/errors/ErrorMessage.d.ts +3 -0
- package/dist/lib/errors/ErrorMessage.js +16 -0
- package/dist/lib/errors/ErrorMessage.js.map +1 -0
- package/dist/lib/hooks/index.d.ts +2 -0
- package/dist/lib/oas/graphql/circular.d.ts +2 -0
- package/dist/lib/oas/graphql/circular.js +21 -16
- package/dist/lib/oas/graphql/circular.js.map +1 -1
- package/dist/lib/oas/graphql/circular.test.d.ts +1 -0
- package/dist/lib/oas/graphql/circular.test.js +183 -0
- package/dist/lib/oas/graphql/circular.test.js.map +1 -0
- package/dist/lib/oas/graphql/index.js +7 -3
- package/dist/lib/oas/graphql/index.js.map +1 -1
- package/dist/lib/plugins/api-keys/SettingsApiKeys.js +9 -172
- package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
- package/dist/lib/plugins/api-keys/index.d.ts +11 -4
- package/dist/lib/plugins/api-keys/index.js +36 -22
- package/dist/lib/plugins/api-keys/index.js.map +1 -1
- package/dist/lib/plugins/api-keys/settings/ApiKeyItem.d.ts +12 -0
- package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js +133 -0
- package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js.map +1 -0
- package/dist/lib/plugins/api-keys/settings/ApiKeyList.d.ts +4 -0
- package/dist/lib/plugins/api-keys/settings/ApiKeyList.js +33 -0
- package/dist/lib/plugins/api-keys/settings/ApiKeyList.js.map +1 -0
- package/dist/lib/plugins/api-keys/settings/RevealApiKey.d.ts +6 -0
- package/dist/lib/plugins/api-keys/settings/RevealApiKey.js +39 -0
- package/dist/lib/plugins/api-keys/settings/RevealApiKey.js.map +1 -0
- package/dist/lib/plugins/openapi/OasProvider.js +6 -2
- package/dist/lib/plugins/openapi/OasProvider.js.map +1 -1
- package/dist/lib/plugins/openapi/OperationList.js +4 -4
- package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
- package/dist/lib/plugins/openapi/ParamInfos.js +1 -0
- package/dist/lib/plugins/openapi/ParamInfos.js.map +1 -1
- package/dist/lib/plugins/openapi/Sidecar.js +3 -2
- package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
- package/dist/lib/plugins/openapi/interfaces.d.ts +3 -0
- package/dist/lib/plugins/openapi/schema/SchemaView.js +1 -1
- package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
- package/dist/lib/plugins/openapi/schema/utils.js +11 -3
- package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
- package/dist/lib/plugins/openapi/util/createHttpSnippet.js +24 -1
- package/dist/lib/plugins/openapi/util/createHttpSnippet.js.map +1 -1
- package/dist/lib/plugins/openapi/util/getRoutes.d.ts +3 -0
- package/dist/lib/plugins/openapi/util/getRoutes.js +2 -1
- package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
- package/dist/lib/ui/Button.js +1 -1
- package/dist/lib/ui/Button.js.map +1 -1
- package/dist/lib/ui/Command.d.ts +3 -3
- package/dist/lib/util/invariant.d.ts +1 -1
- package/dist/lib/util/invariant.js +2 -2
- package/dist/lib/util/invariant.js.map +1 -1
- package/dist/vite/api/SchemaManager.d.ts +12 -1
- package/dist/vite/api/SchemaManager.js +31 -14
- package/dist/vite/api/SchemaManager.js.map +1 -1
- package/dist/vite/api/SchemaManager.test.js +44 -0
- package/dist/vite/api/SchemaManager.test.js.map +1 -1
- package/dist/vite/config.js +10 -4
- package/dist/vite/config.js.map +1 -1
- package/dist/vite/error-handler.js +1 -5
- package/dist/vite/error-handler.js.map +1 -1
- package/dist/vite/mdx/remark-link-rewrite.js +1 -1
- package/dist/vite/plugin-api-keys.js +5 -1
- package/dist/vite/plugin-api-keys.js.map +1 -1
- package/dist/vite/plugin-api.js +5 -3
- package/dist/vite/plugin-api.js.map +1 -1
- package/dist/vite/plugin-markdown-export.js +1 -1
- package/dist/vite/plugin-markdown-export.js.map +1 -1
- package/dist/vite/prerender/utils.js +9 -3
- package/dist/vite/prerender/utils.js.map +1 -1
- package/dist/vite/prerender/worker.js +3 -0
- package/dist/vite/prerender/worker.js.map +1 -1
- package/dist/vite/zuplo.d.ts +13 -0
- package/dist/vite/zuplo.js +15 -0
- package/dist/vite/zuplo.js.map +1 -0
- package/lib/{ActionButton-DUgvSylL.js → ActionButton-B0CXL1Lq.js} +3 -3
- package/lib/{ActionButton-DUgvSylL.js.map → ActionButton-B0CXL1Lq.js.map} +1 -1
- package/lib/{Button-CynVW1JV.js → Button-GUVe7pmt.js} +8 -7
- package/lib/{Button-CynVW1JV.js.map → Button-GUVe7pmt.js.map} +1 -1
- package/lib/{Card-KFniaZn5.js → Card-DCdq37aA.js} +2 -2
- package/lib/{Card-KFniaZn5.js.map → Card-DCdq37aA.js.map} +1 -1
- package/lib/{ClaudeLogo-B4Xxt-x_.js → ClaudeLogo-DJ9bU-sO.js} +22 -22
- package/lib/ClaudeLogo-DJ9bU-sO.js.map +1 -0
- package/lib/{Command-BpT1iBE6.js → Command-N6VujV30.js} +3 -3
- package/lib/{Command-BpT1iBE6.js.map → Command-N6VujV30.js.map} +1 -1
- package/lib/{Dialog-BQciPiHN.js → Dialog-hlvmmQ_c.js} +2 -2
- package/lib/{Dialog-BQciPiHN.js.map → Dialog-hlvmmQ_c.js.map} +1 -1
- package/lib/{Drawer-Ci7XwhqT.js → Drawer-Ch7927PF.js} +7 -7
- package/lib/{Drawer-Ci7XwhqT.js.map → Drawer-Ch7927PF.js.map} +1 -1
- package/lib/{DropdownMenu-C8SX_-S_.js → DropdownMenu-DN0jNrjj.js} +2 -2
- package/lib/{DropdownMenu-C8SX_-S_.js.map → DropdownMenu-DN0jNrjj.js.map} +1 -1
- package/lib/Frame-DKlOmSkU.js +205 -0
- package/lib/Frame-DKlOmSkU.js.map +1 -0
- package/lib/HydrationBoundary-CNF2ZV3E.js +601 -0
- package/lib/HydrationBoundary-CNF2ZV3E.js.map +1 -0
- package/lib/{IndexingDialog-B5zCiUKr.js → IndexingDialog-D0YdGfbn.js} +3 -3
- package/lib/{IndexingDialog-B5zCiUKr.js.map → IndexingDialog-D0YdGfbn.js.map} +1 -1
- package/lib/Input-Cx-GeKoF.js +22 -0
- package/lib/Input-Cx-GeKoF.js.map +1 -0
- package/lib/{MdxPage-BagO2c-n.js → MdxPage-stpAoBtx.js} +11 -11
- package/lib/{MdxPage-BagO2c-n.js.map → MdxPage-stpAoBtx.js.map} +1 -1
- package/lib/{Mermaid-D_VSX7_Q.js → Mermaid-Koc3z8mU.js} +4 -4
- package/lib/{Mermaid-D_VSX7_Q.js.map → Mermaid-Koc3z8mU.js.map} +1 -1
- package/lib/{OAuthErrorPage-Fq54RLgt.js → OAuthErrorPage-DJ811Bn_.js} +15 -15
- package/lib/OAuthErrorPage-DJ811Bn_.js.map +1 -0
- package/lib/OasProvider-B2KxIBsI.js +48 -0
- package/lib/OasProvider-B2KxIBsI.js.map +1 -0
- package/lib/{OperationList-C0jiEaG5.js → OperationList-C2tAfThO.js} +1558 -1543
- package/lib/{OperationList-C0jiEaG5.js.map → OperationList-C2tAfThO.js.map} +1 -1
- package/lib/RouteGuard--A04ESy8.js +77 -0
- package/lib/RouteGuard--A04ESy8.js.map +1 -0
- package/lib/{SchemaList-BU0zCHn9.js → SchemaList-Ep8DleP_.js} +9 -9
- package/lib/{SchemaList-BU0zCHn9.js.map → SchemaList-Ep8DleP_.js.map} +1 -1
- package/lib/SchemaView-BpaEKRYx.js +438 -0
- package/lib/SchemaView-BpaEKRYx.js.map +1 -0
- package/lib/{Select-CkxXP5I7.js → Secret-BDBqq4p3.js} +122 -122
- package/lib/Secret-BDBqq4p3.js.map +1 -0
- package/lib/{Separator-CTPSeW1S.js → Separator-BXt1LYnm.js} +2 -2
- package/lib/{Separator-CTPSeW1S.js.map → Separator-BXt1LYnm.js.map} +1 -1
- package/lib/SignUp-DCBViNUi.js +50 -0
- package/lib/SignUp-DCBViNUi.js.map +1 -0
- package/lib/{SyntaxHighlight-Kdyskw3C.js → SyntaxHighlight-Dshjn3Zf.js} +1749 -1723
- package/lib/SyntaxHighlight-Dshjn3Zf.js.map +1 -0
- package/lib/{Toc-DJxFPfcS.js → Toc-Cgz6CPiE.js} +3 -3
- package/lib/{Toc-DJxFPfcS.js.map → Toc-Cgz6CPiE.js.map} +1 -1
- package/lib/ZudokuContext-BZB1TWdT.js +387 -0
- package/lib/ZudokuContext-BZB1TWdT.js.map +1 -0
- package/lib/{___vite-browser-external_commonjs-proxy-Cga3HsWk.js → ___vite-browser-external_commonjs-proxy-BttVsNON.js} +2 -2
- package/lib/___vite-browser-external_commonjs-proxy-BttVsNON.js.map +1 -0
- package/lib/chunk-EPOLDU6W-C6C8jAwd.js +8558 -0
- package/lib/chunk-EPOLDU6W-C6C8jAwd.js.map +1 -0
- package/lib/{circular-CzWF1hj5.js → circular-CG3e0_Uz.js} +1689 -1686
- package/lib/{circular-CzWF1hj5.js.map → circular-CG3e0_Uz.js.map} +1 -1
- package/lib/{cn-dYga0KKN.js → cn-5-Gd1Dss.js} +531 -498
- package/lib/cn-5-Gd1Dss.js.map +1 -0
- package/lib/{createServer-BIr2_tGn.js → createServer-CNeRqj98.js} +12 -12
- package/lib/{createServer-BIr2_tGn.js.map → createServer-CNeRqj98.js.map} +1 -1
- package/lib/createVariantComponent-Dc0vtOvr.js +18 -0
- package/lib/createVariantComponent-Dc0vtOvr.js.map +1 -0
- package/lib/{errors-Bs4duWDy.js → errors-b9I-fAOY.js} +3 -3
- package/lib/{errors-Bs4duWDy.js.map → errors-b9I-fAOY.js.map} +1 -1
- package/lib/{firebase-qUdSEL1p.js → firebase-BCXX7Qv5.js} +1590 -1342
- package/lib/firebase-BCXX7Qv5.js.map +1 -0
- package/lib/hook-BGlHBdET.js +52 -0
- package/lib/hook-BGlHBdET.js.map +1 -0
- package/lib/{ErrorAlert-DrOR8w3f.js → index-CL8eDnQW.js} +5473 -4433
- package/lib/index-CL8eDnQW.js.map +1 -0
- package/lib/index-CrcNWbel.js.map +1 -1
- package/lib/{index-Css56y3F.js → index-DBjOT2H1.js} +4 -4
- package/lib/{index-Css56y3F.js.map → index-DBjOT2H1.js.map} +1 -1
- package/lib/{index-0oT9beQN.js → index-I3kmZ7tG.js} +152 -148
- package/lib/{index-0oT9beQN.js.map → index-I3kmZ7tG.js.map} +1 -1
- package/lib/{index-Bh-MffiL.js → index-UOLtazB8.js} +2 -2
- package/lib/{index-Bh-MffiL.js.map → index-UOLtazB8.js.map} +1 -1
- package/lib/index.esm-BYObtETB.js.map +1 -1
- package/lib/{index.esm-DtzT_KoE.js → index.esm-B_0dvNjB.js} +2 -2
- package/lib/{index.esm-DtzT_KoE.js.map → index.esm-B_0dvNjB.js.map} +1 -1
- package/lib/{index.esm-kW-Utcsi.js → index.esm-C5CBsVzN.js} +16 -14
- package/lib/index.esm-C5CBsVzN.js.map +1 -0
- package/lib/{invariant-CGOLuIIz.js → invariant-BJAl77rw.js} +4 -4
- package/lib/invariant-BJAl77rw.js.map +1 -0
- package/lib/jsx-runtime-BzflLqGi.js.map +1 -1
- package/lib/{mutation-BoVlx8yA.js → mutation-BISOc7OM.js} +70 -44
- package/lib/mutation-BISOc7OM.js.map +1 -0
- package/lib/ui/Accordion.js +1 -1
- package/lib/ui/ActionButton.js +2 -2
- package/lib/ui/Alert.js +1 -1
- package/lib/ui/AlertDialog.js +1 -1
- package/lib/ui/Badge.js +1 -1
- package/lib/ui/Breadcrumb.js +1 -1
- package/lib/ui/Button.js +7 -6
- package/lib/ui/Button.js.map +1 -1
- package/lib/ui/ButtonGroup.js +1 -1
- package/lib/ui/Callout.js +1 -1
- package/lib/ui/Card.js +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/CodeBlock.js +1 -1
- package/lib/ui/Command.js +2 -2
- package/lib/ui/Dialog.js +1 -1
- package/lib/ui/Drawer.js +3 -3
- package/lib/ui/DropdownMenu.js +1 -1
- package/lib/ui/EmbeddedCodeBlock.js +1 -1
- package/lib/ui/Form.js +1 -1
- package/lib/ui/Frame.js +1 -1
- package/lib/ui/HoverCard.js +1 -1
- package/lib/ui/Input.js +1 -1
- package/lib/ui/Item.js +1 -1
- package/lib/ui/Label.js +1 -1
- package/lib/ui/NativeSelect.js +1 -1
- package/lib/ui/Pagination.js +1 -1
- package/lib/ui/Popover.js +1 -1
- package/lib/ui/Progress.js +1 -1
- package/lib/ui/RadioGroup.js +1 -1
- package/lib/ui/ScrollArea.js +1 -1
- package/lib/ui/Secret.js +1 -1
- package/lib/ui/Separator.js +1 -1
- package/lib/ui/Skeleton.js +1 -1
- package/lib/ui/Slider.js +1 -1
- package/lib/ui/Switch.js +1 -1
- package/lib/ui/SyntaxHighlight.js +3 -3
- package/lib/ui/Tabs.js +1 -1
- package/lib/ui/Textarea.js +1 -1
- package/lib/ui/Toggle.js +1 -1
- package/lib/ui/ToggleGroup.js +1 -1
- package/lib/ui/Value.js +1 -1
- package/lib/ui/util.js +1 -1
- package/lib/{useMutation-C6RqWmTS.js → useMutation-CFMGlAMW.js} +39 -17
- package/lib/useMutation-CFMGlAMW.js.map +1 -0
- package/lib/useSuspenseQuery-CSB_rVek.js +1226 -0
- package/lib/useSuspenseQuery-CSB_rVek.js.map +1 -0
- package/lib/zudoku.__internal.js +826 -1325
- package/lib/zudoku.__internal.js.map +1 -1
- package/lib/zudoku.auth-auth0.js +16 -16
- package/lib/zudoku.auth-auth0.js.map +1 -1
- package/lib/zudoku.auth-azureb2c.js +4 -4
- package/lib/zudoku.auth-clerk.js +52 -75
- package/lib/zudoku.auth-clerk.js.map +1 -1
- package/lib/zudoku.auth-firebase.js +6 -5
- package/lib/zudoku.auth-firebase.js.map +1 -1
- package/lib/zudoku.auth-openid.js +5 -5
- package/lib/zudoku.auth-supabase.js +31 -40
- package/lib/zudoku.auth-supabase.js.map +1 -1
- package/lib/zudoku.components.js +23 -21
- package/lib/zudoku.hooks.js +3 -3
- package/lib/zudoku.mermaid.js +3 -3
- package/lib/zudoku.plugin-api-catalog.js +8 -8
- package/lib/zudoku.plugin-api-keys.js +607 -552
- package/lib/zudoku.plugin-api-keys.js.map +1 -1
- package/lib/zudoku.plugin-custom-pages.js +1 -1
- package/lib/zudoku.plugin-markdown.js +1 -1
- package/lib/zudoku.plugin-openapi.js +3 -3
- package/lib/zudoku.plugin-redirect.js +1 -1
- package/lib/zudoku.plugin-search-pagefind.js +30 -29
- package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
- package/lib/zudoku.plugins.js +9 -8
- package/lib/zudoku.plugins.js.map +1 -1
- package/lib/zudoku.react-query.js +440 -0
- package/lib/zudoku.react-query.js.map +1 -0
- package/lib/zudoku.router.js +1130 -1404
- package/lib/zudoku.router.js.map +1 -1
- package/package.json +28 -21
- package/src/lib/auth/issuer.ts +1 -1
- package/src/lib/authentication/authentication.ts +8 -2
- package/src/lib/authentication/components/CallbackHandler.tsx +1 -1
- package/src/lib/authentication/components/SignIn.tsx +5 -2
- package/src/lib/authentication/components/SignUp.tsx +5 -2
- package/src/lib/authentication/hook.ts +16 -0
- package/src/lib/authentication/providers/auth0.tsx +15 -9
- package/src/lib/authentication/providers/clerk.tsx +0 -26
- package/src/lib/authentication/providers/firebase.tsx +98 -6
- package/src/lib/authentication/providers/supabase.tsx +6 -15
- package/src/lib/authentication/ui/EmailVerificationUi.tsx +129 -0
- package/src/lib/authentication/ui/ZudokuAuthUi.tsx +170 -38
- package/src/lib/authentication/utils/relativeRedirectUrl.ts +12 -0
- package/src/lib/components/Pagination.tsx +4 -5
- package/src/lib/components/index.ts +4 -0
- package/src/lib/components/navigation/NavigationItem.tsx +9 -3
- package/src/lib/core/RouteGuard.tsx +30 -24
- package/src/lib/core/plugins.ts +21 -1
- package/src/lib/core/react-query.ts +1 -0
- package/src/lib/core/transform-config.ts +29 -0
- package/src/lib/errors/ErrorMessage.tsx +38 -0
- package/src/lib/oas/graphql/circular.test.ts +221 -0
- package/src/lib/oas/graphql/circular.ts +31 -18
- package/src/lib/oas/graphql/index.ts +7 -3
- package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +36 -476
- package/src/lib/plugins/api-keys/index.tsx +76 -32
- package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +342 -0
- package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -0
- package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +124 -0
- package/src/lib/plugins/openapi/OasProvider.tsx +10 -2
- package/src/lib/plugins/openapi/OperationList.tsx +4 -4
- package/src/lib/plugins/openapi/ParamInfos.tsx +1 -0
- package/src/lib/plugins/openapi/Sidecar.tsx +3 -2
- package/src/lib/plugins/openapi/interfaces.ts +6 -1
- package/src/lib/plugins/openapi/schema/SchemaView.tsx +6 -4
- package/src/lib/plugins/openapi/schema/utils.ts +15 -4
- package/src/lib/plugins/openapi/util/createHttpSnippet.ts +29 -1
- package/src/lib/plugins/openapi/util/getRoutes.tsx +4 -1
- package/src/lib/ui/Button.tsx +1 -0
- package/src/lib/util/invariant.ts +2 -1
- package/src/shiki/langs/c3.js +1 -0
- package/src/shiki/langs/gn.js +1 -0
- package/src/shiki/langs/moonbit.js +1 -0
- package/lib/ClaudeLogo-B4Xxt-x_.js.map +0 -1
- package/lib/ErrorAlert-DrOR8w3f.js.map +0 -1
- package/lib/OAuthErrorPage-Fq54RLgt.js.map +0 -1
- package/lib/OasProvider-DPH8mwDa.js +0 -40
- package/lib/OasProvider-DPH8mwDa.js.map +0 -1
- package/lib/RouteGuard-9wjejsKm.js +0 -77
- package/lib/RouteGuard-9wjejsKm.js.map +0 -1
- package/lib/RouterError-DSLXagd5.js +0 -42
- package/lib/RouterError-DSLXagd5.js.map +0 -1
- package/lib/SchemaView-DVae4RO2.js +0 -597
- package/lib/SchemaView-DVae4RO2.js.map +0 -1
- package/lib/Select-CkxXP5I7.js.map +0 -1
- package/lib/SignUp-BjS4ozA7.js +0 -50
- package/lib/SignUp-BjS4ozA7.js.map +0 -1
- package/lib/SyntaxHighlight-Kdyskw3C.js.map +0 -1
- package/lib/ZudokuContext-BXldanA8.js +0 -1508
- package/lib/ZudokuContext-BXldanA8.js.map +0 -1
- package/lib/___vite-browser-external_commonjs-proxy-Cga3HsWk.js.map +0 -1
- package/lib/chunk-PVWAREVJ-dLIqswPy.js +0 -7965
- package/lib/chunk-PVWAREVJ-dLIqswPy.js.map +0 -1
- package/lib/cn-dYga0KKN.js.map +0 -1
- package/lib/createVariantComponent-B9_dVBvu.js +0 -35
- package/lib/createVariantComponent-B9_dVBvu.js.map +0 -1
- package/lib/firebase-qUdSEL1p.js.map +0 -1
- package/lib/hook-BNxidGQq.js +0 -40
- package/lib/hook-BNxidGQq.js.map +0 -1
- package/lib/index-CCmMJp02.js +0 -1059
- package/lib/index-CCmMJp02.js.map +0 -1
- package/lib/index.esm-kW-Utcsi.js.map +0 -1
- package/lib/invariant-CGOLuIIz.js.map +0 -1
- package/lib/mutation-BoVlx8yA.js.map +0 -1
- package/lib/useMutation-C6RqWmTS.js.map +0 -1
|
@@ -1,181 +1,26 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { ErrorBoundary } from "react-error-boundary";
|
|
3
|
+
import { Button } from "zudoku/components";
|
|
4
|
+
import { useAuth } from "zudoku/hooks";
|
|
1
5
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
CircleSlashIcon,
|
|
9
|
-
PencilLineIcon,
|
|
10
|
-
RefreshCwIcon,
|
|
11
|
-
TrashIcon,
|
|
12
|
-
XIcon,
|
|
13
|
-
} from "lucide-react";
|
|
14
|
-
import { AnimatePresence } from "motion/react";
|
|
15
|
-
import React, { useState } from "react";
|
|
16
|
-
import { Alert, AlertTitle } from "zudoku/ui/Alert.js";
|
|
17
|
-
import { Card, CardHeader } from "zudoku/ui/Card.js";
|
|
18
|
-
import {
|
|
19
|
-
Dialog,
|
|
20
|
-
DialogClose,
|
|
21
|
-
DialogContent,
|
|
22
|
-
DialogDescription,
|
|
23
|
-
DialogFooter,
|
|
24
|
-
DialogHeader,
|
|
25
|
-
DialogTitle,
|
|
26
|
-
DialogTrigger,
|
|
27
|
-
} from "zudoku/ui/Dialog.js";
|
|
28
|
-
import { Secret } from "zudoku/ui/Secret.js";
|
|
29
|
-
import { useZudoku } from "../../components/context/ZudokuContext.js";
|
|
6
|
+
Item,
|
|
7
|
+
ItemActions,
|
|
8
|
+
ItemContent,
|
|
9
|
+
ItemDescription,
|
|
10
|
+
ItemTitle,
|
|
11
|
+
} from "zudoku/ui/Item.js";
|
|
30
12
|
import { Slot } from "../../components/Slot.js";
|
|
31
|
-
import {
|
|
32
|
-
import { Input } from "../../ui/Input.js";
|
|
33
|
-
import { cn } from "../../util/cn.js";
|
|
13
|
+
import { ErrorMessage } from "../../errors/ErrorMessage.js";
|
|
34
14
|
import { CreateApiKeyDialog } from "./CreateApiKeyDialog.js";
|
|
35
|
-
import type {
|
|
15
|
+
import type { ApiKeyService } from "./index.js";
|
|
16
|
+
import { ApiKeyList } from "./settings/ApiKeyList.js";
|
|
36
17
|
|
|
37
18
|
export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
|
|
38
|
-
const context = useZudoku();
|
|
39
|
-
const queryClient = useQueryClient();
|
|
40
|
-
const [editingConsumerId, setEditingConsumerId] = useState<string | null>(
|
|
41
|
-
null,
|
|
42
|
-
);
|
|
43
|
-
const [editingLabel, setEditingLabel] = useState<string>("");
|
|
44
|
-
const { data, isFetching } = useSuspenseQuery({
|
|
45
|
-
queryFn: () => service.getConsumers(context),
|
|
46
|
-
queryKey: ["api-keys"],
|
|
47
|
-
retry: false,
|
|
48
|
-
});
|
|
49
|
-
|
|
50
19
|
const [isCreateApiKeyOpen, setIsCreateApiKeyOpen] = useState(false);
|
|
51
|
-
|
|
52
|
-
const deleteKeyMutation = useMutation({
|
|
53
|
-
mutationFn: ({
|
|
54
|
-
consumerId,
|
|
55
|
-
keyId,
|
|
56
|
-
}: {
|
|
57
|
-
consumerId: string;
|
|
58
|
-
keyId: string;
|
|
59
|
-
}) => {
|
|
60
|
-
if (!service.deleteKey) {
|
|
61
|
-
throw new Error("deleteKey not implemented");
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return service.deleteKey(consumerId, keyId, context);
|
|
65
|
-
},
|
|
66
|
-
onMutate: async ({ consumerId, keyId }) => {
|
|
67
|
-
await queryClient.cancelQueries({ queryKey: ["api-keys"] });
|
|
68
|
-
const previousData = queryClient.getQueryData<ApiConsumer[]>([
|
|
69
|
-
"api-keys",
|
|
70
|
-
]);
|
|
71
|
-
queryClient.setQueryData<ApiConsumer[]>(["api-keys"], (old) => {
|
|
72
|
-
if (!old) {
|
|
73
|
-
return old;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return old.map((consumer) => {
|
|
77
|
-
if (consumer.id === consumerId) {
|
|
78
|
-
return {
|
|
79
|
-
...consumer,
|
|
80
|
-
apiKeys: consumer.apiKeys.filter((key) => key.id !== keyId),
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
return consumer;
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
return { previousData };
|
|
88
|
-
},
|
|
89
|
-
onError: (_err, _variables, context) => {
|
|
90
|
-
if (context?.previousData) {
|
|
91
|
-
queryClient.setQueryData(["api-keys"], context.previousData);
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
onSuccess: () => {
|
|
95
|
-
void queryClient.invalidateQueries({ queryKey: ["api-keys"] });
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
const updateConsumerMutation = useMutation({
|
|
100
|
-
mutationFn: ({
|
|
101
|
-
consumerId,
|
|
102
|
-
label,
|
|
103
|
-
}: {
|
|
104
|
-
consumerId: string;
|
|
105
|
-
label: string;
|
|
106
|
-
}) => {
|
|
107
|
-
if (!service.updateConsumer) {
|
|
108
|
-
throw new Error("updateConsumer not implemented");
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return service.updateConsumer({ id: consumerId, label }, context);
|
|
112
|
-
},
|
|
113
|
-
onMutate: async ({ consumerId, label }) => {
|
|
114
|
-
await queryClient.cancelQueries({ queryKey: ["api-keys"] });
|
|
115
|
-
|
|
116
|
-
const previousData = queryClient.getQueryData(["api-keys"]);
|
|
117
|
-
queryClient.setQueryData<ApiConsumer[]>(["api-keys"], (old) => {
|
|
118
|
-
if (!old) {
|
|
119
|
-
return old;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return old.map((consumer) => {
|
|
123
|
-
if (consumer.id === consumerId) {
|
|
124
|
-
return {
|
|
125
|
-
...consumer,
|
|
126
|
-
label,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
return consumer;
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
return { previousData };
|
|
134
|
-
},
|
|
135
|
-
onError: (_err, _variables, context) => {
|
|
136
|
-
if (context?.previousData) {
|
|
137
|
-
queryClient.setQueryData(["api-keys"], context.previousData);
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
onSuccess: () => {
|
|
141
|
-
void queryClient.invalidateQueries({ queryKey: ["api-keys"] });
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
const rollKeyMutation = useMutation({
|
|
146
|
-
mutationFn: (id: string) => {
|
|
147
|
-
if (!service.rollKey) {
|
|
148
|
-
throw new Error("rollKey not implemented");
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return service.rollKey(id, context);
|
|
152
|
-
},
|
|
153
|
-
onSuccess: () => queryClient.invalidateQueries({ queryKey: ["api-keys"] }),
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
const handleStartEdit = (consumerId: string, currentLabel: string) => {
|
|
157
|
-
setEditingConsumerId(consumerId);
|
|
158
|
-
setEditingLabel(currentLabel);
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
const handleSaveEdit = (consumerId: string) => {
|
|
162
|
-
if (editingLabel.trim()) {
|
|
163
|
-
updateConsumerMutation.mutate({
|
|
164
|
-
consumerId,
|
|
165
|
-
label: editingLabel.trim(),
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
setEditingConsumerId(null);
|
|
169
|
-
setEditingLabel("");
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
const handleCancelEdit = () => {
|
|
173
|
-
setEditingConsumerId(null);
|
|
174
|
-
setEditingLabel("");
|
|
175
|
-
};
|
|
20
|
+
const auth = useAuth();
|
|
176
21
|
|
|
177
22
|
return (
|
|
178
|
-
<div className="max-w-
|
|
23
|
+
<div className="max-w-3xl h-full pt-(--padding-content-top) pb-(--padding-content-bottom)">
|
|
179
24
|
<Slot.Target name="api-keys-list-page" />
|
|
180
25
|
|
|
181
26
|
<div className="flex justify-between pb-3">
|
|
@@ -192,313 +37,28 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
|
|
|
192
37
|
<p>Create, manage, and monitor your API keys</p>
|
|
193
38
|
|
|
194
39
|
<Slot.Target name="api-keys-list-page-before-keys" />
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
<
|
|
205
|
-
|
|
206
|
-
|
|
40
|
+
{auth.profile?.emailVerified === false ? (
|
|
41
|
+
<Item variant="outline">
|
|
42
|
+
<ItemContent>
|
|
43
|
+
<ItemTitle>Verified email required</ItemTitle>
|
|
44
|
+
<ItemDescription>
|
|
45
|
+
You need to verify your email to access API keys.
|
|
46
|
+
</ItemDescription>
|
|
47
|
+
</ItemContent>
|
|
48
|
+
|
|
49
|
+
<ItemActions>
|
|
50
|
+
<Button onClick={() => auth.requestEmailVerification()}>
|
|
51
|
+
Verify email
|
|
52
|
+
</Button>
|
|
53
|
+
</ItemActions>
|
|
54
|
+
</Item>
|
|
55
|
+
) : (
|
|
56
|
+
<ErrorBoundary
|
|
57
|
+
fallbackRender={({ error }) => <ErrorMessage error={error} />}
|
|
58
|
+
>
|
|
59
|
+
<ApiKeyList service={service} />
|
|
60
|
+
</ErrorBoundary>
|
|
207
61
|
)}
|
|
208
|
-
{deleteKeyMutation.isError && (
|
|
209
|
-
<Alert variant="destructive" className="mb-4">
|
|
210
|
-
<CircleSlashIcon size={16} />
|
|
211
|
-
<AlertTitle>{deleteKeyMutation.error.message}</AlertTitle>
|
|
212
|
-
</Alert>
|
|
213
|
-
)}
|
|
214
|
-
<div className="">
|
|
215
|
-
{data.length === 0 ? (
|
|
216
|
-
<div className="flex col-span-full flex-col justify-center gap-4 items-center p-8 border rounded-sm bg-muted/30 text-muted-foreground">
|
|
217
|
-
<p className="text-center">
|
|
218
|
-
You have no API keys yet.
|
|
219
|
-
<br />
|
|
220
|
-
{service.createKey && "Get started and create your first key."}
|
|
221
|
-
</p>
|
|
222
|
-
{service.createKey && (
|
|
223
|
-
<CreateApiKeyDialog
|
|
224
|
-
service={service}
|
|
225
|
-
isOpen={isCreateApiKeyOpen}
|
|
226
|
-
onOpenChange={setIsCreateApiKeyOpen}
|
|
227
|
-
/>
|
|
228
|
-
)}
|
|
229
|
-
</div>
|
|
230
|
-
) : (
|
|
231
|
-
<ul
|
|
232
|
-
className={cn(
|
|
233
|
-
"grid grid-cols-[1fr_min-content] divide-y divide-border col-span-6",
|
|
234
|
-
)}
|
|
235
|
-
>
|
|
236
|
-
{data.map((consumers) => (
|
|
237
|
-
<Card
|
|
238
|
-
className="grid grid-cols-subgrid col-span-full items-center mb-4 group"
|
|
239
|
-
key={consumers.id}
|
|
240
|
-
>
|
|
241
|
-
<CardHeader className="border-b col-span-full grid-cols-subgrid grid">
|
|
242
|
-
<div className="h-10 flex flex-col text-sm justify-center">
|
|
243
|
-
<div className="font-medium text-lg flex items-center gap-2">
|
|
244
|
-
{editingConsumerId === consumers.id ? (
|
|
245
|
-
<div className="flex items-center gap-2 w-full">
|
|
246
|
-
<Input
|
|
247
|
-
maxLength={32}
|
|
248
|
-
value={editingLabel}
|
|
249
|
-
onChange={(e) => setEditingLabel(e.target.value)}
|
|
250
|
-
onKeyDown={(e) => {
|
|
251
|
-
if (e.key === "Enter") {
|
|
252
|
-
handleSaveEdit(consumers.id);
|
|
253
|
-
} else if (e.key === "Escape") {
|
|
254
|
-
handleCancelEdit();
|
|
255
|
-
}
|
|
256
|
-
}}
|
|
257
|
-
className="text-lg font-medium"
|
|
258
|
-
autoFocus
|
|
259
|
-
/>
|
|
260
|
-
<div className="flex items-center">
|
|
261
|
-
<Button
|
|
262
|
-
size="icon"
|
|
263
|
-
variant="ghost"
|
|
264
|
-
onClick={() => handleSaveEdit(consumers.id)}
|
|
265
|
-
disabled={!editingLabel.trim()}
|
|
266
|
-
>
|
|
267
|
-
<CheckIcon size={16} />
|
|
268
|
-
</Button>
|
|
269
|
-
<Button
|
|
270
|
-
size="icon"
|
|
271
|
-
variant="ghost"
|
|
272
|
-
onClick={handleCancelEdit}
|
|
273
|
-
>
|
|
274
|
-
<XIcon size={16} />
|
|
275
|
-
</Button>
|
|
276
|
-
</div>
|
|
277
|
-
</div>
|
|
278
|
-
) : (
|
|
279
|
-
consumers.label
|
|
280
|
-
)}
|
|
281
|
-
<div className="text-muted-foreground text-xs">
|
|
282
|
-
{consumers.createdOn}
|
|
283
|
-
</div>
|
|
284
|
-
</div>
|
|
285
|
-
<div className="text-muted-foreground text-xs">
|
|
286
|
-
{consumers.createdOn && (
|
|
287
|
-
<div>
|
|
288
|
-
Created on{" "}
|
|
289
|
-
{new Date(consumers.createdOn).toLocaleDateString()}
|
|
290
|
-
</div>
|
|
291
|
-
)}
|
|
292
|
-
{consumers.expiresOn && (
|
|
293
|
-
<div>
|
|
294
|
-
Expires on{" "}
|
|
295
|
-
{new Date(consumers.expiresOn).toLocaleDateString()}
|
|
296
|
-
</div>
|
|
297
|
-
)}
|
|
298
|
-
</div>
|
|
299
|
-
</div>
|
|
300
|
-
|
|
301
|
-
<div className="flex justify-end">
|
|
302
|
-
{service.updateConsumer && (
|
|
303
|
-
<Button
|
|
304
|
-
variant="ghost"
|
|
305
|
-
onClick={() =>
|
|
306
|
-
handleStartEdit(consumers.id, consumers.label)
|
|
307
|
-
}
|
|
308
|
-
className={cn(
|
|
309
|
-
"flex gap-2",
|
|
310
|
-
editingConsumerId === consumers.id &&
|
|
311
|
-
"opacity-0! pointer-events-none",
|
|
312
|
-
)}
|
|
313
|
-
disabled={editingConsumerId === consumers.id}
|
|
314
|
-
>
|
|
315
|
-
<PencilLineIcon size={16} />
|
|
316
|
-
<span className="hidden md:block">Edit label</span>
|
|
317
|
-
</Button>
|
|
318
|
-
)}
|
|
319
|
-
{service.rollKey && (
|
|
320
|
-
<Dialog>
|
|
321
|
-
<DialogTrigger asChild>
|
|
322
|
-
<Button
|
|
323
|
-
title="Roll this key"
|
|
324
|
-
variant="ghost"
|
|
325
|
-
disabled={rollKeyMutation.isPending}
|
|
326
|
-
className="flex items-center gap-2"
|
|
327
|
-
>
|
|
328
|
-
<RefreshCwIcon
|
|
329
|
-
size={16}
|
|
330
|
-
className={
|
|
331
|
-
rollKeyMutation.isPending
|
|
332
|
-
? "animate-spin"
|
|
333
|
-
: undefined
|
|
334
|
-
}
|
|
335
|
-
/>
|
|
336
|
-
<span className="hidden md:block">Roll key</span>
|
|
337
|
-
</Button>
|
|
338
|
-
</DialogTrigger>
|
|
339
|
-
<DialogContent>
|
|
340
|
-
<DialogHeader>
|
|
341
|
-
<DialogTitle>Roll API Key</DialogTitle>
|
|
342
|
-
<DialogDescription>
|
|
343
|
-
Are you sure you want to roll this API key?
|
|
344
|
-
</DialogDescription>
|
|
345
|
-
</DialogHeader>
|
|
346
|
-
<DialogFooter>
|
|
347
|
-
<DialogClose asChild>
|
|
348
|
-
<Button variant="outline">Cancel</Button>
|
|
349
|
-
</DialogClose>
|
|
350
|
-
<DialogClose asChild>
|
|
351
|
-
<Button
|
|
352
|
-
onClick={() => {
|
|
353
|
-
rollKeyMutation.mutate(consumers.id);
|
|
354
|
-
}}
|
|
355
|
-
>
|
|
356
|
-
Roll Key
|
|
357
|
-
</Button>
|
|
358
|
-
</DialogClose>
|
|
359
|
-
</DialogFooter>
|
|
360
|
-
</DialogContent>
|
|
361
|
-
</Dialog>
|
|
362
|
-
)}
|
|
363
|
-
</div>
|
|
364
|
-
</CardHeader>
|
|
365
|
-
<div className="col-span-full grid-cols-subgrid grid">
|
|
366
|
-
<AnimatePresence>
|
|
367
|
-
{consumers.apiKeys.map((apiKey) => (
|
|
368
|
-
<React.Fragment key={apiKey.id}>
|
|
369
|
-
<RevealApiKey
|
|
370
|
-
apiKey={apiKey}
|
|
371
|
-
onDeleteKey={() => {
|
|
372
|
-
deleteKeyMutation.mutate({
|
|
373
|
-
consumerId: consumers.id,
|
|
374
|
-
keyId: apiKey.id,
|
|
375
|
-
});
|
|
376
|
-
}}
|
|
377
|
-
className={
|
|
378
|
-
deleteKeyMutation.variables?.keyId === apiKey.id &&
|
|
379
|
-
(deleteKeyMutation.isPending || isFetching)
|
|
380
|
-
? "opacity-10!"
|
|
381
|
-
: undefined
|
|
382
|
-
}
|
|
383
|
-
/>
|
|
384
|
-
<div className="col-span-full h-px bg-border"></div>
|
|
385
|
-
</React.Fragment>
|
|
386
|
-
))}
|
|
387
|
-
</AnimatePresence>
|
|
388
|
-
</div>
|
|
389
|
-
</Card>
|
|
390
|
-
))}
|
|
391
|
-
</ul>
|
|
392
|
-
)}
|
|
393
|
-
</div>
|
|
394
|
-
</div>
|
|
395
|
-
);
|
|
396
|
-
};
|
|
397
|
-
|
|
398
|
-
const getTimeAgo = (date: string) => {
|
|
399
|
-
const now = new Date();
|
|
400
|
-
const created = new Date(date);
|
|
401
|
-
const diffInSeconds = Math.floor((now.getTime() - created.getTime()) / 1000);
|
|
402
|
-
|
|
403
|
-
const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
|
|
404
|
-
|
|
405
|
-
if (diffInSeconds < 60) return rtf.format(-diffInSeconds, "second");
|
|
406
|
-
if (diffInSeconds < 3600)
|
|
407
|
-
return rtf.format(-Math.floor(diffInSeconds / 60), "minute");
|
|
408
|
-
if (diffInSeconds < 86400)
|
|
409
|
-
return rtf.format(-Math.floor(diffInSeconds / 3600), "hour");
|
|
410
|
-
if (diffInSeconds < 2592000)
|
|
411
|
-
return rtf.format(-Math.floor(diffInSeconds / 86400), "day");
|
|
412
|
-
if (diffInSeconds < 31536000)
|
|
413
|
-
return rtf.format(-Math.floor(diffInSeconds / 2592000), "month");
|
|
414
|
-
return rtf.format(-Math.floor(diffInSeconds / 31536000), "year");
|
|
415
|
-
};
|
|
416
|
-
|
|
417
|
-
const RevealApiKey = ({
|
|
418
|
-
apiKey,
|
|
419
|
-
onDeleteKey,
|
|
420
|
-
className,
|
|
421
|
-
}: {
|
|
422
|
-
apiKey: ApiKey;
|
|
423
|
-
onDeleteKey: () => void;
|
|
424
|
-
className?: string;
|
|
425
|
-
}) => {
|
|
426
|
-
const [revealed, setRevealed] = useState(false);
|
|
427
|
-
|
|
428
|
-
const { key, createdOn, expiresOn } = apiKey;
|
|
429
|
-
const isExpired = expiresOn && new Date(expiresOn) < new Date();
|
|
430
|
-
const daysUntilExpiry = expiresOn
|
|
431
|
-
? Math.ceil(
|
|
432
|
-
(new Date(expiresOn).getTime() - Date.now()) / (1000 * 60 * 60 * 24),
|
|
433
|
-
)
|
|
434
|
-
: Infinity;
|
|
435
|
-
const expiresSoon = daysUntilExpiry <= 7 && !isExpired;
|
|
436
|
-
|
|
437
|
-
return (
|
|
438
|
-
<div className={cn("grid col-span-full grid-cols-subgrid p-6", className)}>
|
|
439
|
-
<div className="flex flex-col gap-1">
|
|
440
|
-
<Secret
|
|
441
|
-
className="max-w-fit w-full"
|
|
442
|
-
secret={key}
|
|
443
|
-
status={isExpired ? "expired" : expiresSoon ? "expiring" : "active"}
|
|
444
|
-
revealed={revealed}
|
|
445
|
-
onReveal={setRevealed}
|
|
446
|
-
/>
|
|
447
|
-
<div className="flex gap-1 mt-0.5 text-nowrap">
|
|
448
|
-
{createdOn && (
|
|
449
|
-
<span className="text-xs text-muted-foreground">
|
|
450
|
-
Created {getTimeAgo(createdOn)}.
|
|
451
|
-
</span>
|
|
452
|
-
)}{" "}
|
|
453
|
-
{expiresOn && expiresSoon && (
|
|
454
|
-
<span className="text-xs text-primary">
|
|
455
|
-
Expires in {daysUntilExpiry}{" "}
|
|
456
|
-
{daysUntilExpiry === 1 ? "day" : "days"}.
|
|
457
|
-
</span>
|
|
458
|
-
)}
|
|
459
|
-
{expiresOn && isExpired && (
|
|
460
|
-
<span className="text-xs text-primary">
|
|
461
|
-
Expired{" "}
|
|
462
|
-
{daysUntilExpiry === 0
|
|
463
|
-
? "today."
|
|
464
|
-
: `${daysUntilExpiry * -1} days ago.`}
|
|
465
|
-
</span>
|
|
466
|
-
)}
|
|
467
|
-
</div>
|
|
468
|
-
</div>
|
|
469
|
-
<div className="flex justify-end">
|
|
470
|
-
{expiresOn && onDeleteKey && (
|
|
471
|
-
<Dialog>
|
|
472
|
-
<DialogTrigger asChild>
|
|
473
|
-
<Button variant="ghost" size="icon">
|
|
474
|
-
<TrashIcon size={16} />
|
|
475
|
-
</Button>
|
|
476
|
-
</DialogTrigger>
|
|
477
|
-
<DialogContent>
|
|
478
|
-
<DialogHeader>
|
|
479
|
-
<DialogTitle>Delete API Key</DialogTitle>
|
|
480
|
-
<DialogDescription>
|
|
481
|
-
Are you sure you want to delete this API key?
|
|
482
|
-
</DialogDescription>
|
|
483
|
-
</DialogHeader>
|
|
484
|
-
<DialogFooter>
|
|
485
|
-
<DialogClose asChild>
|
|
486
|
-
<Button variant="outline">Cancel</Button>
|
|
487
|
-
</DialogClose>
|
|
488
|
-
<DialogClose asChild>
|
|
489
|
-
<Button
|
|
490
|
-
onClick={() => {
|
|
491
|
-
onDeleteKey();
|
|
492
|
-
}}
|
|
493
|
-
>
|
|
494
|
-
Delete
|
|
495
|
-
</Button>
|
|
496
|
-
</DialogClose>
|
|
497
|
-
</DialogFooter>
|
|
498
|
-
</DialogContent>
|
|
499
|
-
</Dialog>
|
|
500
|
-
)}
|
|
501
|
-
</div>
|
|
502
62
|
</div>
|
|
503
63
|
);
|
|
504
64
|
};
|