@stytch/react 20.0.0-next.4 → 20.0.0-next.6
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/CHANGELOG.md +12 -0
- package/dist/cjs/StytchSSRProxy-Bz6LNYdq.js.map +1 -1
- package/dist/cjs/adminPortal/index.cjs +2 -2
- package/dist/cjs/b2b/index.cjs +11 -8
- package/dist/cjs/b2b/index.cjs.map +1 -1
- package/dist/cjs/b2b/index.headless.cjs +456 -496
- package/dist/cjs/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs/{idpHelpers-Bj_7pbfW.js → idpHelpers-UZaYQqT8.js} +111 -129
- package/dist/cjs/{idpHelpers-Bj_7pbfW.js.map → idpHelpers-UZaYQqT8.js.map} +1 -1
- package/dist/cjs/{index-BIjXBvf_.js → index-MDH3lelI.js} +2 -2
- package/dist/cjs/{index-BIjXBvf_.js.map → index-MDH3lelI.js.map} +1 -1
- package/dist/cjs/index.cjs +18 -14
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.headless.cjs +401 -448
- package/dist/cjs/index.headless.cjs.map +1 -1
- package/dist/cjs/{passwordManagerDisableAutofillProps-DV31RTL_.js → passwordManagerDisableAutofillProps-BzR1GTDj.js} +42 -33
- package/dist/cjs/passwordManagerDisableAutofillProps-BzR1GTDj.js.map +1 -0
- package/dist/cjs/{shadcn-aVU6Lm9q.js → shadcn-BNtf3uZr.js} +7 -6
- package/dist/cjs/shadcn-BNtf3uZr.js.map +1 -0
- package/dist/cjs-dev/adminPortal/index.cjs +2 -2
- package/dist/cjs-dev/b2b/index.cjs +11 -8
- package/dist/cjs-dev/b2b/index.cjs.map +1 -1
- package/dist/cjs-dev/b2b/index.headless.cjs +468 -508
- package/dist/cjs-dev/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/dev-DaCGDI6V.js.map +1 -1
- package/dist/cjs-dev/{idpHelpers-DOYYSxsX.js → idpHelpers-CVk39K69.js} +111 -129
- package/dist/cjs-dev/{idpHelpers-DOYYSxsX.js.map → idpHelpers-CVk39K69.js.map} +1 -1
- package/dist/cjs-dev/{index-rquGmIlv.js → index-BDTK8QN0.js} +2 -2
- package/dist/cjs-dev/{index-rquGmIlv.js.map → index-BDTK8QN0.js.map} +1 -1
- package/dist/cjs-dev/index.cjs +18 -14
- package/dist/cjs-dev/index.cjs.map +1 -1
- package/dist/cjs-dev/index.headless.cjs +405 -452
- package/dist/cjs-dev/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/{passwordManagerDisableAutofillProps-CgiK2M_U.js → passwordManagerDisableAutofillProps--FLcEDiY.js} +42 -33
- package/dist/cjs-dev/passwordManagerDisableAutofillProps--FLcEDiY.js.map +1 -0
- package/dist/cjs-dev/{shadcn-DMk6ZSoD.js → shadcn-CvmoCuzj.js} +9 -8
- package/dist/cjs-dev/shadcn-CvmoCuzj.js.map +1 -0
- package/dist/esm/_virtual/index3.mjs +3 -5
- package/dist/esm/_virtual/index3.mjs.map +1 -1
- package/dist/esm/_virtual/index4.mjs +5 -3
- package/dist/esm/_virtual/index4.mjs.map +1 -1
- package/dist/esm/node_modules/@lingui/react/dist/index.mjs +14 -13
- package/dist/esm/node_modules/@lingui/react/dist/index.mjs.map +1 -1
- package/dist/esm/node_modules/@lingui/react/dist/shared/{react.31c3b5fa.mjs → react.8970326b.mjs} +32 -23
- package/dist/esm/node_modules/@lingui/react/dist/shared/react.8970326b.mjs.map +1 -0
- package/dist/esm/packages/core/src/DFPProtectedAuthProvider.mjs +39 -43
- package/dist/esm/packages/core/src/DFPProtectedAuthProvider.mjs.map +1 -1
- package/dist/esm/packages/core/src/EventLogger.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessCryptoWalletClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs +15 -18
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessImpersonationClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessMagicLinkClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs +58 -77
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs +100 -103
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessPasswordClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs +6 -8
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs +77 -82
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessTOTPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessUserClient.mjs +111 -125
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessUserClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs +10 -11
- package/dist/esm/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs +16 -19
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BMagicLinkClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOTPsClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs +142 -153
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BPasswordsClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs +7 -9
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BRecoveryCodesClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSCIMClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs +67 -70
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs +81 -93
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs +67 -73
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/NetworkClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/SearchManager.mjs.map +1 -1
- package/dist/esm/packages/core/src/SessionManager.mjs +28 -31
- package/dist/esm/packages/core/src/SessionManager.mjs.map +1 -1
- package/dist/esm/packages/core/src/StateChangeClient.mjs +5 -6
- package/dist/esm/packages/core/src/StateChangeClient.mjs.map +1 -1
- package/dist/esm/packages/core/src/public/SDKErrors.mjs.map +1 -1
- package/dist/esm/packages/core/src/rbac.mjs.map +1 -1
- package/dist/esm/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/BootstrapDataManager.mjs.map +1 -1
- package/dist/esm/packages/web/src/CaptchaProvider.mjs +10 -11
- package/dist/esm/packages/web/src/CaptchaProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/ClientsideServicesProvider.mjs +4 -8
- package/dist/esm/packages/web/src/ClientsideServicesProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/HeadlessOAuthClient.mjs +24 -24
- package/dist/esm/packages/web/src/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/NetworkClient.mjs +4 -5
- package/dist/esm/packages/web/src/NetworkClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/PKCEManager.mjs.map +1 -1
- package/dist/esm/packages/web/src/StytchClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/SubscriptionService.mjs +8 -10
- package/dist/esm/packages/web/src/SubscriptionService.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs +48 -48
- package/dist/esm/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/b2b/StytchB2BClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs +27 -30
- package/dist/esm/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/oneTap/GoogleOneTapClient.mjs.map +1 -1
- package/dist/esm/packages/web/src/oneTap/OneTapProvider.mjs +12 -14
- package/dist/esm/packages/web/src/oneTap/OneTapProvider.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/App.mjs +3 -1
- package/dist/esm/packages/web/src/ui/b2b/App.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/InternalAppContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2b/InternalAppContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/SMSOTPEnrollScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/AppContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/AppContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/IDPContainer.mjs +3 -1
- package/dist/esm/packages/web/src/ui/b2c/IDPContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/ResetPasswordContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/ResetPasswordContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +4 -2
- package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Main/index.mjs +2 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Main/index.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/PresentationConfig.mjs +2 -1
- package/dist/esm/packages/web/src/ui/components/PresentationConfig.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/mixins/Root.module.css.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +1 -1
- package/dist/esm/packages/web/src/ui/hooks/usePromptPasskey.mjs +3 -3
- package/dist/esm/packages/web/src/ui/hooks/usePromptPasskey.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs +2 -2
- package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/bindings/createB2CComponent.mjs +2 -2
- package/dist/esm/packages/web/src/ui/react/bindings/createB2CComponent.mjs.map +1 -1
- package/dist/esm/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/esm-dev/_virtual/index.mjs +3 -5
- package/dist/esm-dev/_virtual/index.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index2.mjs +5 -3
- package/dist/esm-dev/_virtual/index2.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index3.mjs +5 -3
- package/dist/esm-dev/_virtual/index3.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index4.mjs +3 -5
- package/dist/esm-dev/_virtual/index4.mjs.map +1 -1
- package/dist/esm-dev/node_modules/@lingui/react/dist/index.mjs +14 -13
- package/dist/esm-dev/node_modules/@lingui/react/dist/index.mjs.map +1 -1
- package/dist/esm-dev/node_modules/@lingui/react/dist/shared/{react.31c3b5fa.mjs → react.8970326b.mjs} +32 -23
- package/dist/esm-dev/node_modules/@lingui/react/dist/shared/react.8970326b.mjs.map +1 -0
- package/dist/esm-dev/node_modules/swr/core/dist/index.mjs +1 -1
- package/dist/esm-dev/node_modules/swr/infinite/dist/index.mjs +1 -1
- package/dist/esm-dev/packages/core/src/DFPProtectedAuthProvider.mjs +39 -43
- package/dist/esm-dev/packages/core/src/DFPProtectedAuthProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/EventLogger.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessCryptoWalletClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs +15 -18
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessIDPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessImpersonationClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessMagicLinkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs +58 -77
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs +100 -103
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessOTPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessPasswordClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs +6 -8
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessRBACClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs +77 -82
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessSessionClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessTOTPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessUserClient.mjs +114 -128
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessUserClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs +10 -11
- package/dist/esm-dev/packages/core/src/HeadlessClients/HeadlessWebAuthnClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs +16 -19
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BMagicLinkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOTPsClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs +144 -155
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BOrganizationClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BPasswordsClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs +7 -9
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRBACClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BRecoveryCodesClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSCIMClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs +67 -70
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSSOClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs +88 -100
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSelfClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs +70 -76
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BSessionClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BTOTPsClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/NetworkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/SearchManager.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/SessionManager.mjs +28 -31
- package/dist/esm-dev/packages/core/src/SessionManager.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/StateChangeClient.mjs +5 -6
- package/dist/esm-dev/packages/core/src/StateChangeClient.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/public/SDKErrors.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/rbac.mjs.map +1 -1
- package/dist/esm-dev/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/BootstrapDataManager.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/CaptchaProvider.mjs +10 -11
- package/dist/esm-dev/packages/web/src/CaptchaProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ClientsideServicesProvider.mjs +4 -8
- package/dist/esm-dev/packages/web/src/ClientsideServicesProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/HeadlessOAuthClient.mjs +24 -24
- package/dist/esm-dev/packages/web/src/HeadlessOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/NetworkClient.mjs +4 -5
- package/dist/esm-dev/packages/web/src/NetworkClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/PKCEManager.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/StytchClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/SubscriptionService.mjs +8 -10
- package/dist/esm-dev/packages/web/src/SubscriptionService.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/AuthManagementSection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/useMemberActivation.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionDangerZoneSection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionTokenRotationSection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMNewConnectionScreen.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/sso/SSONewConnectionScreen.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateMember.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateOrganization.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateScimConnection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useMutateSsoConnection.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRevalidateConnectionList.mjs +1 -1
- package/dist/esm-dev/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs +48 -48
- package/dist/esm-dev/packages/web/src/b2b/HeadlessB2BOAuthClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/b2b/StytchB2BClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs +27 -30
- package/dist/esm-dev/packages/web/src/b2b/oneTap/B2BOneTapProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/oneTap/GoogleOneTapClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/oneTap/OneTapProvider.mjs +12 -14
- package/dist/esm-dev/packages/web/src/oneTap/OneTapProvider.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/App.mjs +3 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/App.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/Container.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/InternalAppContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/InternalAppContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OAuthB2BButton.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OrganizationRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/SMSOTPEnrollScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/AppContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/AppContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/IDPContainer.mjs +3 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/IDPContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/PasskeyRegistrationContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/ResetPasswordContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/ResetPasswordContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +5 -3
- package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/LoginForm/index.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/index.mjs +2 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/index.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Passkey/EditableRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/PresentationConfig.mjs +2 -1
- package/dist/esm-dev/packages/web/src/ui/components/PresentationConfig.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/AnimatedContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Button.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CodeContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Column.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Typography.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VerticalTransition.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VisuallyHidden.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/mixins/Root.module.css.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Badge.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Input.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/OtpInput.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PasswordStrengthCheck.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/IDPConsentManifest.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/OneTapError.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/organisms/OneTapError.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/hooks/usePromptPasskey.mjs +3 -3
- package/dist/esm-dev/packages/web/src/ui/hooks/usePromptPasskey.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2CComponent.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2CComponent.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/types/{PresentationConfig-B2jX85oV.d.ts → PresentationConfig-CdAymT0c.d.ts} +5 -0
- package/dist/types/{StytchB2BClient-D16e_lp1.d.ts → StytchB2BClient-DYF9xGAB.d.ts} +1 -1
- package/dist/types/{StytchClient-BwQdJzdj.d.ts → StytchClient-IyY7-cpI.d.ts} +1 -1
- package/dist/types/adminPortal/index.d.ts +3 -3
- package/dist/types/b2b/index.d.ts +7 -7
- package/dist/types/b2b/index.headless.d.ts +2 -2
- package/dist/types/compat.d.ts +1 -1
- package/dist/types/{createAuthUrlHandler-R1kNNQD_.d.ts → createAuthUrlHandler-CFZ0DGWC.d.ts} +6 -2
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.headless.d.ts +2 -2
- package/dist/types/{shadcn-CGdmyIUF.d.ts → shadcn-USiNERNw.d.ts} +4 -4
- package/messages/en.po +3 -3
- package/package.json +1 -1
- package/dist/cjs/passwordManagerDisableAutofillProps-DV31RTL_.js.map +0 -1
- package/dist/cjs/shadcn-aVU6Lm9q.js.map +0 -1
- package/dist/cjs-dev/passwordManagerDisableAutofillProps-CgiK2M_U.js.map +0 -1
- package/dist/cjs-dev/shadcn-DMk6ZSoD.js.map +0 -1
- package/dist/esm/node_modules/@lingui/react/dist/shared/react.31c3b5fa.mjs.map +0 -1
- package/dist/esm-dev/node_modules/@lingui/react/dist/shared/react.31c3b5fa.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StytchB2BClient.mjs","sources":["../../../../../../../web/src/b2b/StytchB2BClient.ts"],"sourcesContent":["import {\n checkB2BNotSSR,\n checkPublicToken,\n DFPProtectedAuthProvider,\n HeadlessB2BDiscoveryClient,\n HeadlessB2BIDPClient,\n HeadlessB2BImpersonationClient,\n HeadlessB2BMagicLinksClient,\n HeadlessB2BOrganizationClient,\n HeadlessB2BOTPsClient,\n HeadlessB2BPasswordsClient,\n HeadlessB2BRBACClient,\n HeadlessB2BRecoveryCodesClient,\n HeadlessB2BSCIMClient,\n HeadlessB2BSelfClient,\n HeadlessB2BSessionClient,\n HeadlessB2BSSOClient,\n HeadlessB2BTOTPsClient,\n INetworkClient,\n SearchDataManager,\n SessionManager,\n StateChangeClient,\n StateChangeRegisterFunction,\n VERTICAL_CONSUMER,\n logger,\n} from '@stytch/core';\nimport {\n B2BState,\n IHeadlessB2BDiscoveryClient,\n IHeadlessB2BImpersonationClient,\n IHeadlessB2BMagicLinksClient,\n IHeadlessB2BMemberClient,\n IHeadlessB2BOrganizationClient,\n IHeadlessB2BOTPsClient,\n IHeadlessB2BPasswordClient,\n IHeadlessB2BRBACClient,\n IHeadlessB2BRecoveryCodesClient,\n IHeadlessB2BSCIMClient,\n IHeadlessB2BSelfClient,\n IHeadlessB2BSessionClient,\n IHeadlessB2BSSOClient,\n IHeadlessB2BTOTPsClient,\n StytchClientOptions,\n StytchProjectConfigurationInput,\n} from '@stytch/core/public';\nimport { BootstrapDataManager } from '../BootstrapDataManager';\nimport { CaptchaProvider } from '../CaptchaProvider';\nimport { ClientsideServicesProvider } from '../ClientsideServicesProvider';\nimport { NetworkClient } from '../NetworkClient';\nimport { PKCEManager } from '../PKCEManager';\nimport { B2BSubscriptionDataLayer, B2BSubscriptionService, getB2BDataLayer } from '../SubscriptionService';\nimport { B2BInternals, writeB2BInternals } from '../utils/internal';\nimport { HeadlessB2BOAuthClient, IWebB2BOAuthClient } from './HeadlessB2BOAuthClient';\nimport { B2BOneTapProvider } from './oneTap/B2BOneTapProvider';\nimport { buildFinalConfig, hasCustomApiEndpoint } from '../utils/config';\nimport { createAuthUrlHandler, AuthenticateByUrl, ParseAuthenticateUrl } from '../utils/createAuthUrlHandler';\n\nexport type HandledTokenType =\n | 'discovery'\n | 'discovery_oauth'\n | 'oauth'\n | 'sso'\n | 'multi_tenant_magic_links'\n | 'multi_tenant_impersonation';\n\n/**\n * A headless client used for invoking Stytch's B2B APIs.\n * The Stytch Headless Client can be used as a drop-in solution for authentication and session management.\n * Full documentation can be found {@link https://stytch.com/docs/b2b/sdks/javascript-sdk online}.\n *\n * @example\n * const stytch = new StytchB2BClient('public-token-<find yours in the stytch dashboard>');\n * stytch.magicLinks.email.loginOrCreate({\n * email: 'sandbox@stytch.com',\n * organization_id: 'organization-test-123',\n * });\n */\nexport class StytchB2BClient<\n TProjectConfiguration extends StytchProjectConfigurationInput = Stytch.DefaultProjectConfiguration,\n> {\n private readonly _subscriptionService: B2BSubscriptionService<TProjectConfiguration>;\n private readonly _sessionManager: SessionManager<TProjectConfiguration>;\n private readonly _networkClient: INetworkClient;\n private readonly _dataLayer: B2BSubscriptionDataLayer;\n private readonly _stateChangeClient: StateChangeClient<B2BState>;\n\n // External API Clients\n magicLinks: IHeadlessB2BMagicLinksClient<TProjectConfiguration>;\n session: IHeadlessB2BSessionClient<TProjectConfiguration>;\n /** @deprecated Please use client.self instead. This will be removed in a future release. */\n member: IHeadlessB2BMemberClient;\n self: IHeadlessB2BSelfClient;\n organization: IHeadlessB2BOrganizationClient;\n oauth: IWebB2BOAuthClient<TProjectConfiguration>;\n sso: IHeadlessB2BSSOClient<TProjectConfiguration>;\n discovery: IHeadlessB2BDiscoveryClient<TProjectConfiguration>;\n passwords: IHeadlessB2BPasswordClient<TProjectConfiguration>;\n otps: IHeadlessB2BOTPsClient<TProjectConfiguration>;\n totp: IHeadlessB2BTOTPsClient<TProjectConfiguration>;\n recoveryCodes: IHeadlessB2BRecoveryCodesClient<TProjectConfiguration>;\n rbac: IHeadlessB2BRBACClient;\n scim: IHeadlessB2BSCIMClient;\n impersonation: IHeadlessB2BImpersonationClient;\n idp: HeadlessB2BIDPClient;\n\n // External methods\n /**\n * Register a callback function to be invoked whenever certain state changes\n * occur, like a member or session object being updated.\n *\n * This is an alternative to more specific methods like `self.onChange` and\n * `session.onChange`. It can be helpful if you want to be notified of related\n * changes to different parts of state at once.\n *\n * If you are only interested in specific state changes, consider using more\n * specific methods like `self.onChange` and `session.onChange` instead.\n */\n onStateChange: StateChangeRegisterFunction<B2BState>;\n\n /**\n * Extracts token and token type from the current page URL's query parameters.\n * If the current URL do not have the required query params, this will return null.\n * Otherwise, returns an object { handled: boolean, tokenType: string, token: string }\n */\n parseAuthenticateUrl: ParseAuthenticateUrl<HandledTokenType>;\n\n /**\n * Call this method to authenticate the user when the user has been redirected\n * to this page with a token in the query parameters, such as after OAuth\n * or through an email magic link. This method currently supports\n *\n * - Magic links\n * - OAuth\n * - SSO\n * - Impersonation\n *\n * If the current URL do not have the required query params, the promise returned will resolve to null.\n * If the token type is not supported (e.g. reset_password), the promise returned will resolve to this\n * object allowing you to handle the token.\n * {\n * handled: false,\n * tokenType: 'token_type',\n * token: '<token>'\n * }\n */\n authenticateByUrl: AuthenticateByUrl<HandledTokenType>;\n\n constructor(rawPublicToken: string, options?: StytchClientOptions) {\n checkB2BNotSSR();\n\n // Intentionally check the raw public token so that we can log a correct error message,\n // but then coalesce to an empty string so that the UI components don't fail to render.\n checkPublicToken(rawPublicToken);\n const _PUBLIC_TOKEN = rawPublicToken ?? '';\n\n // Not casting to InternalStytchClientOptions since InternalStytchClientOptions is currently a superset\n const config = buildFinalConfig(this.constructor.name, options);\n const usingCustomApiEndpoint = hasCustomApiEndpoint(_PUBLIC_TOKEN, options);\n\n this._dataLayer = getB2BDataLayer(_PUBLIC_TOKEN, config);\n this._subscriptionService = new B2BSubscriptionService(_PUBLIC_TOKEN, this._dataLayer, { usingCustomApiEndpoint });\n this._stateChangeClient = new StateChangeClient(this._subscriptionService, {});\n this.onStateChange = (...args) => this._stateChangeClient.onStateChange(...args);\n\n const additionalTelemetryDataFn = () => ({\n stytch_member_id: this._dataLayer.state?.member?.member_id,\n stytch_member_session_id: this._dataLayer.state?.session?.member_session_id,\n });\n\n const passwordsPKCEManager = new PKCEManager(this._dataLayer, 'passwords');\n\n const networkClient = new NetworkClient(\n _PUBLIC_TOKEN,\n this._dataLayer,\n config.endpoints.liveAPIURL,\n config.endpoints.testAPIURL,\n additionalTelemetryDataFn,\n );\n this._networkClient = networkClient;\n\n const bootstrap = new BootstrapDataManager(_PUBLIC_TOKEN, networkClient, this._dataLayer);\n const captcha = new CaptchaProvider(bootstrap.getAsync());\n const dfpProtectedAuth = new DFPProtectedAuthProvider(\n _PUBLIC_TOKEN,\n config.endpoints.dfpBackendURL,\n config.endpoints.dfpCdnURL,\n bootstrap.getAsync(),\n captcha.executeRecaptcha,\n );\n const clientsideServices = new ClientsideServicesProvider(config.endpoints.clientsideServicesIframeURL);\n const pkceManagerForOAuth = new PKCEManager(this._dataLayer, 'oauth');\n const oneTap = new B2BOneTapProvider(networkClient, pkceManagerForOAuth, bootstrap.getAsync());\n\n this.organization = new HeadlessB2BOrganizationClient(networkClient, networkClient, this._subscriptionService);\n this.member = new HeadlessB2BSelfClient(networkClient, networkClient, this._subscriptionService);\n this.self = new HeadlessB2BSelfClient(networkClient, networkClient, this._subscriptionService);\n this.session = new HeadlessB2BSessionClient(networkClient, this._subscriptionService);\n this.magicLinks = new HeadlessB2BMagicLinksClient(\n networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'magic_links'),\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.oauth = new HeadlessB2BOAuthClient(\n networkClient,\n this._subscriptionService,\n pkceManagerForOAuth,\n bootstrap.getAsync(),\n {\n publicToken: _PUBLIC_TOKEN,\n testAPIURL: config.endpoints.testAPIURL,\n liveAPIURL: config.endpoints.liveAPIURL,\n },\n dfpProtectedAuth,\n oneTap,\n );\n this.sso = new HeadlessB2BSSOClient(\n networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'sso'),\n bootstrap.getAsync(),\n {\n publicToken: _PUBLIC_TOKEN,\n testAPIURL: config.endpoints.testAPIURL,\n liveAPIURL: config.endpoints.liveAPIURL,\n },\n dfpProtectedAuth,\n );\n this.discovery = new HeadlessB2BDiscoveryClient(networkClient, this._subscriptionService);\n this.passwords = new HeadlessB2BPasswordsClient(\n networkClient,\n this._subscriptionService,\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.otps = new HeadlessB2BOTPsClient(networkClient, this._subscriptionService, dfpProtectedAuth);\n this.totp = new HeadlessB2BTOTPsClient(networkClient, this._subscriptionService, dfpProtectedAuth);\n this.recoveryCodes = new HeadlessB2BRecoveryCodesClient(networkClient, this._subscriptionService, dfpProtectedAuth);\n this.rbac = new HeadlessB2BRBACClient(bootstrap.getSync(), bootstrap.getAsync(), this._subscriptionService);\n this.scim = new HeadlessB2BSCIMClient(this._networkClient, this._subscriptionService);\n this.impersonation = new HeadlessB2BImpersonationClient(\n this._networkClient,\n this._subscriptionService,\n dfpProtectedAuth,\n );\n this.idp = new HeadlessB2BIDPClient(networkClient);\n this._sessionManager = new SessionManager(this._subscriptionService, this.session, _PUBLIC_TOKEN, {\n keepSessionAlive: config.keepSessionAlive,\n });\n const searchManager = new SearchDataManager(networkClient, dfpProtectedAuth);\n\n // If the session does not exist in localstorage (like if we are in an iframe)\n // then the cookie might still be set and we can retrieve the session via an API call.\n // If a custom API endpoint is being used, the session may be being managed by\n // HttpOnly cookies, which we can't detect.\n if (usingCustomApiEndpoint || this._dataLayer.readSessionCookie().session_token) {\n this._sessionManager.performBackgroundRefresh();\n }\n\n const { authenticateByUrl, parseAuthenticateUrl } = createAuthUrlHandler<HandledTokenType>({\n discovery: (token) => this.magicLinks.discovery.authenticate({ discovery_magic_links_token: token }),\n discovery_oauth: (token) => this.oauth.discovery.authenticate({ discovery_oauth_token: token }),\n oauth: (token, options) => this.oauth.authenticate({ oauth_token: token, ...options }),\n sso: (token, options) => this.sso.authenticate({ sso_token: token, ...options }),\n multi_tenant_magic_links: (token, options) =>\n this.magicLinks.authenticate({ magic_links_token: token, ...options }),\n multi_tenant_impersonation: (token) => this.impersonation.authenticate({ impersonation_token: token }),\n });\n\n this.authenticateByUrl = authenticateByUrl;\n this.parseAuthenticateUrl = parseAuthenticateUrl;\n\n networkClient.logEvent({\n name: 'b2b_sdk_instance_instantiated',\n details: {\n event_callback_registered: false,\n error_callback_registered: false,\n success_callback_registered: false,\n },\n });\n\n bootstrap.getAsync().then((bootstrapData) => {\n if (bootstrapData.vertical === VERTICAL_CONSUMER) {\n logger.error(\n 'This application is using a Stytch client for B2B projects, but the public token is for a Stytch Consumer project. Use a Consumer Stytch client instead, or verify that the public token is correct.',\n );\n }\n });\n\n const internals: B2BInternals = {\n bootstrap,\n clientsideServices,\n publicToken: _PUBLIC_TOKEN,\n searchManager,\n dataLayer: this._dataLayer,\n networkClient: networkClient,\n oneTap,\n };\n\n writeB2BInternals(this, internals);\n }\n}\n"],"names":["StytchB2BClient","_subscriptionService","_sessionManager","_networkClient","_dataLayer","_stateChangeClient","magicLinks","session","member","self","organization","oauth","sso","discovery","passwords","otps","totp","recoveryCodes","rbac","scim","impersonation","idp","onStateChange","parseAuthenticateUrl","authenticateByUrl","constructor","rawPublicToken","options","checkB2BNotSSR","checkPublicToken","_PUBLIC_TOKEN","config","buildFinalConfig","name","usingCustomApiEndpoint","hasCustomApiEndpoint","getB2BDataLayer","B2BSubscriptionService","StateChangeClient","args","additionalTelemetryDataFn","stytch_member_id","state","member_id","stytch_member_session_id","member_session_id","passwordsPKCEManager","PKCEManager","networkClient","NetworkClient","endpoints","liveAPIURL","testAPIURL","bootstrap","BootstrapDataManager","captcha","CaptchaProvider","getAsync","dfpProtectedAuth","DFPProtectedAuthProvider","dfpBackendURL","dfpCdnURL","executeRecaptcha","clientsideServices","ClientsideServicesProvider","clientsideServicesIframeURL","pkceManagerForOAuth","oneTap","B2BOneTapProvider","HeadlessB2BOrganizationClient","HeadlessB2BSelfClient","HeadlessB2BSessionClient","HeadlessB2BMagicLinksClient","HeadlessB2BOAuthClient","publicToken","HeadlessB2BSSOClient","HeadlessB2BDiscoveryClient","HeadlessB2BPasswordsClient","HeadlessB2BOTPsClient","HeadlessB2BTOTPsClient","HeadlessB2BRecoveryCodesClient","HeadlessB2BRBACClient","getSync","HeadlessB2BSCIMClient","HeadlessB2BImpersonationClient","HeadlessB2BIDPClient","SessionManager","keepSessionAlive","searchManager","SearchDataManager","readSessionCookie","session_token","performBackgroundRefresh","createAuthUrlHandler","token","authenticate","discovery_magic_links_token","discovery_oauth","discovery_oauth_token","oauth_token","sso_token","multi_tenant_magic_links","magic_links_token","multi_tenant_impersonation","impersonation_token","logEvent","details","event_callback_registered","error_callback_registered","success_callback_registered","then","bootstrapData","vertical","VERTICAL_CONSUMER","logger","error","internals","dataLayer","writeB2BInternals"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StytchB2BClient.mjs","sources":["../../../../../../../web/src/b2b/StytchB2BClient.ts"],"sourcesContent":["import {\n checkB2BNotSSR,\n checkPublicToken,\n DFPProtectedAuthProvider,\n HeadlessB2BDiscoveryClient,\n HeadlessB2BIDPClient,\n HeadlessB2BImpersonationClient,\n HeadlessB2BMagicLinksClient,\n HeadlessB2BOrganizationClient,\n HeadlessB2BOTPsClient,\n HeadlessB2BPasswordsClient,\n HeadlessB2BRBACClient,\n HeadlessB2BRecoveryCodesClient,\n HeadlessB2BSCIMClient,\n HeadlessB2BSelfClient,\n HeadlessB2BSessionClient,\n HeadlessB2BSSOClient,\n HeadlessB2BTOTPsClient,\n INetworkClient,\n SearchDataManager,\n SessionManager,\n StateChangeClient,\n StateChangeRegisterFunction,\n VERTICAL_CONSUMER,\n logger,\n} from '@stytch/core';\nimport {\n B2BState,\n IHeadlessB2BDiscoveryClient,\n IHeadlessB2BImpersonationClient,\n IHeadlessB2BMagicLinksClient,\n IHeadlessB2BMemberClient,\n IHeadlessB2BOrganizationClient,\n IHeadlessB2BOTPsClient,\n IHeadlessB2BPasswordClient,\n IHeadlessB2BRBACClient,\n IHeadlessB2BRecoveryCodesClient,\n IHeadlessB2BSCIMClient,\n IHeadlessB2BSelfClient,\n IHeadlessB2BSessionClient,\n IHeadlessB2BSSOClient,\n IHeadlessB2BTOTPsClient,\n StytchClientOptions,\n StytchProjectConfigurationInput,\n} from '@stytch/core/public';\nimport { BootstrapDataManager } from '../BootstrapDataManager';\nimport { CaptchaProvider } from '../CaptchaProvider';\nimport { ClientsideServicesProvider } from '../ClientsideServicesProvider';\nimport { NetworkClient } from '../NetworkClient';\nimport { PKCEManager } from '../PKCEManager';\nimport { B2BSubscriptionDataLayer, B2BSubscriptionService, getB2BDataLayer } from '../SubscriptionService';\nimport { B2BInternals, writeB2BInternals } from '../utils/internal';\nimport { HeadlessB2BOAuthClient, IWebB2BOAuthClient } from './HeadlessB2BOAuthClient';\nimport { B2BOneTapProvider } from './oneTap/B2BOneTapProvider';\nimport { buildFinalConfig, hasCustomApiEndpoint } from '../utils/config';\nimport { createAuthUrlHandler, AuthenticateByUrl, ParseAuthenticateUrl } from '../utils/createAuthUrlHandler';\n\nexport type HandledTokenType =\n | 'discovery'\n | 'discovery_oauth'\n | 'oauth'\n | 'sso'\n | 'multi_tenant_magic_links'\n | 'multi_tenant_impersonation';\n\n/**\n * A headless client used for invoking Stytch's B2B APIs.\n * The Stytch Headless Client can be used as a drop-in solution for authentication and session management.\n * Full documentation can be found {@link https://stytch.com/docs/b2b/sdks/javascript-sdk online}.\n *\n * @example\n * const stytch = new StytchB2BClient('public-token-<find yours in the stytch dashboard>');\n * stytch.magicLinks.email.loginOrCreate({\n * email: 'sandbox@stytch.com',\n * organization_id: 'organization-test-123',\n * });\n */\nexport class StytchB2BClient<\n TProjectConfiguration extends StytchProjectConfigurationInput = Stytch.DefaultProjectConfiguration,\n> {\n private readonly _subscriptionService: B2BSubscriptionService<TProjectConfiguration>;\n private readonly _sessionManager: SessionManager<TProjectConfiguration>;\n private readonly _networkClient: INetworkClient;\n private readonly _dataLayer: B2BSubscriptionDataLayer;\n private readonly _stateChangeClient: StateChangeClient<B2BState>;\n\n // External API Clients\n magicLinks: IHeadlessB2BMagicLinksClient<TProjectConfiguration>;\n session: IHeadlessB2BSessionClient<TProjectConfiguration>;\n /** @deprecated Please use client.self instead. This will be removed in a future release. */\n member: IHeadlessB2BMemberClient;\n self: IHeadlessB2BSelfClient;\n organization: IHeadlessB2BOrganizationClient;\n oauth: IWebB2BOAuthClient<TProjectConfiguration>;\n sso: IHeadlessB2BSSOClient<TProjectConfiguration>;\n discovery: IHeadlessB2BDiscoveryClient<TProjectConfiguration>;\n passwords: IHeadlessB2BPasswordClient<TProjectConfiguration>;\n otps: IHeadlessB2BOTPsClient<TProjectConfiguration>;\n totp: IHeadlessB2BTOTPsClient<TProjectConfiguration>;\n recoveryCodes: IHeadlessB2BRecoveryCodesClient<TProjectConfiguration>;\n rbac: IHeadlessB2BRBACClient;\n scim: IHeadlessB2BSCIMClient;\n impersonation: IHeadlessB2BImpersonationClient;\n idp: HeadlessB2BIDPClient;\n\n // External methods\n /**\n * Register a callback function to be invoked whenever certain state changes\n * occur, like a member or session object being updated.\n *\n * This is an alternative to more specific methods like `self.onChange` and\n * `session.onChange`. It can be helpful if you want to be notified of related\n * changes to different parts of state at once.\n *\n * If you are only interested in specific state changes, consider using more\n * specific methods like `self.onChange` and `session.onChange` instead.\n */\n onStateChange: StateChangeRegisterFunction<B2BState>;\n\n /**\n * Extracts token and token type from the current page URL's query parameters.\n * If the current URL do not have the required query params, this will return null.\n * Otherwise, returns an object { handled: boolean, tokenType: string, token: string }\n */\n parseAuthenticateUrl: ParseAuthenticateUrl<HandledTokenType>;\n\n /**\n * Call this method to authenticate the user when the user has been redirected\n * to this page with a token in the query parameters, such as after OAuth\n * or through an email magic link. This method currently supports\n *\n * - Magic links\n * - OAuth\n * - SSO\n * - Impersonation\n *\n * If the current URL do not have the required query params, the promise returned will resolve to null.\n * If the token type is not supported (e.g. reset_password), the promise returned will resolve to this\n * object allowing you to handle the token.\n * {\n * handled: false,\n * tokenType: 'token_type',\n * token: '<token>'\n * }\n */\n authenticateByUrl: AuthenticateByUrl<HandledTokenType>;\n\n constructor(rawPublicToken: string, options?: StytchClientOptions) {\n checkB2BNotSSR();\n\n // Intentionally check the raw public token so that we can log a correct error message,\n // but then coalesce to an empty string so that the UI components don't fail to render.\n checkPublicToken(rawPublicToken);\n const _PUBLIC_TOKEN = rawPublicToken ?? '';\n\n // Not casting to InternalStytchClientOptions since InternalStytchClientOptions is currently a superset\n const config = buildFinalConfig(this.constructor.name, options);\n const usingCustomApiEndpoint = hasCustomApiEndpoint(_PUBLIC_TOKEN, options);\n\n this._dataLayer = getB2BDataLayer(_PUBLIC_TOKEN, config);\n this._subscriptionService = new B2BSubscriptionService(_PUBLIC_TOKEN, this._dataLayer, { usingCustomApiEndpoint });\n this._stateChangeClient = new StateChangeClient(this._subscriptionService, {});\n this.onStateChange = (...args) => this._stateChangeClient.onStateChange(...args);\n\n const additionalTelemetryDataFn = () => ({\n stytch_member_id: this._dataLayer.state?.member?.member_id,\n stytch_member_session_id: this._dataLayer.state?.session?.member_session_id,\n });\n\n const passwordsPKCEManager = new PKCEManager(this._dataLayer, 'passwords');\n\n const networkClient = new NetworkClient(\n _PUBLIC_TOKEN,\n this._dataLayer,\n config.endpoints.liveAPIURL,\n config.endpoints.testAPIURL,\n additionalTelemetryDataFn,\n );\n this._networkClient = networkClient;\n\n const bootstrap = new BootstrapDataManager(_PUBLIC_TOKEN, networkClient, this._dataLayer);\n const captcha = new CaptchaProvider(bootstrap.getAsync());\n const dfpProtectedAuth = new DFPProtectedAuthProvider(\n _PUBLIC_TOKEN,\n config.endpoints.dfpBackendURL,\n config.endpoints.dfpCdnURL,\n bootstrap.getAsync(),\n captcha.executeRecaptcha,\n );\n const clientsideServices = new ClientsideServicesProvider(config.endpoints.clientsideServicesIframeURL);\n const pkceManagerForOAuth = new PKCEManager(this._dataLayer, 'oauth');\n const oneTap = new B2BOneTapProvider(networkClient, pkceManagerForOAuth, bootstrap.getAsync());\n\n this.organization = new HeadlessB2BOrganizationClient(networkClient, networkClient, this._subscriptionService);\n this.member = new HeadlessB2BSelfClient(networkClient, networkClient, this._subscriptionService);\n this.self = new HeadlessB2BSelfClient(networkClient, networkClient, this._subscriptionService);\n this.session = new HeadlessB2BSessionClient(networkClient, this._subscriptionService);\n this.magicLinks = new HeadlessB2BMagicLinksClient(\n networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'magic_links'),\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.oauth = new HeadlessB2BOAuthClient(\n networkClient,\n this._subscriptionService,\n pkceManagerForOAuth,\n bootstrap.getAsync(),\n {\n publicToken: _PUBLIC_TOKEN,\n testAPIURL: config.endpoints.testAPIURL,\n liveAPIURL: config.endpoints.liveAPIURL,\n },\n dfpProtectedAuth,\n oneTap,\n );\n this.sso = new HeadlessB2BSSOClient(\n networkClient,\n this._subscriptionService,\n new PKCEManager(this._dataLayer, 'sso'),\n bootstrap.getAsync(),\n {\n publicToken: _PUBLIC_TOKEN,\n testAPIURL: config.endpoints.testAPIURL,\n liveAPIURL: config.endpoints.liveAPIURL,\n },\n dfpProtectedAuth,\n );\n this.discovery = new HeadlessB2BDiscoveryClient(networkClient, this._subscriptionService);\n this.passwords = new HeadlessB2BPasswordsClient(\n networkClient,\n this._subscriptionService,\n passwordsPKCEManager,\n bootstrap.getAsync(),\n dfpProtectedAuth,\n );\n this.otps = new HeadlessB2BOTPsClient(networkClient, this._subscriptionService, dfpProtectedAuth);\n this.totp = new HeadlessB2BTOTPsClient(networkClient, this._subscriptionService, dfpProtectedAuth);\n this.recoveryCodes = new HeadlessB2BRecoveryCodesClient(networkClient, this._subscriptionService, dfpProtectedAuth);\n this.rbac = new HeadlessB2BRBACClient(bootstrap.getSync(), bootstrap.getAsync(), this._subscriptionService);\n this.scim = new HeadlessB2BSCIMClient(this._networkClient, this._subscriptionService);\n this.impersonation = new HeadlessB2BImpersonationClient(\n this._networkClient,\n this._subscriptionService,\n dfpProtectedAuth,\n );\n this.idp = new HeadlessB2BIDPClient(networkClient);\n this._sessionManager = new SessionManager(this._subscriptionService, this.session, _PUBLIC_TOKEN, {\n keepSessionAlive: config.keepSessionAlive,\n });\n const searchManager = new SearchDataManager(networkClient, dfpProtectedAuth);\n\n // If the session does not exist in localstorage (like if we are in an iframe)\n // then the cookie might still be set and we can retrieve the session via an API call.\n // If a custom API endpoint is being used, the session may be being managed by\n // HttpOnly cookies, which we can't detect.\n if (usingCustomApiEndpoint || this._dataLayer.readSessionCookie().session_token) {\n this._sessionManager.performBackgroundRefresh();\n }\n\n const { authenticateByUrl, parseAuthenticateUrl } = createAuthUrlHandler<HandledTokenType>({\n discovery: (token) => this.magicLinks.discovery.authenticate({ discovery_magic_links_token: token }),\n discovery_oauth: (token) => this.oauth.discovery.authenticate({ discovery_oauth_token: token }),\n oauth: (token, options) => this.oauth.authenticate({ oauth_token: token, ...options }),\n sso: (token, options) => this.sso.authenticate({ sso_token: token, ...options }),\n multi_tenant_magic_links: (token, options) =>\n this.magicLinks.authenticate({ magic_links_token: token, ...options }),\n multi_tenant_impersonation: (token) => this.impersonation.authenticate({ impersonation_token: token }),\n });\n\n this.authenticateByUrl = authenticateByUrl;\n this.parseAuthenticateUrl = parseAuthenticateUrl;\n\n networkClient.logEvent({\n name: 'b2b_sdk_instance_instantiated',\n details: {\n event_callback_registered: false,\n error_callback_registered: false,\n success_callback_registered: false,\n },\n });\n\n bootstrap.getAsync().then((bootstrapData) => {\n if (bootstrapData.vertical === VERTICAL_CONSUMER) {\n logger.error(\n 'This application is using a Stytch client for B2B projects, but the public token is for a Stytch Consumer project. Use a Consumer Stytch client instead, or verify that the public token is correct.',\n );\n }\n });\n\n const internals: B2BInternals = {\n bootstrap,\n clientsideServices,\n publicToken: _PUBLIC_TOKEN,\n searchManager,\n dataLayer: this._dataLayer,\n networkClient: networkClient,\n oneTap,\n };\n\n writeB2BInternals(this, internals);\n }\n}\n"],"names":["StytchB2BClient","_subscriptionService","_sessionManager","_networkClient","_dataLayer","_stateChangeClient","magicLinks","session","member","self","organization","oauth","sso","discovery","passwords","otps","totp","recoveryCodes","rbac","scim","impersonation","idp","onStateChange","parseAuthenticateUrl","authenticateByUrl","rawPublicToken","options","checkB2BNotSSR","checkPublicToken","_PUBLIC_TOKEN","config","buildFinalConfig","name","usingCustomApiEndpoint","hasCustomApiEndpoint","getB2BDataLayer","B2BSubscriptionService","StateChangeClient","args","additionalTelemetryDataFn","stytch_member_id","state","member_id","stytch_member_session_id","member_session_id","passwordsPKCEManager","PKCEManager","networkClient","NetworkClient","endpoints","liveAPIURL","testAPIURL","bootstrap","BootstrapDataManager","captcha","CaptchaProvider","getAsync","dfpProtectedAuth","DFPProtectedAuthProvider","dfpBackendURL","dfpCdnURL","executeRecaptcha","clientsideServices","ClientsideServicesProvider","clientsideServicesIframeURL","pkceManagerForOAuth","oneTap","B2BOneTapProvider","HeadlessB2BOrganizationClient","HeadlessB2BSelfClient","HeadlessB2BSessionClient","HeadlessB2BMagicLinksClient","HeadlessB2BOAuthClient","publicToken","HeadlessB2BSSOClient","HeadlessB2BDiscoveryClient","HeadlessB2BPasswordsClient","HeadlessB2BOTPsClient","HeadlessB2BTOTPsClient","HeadlessB2BRecoveryCodesClient","HeadlessB2BRBACClient","getSync","HeadlessB2BSCIMClient","HeadlessB2BImpersonationClient","HeadlessB2BIDPClient","SessionManager","keepSessionAlive","searchManager","SearchDataManager","readSessionCookie","session_token","performBackgroundRefresh","createAuthUrlHandler","token","authenticate","discovery_magic_links_token","discovery_oauth","discovery_oauth_token","oauth_token","sso_token","multi_tenant_magic_links","magic_links_token","multi_tenant_impersonation","impersonation_token","logEvent","details","event_callback_registered","error_callback_registered","success_callback_registered","then","bootstrapData","vertical","VERTICAL_CONSUMER","logger","error","internals","dataLayer","writeB2BInternals"],"mappings":"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"}
|
|
@@ -16,33 +16,6 @@ const DefaultDynamicConfig = Promise.resolve({
|
|
|
16
16
|
this._networkClient = _networkClient;
|
|
17
17
|
this._pkceManager = _pkceManager;
|
|
18
18
|
this._config = _config;
|
|
19
|
-
this.createOnDiscoverySuccessHandler = ({ discoveryRedirectUrl, onSuccess, onError })=>async (response)=>{
|
|
20
|
-
const { credential } = response;
|
|
21
|
-
let submitPromise = this.submitGoogleOneTapTokenDiscovery({
|
|
22
|
-
credential,
|
|
23
|
-
discoveryRedirectUrl
|
|
24
|
-
}).then((result)=>onSuccess(result.redirect_url));
|
|
25
|
-
if (onError) {
|
|
26
|
-
submitPromise = submitPromise.catch((error)=>onError(error));
|
|
27
|
-
}
|
|
28
|
-
await submitPromise;
|
|
29
|
-
};
|
|
30
|
-
this.createOnSuccessHandler = ({ organizationId, signupRedirectUrl, loginRedirectUrl, onSuccess, onError })=>async (response)=>{
|
|
31
|
-
const { credential } = response;
|
|
32
|
-
let submitPromise = this.submitGoogleOneTapToken({
|
|
33
|
-
credential,
|
|
34
|
-
organizationId,
|
|
35
|
-
signupRedirectUrl,
|
|
36
|
-
loginRedirectUrl
|
|
37
|
-
}).then((result)=>onSuccess(result.redirect_url));
|
|
38
|
-
if (onError) {
|
|
39
|
-
submitPromise = submitPromise.catch((error)=>onError(error));
|
|
40
|
-
}
|
|
41
|
-
await submitPromise;
|
|
42
|
-
};
|
|
43
|
-
this.redirectOnSuccess = (redirect_url)=>{
|
|
44
|
-
window.location.href = redirect_url;
|
|
45
|
-
};
|
|
46
19
|
}
|
|
47
20
|
async fetchGoogleStart() {
|
|
48
21
|
if (this.googleClientID) {
|
|
@@ -118,9 +91,33 @@ const DefaultDynamicConfig = Promise.resolve({
|
|
|
118
91
|
client
|
|
119
92
|
};
|
|
120
93
|
}
|
|
121
|
-
createOnDiscoverySuccessHandler
|
|
122
|
-
|
|
123
|
-
|
|
94
|
+
createOnDiscoverySuccessHandler = ({ discoveryRedirectUrl, onSuccess, onError })=>async (response)=>{
|
|
95
|
+
const { credential } = response;
|
|
96
|
+
let submitPromise = this.submitGoogleOneTapTokenDiscovery({
|
|
97
|
+
credential,
|
|
98
|
+
discoveryRedirectUrl
|
|
99
|
+
}).then((result)=>onSuccess(result.redirect_url));
|
|
100
|
+
if (onError) {
|
|
101
|
+
submitPromise = submitPromise.catch((error)=>onError(error));
|
|
102
|
+
}
|
|
103
|
+
await submitPromise;
|
|
104
|
+
};
|
|
105
|
+
createOnSuccessHandler = ({ organizationId, signupRedirectUrl, loginRedirectUrl, onSuccess, onError })=>async (response)=>{
|
|
106
|
+
const { credential } = response;
|
|
107
|
+
let submitPromise = this.submitGoogleOneTapToken({
|
|
108
|
+
credential,
|
|
109
|
+
organizationId,
|
|
110
|
+
signupRedirectUrl,
|
|
111
|
+
loginRedirectUrl
|
|
112
|
+
}).then((result)=>onSuccess(result.redirect_url));
|
|
113
|
+
if (onError) {
|
|
114
|
+
submitPromise = submitPromise.catch((error)=>onError(error));
|
|
115
|
+
}
|
|
116
|
+
await submitPromise;
|
|
117
|
+
};
|
|
118
|
+
redirectOnSuccess = (redirect_url)=>{
|
|
119
|
+
window.location.href = redirect_url;
|
|
120
|
+
};
|
|
124
121
|
}
|
|
125
122
|
|
|
126
123
|
export { B2BOneTapProvider };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"B2BOneTapProvider.mjs","sources":["../../../../../../../../web/src/b2b/oneTap/B2BOneTapProvider.ts"],"sourcesContent":["import type { CredentialResponse } from 'google-one-tap';\nimport { INetworkClient, IPKCEManager } from '@stytch/core';\nimport { ResponseCommon, StytchAPIError } from '@stytch/core/public';\nimport { GoogleOneTapClient } from '../../oneTap/GoogleOneTapClient';\nimport { loadGoogleOneTapClient } from '../../oneTap/OneTapProvider';\n\ntype B2BOneTapStartResponse = ResponseCommon & {\n google_client_id: string;\n};\n\ntype B2BOneTapSubmitResponse = ResponseCommon & {\n redirect_url: string;\n};\n\ntype OneTapNotLoadedReason =\n // These come from the API directly - err.error_type\n | 'oauth_config_not_found'\n | 'default_provider_not_allowed'\n // If we have an unhandled error :$\n | string;\n\ntype OneTapLoadResult =\n | { success: true; client: GoogleOneTapClient }\n | { success: false; reason: OneTapNotLoadedReason };\n\ntype DynamicConfig = Promise<{\n pkceRequiredForOAuth: boolean;\n}>;\n\nconst DefaultDynamicConfig = Promise.resolve({\n pkceRequiredForOAuth: false,\n});\n\n/**\n * Handles loading One Tap config from Stytch API and initializing {@link GoogleOneTapClient}\n */\nexport class B2BOneTapProvider {\n private googleClientID?: string;\n constructor(\n private _networkClient: INetworkClient,\n private _pkceManager: IPKCEManager,\n private _config: DynamicConfig = DefaultDynamicConfig,\n ) {}\n\n private async fetchGoogleStart() {\n if (this.googleClientID) {\n return this.googleClientID;\n }\n const oneTapStartResp = await this._networkClient.fetchSDK<B2BOneTapStartResponse>({\n url: '/b2b/oauth/google/onetap/start',\n method: 'GET',\n });\n this.googleClientID = oneTapStartResp.google_client_id;\n return this.googleClientID;\n }\n\n private async submitGoogleOneTapTokenDiscovery({\n credential,\n discoveryRedirectUrl,\n }: {\n credential: string;\n discoveryRedirectUrl?: string;\n }) {\n let codeChallenge = undefined;\n const { pkceRequiredForOAuth } = await this._config;\n if (pkceRequiredForOAuth) {\n const keyPair = await this._pkceManager.startPKCETransaction();\n codeChallenge = keyPair.code_challenge;\n } else {\n this._pkceManager.clearPKPair();\n }\n return await this._networkClient.fetchSDK<B2BOneTapSubmitResponse>({\n url: '/b2b/oauth/google/onetap/discovery/submit',\n method: 'POST',\n body: {\n id_token: credential,\n discovery_redirect_url: discoveryRedirectUrl,\n pkce_code_challenge: codeChallenge,\n },\n });\n }\n\n private async submitGoogleOneTapToken({\n credential,\n organizationId,\n signupRedirectUrl,\n loginRedirectUrl,\n }: {\n credential: string;\n organizationId: string;\n signupRedirectUrl?: string;\n loginRedirectUrl?: string;\n }) {\n let codeChallenge = undefined;\n const { pkceRequiredForOAuth } = await this._config;\n if (pkceRequiredForOAuth) {\n const keyPair = await this._pkceManager.startPKCETransaction();\n codeChallenge = keyPair.code_challenge;\n } else {\n this._pkceManager.clearPKPair();\n }\n return await this._networkClient.fetchSDK<B2BOneTapSubmitResponse>({\n url: '/b2b/oauth/google/onetap/submit',\n method: 'POST',\n body: {\n id_token: credential,\n organization_id: organizationId,\n signup_redirect_url: signupRedirectUrl,\n login_redirect_url: loginRedirectUrl,\n pkce_code_challenge: codeChallenge,\n },\n });\n }\n\n async createOneTapClient(): Promise<OneTapLoadResult> {\n let googleClientId: string;\n try {\n googleClientId = await this.fetchGoogleStart();\n } catch (e) {\n const err = StytchAPIError.from(e);\n return { success: false, reason: err.error_type };\n }\n\n if (googleClientId === '') {\n return { success: false, reason: 'oauth_config_not_found' };\n }\n const client = new GoogleOneTapClient(await loadGoogleOneTapClient(), googleClientId);\n return { success: true, client };\n }\n\n createOnDiscoverySuccessHandler =\n ({\n discoveryRedirectUrl,\n onSuccess,\n onError,\n }: {\n discoveryRedirectUrl?: string;\n onSuccess: (redirect_url: string) => void;\n onError?: (error: Error) => void;\n }) =>\n async (response: CredentialResponse) => {\n const { credential } = response;\n let submitPromise = this.submitGoogleOneTapTokenDiscovery({\n credential,\n discoveryRedirectUrl,\n }).then((result) => onSuccess(result.redirect_url));\n if (onError) {\n submitPromise = submitPromise.catch((error) => onError(error));\n }\n await submitPromise;\n };\n\n createOnSuccessHandler =\n ({\n organizationId,\n signupRedirectUrl,\n loginRedirectUrl,\n onSuccess,\n onError,\n }: {\n organizationId: string;\n signupRedirectUrl?: string;\n loginRedirectUrl?: string;\n onSuccess: (redirect_url: string) => void;\n onError?: (error: Error) => void;\n }) =>\n async (response: CredentialResponse) => {\n const { credential } = response;\n let submitPromise = this.submitGoogleOneTapToken({\n credential,\n organizationId,\n signupRedirectUrl,\n loginRedirectUrl,\n }).then((result) => onSuccess(result.redirect_url));\n if (onError) {\n submitPromise = submitPromise.catch((error) => onError(error));\n }\n await submitPromise;\n };\n\n redirectOnSuccess = (redirect_url: string) => {\n window.location.href = redirect_url;\n };\n}\n"],"names":["DefaultDynamicConfig","Promise","resolve","pkceRequiredForOAuth","B2BOneTapProvider","googleClientID","constructor","_networkClient","_pkceManager","_config","createOnDiscoverySuccessHandler","discoveryRedirectUrl","onSuccess","onError","response","credential","submitPromise","submitGoogleOneTapTokenDiscovery","then","result","redirect_url","catch","error","createOnSuccessHandler","organizationId","signupRedirectUrl","loginRedirectUrl","submitGoogleOneTapToken","redirectOnSuccess","window","location","href","fetchGoogleStart","oneTapStartResp","fetchSDK","url","method","google_client_id","codeChallenge","undefined","keyPair","startPKCETransaction","code_challenge","clearPKPair","body","id_token","discovery_redirect_url","pkce_code_challenge","organization_id","signup_redirect_url","login_redirect_url","createOneTapClient","googleClientId","e","err","StytchAPIError","from","success","reason","error_type","client","GoogleOneTapClient","loadGoogleOneTapClient"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"B2BOneTapProvider.mjs","sources":["../../../../../../../../web/src/b2b/oneTap/B2BOneTapProvider.ts"],"sourcesContent":["import type { CredentialResponse } from 'google-one-tap';\nimport { INetworkClient, IPKCEManager } from '@stytch/core';\nimport { ResponseCommon, StytchAPIError } from '@stytch/core/public';\nimport { GoogleOneTapClient } from '../../oneTap/GoogleOneTapClient';\nimport { loadGoogleOneTapClient } from '../../oneTap/OneTapProvider';\n\ntype B2BOneTapStartResponse = ResponseCommon & {\n google_client_id: string;\n};\n\ntype B2BOneTapSubmitResponse = ResponseCommon & {\n redirect_url: string;\n};\n\ntype OneTapNotLoadedReason =\n // These come from the API directly - err.error_type\n | 'oauth_config_not_found'\n | 'default_provider_not_allowed'\n // If we have an unhandled error :$\n | string;\n\ntype OneTapLoadResult =\n | { success: true; client: GoogleOneTapClient }\n | { success: false; reason: OneTapNotLoadedReason };\n\ntype DynamicConfig = Promise<{\n pkceRequiredForOAuth: boolean;\n}>;\n\nconst DefaultDynamicConfig = Promise.resolve({\n pkceRequiredForOAuth: false,\n});\n\n/**\n * Handles loading One Tap config from Stytch API and initializing {@link GoogleOneTapClient}\n */\nexport class B2BOneTapProvider {\n private googleClientID?: string;\n constructor(\n private _networkClient: INetworkClient,\n private _pkceManager: IPKCEManager,\n private _config: DynamicConfig = DefaultDynamicConfig,\n ) {}\n\n private async fetchGoogleStart() {\n if (this.googleClientID) {\n return this.googleClientID;\n }\n const oneTapStartResp = await this._networkClient.fetchSDK<B2BOneTapStartResponse>({\n url: '/b2b/oauth/google/onetap/start',\n method: 'GET',\n });\n this.googleClientID = oneTapStartResp.google_client_id;\n return this.googleClientID;\n }\n\n private async submitGoogleOneTapTokenDiscovery({\n credential,\n discoveryRedirectUrl,\n }: {\n credential: string;\n discoveryRedirectUrl?: string;\n }) {\n let codeChallenge = undefined;\n const { pkceRequiredForOAuth } = await this._config;\n if (pkceRequiredForOAuth) {\n const keyPair = await this._pkceManager.startPKCETransaction();\n codeChallenge = keyPair.code_challenge;\n } else {\n this._pkceManager.clearPKPair();\n }\n return await this._networkClient.fetchSDK<B2BOneTapSubmitResponse>({\n url: '/b2b/oauth/google/onetap/discovery/submit',\n method: 'POST',\n body: {\n id_token: credential,\n discovery_redirect_url: discoveryRedirectUrl,\n pkce_code_challenge: codeChallenge,\n },\n });\n }\n\n private async submitGoogleOneTapToken({\n credential,\n organizationId,\n signupRedirectUrl,\n loginRedirectUrl,\n }: {\n credential: string;\n organizationId: string;\n signupRedirectUrl?: string;\n loginRedirectUrl?: string;\n }) {\n let codeChallenge = undefined;\n const { pkceRequiredForOAuth } = await this._config;\n if (pkceRequiredForOAuth) {\n const keyPair = await this._pkceManager.startPKCETransaction();\n codeChallenge = keyPair.code_challenge;\n } else {\n this._pkceManager.clearPKPair();\n }\n return await this._networkClient.fetchSDK<B2BOneTapSubmitResponse>({\n url: '/b2b/oauth/google/onetap/submit',\n method: 'POST',\n body: {\n id_token: credential,\n organization_id: organizationId,\n signup_redirect_url: signupRedirectUrl,\n login_redirect_url: loginRedirectUrl,\n pkce_code_challenge: codeChallenge,\n },\n });\n }\n\n async createOneTapClient(): Promise<OneTapLoadResult> {\n let googleClientId: string;\n try {\n googleClientId = await this.fetchGoogleStart();\n } catch (e) {\n const err = StytchAPIError.from(e);\n return { success: false, reason: err.error_type };\n }\n\n if (googleClientId === '') {\n return { success: false, reason: 'oauth_config_not_found' };\n }\n const client = new GoogleOneTapClient(await loadGoogleOneTapClient(), googleClientId);\n return { success: true, client };\n }\n\n createOnDiscoverySuccessHandler =\n ({\n discoveryRedirectUrl,\n onSuccess,\n onError,\n }: {\n discoveryRedirectUrl?: string;\n onSuccess: (redirect_url: string) => void;\n onError?: (error: Error) => void;\n }) =>\n async (response: CredentialResponse) => {\n const { credential } = response;\n let submitPromise = this.submitGoogleOneTapTokenDiscovery({\n credential,\n discoveryRedirectUrl,\n }).then((result) => onSuccess(result.redirect_url));\n if (onError) {\n submitPromise = submitPromise.catch((error) => onError(error));\n }\n await submitPromise;\n };\n\n createOnSuccessHandler =\n ({\n organizationId,\n signupRedirectUrl,\n loginRedirectUrl,\n onSuccess,\n onError,\n }: {\n organizationId: string;\n signupRedirectUrl?: string;\n loginRedirectUrl?: string;\n onSuccess: (redirect_url: string) => void;\n onError?: (error: Error) => void;\n }) =>\n async (response: CredentialResponse) => {\n const { credential } = response;\n let submitPromise = this.submitGoogleOneTapToken({\n credential,\n organizationId,\n signupRedirectUrl,\n loginRedirectUrl,\n }).then((result) => onSuccess(result.redirect_url));\n if (onError) {\n submitPromise = submitPromise.catch((error) => onError(error));\n }\n await submitPromise;\n };\n\n redirectOnSuccess = (redirect_url: string) => {\n window.location.href = redirect_url;\n };\n}\n"],"names":["DefaultDynamicConfig","Promise","resolve","pkceRequiredForOAuth","B2BOneTapProvider","googleClientID","_networkClient","_pkceManager","_config","fetchGoogleStart","oneTapStartResp","fetchSDK","url","method","google_client_id","submitGoogleOneTapTokenDiscovery","credential","discoveryRedirectUrl","codeChallenge","undefined","keyPair","startPKCETransaction","code_challenge","clearPKPair","body","id_token","discovery_redirect_url","pkce_code_challenge","submitGoogleOneTapToken","organizationId","signupRedirectUrl","loginRedirectUrl","organization_id","signup_redirect_url","login_redirect_url","createOneTapClient","googleClientId","e","err","StytchAPIError","from","success","reason","error_type","client","GoogleOneTapClient","loadGoogleOneTapClient","createOnDiscoverySuccessHandler","onSuccess","onError","response","submitPromise","then","result","redirect_url","catch","error","createOnSuccessHandler","redirectOnSuccess","window","location","href"],"mappings":";;;;AA6BA,MAAMA,oBAAAA,GAAuBC,OAAAA,CAAQC,OAAO,CAAC;IAC3CC,oBAAAA,EAAsB;AACxB,CAAA,CAAA;AAEA;;AAEC,IACM,MAAMC,iBAAAA,CAAAA;;;;IACHC,cAAAA;IACR,WAAA,CACUC,cAA8B,EAC9BC,YAA0B,EAC1BC,OAAAA,GAAyBR,oBAAoB,CACrD;aAHQM,cAAAA,GAAAA,cAAAA;aACAC,YAAAA,GAAAA,YAAAA;aACAC,OAAAA,GAAAA,OAAAA;AACP,IAAA;AAEH,IAAA,MAAcC,gBAAAA,GAAmB;QAC/B,IAAI,IAAI,CAACJ,cAAc,EAAE;YACvB,OAAO,IAAI,CAACA,cAAc;AAC5B,QAAA;AACA,QAAA,MAAMK,kBAAkB,MAAM,IAAI,CAACJ,cAAc,CAACK,QAAQ,CAAyB;YACjFC,GAAAA,EAAK,gCAAA;YACLC,MAAAA,EAAQ;AACV,SAAA,CAAA;AACA,QAAA,IAAI,CAACR,cAAc,GAAGK,eAAAA,CAAgBI,gBAAgB;QACtD,OAAO,IAAI,CAACT,cAAc;AAC5B,IAAA;AAEA,IAAA,MAAcU,iCAAiC,EAC7CC,UAAU,EACVC,oBAAoB,EAIrB,EAAE;AACD,QAAA,IAAIC,aAAAA,GAAgBC,SAAAA;AACpB,QAAA,MAAM,EAAEhB,oBAAoB,EAAE,GAAG,MAAM,IAAI,CAACK,OAAO;AACnD,QAAA,IAAIL,oBAAAA,EAAsB;AACxB,YAAA,MAAMiB,UAAU,MAAM,IAAI,CAACb,YAAY,CAACc,oBAAoB,EAAA;AAC5DH,YAAAA,aAAAA,GAAgBE,QAAQE,cAAc;QACxC,CAAA,MAAO;YACL,IAAI,CAACf,YAAY,CAACgB,WAAW,EAAA;AAC/B,QAAA;AACA,QAAA,OAAO,MAAM,IAAI,CAACjB,cAAc,CAACK,QAAQ,CAA0B;YACjEC,GAAAA,EAAK,2CAAA;YACLC,MAAAA,EAAQ,MAAA;YACRW,IAAAA,EAAM;gBACJC,QAAAA,EAAUT,UAAAA;gBACVU,sBAAAA,EAAwBT,oBAAAA;gBACxBU,mBAAAA,EAAqBT;AACvB;AACF,SAAA,CAAA;AACF,IAAA;IAEA,MAAcU,uBAAAA,CAAwB,EACpCZ,UAAU,EACVa,cAAc,EACdC,iBAAiB,EACjBC,gBAAgB,EAMjB,EAAE;AACD,QAAA,IAAIb,aAAAA,GAAgBC,SAAAA;AACpB,QAAA,MAAM,EAAEhB,oBAAoB,EAAE,GAAG,MAAM,IAAI,CAACK,OAAO;AACnD,QAAA,IAAIL,oBAAAA,EAAsB;AACxB,YAAA,MAAMiB,UAAU,MAAM,IAAI,CAACb,YAAY,CAACc,oBAAoB,EAAA;AAC5DH,YAAAA,aAAAA,GAAgBE,QAAQE,cAAc;QACxC,CAAA,MAAO;YACL,IAAI,CAACf,YAAY,CAACgB,WAAW,EAAA;AAC/B,QAAA;AACA,QAAA,OAAO,MAAM,IAAI,CAACjB,cAAc,CAACK,QAAQ,CAA0B;YACjEC,GAAAA,EAAK,iCAAA;YACLC,MAAAA,EAAQ,MAAA;YACRW,IAAAA,EAAM;gBACJC,QAAAA,EAAUT,UAAAA;gBACVgB,eAAAA,EAAiBH,cAAAA;gBACjBI,mBAAAA,EAAqBH,iBAAAA;gBACrBI,kBAAAA,EAAoBH,gBAAAA;gBACpBJ,mBAAAA,EAAqBT;AACvB;AACF,SAAA,CAAA;AACF,IAAA;AAEA,IAAA,MAAMiB,kBAAAA,GAAgD;QACpD,IAAIC,cAAAA;QACJ,IAAI;YACFA,cAAAA,GAAiB,MAAM,IAAI,CAAC3B,gBAAgB,EAAA;AAC9C,QAAA,CAAA,CAAE,OAAO4B,CAAAA,EAAG;YACV,MAAMC,GAAAA,GAAMC,cAAAA,CAAeC,IAAI,CAACH,CAAAA,CAAAA;YAChC,OAAO;gBAAEI,OAAAA,EAAS,KAAA;AAAOC,gBAAAA,MAAAA,EAAQJ,IAAIK;AAAW,aAAA;AAClD,QAAA;AAEA,QAAA,IAAIP,mBAAmB,EAAA,EAAI;YACzB,OAAO;gBAAEK,OAAAA,EAAS,KAAA;gBAAOC,MAAAA,EAAQ;AAAyB,aAAA;AAC5D,QAAA;AACA,QAAA,MAAME,MAAAA,GAAS,IAAIC,kBAAAA,CAAmB,MAAMC,sBAAAA,EAAAA,EAA0BV,cAAAA,CAAAA;QACtE,OAAO;YAAEK,OAAAA,EAAS,IAAA;AAAMG,YAAAA;AAAO,SAAA;AACjC,IAAA;IAEAG,+BAAAA,GACE,CAAC,EACC9B,oBAAoB,EACpB+B,SAAS,EACTC,OAAO,EAKR,GACD,OAAOC,QAAAA,GAAAA;YACL,MAAM,EAAElC,UAAU,EAAE,GAAGkC,QAAAA;AACvB,YAAA,IAAIC,aAAAA,GAAgB,IAAI,CAACpC,gCAAgC,CAAC;AACxDC,gBAAAA,UAAAA;AACAC,gBAAAA;AACF,aAAA,CAAA,CAAGmC,IAAI,CAAC,CAACC,MAAAA,GAAWL,SAAAA,CAAUK,OAAOC,YAAY,CAAA,CAAA;AACjD,YAAA,IAAIL,OAAAA,EAAS;AACXE,gBAAAA,aAAAA,GAAgBA,aAAAA,CAAcI,KAAK,CAAC,CAACC,QAAUP,OAAAA,CAAQO,KAAAA,CAAAA,CAAAA;AACzD,YAAA;YACA,MAAML,aAAAA;QACR,CAAA;AAEFM,IAAAA,sBAAAA,GACE,CAAC,EACC5B,cAAc,EACdC,iBAAiB,EACjBC,gBAAgB,EAChBiB,SAAS,EACTC,OAAO,EAOR,GACD,OAAOC,QAAAA,GAAAA;YACL,MAAM,EAAElC,UAAU,EAAE,GAAGkC,QAAAA;AACvB,YAAA,IAAIC,aAAAA,GAAgB,IAAI,CAACvB,uBAAuB,CAAC;AAC/CZ,gBAAAA,UAAAA;AACAa,gBAAAA,cAAAA;AACAC,gBAAAA,iBAAAA;AACAC,gBAAAA;AACF,aAAA,CAAA,CAAGqB,IAAI,CAAC,CAACC,MAAAA,GAAWL,SAAAA,CAAUK,OAAOC,YAAY,CAAA,CAAA;AACjD,YAAA,IAAIL,OAAAA,EAAS;AACXE,gBAAAA,aAAAA,GAAgBA,aAAAA,CAAcI,KAAK,CAAC,CAACC,QAAUP,OAAAA,CAAQO,KAAAA,CAAAA,CAAAA;AACzD,YAAA;YACA,MAAML,aAAAA;QACR,CAAA;AAEFO,IAAAA,iBAAAA,GAAoB,CAACJ,YAAAA,GAAAA;QACnBK,MAAAA,CAAOC,QAAQ,CAACC,IAAI,GAAGP,YAAAA;IACzB,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleOneTapClient.mjs","sources":["../../../../../../../web/src/oneTap/GoogleOneTapClient.ts"],"sourcesContent":["import type { accounts, CredentialResponse, IdConfiguration, PromptMomentNotification } from 'google-one-tap';\nimport { GOOGLE_ONE_TAP_HOST } from '@stytch/core';\nimport { OneTapStyleConfig } from '@stytch/core/public';\nimport { getConfiguredEmbeddedMode, getShouldRenderEmbeddedOneTap } from './positionModes';\n\ntype OneTapNotShownReason =\n | ReturnType<PromptMomentNotification['getNotDisplayedReason']>\n | ReturnType<PromptMomentNotification['getSkippedReason']>;\n\nexport type OneTapRenderResult = { success: true } | { success: false; reason: OneTapNotShownReason };\n\n/**\n * Wrapper around Google One Tap JS client that combines initialize() and prompt()\n * into one async render() call\n *\n * @see https://developers.google.com/identity/gsi/web/guides/display-google-one-tap#javascript\n */\nexport class GoogleOneTapClient {\n constructor(\n private _googleClient: accounts['id'],\n private _clientId: string,\n ) {}\n\n cancel(): void {\n this._googleClient.cancel();\n }\n\n async render({\n callback,\n onOneTapCancelled,\n style,\n cancelOnTapOutside = true,\n }: {\n callback: (response: CredentialResponse) => void;\n onOneTapCancelled?: (showError?: boolean) => void;\n style: OneTapStyleConfig;\n cancelOnTapOutside?: boolean;\n }): Promise<OneTapRenderResult> {\n const embeddedMode = getConfiguredEmbeddedMode(style.position);\n const shouldRenderEmbeddedOneTap = getShouldRenderEmbeddedOneTap(style.position);\n\n const config: IdConfiguration = {\n client_id: this._clientId,\n callback: callback,\n auto_select: false,\n context: 'use',\n itp_support: true,\n use_fedcm_for_prompt: embeddedMode !== 'force',\n cancel_on_tap_outside: cancelOnTapOutside,\n };\n if (shouldRenderEmbeddedOneTap) {\n config.prompt_parent_id = 'google-parent-prompt';\n config.cancel_on_tap_outside = false;\n }\n this._googleClient.initialize(config);\n\n return new Promise((resolve) => {\n this._googleClient.prompt((notification: PromptMomentNotification) => {\n if (notification.isSkippedMoment()) {\n // After FedCM is mandatory, `getSkippedReason` will no longer be\n // supported, so access it defensively.\n const reason = notification.getSkippedReason?.() ?? 'unknown_reason';\n\n if (reason === 'user_cancel') {\n onOneTapCancelled?.();\n }\n return resolve({\n success: false,\n reason,\n });\n }\n\n // At some point after FedCM is mandatory, `isNotDisplayed` and\n // `getNotDisplayedReason` (and display moments in general) will not be\n // supported. If we can tell they're not available and we're trying to\n // show an embedded one tap UI, we should treat it as a failure, because\n // we won't expect an embedded UI to work (by virtue of FedCM being\n // mandatory) and won't expect any other notifications.\n if ((!notification.isNotDisplayed && shouldRenderEmbeddedOneTap) || notification.isNotDisplayed?.()) {\n return resolve({\n success: false,\n reason: notification.getNotDisplayedReason?.() ?? 'unknown_reason',\n });\n }\n\n if (!notification.isDismissedMoment()) {\n this.styleFrame(shouldRenderEmbeddedOneTap);\n return resolve({ success: true });\n }\n });\n });\n }\n\n styleFrame(shouldRenderEmbeddedOneTap: boolean) {\n if (!shouldRenderEmbeddedOneTap) {\n return;\n }\n Array.from(document.getElementsByTagName('iframe')).forEach((frame) => {\n if (frame.src.includes(GOOGLE_ONE_TAP_HOST)) {\n frame.style.width = '100%';\n }\n });\n }\n}\n"],"names":["GoogleOneTapClient","
|
|
1
|
+
{"version":3,"file":"GoogleOneTapClient.mjs","sources":["../../../../../../../web/src/oneTap/GoogleOneTapClient.ts"],"sourcesContent":["import type { accounts, CredentialResponse, IdConfiguration, PromptMomentNotification } from 'google-one-tap';\nimport { GOOGLE_ONE_TAP_HOST } from '@stytch/core';\nimport { OneTapStyleConfig } from '@stytch/core/public';\nimport { getConfiguredEmbeddedMode, getShouldRenderEmbeddedOneTap } from './positionModes';\n\ntype OneTapNotShownReason =\n | ReturnType<PromptMomentNotification['getNotDisplayedReason']>\n | ReturnType<PromptMomentNotification['getSkippedReason']>;\n\nexport type OneTapRenderResult = { success: true } | { success: false; reason: OneTapNotShownReason };\n\n/**\n * Wrapper around Google One Tap JS client that combines initialize() and prompt()\n * into one async render() call\n *\n * @see https://developers.google.com/identity/gsi/web/guides/display-google-one-tap#javascript\n */\nexport class GoogleOneTapClient {\n constructor(\n private _googleClient: accounts['id'],\n private _clientId: string,\n ) {}\n\n cancel(): void {\n this._googleClient.cancel();\n }\n\n async render({\n callback,\n onOneTapCancelled,\n style,\n cancelOnTapOutside = true,\n }: {\n callback: (response: CredentialResponse) => void;\n onOneTapCancelled?: (showError?: boolean) => void;\n style: OneTapStyleConfig;\n cancelOnTapOutside?: boolean;\n }): Promise<OneTapRenderResult> {\n const embeddedMode = getConfiguredEmbeddedMode(style.position);\n const shouldRenderEmbeddedOneTap = getShouldRenderEmbeddedOneTap(style.position);\n\n const config: IdConfiguration = {\n client_id: this._clientId,\n callback: callback,\n auto_select: false,\n context: 'use',\n itp_support: true,\n use_fedcm_for_prompt: embeddedMode !== 'force',\n cancel_on_tap_outside: cancelOnTapOutside,\n };\n if (shouldRenderEmbeddedOneTap) {\n config.prompt_parent_id = 'google-parent-prompt';\n config.cancel_on_tap_outside = false;\n }\n this._googleClient.initialize(config);\n\n return new Promise((resolve) => {\n this._googleClient.prompt((notification: PromptMomentNotification) => {\n if (notification.isSkippedMoment()) {\n // After FedCM is mandatory, `getSkippedReason` will no longer be\n // supported, so access it defensively.\n const reason = notification.getSkippedReason?.() ?? 'unknown_reason';\n\n if (reason === 'user_cancel') {\n onOneTapCancelled?.();\n }\n return resolve({\n success: false,\n reason,\n });\n }\n\n // At some point after FedCM is mandatory, `isNotDisplayed` and\n // `getNotDisplayedReason` (and display moments in general) will not be\n // supported. If we can tell they're not available and we're trying to\n // show an embedded one tap UI, we should treat it as a failure, because\n // we won't expect an embedded UI to work (by virtue of FedCM being\n // mandatory) and won't expect any other notifications.\n if ((!notification.isNotDisplayed && shouldRenderEmbeddedOneTap) || notification.isNotDisplayed?.()) {\n return resolve({\n success: false,\n reason: notification.getNotDisplayedReason?.() ?? 'unknown_reason',\n });\n }\n\n if (!notification.isDismissedMoment()) {\n this.styleFrame(shouldRenderEmbeddedOneTap);\n return resolve({ success: true });\n }\n });\n });\n }\n\n styleFrame(shouldRenderEmbeddedOneTap: boolean) {\n if (!shouldRenderEmbeddedOneTap) {\n return;\n }\n Array.from(document.getElementsByTagName('iframe')).forEach((frame) => {\n if (frame.src.includes(GOOGLE_ONE_TAP_HOST)) {\n frame.style.width = '100%';\n }\n });\n }\n}\n"],"names":["GoogleOneTapClient","_clientId","_googleClient","cancel","render","callback","onOneTapCancelled","style","cancelOnTapOutside","embeddedMode","getConfiguredEmbeddedMode","position","shouldRenderEmbeddedOneTap","getShouldRenderEmbeddedOneTap","config","client_id","auto_select","context","itp_support","use_fedcm_for_prompt","cancel_on_tap_outside","prompt_parent_id","initialize","Promise","resolve","prompt","notification","isSkippedMoment","reason","getSkippedReason","success","isNotDisplayed","getNotDisplayedReason","isDismissedMoment","styleFrame","Array","from","document","getElementsByTagName","forEach","frame","src","includes","GOOGLE_ONE_TAP_HOST","width"],"mappings":"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"}
|
|
@@ -13,18 +13,6 @@ const loadGoogleOneTapClient = ()=>loadESModule(GOOGLE_ONE_TAP_SCRIPT_URL, ()=>w
|
|
|
13
13
|
constructor(_publicToken, clientsideServices){
|
|
14
14
|
this._publicToken = _publicToken;
|
|
15
15
|
this.clientsideServices = clientsideServices;
|
|
16
|
-
this.createOnSuccessHandler = ({ loginRedirectUrl, signupRedirectUrl, onSuccess })=>async (response)=>{
|
|
17
|
-
const { credential } = response;
|
|
18
|
-
const { redirect_url } = await this.submitGoogleOneTapToken({
|
|
19
|
-
credential,
|
|
20
|
-
loginRedirectUrl,
|
|
21
|
-
signupRedirectUrl
|
|
22
|
-
});
|
|
23
|
-
onSuccess(redirect_url);
|
|
24
|
-
};
|
|
25
|
-
this.redirectOnSuccess = (redirect_url)=>{
|
|
26
|
-
window.location.href = redirect_url;
|
|
27
|
-
};
|
|
28
16
|
}
|
|
29
17
|
async createOneTapClient() {
|
|
30
18
|
let googleClientId;
|
|
@@ -49,7 +37,15 @@ const loadGoogleOneTapClient = ()=>loadESModule(GOOGLE_ONE_TAP_SCRIPT_URL, ()=>w
|
|
|
49
37
|
client
|
|
50
38
|
};
|
|
51
39
|
}
|
|
52
|
-
createOnSuccessHandler
|
|
40
|
+
createOnSuccessHandler = ({ loginRedirectUrl, signupRedirectUrl, onSuccess })=>async (response)=>{
|
|
41
|
+
const { credential } = response;
|
|
42
|
+
const { redirect_url } = await this.submitGoogleOneTapToken({
|
|
43
|
+
credential,
|
|
44
|
+
loginRedirectUrl,
|
|
45
|
+
signupRedirectUrl
|
|
46
|
+
});
|
|
47
|
+
onSuccess(redirect_url);
|
|
48
|
+
};
|
|
53
49
|
fetchGoogleStart() {
|
|
54
50
|
if (this.googleConfig) {
|
|
55
51
|
return this.googleConfig;
|
|
@@ -69,7 +65,9 @@ const loadGoogleOneTapClient = ()=>loadESModule(GOOGLE_ONE_TAP_SCRIPT_URL, ()=>w
|
|
|
69
65
|
signupRedirectURL: signupRedirectUrl
|
|
70
66
|
});
|
|
71
67
|
}
|
|
72
|
-
redirectOnSuccess
|
|
68
|
+
redirectOnSuccess = (redirect_url)=>{
|
|
69
|
+
window.location.href = redirect_url;
|
|
70
|
+
};
|
|
73
71
|
/**
|
|
74
72
|
* Google One Tap will show a banner on the bottom of the screen on certain mobile devices
|
|
75
73
|
* This logic is controlled via some sniffing of the useragent string on startup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneTapProvider.mjs","sources":["../../../../../../../web/src/oneTap/OneTapProvider.ts"],"sourcesContent":["import { GOOGLE_ONE_TAP_SCRIPT_URL, OneTapStartResponse, loadESModule, RPCManifest } from '@stytch/core';\nimport { StytchAPIError } from '@stytch/core/public';\nimport type { CredentialResponse } from 'google-one-tap';\nimport { GoogleOneTapClient } from './GoogleOneTapClient';\n\nexport const loadGoogleOneTapClient = (): Promise<google.accounts['id']> =>\n loadESModule(GOOGLE_ONE_TAP_SCRIPT_URL, () => window.google.accounts.id);\n\ntype OneTapNotLoadedReason =\n // These come from the API directly - err.error_type\n | 'oauth_config_not_found'\n | 'no_login_redirect_urls_set'\n | 'no_signup_redirect_urls_set'\n // If we have an unhandled error :$\n | string;\n\ntype OneTapLoadResult =\n | { success: true; client: GoogleOneTapClient }\n | { success: false; reason: OneTapNotLoadedReason };\n\n/**\n * Handles loading One Tap config from Stytch API and initializing {@link GoogleOneTapClient}\n */\nexport class OneTapProvider {\n private googleConfig?: Promise<OneTapStartResponse>;\n\n constructor(\n private _publicToken: string,\n private clientsideServices: RPCManifest,\n ) {}\n\n async createOneTapClient(): Promise<OneTapLoadResult> {\n let googleClientId: string;\n try {\n ({ googleClientId } = await this.fetchGoogleStart());\n } catch (e) {\n const err = StytchAPIError.from(e);\n return { success: false, reason: err.error_type };\n }\n\n if (googleClientId === '') {\n return { success: false, reason: 'oauth_config_not_found' };\n }\n const client = new GoogleOneTapClient(await loadGoogleOneTapClient(), googleClientId);\n return { success: true, client };\n }\n\n createOnSuccessHandler =\n ({\n loginRedirectUrl,\n signupRedirectUrl,\n onSuccess,\n }: {\n loginRedirectUrl?: string;\n signupRedirectUrl?: string;\n onSuccess: (redirect_url: string) => void;\n }) =>\n async (response: CredentialResponse) => {\n const { credential } = response;\n const { redirect_url } = await this.submitGoogleOneTapToken({\n credential,\n loginRedirectUrl,\n signupRedirectUrl,\n });\n onSuccess(redirect_url);\n };\n\n private fetchGoogleStart() {\n if (this.googleConfig) {\n return this.googleConfig;\n }\n this.googleConfig = this.clientsideServices.oneTapStart({\n publicToken: this._publicToken,\n });\n return this.googleConfig;\n }\n\n private async submitGoogleOneTapToken({\n credential,\n loginRedirectUrl,\n signupRedirectUrl,\n }: {\n credential: string;\n loginRedirectUrl?: string;\n signupRedirectUrl?: string;\n }) {\n const { oauthCallbackId } = await this.fetchGoogleStart();\n\n return this.clientsideServices.oneTapSubmit({\n publicToken: this._publicToken,\n idToken: credential,\n loginRedirectURL: loginRedirectUrl,\n oauthCallbackID: oauthCallbackId,\n signupRedirectURL: signupRedirectUrl,\n });\n }\n\n redirectOnSuccess = (redirect_url: string) => {\n window.location.href = redirect_url;\n };\n\n /**\n * Google One Tap will show a banner on the bottom of the screen on certain mobile devices\n * This logic is controlled via some sniffing of the useragent string on startup\n * These specific strings were extracted from the One Tap minified source code\n * See the linked PR for details and screenshots\n */\n static willGoogleOneTapShowEmbedded(ua = navigator.userAgent): boolean {\n const uaContains = (userAgent: string, searchString: string) => userAgent.indexOf(searchString) !== -1;\n\n const isTabletUA =\n uaContains(ua, 'iPad') || (uaContains(ua, 'Android') && !uaContains(ua, 'Mobile')) || uaContains(ua, 'Silk');\n\n const isMobileUA =\n uaContains(ua, 'iPod') || uaContains(ua, 'iPhone') || uaContains(ua, 'Android') || uaContains(ua, 'IEMobile');\n\n return !isTabletUA && isMobileUA;\n }\n}\n"],"names":["loadGoogleOneTapClient","loadESModule","GOOGLE_ONE_TAP_SCRIPT_URL","window","google","accounts","id","OneTapProvider","googleConfig","
|
|
1
|
+
{"version":3,"file":"OneTapProvider.mjs","sources":["../../../../../../../web/src/oneTap/OneTapProvider.ts"],"sourcesContent":["import { GOOGLE_ONE_TAP_SCRIPT_URL, OneTapStartResponse, loadESModule, RPCManifest } from '@stytch/core';\nimport { StytchAPIError } from '@stytch/core/public';\nimport type { CredentialResponse } from 'google-one-tap';\nimport { GoogleOneTapClient } from './GoogleOneTapClient';\n\nexport const loadGoogleOneTapClient = (): Promise<google.accounts['id']> =>\n loadESModule(GOOGLE_ONE_TAP_SCRIPT_URL, () => window.google.accounts.id);\n\ntype OneTapNotLoadedReason =\n // These come from the API directly - err.error_type\n | 'oauth_config_not_found'\n | 'no_login_redirect_urls_set'\n | 'no_signup_redirect_urls_set'\n // If we have an unhandled error :$\n | string;\n\ntype OneTapLoadResult =\n | { success: true; client: GoogleOneTapClient }\n | { success: false; reason: OneTapNotLoadedReason };\n\n/**\n * Handles loading One Tap config from Stytch API and initializing {@link GoogleOneTapClient}\n */\nexport class OneTapProvider {\n private googleConfig?: Promise<OneTapStartResponse>;\n\n constructor(\n private _publicToken: string,\n private clientsideServices: RPCManifest,\n ) {}\n\n async createOneTapClient(): Promise<OneTapLoadResult> {\n let googleClientId: string;\n try {\n ({ googleClientId } = await this.fetchGoogleStart());\n } catch (e) {\n const err = StytchAPIError.from(e);\n return { success: false, reason: err.error_type };\n }\n\n if (googleClientId === '') {\n return { success: false, reason: 'oauth_config_not_found' };\n }\n const client = new GoogleOneTapClient(await loadGoogleOneTapClient(), googleClientId);\n return { success: true, client };\n }\n\n createOnSuccessHandler =\n ({\n loginRedirectUrl,\n signupRedirectUrl,\n onSuccess,\n }: {\n loginRedirectUrl?: string;\n signupRedirectUrl?: string;\n onSuccess: (redirect_url: string) => void;\n }) =>\n async (response: CredentialResponse) => {\n const { credential } = response;\n const { redirect_url } = await this.submitGoogleOneTapToken({\n credential,\n loginRedirectUrl,\n signupRedirectUrl,\n });\n onSuccess(redirect_url);\n };\n\n private fetchGoogleStart() {\n if (this.googleConfig) {\n return this.googleConfig;\n }\n this.googleConfig = this.clientsideServices.oneTapStart({\n publicToken: this._publicToken,\n });\n return this.googleConfig;\n }\n\n private async submitGoogleOneTapToken({\n credential,\n loginRedirectUrl,\n signupRedirectUrl,\n }: {\n credential: string;\n loginRedirectUrl?: string;\n signupRedirectUrl?: string;\n }) {\n const { oauthCallbackId } = await this.fetchGoogleStart();\n\n return this.clientsideServices.oneTapSubmit({\n publicToken: this._publicToken,\n idToken: credential,\n loginRedirectURL: loginRedirectUrl,\n oauthCallbackID: oauthCallbackId,\n signupRedirectURL: signupRedirectUrl,\n });\n }\n\n redirectOnSuccess = (redirect_url: string) => {\n window.location.href = redirect_url;\n };\n\n /**\n * Google One Tap will show a banner on the bottom of the screen on certain mobile devices\n * This logic is controlled via some sniffing of the useragent string on startup\n * These specific strings were extracted from the One Tap minified source code\n * See the linked PR for details and screenshots\n */\n static willGoogleOneTapShowEmbedded(ua = navigator.userAgent): boolean {\n const uaContains = (userAgent: string, searchString: string) => userAgent.indexOf(searchString) !== -1;\n\n const isTabletUA =\n uaContains(ua, 'iPad') || (uaContains(ua, 'Android') && !uaContains(ua, 'Mobile')) || uaContains(ua, 'Silk');\n\n const isMobileUA =\n uaContains(ua, 'iPod') || uaContains(ua, 'iPhone') || uaContains(ua, 'Android') || uaContains(ua, 'IEMobile');\n\n return !isTabletUA && isMobileUA;\n }\n}\n"],"names":["loadGoogleOneTapClient","loadESModule","GOOGLE_ONE_TAP_SCRIPT_URL","window","google","accounts","id","OneTapProvider","googleConfig","clientsideServices","_publicToken","createOneTapClient","googleClientId","fetchGoogleStart","e","err","StytchAPIError","from","success","reason","error_type","client","GoogleOneTapClient","createOnSuccessHandler","loginRedirectUrl","signupRedirectUrl","onSuccess","response","credential","redirect_url","submitGoogleOneTapToken","oneTapStart","publicToken","oauthCallbackId","oneTapSubmit","idToken","loginRedirectURL","oauthCallbackID","signupRedirectURL","redirectOnSuccess","location","href","willGoogleOneTapShowEmbedded","ua","navigator","userAgent","uaContains","searchString","indexOf","isTabletUA","isMobileUA"],"mappings":"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"}
|
|
@@ -24,7 +24,9 @@ import { IDPConsentScreen } from './screens/IDPConsent.mjs';
|
|
|
24
24
|
});
|
|
25
25
|
};
|
|
26
26
|
const B2BIDPContainer = ({ client, presentation, callbacks, strings, getIDPConsentManifest, trustedAuthTokenParams, styles })=>{
|
|
27
|
-
const presentationValue = usePresentationWithDefault(presentation, false,
|
|
27
|
+
const presentationValue = usePresentationWithDefault(presentation, false, {
|
|
28
|
+
products: []
|
|
29
|
+
});
|
|
28
30
|
useEffect(()=>{
|
|
29
31
|
readB2BInternals(client).bootstrap.getAsync().then((data)=>{
|
|
30
32
|
readB2BInternals(client).networkClient.logEvent({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.mjs","sources":["../../../../../../../../web/src/ui/b2b/App.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { B2BIDPSDKConfig, B2BSDKConfig, DeprecatedSDKConfig, StytchB2BExtendedLoginConfig } from '../../types';\nimport { InternalAppContainer } from './InternalAppContainer';\nimport * as B2BProducts from './B2BProducts';\nimport { PresentationContext, usePresentationWithDefault } from '../components/PresentationConfig';\nimport { readB2BInternals } from '../../utils/internal';\nimport { DEFAULT_STATE, GlobalContextProvider } from './GlobalContextProvider';\nimport { IDPContextProvider } from '../components/organisms/IDPContextProvider';\nimport { I18nProviderWrapper } from '../components/atoms/I18nProviderWrapper';\nimport { messages } from '../../messages/b2b/en';\nimport { IDPConsentScreen } from './screens/IDPConsent';\nimport { logger, RUN_IN_DEV } from '@stytch/core';\n\n/**\n * Wrapper to add default organizationProducts value. This is done to preserve the ability for a future\n * component that doesn't do this, allowing B2B products to be properly tree-shaken (which is also why this is currently\n * in a completely different file)\n */\nexport const AppContainer = ({\n config,\n styles,\n ...props\n}: B2BSDKConfig<StytchProjectConfigurationInput> & DeprecatedSDKConfig) => {\n RUN_IN_DEV(() => {\n if (styles) {\n logger.error(\n 'styles is deprecated and has no effect. Use the presentation prop instead.\\n' +\n 'See https://staging.stytch.com/docs/api-reference/b2b/frontend-sdks/react/upgrade-guide',\n );\n }\n });\n\n const internalConfig = {\n ...config,\n organizationProducts: Object.values(B2BProducts),\n };\n\n return <InternalAppContainer config={internalConfig} {...props}></InternalAppContainer>;\n};\n\nexport const B2BIDPContainer = <TProjectConfiguration extends StytchProjectConfigurationInput>({\n client,\n presentation,\n callbacks,\n strings,\n getIDPConsentManifest,\n trustedAuthTokenParams,\n styles,\n}: B2BIDPSDKConfig<TProjectConfiguration> & DeprecatedSDKConfig) => {\n const presentationValue = usePresentationWithDefault(presentation, false, []);\n\n useEffect(() => {\n readB2BInternals(client)\n .bootstrap.getAsync()\n .then((data) => {\n readB2BInternals(client).networkClient.logEvent({\n name: 'render_b2b_idp_screen',\n details: { bootstrap: data },\n });\n });\n }, [client]);\n\n RUN_IN_DEV(() => {\n if (styles) {\n logger.error(\n 'styles is deprecated and has no effect. Use the presentation prop instead.\\n' +\n 'See https://staging.stytch.com/docs/api-reference/b2b/frontend-sdks/react/upgrade-guide',\n );\n }\n });\n\n return (\n <GlobalContextProvider\n client={client}\n config={{} as StytchB2BExtendedLoginConfig}\n callbacks={callbacks}\n initialState={DEFAULT_STATE}\n >\n <IDPContextProvider consentManifestGenerator={getIDPConsentManifest} authTokenParams={trustedAuthTokenParams}>\n <PresentationContext.Provider value={presentationValue}>\n <I18nProviderWrapper messages={messages} overrides={strings}>\n <IDPConsentScreen />\n </I18nProviderWrapper>\n </PresentationContext.Provider>\n </IDPContextProvider>\n </GlobalContextProvider>\n );\n};\n"],"names":["AppContainer","config","styles","props","internalConfig","organizationProducts","Object","values","B2BProducts","React","InternalAppContainer","B2BIDPContainer","client","presentation","callbacks","strings","getIDPConsentManifest","trustedAuthTokenParams","presentationValue","usePresentationWithDefault","useEffect","readB2BInternals","bootstrap","getAsync","then","data","networkClient","logEvent","name","details","GlobalContextProvider","initialState","DEFAULT_STATE","IDPContextProvider","consentManifestGenerator","authTokenParams","PresentationContext","Provider","value","I18nProviderWrapper","messages","overrides","IDPConsentScreen"],"mappings":";;;;;;;;;;;AAcA;;;;IAKO,MAAMA,YAAAA,GAAe,CAAC,EAC3BC,MAAM,EACNC,MAAM,EACN,GAAGC,KAAAA,EACiE,GAAA;AAUpE,IAAA,MAAMC,cAAAA,GAAiB;AACrB,QAAA,GAAGH,MAAM;QACTI,oBAAAA,EAAsBC,MAAAA,CAAOC,MAAM,CAACC,WAAAA;AACtC,KAAA;AAEA,IAAA,qBAAOC,cAAA,CAAA,aAAA,CAACC,oBAAAA,EAAAA;QAAqBT,MAAAA,EAAQG,cAAAA;AAAiB,QAAA,GAAGD;;AAC3D;MAEaQ,eAAAA,GAAkB,CAAgE,EAC7FC,MAAM,EACNC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,qBAAqB,EACrBC,sBAAsB,EACtBf,MAAM,EACuD,GAAA;
|
|
1
|
+
{"version":3,"file":"App.mjs","sources":["../../../../../../../../web/src/ui/b2b/App.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { B2BIDPSDKConfig, B2BSDKConfig, DeprecatedSDKConfig, StytchB2BExtendedLoginConfig } from '../../types';\nimport { InternalAppContainer } from './InternalAppContainer';\nimport * as B2BProducts from './B2BProducts';\nimport { PresentationContext, usePresentationWithDefault } from '../components/PresentationConfig';\nimport { readB2BInternals } from '../../utils/internal';\nimport { DEFAULT_STATE, GlobalContextProvider } from './GlobalContextProvider';\nimport { IDPContextProvider } from '../components/organisms/IDPContextProvider';\nimport { I18nProviderWrapper } from '../components/atoms/I18nProviderWrapper';\nimport { messages } from '../../messages/b2b/en';\nimport { IDPConsentScreen } from './screens/IDPConsent';\nimport { logger, RUN_IN_DEV } from '@stytch/core';\n\n/**\n * Wrapper to add default organizationProducts value. This is done to preserve the ability for a future\n * component that doesn't do this, allowing B2B products to be properly tree-shaken (which is also why this is currently\n * in a completely different file)\n */\nexport const AppContainer = ({\n config,\n styles,\n ...props\n}: B2BSDKConfig<StytchProjectConfigurationInput> & DeprecatedSDKConfig) => {\n RUN_IN_DEV(() => {\n if (styles) {\n logger.error(\n 'styles is deprecated and has no effect. Use the presentation prop instead.\\n' +\n 'See https://staging.stytch.com/docs/api-reference/b2b/frontend-sdks/react/upgrade-guide',\n );\n }\n });\n\n const internalConfig = {\n ...config,\n organizationProducts: Object.values(B2BProducts),\n };\n\n return <InternalAppContainer config={internalConfig} {...props}></InternalAppContainer>;\n};\n\nexport const B2BIDPContainer = <TProjectConfiguration extends StytchProjectConfigurationInput>({\n client,\n presentation,\n callbacks,\n strings,\n getIDPConsentManifest,\n trustedAuthTokenParams,\n styles,\n}: B2BIDPSDKConfig<TProjectConfiguration> & DeprecatedSDKConfig) => {\n const presentationValue = usePresentationWithDefault(presentation, false, { products: [] });\n\n useEffect(() => {\n readB2BInternals(client)\n .bootstrap.getAsync()\n .then((data) => {\n readB2BInternals(client).networkClient.logEvent({\n name: 'render_b2b_idp_screen',\n details: { bootstrap: data },\n });\n });\n }, [client]);\n\n RUN_IN_DEV(() => {\n if (styles) {\n logger.error(\n 'styles is deprecated and has no effect. Use the presentation prop instead.\\n' +\n 'See https://staging.stytch.com/docs/api-reference/b2b/frontend-sdks/react/upgrade-guide',\n );\n }\n });\n\n return (\n <GlobalContextProvider\n client={client}\n config={{} as StytchB2BExtendedLoginConfig}\n callbacks={callbacks}\n initialState={DEFAULT_STATE}\n >\n <IDPContextProvider consentManifestGenerator={getIDPConsentManifest} authTokenParams={trustedAuthTokenParams}>\n <PresentationContext.Provider value={presentationValue}>\n <I18nProviderWrapper messages={messages} overrides={strings}>\n <IDPConsentScreen />\n </I18nProviderWrapper>\n </PresentationContext.Provider>\n </IDPContextProvider>\n </GlobalContextProvider>\n );\n};\n"],"names":["AppContainer","config","styles","props","internalConfig","organizationProducts","Object","values","B2BProducts","React","InternalAppContainer","B2BIDPContainer","client","presentation","callbacks","strings","getIDPConsentManifest","trustedAuthTokenParams","presentationValue","usePresentationWithDefault","products","useEffect","readB2BInternals","bootstrap","getAsync","then","data","networkClient","logEvent","name","details","GlobalContextProvider","initialState","DEFAULT_STATE","IDPContextProvider","consentManifestGenerator","authTokenParams","PresentationContext","Provider","value","I18nProviderWrapper","messages","overrides","IDPConsentScreen"],"mappings":";;;;;;;;;;;AAcA;;;;IAKO,MAAMA,YAAAA,GAAe,CAAC,EAC3BC,MAAM,EACNC,MAAM,EACN,GAAGC,KAAAA,EACiE,GAAA;AAUpE,IAAA,MAAMC,cAAAA,GAAiB;AACrB,QAAA,GAAGH,MAAM;QACTI,oBAAAA,EAAsBC,MAAAA,CAAOC,MAAM,CAACC,WAAAA;AACtC,KAAA;AAEA,IAAA,qBAAOC,cAAA,CAAA,aAAA,CAACC,oBAAAA,EAAAA;QAAqBT,MAAAA,EAAQG,cAAAA;AAAiB,QAAA,GAAGD;;AAC3D;MAEaQ,eAAAA,GAAkB,CAAgE,EAC7FC,MAAM,EACNC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,qBAAqB,EACrBC,sBAAsB,EACtBf,MAAM,EACuD,GAAA;IAC7D,MAAMgB,iBAAAA,GAAoBC,0BAAAA,CAA2BN,YAAAA,EAAc,KAAA,EAAO;AAAEO,QAAAA,QAAAA,EAAU;AAAG,KAAA,CAAA;IAEzFC,SAAAA,CAAU,IAAA;AACRC,QAAAA,gBAAAA,CAAiBV,QACdW,SAAS,CAACC,QAAQ,EAAA,CAClBC,IAAI,CAAC,CAACC,IAAAA,GAAAA;AACLJ,YAAAA,gBAAAA,CAAiBV,MAAAA,CAAAA,CAAQe,aAAa,CAACC,QAAQ,CAAC;gBAC9CC,IAAAA,EAAM,uBAAA;gBACNC,OAAAA,EAAS;oBAAEP,SAAAA,EAAWG;AAAK;AAC7B,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;KACJ,EAAG;AAACd,QAAAA;AAAO,KAAA,CAAA;AAWX,IAAA,qBACEH,cAAA,CAAA,aAAA,CAACsB,qBAAAA,EAAAA;QACCnB,MAAAA,EAAQA,MAAAA;AACRX,QAAAA,MAAAA,EAAQ,EAAC;QACTa,SAAAA,EAAWA,SAAAA;QACXkB,YAAAA,EAAcC;qBAEdxB,cAAA,CAAA,aAAA,CAACyB,kBAAAA,EAAAA;QAAmBC,wBAAAA,EAA0BnB,qBAAAA;QAAuBoB,eAAAA,EAAiBnB;AACpF,KAAA,gBAAAR,cAAA,CAAA,aAAA,CAAC4B,oBAAoBC,QAAQ,EAAA;QAACC,KAAAA,EAAOrB;qBACnCT,cAAA,CAAA,aAAA,CAAC+B,mBAAAA,EAAAA;QAAoBC,QAAAA,EAAUA,QAAAA;QAAUC,SAAAA,EAAW3B;qBAClDN,cAAA,CAAA,aAAA,CAACkC,gBAAAA,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAMb;;;;"}
|
|
@@ -54,7 +54,7 @@ const InternalAppContainer = ({ client, presentation, callbacks, config, strings
|
|
|
54
54
|
}), [
|
|
55
55
|
config
|
|
56
56
|
]);
|
|
57
|
-
const presentationValue = usePresentationWithDefault(presentation, displayWatermark, configWithDefaults
|
|
57
|
+
const presentationValue = usePresentationWithDefault(presentation, displayWatermark, configWithDefaults);
|
|
58
58
|
return /*#__PURE__*/ React__default.createElement(GlobalContextProvider, {
|
|
59
59
|
client: client,
|
|
60
60
|
callbacks: callbacks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InternalAppContainer.mjs","sources":["../../../../../../../../web/src/ui/b2b/InternalAppContainer.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { OverrideProperties } from 'type-fest';\nimport { messages } from '../../messages/b2b/en';\nimport { I18nProviderWrapper } from '../components/atoms/I18nProviderWrapper';\nimport { DEFAULT_STATE, GlobalContextProvider } from './GlobalContextProvider';\nimport { AppState } from './types/AppState';\nimport { AppScreens } from './types/AppScreens';\nimport { B2BSDKConfig, StytchB2BExtendedLoginConfig } from '../../types';\nimport { readB2BInternals } from '../../utils/internal';\nimport Container from './Container';\nimport { AuthFlowType, RedirectURLType, StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { PresentationContext, usePresentationWithDefault } from '../components/PresentationConfig';\n\nexport type InternalSDKConfig<TProjectConfiguration extends StytchProjectConfigurationInput> = OverrideProperties<\n B2BSDKConfig<TProjectConfiguration>,\n { config: StytchB2BExtendedLoginConfig }\n>;\n\nexport const InternalAppContainer = <TProjectConfiguration extends StytchProjectConfigurationInput>({\n client,\n presentation,\n callbacks,\n config,\n strings,\n}: InternalSDKConfig<TProjectConfiguration>) => {\n /**\n * Read the watermark out of sync storage, then read it out of async storage\n */\n const [displayWatermark, setDisplayWatermark] = useState(() => {\n const { displayWatermark } = readB2BInternals(client).bootstrap.getSync();\n return displayWatermark;\n });\n\n useEffect(() => {\n readB2BInternals(client)\n .bootstrap.getAsync()\n .then((data) => {\n readB2BInternals(client).networkClient.logEvent({\n name: 'render_b2b_login_screen',\n details: { options: config, bootstrap: data },\n });\n setDisplayWatermark(data.displayWatermark);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n }, [client]);\n\n const getRedirectTypeFromUrl = () => {\n const url = new URL(window.location.href);\n const redirectType = url.searchParams.get('stytch_redirect_type');\n\n return redirectType;\n };\n\n const redirectType = getRedirectTypeFromUrl();\n const authFlowType =\n redirectType === RedirectURLType.ResetPassword ? AuthFlowType.PasswordReset : config.authFlowType;\n\n const initialState: AppState = {\n ...DEFAULT_STATE,\n screen: authFlowType === AuthFlowType.PasswordReset ? AppScreens.PasswordResetForm : AppScreens.Main,\n flowState: {\n ...DEFAULT_STATE.flowState,\n type: authFlowType,\n },\n };\n\n const configWithDefaults = useMemo(\n () => ({\n ...config,\n // While `sessionOptions` is required in the types, we still want to handle the error gracefully if it's not provided.\n // We set it to an empty object here so that future checks for `sessionOptions.sessionDurationMinutes` throw a `can't read property of undefined` error,\n // and instead throw an error regarding a missing `sessionDurationMinutes` error from the headless client.\n sessionOptions: config.sessionOptions ?? {},\n }),\n [config],\n );\n\n const presentationValue = usePresentationWithDefault(\n presentation,\n displayWatermark,\n configWithDefaults
|
|
1
|
+
{"version":3,"file":"InternalAppContainer.mjs","sources":["../../../../../../../../web/src/ui/b2b/InternalAppContainer.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { OverrideProperties } from 'type-fest';\nimport { messages } from '../../messages/b2b/en';\nimport { I18nProviderWrapper } from '../components/atoms/I18nProviderWrapper';\nimport { DEFAULT_STATE, GlobalContextProvider } from './GlobalContextProvider';\nimport { AppState } from './types/AppState';\nimport { AppScreens } from './types/AppScreens';\nimport { B2BSDKConfig, StytchB2BExtendedLoginConfig } from '../../types';\nimport { readB2BInternals } from '../../utils/internal';\nimport Container from './Container';\nimport { AuthFlowType, RedirectURLType, StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { PresentationContext, usePresentationWithDefault } from '../components/PresentationConfig';\n\nexport type InternalSDKConfig<TProjectConfiguration extends StytchProjectConfigurationInput> = OverrideProperties<\n B2BSDKConfig<TProjectConfiguration>,\n { config: StytchB2BExtendedLoginConfig }\n>;\n\nexport const InternalAppContainer = <TProjectConfiguration extends StytchProjectConfigurationInput>({\n client,\n presentation,\n callbacks,\n config,\n strings,\n}: InternalSDKConfig<TProjectConfiguration>) => {\n /**\n * Read the watermark out of sync storage, then read it out of async storage\n */\n const [displayWatermark, setDisplayWatermark] = useState(() => {\n const { displayWatermark } = readB2BInternals(client).bootstrap.getSync();\n return displayWatermark;\n });\n\n useEffect(() => {\n readB2BInternals(client)\n .bootstrap.getAsync()\n .then((data) => {\n readB2BInternals(client).networkClient.logEvent({\n name: 'render_b2b_login_screen',\n details: { options: config, bootstrap: data },\n });\n setDisplayWatermark(data.displayWatermark);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n }, [client]);\n\n const getRedirectTypeFromUrl = () => {\n const url = new URL(window.location.href);\n const redirectType = url.searchParams.get('stytch_redirect_type');\n\n return redirectType;\n };\n\n const redirectType = getRedirectTypeFromUrl();\n const authFlowType =\n redirectType === RedirectURLType.ResetPassword ? AuthFlowType.PasswordReset : config.authFlowType;\n\n const initialState: AppState = {\n ...DEFAULT_STATE,\n screen: authFlowType === AuthFlowType.PasswordReset ? AppScreens.PasswordResetForm : AppScreens.Main,\n flowState: {\n ...DEFAULT_STATE.flowState,\n type: authFlowType,\n },\n };\n\n const configWithDefaults = useMemo(\n () => ({\n ...config,\n // While `sessionOptions` is required in the types, we still want to handle the error gracefully if it's not provided.\n // We set it to an empty object here so that future checks for `sessionOptions.sessionDurationMinutes` throw a `can't read property of undefined` error,\n // and instead throw an error regarding a missing `sessionDurationMinutes` error from the headless client.\n sessionOptions: config.sessionOptions ?? {},\n }),\n [config],\n );\n\n const presentationValue = usePresentationWithDefault(\n presentation,\n displayWatermark,\n configWithDefaults,\n 'B2BProduct',\n );\n\n return (\n <GlobalContextProvider\n client={client}\n callbacks={callbacks}\n config={configWithDefaults}\n initialState={initialState}\n >\n <PresentationContext.Provider value={presentationValue}>\n <I18nProviderWrapper messages={messages} overrides={strings}>\n <Container />\n </I18nProviderWrapper>\n </PresentationContext.Provider>\n </GlobalContextProvider>\n );\n};\n"],"names":["InternalAppContainer","client","presentation","callbacks","config","strings","displayWatermark","setDisplayWatermark","useState","readB2BInternals","bootstrap","getSync","useEffect","getAsync","then","data","networkClient","logEvent","name","details","options","getRedirectTypeFromUrl","url","URL","window","location","href","redirectType","searchParams","get","authFlowType","RedirectURLType","ResetPassword","AuthFlowType","PasswordReset","initialState","DEFAULT_STATE","screen","AppScreens","PasswordResetForm","Main","flowState","type","configWithDefaults","useMemo","sessionOptions","presentationValue","usePresentationWithDefault","React","GlobalContextProvider","PresentationContext","Provider","value","I18nProviderWrapper","messages","overrides","Container"],"mappings":";;;;;;;;;;AAkBO,MAAMA,oBAAAA,GAAuB,CAAgE,EAClGC,MAAM,EACNC,YAAY,EACZC,SAAS,EACTC,MAAM,EACNC,OAAO,EACkC,GAAA;AACzC;;AAEC,MACD,MAAM,CAACC,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGC,QAAAA,CAAS,IAAA;QACvD,MAAM,EAAEF,gBAAgB,EAAE,GAAGG,iBAAiBR,MAAAA,CAAAA,CAAQS,SAAS,CAACC,OAAO,EAAA;QACvE,OAAOL,gBAAAA;AACT,IAAA,CAAA,CAAA;IAEAM,SAAAA,CAAU,IAAA;AACRH,QAAAA,gBAAAA,CAAiBR,QACdS,SAAS,CAACG,QAAQ,EAAA,CAClBC,IAAI,CAAC,CAACC,IAAAA,GAAAA;AACLN,YAAAA,gBAAAA,CAAiBR,MAAAA,CAAAA,CAAQe,aAAa,CAACC,QAAQ,CAAC;gBAC9CC,IAAAA,EAAM,yBAAA;gBACNC,OAAAA,EAAS;oBAAEC,OAAAA,EAAShB,MAAAA;oBAAQM,SAAAA,EAAWK;AAAK;AAC9C,aAAA,CAAA;AACAR,YAAAA,mBAAAA,CAAoBQ,KAAKT,gBAAgB,CAAA;AAC3C,QAAA,CAAA,CAAA;;IAEJ,CAAA,EAAG;AAACL,QAAAA;AAAO,KAAA,CAAA;AAEX,IAAA,MAAMoB,sBAAAA,GAAyB,IAAA;AAC7B,QAAA,MAAMC,MAAM,IAAIC,GAAAA,CAAIC,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAA;AACxC,QAAA,MAAMC,YAAAA,GAAeL,GAAAA,CAAIM,YAAY,CAACC,GAAG,CAAC,sBAAA,CAAA;QAE1C,OAAOF,YAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMA,YAAAA,GAAeN,sBAAAA,EAAAA;IACrB,MAAMS,YAAAA,GACJH,iBAAiBI,eAAAA,CAAgBC,aAAa,GAAGC,YAAAA,CAAaC,aAAa,GAAG9B,MAAAA,CAAO0B,YAAY;AAEnG,IAAA,MAAMK,YAAAA,GAAyB;AAC7B,QAAA,GAAGC,aAAa;QAChBC,MAAAA,EAAQP,YAAAA,KAAiBG,aAAaC,aAAa,GAAGI,WAAWC,iBAAiB,GAAGD,WAAWE,IAAI;QACpGC,SAAAA,EAAW;AACT,YAAA,GAAGL,cAAcK,SAAS;YAC1BC,IAAAA,EAAMZ;AACR;AACF,KAAA;IAEA,MAAMa,kBAAAA,GAAqBC,OAAAA,CACzB,KAAO;AACL,YAAA,GAAGxC,MAAM;;;;YAITyC,cAAAA,EAAgBzC,MAAAA,CAAOyC,cAAc,IAAI;AAC3C,SAAA,CAAA,EACA;AAACzC,QAAAA;AAAO,KAAA,CAAA;AAGV,IAAA,MAAM0C,iBAAAA,GAAoBC,0BAAAA,CACxB7C,YAAAA,EACAI,gBAAAA,EACAqC,kBACA,CAAA;AAGF,IAAA,qBACEK,cAAA,CAAA,aAAA,CAACC,qBAAAA,EAAAA;QACChD,MAAAA,EAAQA,MAAAA;QACRE,SAAAA,EAAWA,SAAAA;QACXC,MAAAA,EAAQuC,kBAAAA;QACRR,YAAAA,EAAcA;AAEd,KAAA,gBAAAa,cAAA,CAAA,aAAA,CAACE,oBAAoBC,QAAQ,EAAA;QAACC,KAAAA,EAAON;qBACnCE,cAAA,CAAA,aAAA,CAACK,mBAAAA,EAAAA;QAAoBC,QAAAA,EAAUA,QAAAA;QAAUC,SAAAA,EAAWlD;qBAClD2C,cAAA,CAAA,aAAA,CAACQ,YAAAA,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAKX;;;;"}
|
|
@@ -43,7 +43,7 @@ const OAuthB2BButton = ({ providerType, loginRedirectUrl, signupRedirectUrl, dis
|
|
|
43
43
|
const [state] = useGlobalReducer();
|
|
44
44
|
const presentation = usePresentation();
|
|
45
45
|
const iconRegistry = presentation.iconRegistry;
|
|
46
|
-
const id = getButtonId(`
|
|
46
|
+
const id = getButtonId(`oauth-${providerType}`, presentation.options);
|
|
47
47
|
const provider = providerInfo[providerType];
|
|
48
48
|
let label = providerType;
|
|
49
49
|
let icon = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuthB2BButton.mjs","sources":["../../../../../../../../../web/src/ui/b2b/components/OAuthB2BButton.tsx"],"sourcesContent":["import React from 'react';\nimport { B2BOAuthProviders } from '@stytch/core/public';\nimport { msg } from '@lingui/core/macro';\nimport { useLingui } from '@lingui/react/macro';\nimport { MessageDescriptor } from '@lingui/core';\nimport { useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport Button from '../../components/atoms/Button';\nimport { getButtonId, usePresentation } from '../../components/PresentationConfig';\nimport { IconRegistry } from '../../components/IconRegistry';\nimport type { oauthIcons } from './Icons';\n\ntype OauthIconName = keyof typeof oauthIcons;\n\ninterface OAuthProviderInfo {\n messageDescriptor: MessageDescriptor;\n}\n\nconst providerInfo: Record<B2BOAuthProviders, OAuthProviderInfo> = {\n [B2BOAuthProviders.Google]: {\n messageDescriptor: msg({ id: 'oauth.continueWithGoogle', message: 'Continue with Google' }),\n },\n [B2BOAuthProviders.Microsoft]: {\n messageDescriptor: msg({ id: 'oauth.continueWithMicrosoft', message: 'Continue with Microsoft' }),\n },\n [B2BOAuthProviders.HubSpot]: {\n messageDescriptor: msg({ id: 'oauth.continueWithHubSpot', message: 'Continue with HubSpot' }),\n },\n [B2BOAuthProviders.Slack]: {\n messageDescriptor: msg({ id: 'oauth.continueWithSlack', message: 'Continue with Slack' }),\n },\n [B2BOAuthProviders.GitHub]: {\n messageDescriptor: msg({ id: 'oauth.continueWithGitHub', message: 'Continue with GitHub' }),\n },\n};\n\nexport type OauthB2BButtonProps = {\n providerType: B2BOAuthProviders;\n loginRedirectUrl?: string;\n signupRedirectUrl?: string;\n discoveryRedirectUrl?: string;\n customScopes?: string[];\n providerParams?: Record<string, string>;\n onSuccess?: () => void;\n};\n\nexport const OAuthB2BButton = ({\n providerType,\n loginRedirectUrl,\n signupRedirectUrl,\n discoveryRedirectUrl,\n customScopes,\n providerParams,\n onSuccess,\n}: OauthB2BButtonProps) => {\n const { t } = useLingui();\n const stytchClient = useStytch();\n const [state] = useGlobalReducer();\n\n const presentation = usePresentation();\n const iconRegistry: IconRegistry<OauthIconName> = presentation.iconRegistry;\n const id = getButtonId(`
|
|
1
|
+
{"version":3,"file":"OAuthB2BButton.mjs","sources":["../../../../../../../../../web/src/ui/b2b/components/OAuthB2BButton.tsx"],"sourcesContent":["import React from 'react';\nimport { B2BOAuthProviders } from '@stytch/core/public';\nimport { msg } from '@lingui/core/macro';\nimport { useLingui } from '@lingui/react/macro';\nimport { MessageDescriptor } from '@lingui/core';\nimport { useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport Button from '../../components/atoms/Button';\nimport { getButtonId, usePresentation } from '../../components/PresentationConfig';\nimport { IconRegistry } from '../../components/IconRegistry';\nimport type { oauthIcons } from './Icons';\n\ntype OauthIconName = keyof typeof oauthIcons;\n\ninterface OAuthProviderInfo {\n messageDescriptor: MessageDescriptor;\n}\n\nconst providerInfo: Record<B2BOAuthProviders, OAuthProviderInfo> = {\n [B2BOAuthProviders.Google]: {\n messageDescriptor: msg({ id: 'oauth.continueWithGoogle', message: 'Continue with Google' }),\n },\n [B2BOAuthProviders.Microsoft]: {\n messageDescriptor: msg({ id: 'oauth.continueWithMicrosoft', message: 'Continue with Microsoft' }),\n },\n [B2BOAuthProviders.HubSpot]: {\n messageDescriptor: msg({ id: 'oauth.continueWithHubSpot', message: 'Continue with HubSpot' }),\n },\n [B2BOAuthProviders.Slack]: {\n messageDescriptor: msg({ id: 'oauth.continueWithSlack', message: 'Continue with Slack' }),\n },\n [B2BOAuthProviders.GitHub]: {\n messageDescriptor: msg({ id: 'oauth.continueWithGitHub', message: 'Continue with GitHub' }),\n },\n};\n\nexport type OauthB2BButtonProps = {\n providerType: B2BOAuthProviders;\n loginRedirectUrl?: string;\n signupRedirectUrl?: string;\n discoveryRedirectUrl?: string;\n customScopes?: string[];\n providerParams?: Record<string, string>;\n onSuccess?: () => void;\n};\n\nexport const OAuthB2BButton = ({\n providerType,\n loginRedirectUrl,\n signupRedirectUrl,\n discoveryRedirectUrl,\n customScopes,\n providerParams,\n onSuccess,\n}: OauthB2BButtonProps) => {\n const { t } = useLingui();\n const stytchClient = useStytch();\n const [state] = useGlobalReducer();\n\n const presentation = usePresentation();\n const iconRegistry: IconRegistry<OauthIconName> = presentation.iconRegistry;\n const id = getButtonId(`oauth-${providerType}`, presentation.options);\n\n const provider = providerInfo[providerType];\n let label: string = providerType;\n let icon = null;\n if (provider) {\n const { messageDescriptor } = provider;\n const Icon = iconRegistry[providerType];\n label = t(messageDescriptor);\n icon = <Icon />;\n }\n\n const onButtonClick = async () => {\n const providerClient = stytchClient.oauth[providerType];\n\n if (state.flowState.organization) {\n await providerClient.start({\n login_redirect_url: loginRedirectUrl,\n signup_redirect_url: signupRedirectUrl,\n custom_scopes: customScopes,\n organization_id: state.flowState.organization.organization_id,\n provider_params: providerParams,\n });\n } else {\n await providerClient.discovery.start({\n discovery_redirect_url: discoveryRedirectUrl,\n custom_scopes: customScopes,\n provider_params: providerParams,\n });\n }\n\n onSuccess?.();\n };\n\n return (\n <Button onClick={onButtonClick} variant=\"outline\" icon={icon} id={id}>\n {label}\n </Button>\n );\n};\n"],"names":["providerInfo","B2BOAuthProviders","Google","messageDescriptor","Microsoft","HubSpot","Slack","GitHub","OAuthB2BButton","providerType","loginRedirectUrl","signupRedirectUrl","discoveryRedirectUrl","customScopes","providerParams","onSuccess","useLingui","stytchClient","useStytch","state","useGlobalReducer","presentation","usePresentation","iconRegistry","id","getButtonId","options","provider","label","icon","Icon","React","onButtonClick","providerClient","oauth","flowState","organization","start","login_redirect_url","signup_redirect_url","custom_scopes","organization_id","provider_params","discovery","discovery_redirect_url","Button","onClick","variant"],"mappings":";;;;;;;AAiBA,MAAMA,YAAAA,GAA6D;IACjE,CAACC,iBAAAA,CAAkBC,MAAM,GAAG;QAC1BC,iBAAiB,EAAA;;;;AACnB,KAAA;IACA,CAACF,iBAAAA,CAAkBG,SAAS,GAAG;QAC7BD,iBAAiB,EAAA;;;;AACnB,KAAA;IACA,CAACF,iBAAAA,CAAkBI,OAAO,GAAG;QAC3BF,iBAAiB,EAAA;;;;AACnB,KAAA;IACA,CAACF,iBAAAA,CAAkBK,KAAK,GAAG;QACzBH,iBAAiB,EAAA;;;;AACnB,KAAA;IACA,CAACF,iBAAAA,CAAkBM,MAAM,GAAG;QAC1BJ,iBAAiB,EAAA;;;;AACnB;AACF,CAAA;MAYaK,cAAAA,GAAiB,CAAC,EAC7BC,YAAY,EACZC,gBAAgB,EAChBC,iBAAiB,EACjBC,oBAAoB,EACpBC,YAAY,EACZC,cAAc,EACdC,SAAS,EACW,GAAA;AACpB,IAAA,MAAM,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,GAAA,EAAA,GAAQC,SAAAA,EAAAA;AACd,IAAA,MAAMC,YAAAA,GAAeC,SAAAA,EAAAA;IACrB,MAAM,CAACC,MAAM,GAAGC,gBAAAA,EAAAA;AAEhB,IAAA,MAAMC,YAAAA,GAAeC,eAAAA,EAAAA;IACrB,MAAMC,YAAAA,GAA4CF,aAAaE,YAAY;IAC3E,MAAMC,EAAAA,GAAKC,YAAY,CAAC,MAAM,EAAEhB,YAAAA,CAAAA,CAAc,EAAEY,aAAaK,OAAO,CAAA;IAEpE,MAAMC,QAAAA,GAAW3B,YAAY,CAACS,YAAAA,CAAa;AAC3C,IAAA,IAAImB,KAAAA,GAAgBnB,YAAAA;AACpB,IAAA,IAAIoB,IAAAA,GAAO,IAAA;AACX,IAAA,IAAIF,QAAAA,EAAU;QACZ,MAAM,EAAExB,iBAAiB,EAAE,GAAGwB,QAAAA;QAC9B,MAAMG,IAAAA,GAAOP,YAAY,CAACd,YAAAA,CAAa;QACvCmB,KAAAA,GAAAA,OAAAA,CAAAA,CAAAA,CAAUzB,iBAAAA,CAAAA;AACV0B,QAAAA,IAAAA,iBAAOE,cAAA,CAAA,aAAA,CAACD,IAAAA,EAAAA,IAAAA,CAAAA;AACV,IAAA;AAEA,IAAA,MAAME,aAAAA,GAAgB,UAAA;AACpB,QAAA,MAAMC,cAAAA,GAAiBhB,YAAAA,CAAaiB,KAAK,CAACzB,YAAAA,CAAa;AAEvD,QAAA,IAAIU,KAAAA,CAAMgB,SAAS,CAACC,YAAY,EAAE;YAChC,MAAMH,cAAAA,CAAeI,KAAK,CAAC;gBACzBC,kBAAAA,EAAoB5B,gBAAAA;gBACpB6B,mBAAAA,EAAqB5B,iBAAAA;gBACrB6B,aAAAA,EAAe3B,YAAAA;AACf4B,gBAAAA,eAAAA,EAAiBtB,KAAAA,CAAMgB,SAAS,CAACC,YAAY,CAACK,eAAe;gBAC7DC,eAAAA,EAAiB5B;AACnB,aAAA,CAAA;QACF,CAAA,MAAO;AACL,YAAA,MAAMmB,cAAAA,CAAeU,SAAS,CAACN,KAAK,CAAC;gBACnCO,sBAAAA,EAAwBhC,oBAAAA;gBACxB4B,aAAAA,EAAe3B,YAAAA;gBACf6B,eAAAA,EAAiB5B;AACnB,aAAA,CAAA;AACF,QAAA;AAEAC,QAAAA,SAAAA,IAAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEgB,cAAA,CAAA,aAAA,CAACc,MAAAA,EAAAA;QAAOC,OAAAA,EAASd,aAAAA;QAAee,OAAAA,EAAQ,SAAA;QAAUlB,IAAAA,EAAMA,IAAAA;QAAML,EAAAA,EAAIA;AAC/DI,KAAAA,EAAAA,KAAAA,CAAAA;AAGP;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SMSOTPEnrollScreen.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/SMSOTPEnrollScreen.tsx"],"sourcesContent":["import { B2BSMSSendResponse, StytchAPIError, StytchSDKError } from '@stytch/core/public';\nimport React, { FormEvent } from 'react';\nimport { COUNTRIES_LIST, CountryCode } from '@stytch/core';\nimport { readB2BInternals } from '../../../utils/internal';\nimport Column from '../../components/atoms/Column';\nimport PhoneInput, { getPhoneNumberProps } from '../../components/molecules/PhoneInput';\nimport Button from '../../components/atoms/Button';\nimport Typography from '../../components/atoms/Typography';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { StytchMutationKey, useMutate } from '../utils';\nimport { formatNumberToIncludeCountryCode } from '../../../utils/handleParsePhoneNumber';\nimport { useLingui } from '@lingui/react/macro';\nimport { getTranslatedError } from '../../../utils/getTranslatedError';\nimport { canGoBack } from '../reducer/navigation';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\n\n// eslint-disable-next-line lingui/no-unlocalized-strings\nconst DEFAULT_COUNTRY_CODE = 'US' satisfies CountryCode;\n\n/**\n * Thrown when the user provides a phone number that cannot be parsed.\n */\nclass InvalidPhoneNumberError extends StytchSDKError {\n constructor() {\n // eslint-disable-next-line lingui/no-unlocalized-strings\n super('InvalidPhoneNumberError', 'Invalid phone number');\n }\n}\n\nexport const SMSOTPEnrollScreen = () => {\n const stytchClient = useStytch();\n const [state, dispatch] = useGlobalReducer();\n const { t } = useLingui();\n const { smsOtpOptions } = useConfig();\n const {\n mfa: {\n smsOtp: { isSending, sendError, enrolledNumber },\n },\n } = state;\n\n // This screen should only be shown if primary info is available\n const { memberId, organizationId } = state.mfa.primaryInfo!;\n\n const [countryCode, setCountryCode] = React.useState<CountryCode>(\n enrolledNumber?.countryCode ?? DEFAULT_COUNTRY_CODE,\n );\n const [phoneNumber, setPhoneNumber] = React.useState(enrolledNumber?.phoneNumber ?? '');\n\n const errorMessage = React.useMemo(() => {\n if (!sendError) return undefined;\n\n if (sendError instanceof InvalidPhoneNumberError) {\n return t({\n id: 'error.invalidPhoneNumber',\n message: 'Phone number format is invalid. Ensure the phone number is in the E.164 format.',\n });\n }\n\n return getTranslatedError(sendError as StytchAPIError, t);\n }, [sendError, t]);\n\n const { parsePhoneNumber, getExampleNumber } = getPhoneNumberProps(readB2BInternals(stytchClient).clientsideServices);\n\n const { trigger: sendSms } = useMutate<\n B2BSMSSendResponse,\n unknown,\n StytchMutationKey,\n { parsedNumber: string; locale?: string }\n >(\n 'stytch.otps.sms.send',\n async (_: string, { arg: { parsedNumber, locale } }: { arg: { parsedNumber: string; locale?: string } }) => {\n return stytchClient.otps.sms.send({\n mfa_phone_number: parsedNumber,\n member_id: memberId,\n organization_id: organizationId,\n locale: locale,\n });\n },\n {\n onSuccess: (response) => {\n dispatch({\n type: 'sms_otp/send_success',\n response,\n countryCode,\n phoneNumber,\n formattedPhoneNumber: `+${COUNTRIES_LIST[countryCode]} ${phoneNumber}`,\n });\n },\n onError: (error) => {\n dispatch({\n type: 'sms_otp/send_error',\n error,\n });\n },\n },\n );\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n dispatch({ type: 'sms_otp/send' });\n try {\n // We parse the phone number here (rather than inside `sendSms`) because we\n // don't want validation errors to be surfaced through the global error\n // callback\n\n const parsedNumber = await formatNumberToIncludeCountryCode({\n parsePhoneNumber,\n phoneNumber,\n country: countryCode,\n });\n\n if (!parsedNumber.isValid) {\n throw new InvalidPhoneNumberError();\n }\n\n await sendSms({ parsedNumber: parsedNumber.number, locale: smsOtpOptions?.locale });\n } catch (error) {\n dispatch({\n type: 'sms_otp/send_error',\n error,\n });\n }\n };\n\n return (\n <Column as=\"form\" gap={6} onSubmit={handleSubmit}>\n <Typography variant=\"header\">\n {t({\n id: 'mfa.smsEnrollment.title',\n message: 'Enter your phone number to set up Multi-Factor Authentication',\n })}\n </Typography>\n\n <Typography variant=\"body\">\n {t({\n id: 'mfa.smsEnrollment.content',\n message: 'Your organization requires an additional form of verification to make your account more secure.',\n })}\n </Typography>\n\n <PhoneInput\n country={countryCode}\n setCountry={setCountryCode}\n phone={phoneNumber}\n setPhone={setPhoneNumber}\n parsePhoneNumber={parsePhoneNumber}\n getExampleNumber={getExampleNumber}\n error={errorMessage}\n />\n\n <ButtonColumn>\n <Button variant=\"primary\" loading={isSending} type=\"submit\" disabled={!phoneNumber || isSending}>\n {t({ id: 'button.continue', message: 'Continue' })}\n </Button>\n {canGoBack(state) && (\n <Button variant=\"ghost\" onClick={() => dispatch({ type: 'navigate_back' })}>\n {t({ id: 'button.goBack', message: 'Go back' })}\n </Button>\n )}\n </ButtonColumn>\n </Column>\n );\n};\n"],"names":["DEFAULT_COUNTRY_CODE","InvalidPhoneNumberError","StytchSDKError","constructor","SMSOTPEnrollScreen","stytchClient","useStytch","state","dispatch","useGlobalReducer","useLingui","smsOtpOptions","useConfig","mfa","smsOtp","isSending","sendError","enrolledNumber","memberId","organizationId","primaryInfo","countryCode","setCountryCode","React","useState","phoneNumber","setPhoneNumber","errorMessage","useMemo","undefined","getTranslatedError","parsePhoneNumber","getExampleNumber","getPhoneNumberProps","readB2BInternals","clientsideServices","trigger","sendSms","useMutate","_","arg","parsedNumber","locale","otps","sms","send","mfa_phone_number","member_id","organization_id","onSuccess","response","type","formattedPhoneNumber","COUNTRIES_LIST","onError","error","handleSubmit","e","preventDefault","formatNumberToIncludeCountryCode","country","isValid","number","Column","as","gap","onSubmit","Typography","variant","PhoneInput","setCountry","phone","setPhone","ButtonColumn","Button","loading","disabled","canGoBack","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SMSOTPEnrollScreen.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/SMSOTPEnrollScreen.tsx"],"sourcesContent":["import { B2BSMSSendResponse, StytchAPIError, StytchSDKError } from '@stytch/core/public';\nimport React, { FormEvent } from 'react';\nimport { COUNTRIES_LIST, CountryCode } from '@stytch/core';\nimport { readB2BInternals } from '../../../utils/internal';\nimport Column from '../../components/atoms/Column';\nimport PhoneInput, { getPhoneNumberProps } from '../../components/molecules/PhoneInput';\nimport Button from '../../components/atoms/Button';\nimport Typography from '../../components/atoms/Typography';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { StytchMutationKey, useMutate } from '../utils';\nimport { formatNumberToIncludeCountryCode } from '../../../utils/handleParsePhoneNumber';\nimport { useLingui } from '@lingui/react/macro';\nimport { getTranslatedError } from '../../../utils/getTranslatedError';\nimport { canGoBack } from '../reducer/navigation';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\n\n// eslint-disable-next-line lingui/no-unlocalized-strings\nconst DEFAULT_COUNTRY_CODE = 'US' satisfies CountryCode;\n\n/**\n * Thrown when the user provides a phone number that cannot be parsed.\n */\nclass InvalidPhoneNumberError extends StytchSDKError {\n constructor() {\n // eslint-disable-next-line lingui/no-unlocalized-strings\n super('InvalidPhoneNumberError', 'Invalid phone number');\n }\n}\n\nexport const SMSOTPEnrollScreen = () => {\n const stytchClient = useStytch();\n const [state, dispatch] = useGlobalReducer();\n const { t } = useLingui();\n const { smsOtpOptions } = useConfig();\n const {\n mfa: {\n smsOtp: { isSending, sendError, enrolledNumber },\n },\n } = state;\n\n // This screen should only be shown if primary info is available\n const { memberId, organizationId } = state.mfa.primaryInfo!;\n\n const [countryCode, setCountryCode] = React.useState<CountryCode>(\n enrolledNumber?.countryCode ?? DEFAULT_COUNTRY_CODE,\n );\n const [phoneNumber, setPhoneNumber] = React.useState(enrolledNumber?.phoneNumber ?? '');\n\n const errorMessage = React.useMemo(() => {\n if (!sendError) return undefined;\n\n if (sendError instanceof InvalidPhoneNumberError) {\n return t({\n id: 'error.invalidPhoneNumber',\n message: 'Phone number format is invalid. Ensure the phone number is in the E.164 format.',\n });\n }\n\n return getTranslatedError(sendError as StytchAPIError, t);\n }, [sendError, t]);\n\n const { parsePhoneNumber, getExampleNumber } = getPhoneNumberProps(readB2BInternals(stytchClient).clientsideServices);\n\n const { trigger: sendSms } = useMutate<\n B2BSMSSendResponse,\n unknown,\n StytchMutationKey,\n { parsedNumber: string; locale?: string }\n >(\n 'stytch.otps.sms.send',\n async (_: string, { arg: { parsedNumber, locale } }: { arg: { parsedNumber: string; locale?: string } }) => {\n return stytchClient.otps.sms.send({\n mfa_phone_number: parsedNumber,\n member_id: memberId,\n organization_id: organizationId,\n locale: locale,\n });\n },\n {\n onSuccess: (response) => {\n dispatch({\n type: 'sms_otp/send_success',\n response,\n countryCode,\n phoneNumber,\n formattedPhoneNumber: `+${COUNTRIES_LIST[countryCode]} ${phoneNumber}`,\n });\n },\n onError: (error) => {\n dispatch({\n type: 'sms_otp/send_error',\n error,\n });\n },\n },\n );\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n dispatch({ type: 'sms_otp/send' });\n try {\n // We parse the phone number here (rather than inside `sendSms`) because we\n // don't want validation errors to be surfaced through the global error\n // callback\n\n const parsedNumber = await formatNumberToIncludeCountryCode({\n parsePhoneNumber,\n phoneNumber,\n country: countryCode,\n });\n\n if (!parsedNumber.isValid) {\n throw new InvalidPhoneNumberError();\n }\n\n await sendSms({ parsedNumber: parsedNumber.number, locale: smsOtpOptions?.locale });\n } catch (error) {\n dispatch({\n type: 'sms_otp/send_error',\n error,\n });\n }\n };\n\n return (\n <Column as=\"form\" gap={6} onSubmit={handleSubmit}>\n <Typography variant=\"header\">\n {t({\n id: 'mfa.smsEnrollment.title',\n message: 'Enter your phone number to set up Multi-Factor Authentication',\n })}\n </Typography>\n\n <Typography variant=\"body\">\n {t({\n id: 'mfa.smsEnrollment.content',\n message: 'Your organization requires an additional form of verification to make your account more secure.',\n })}\n </Typography>\n\n <PhoneInput\n country={countryCode}\n setCountry={setCountryCode}\n phone={phoneNumber}\n setPhone={setPhoneNumber}\n parsePhoneNumber={parsePhoneNumber}\n getExampleNumber={getExampleNumber}\n error={errorMessage}\n />\n\n <ButtonColumn>\n <Button variant=\"primary\" loading={isSending} type=\"submit\" disabled={!phoneNumber || isSending}>\n {t({ id: 'button.continue', message: 'Continue' })}\n </Button>\n {canGoBack(state) && (\n <Button variant=\"ghost\" onClick={() => dispatch({ type: 'navigate_back' })}>\n {t({ id: 'button.goBack', message: 'Go back' })}\n </Button>\n )}\n </ButtonColumn>\n </Column>\n );\n};\n"],"names":["DEFAULT_COUNTRY_CODE","InvalidPhoneNumberError","StytchSDKError","SMSOTPEnrollScreen","stytchClient","useStytch","state","dispatch","useGlobalReducer","useLingui","smsOtpOptions","useConfig","mfa","smsOtp","isSending","sendError","enrolledNumber","memberId","organizationId","primaryInfo","countryCode","setCountryCode","React","useState","phoneNumber","setPhoneNumber","errorMessage","useMemo","undefined","getTranslatedError","parsePhoneNumber","getExampleNumber","getPhoneNumberProps","readB2BInternals","clientsideServices","trigger","sendSms","useMutate","_","arg","parsedNumber","locale","otps","sms","send","mfa_phone_number","member_id","organization_id","onSuccess","response","type","formattedPhoneNumber","COUNTRIES_LIST","onError","error","handleSubmit","e","preventDefault","formatNumberToIncludeCountryCode","country","isValid","number","Column","as","gap","onSubmit","Typography","variant","PhoneInput","setCountry","phone","setPhone","ButtonColumn","Button","loading","disabled","canGoBack","onClick"],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ const AppContainer = ({ client, config, presentation, callbacks, strings, styles
|
|
|
27
27
|
}, [
|
|
28
28
|
client
|
|
29
29
|
]);
|
|
30
|
-
const presentationValue = usePresentationWithDefault(presentation, displayWatermark, config
|
|
30
|
+
const presentationValue = usePresentationWithDefault(presentation, displayWatermark, config);
|
|
31
31
|
return /*#__PURE__*/ React__default.createElement(GlobalContextProvider, {
|
|
32
32
|
client: client,
|
|
33
33
|
config: config,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppContainer.mjs","sources":["../../../../../../../../web/src/ui/b2c/AppContainer.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { messages } from '../../messages/en';\nimport { I18nProviderWrapper } from '../components/atoms/I18nProviderWrapper';\nimport { GlobalContextProvider } from './GlobalContextProvider';\nimport Container from './Container';\nimport { DeprecatedSDKConfig, SDKConfig } from '../../types';\nimport { readB2CInternals } from '../../utils/internal';\nimport { usePresentationWithDefault, PresentationContext } from '../components/PresentationConfig';\nimport { logger, RUN_IN_DEV } from '@stytch/core';\n\nexport const AppContainer = <TProjectConfiguration extends StytchProjectConfigurationInput>({\n client,\n config,\n presentation,\n callbacks,\n strings,\n styles,\n}: SDKConfig<TProjectConfiguration> & DeprecatedSDKConfig) => {\n // Read the watermark out of sync storage, then read it out of async storage\n const [displayWatermark, setDisplayWatermark] = useState(() => {\n const { displayWatermark } = readB2CInternals(client).bootstrap.getSync();\n return displayWatermark;\n });\n\n useEffect(() => {\n readB2CInternals(client)\n .bootstrap.getAsync()\n .then((data) => {\n readB2CInternals(client).networkClient.logEvent({\n name: 'render_login_screen',\n details: { options: config, bootstrap: data },\n });\n setDisplayWatermark(data.displayWatermark);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n }, [client]);\n\n RUN_IN_DEV(() => {\n if (styles) {\n logger.error(\n 'styles is deprecated and has no effect. Use the presentation prop instead.\\n' +\n 'See https://stytch.com/docs/api-reference/consumer/frontend-sdks/react/upgrade-guide#step-by-step-guide',\n );\n }\n });\n\n const presentationValue = usePresentationWithDefault(presentation, displayWatermark, config
|
|
1
|
+
{"version":3,"file":"AppContainer.mjs","sources":["../../../../../../../../web/src/ui/b2c/AppContainer.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { messages } from '../../messages/en';\nimport { I18nProviderWrapper } from '../components/atoms/I18nProviderWrapper';\nimport { GlobalContextProvider } from './GlobalContextProvider';\nimport Container from './Container';\nimport { DeprecatedSDKConfig, SDKConfig } from '../../types';\nimport { readB2CInternals } from '../../utils/internal';\nimport { usePresentationWithDefault, PresentationContext } from '../components/PresentationConfig';\nimport { logger, RUN_IN_DEV } from '@stytch/core';\n\nexport const AppContainer = <TProjectConfiguration extends StytchProjectConfigurationInput>({\n client,\n config,\n presentation,\n callbacks,\n strings,\n styles,\n}: SDKConfig<TProjectConfiguration> & DeprecatedSDKConfig) => {\n // Read the watermark out of sync storage, then read it out of async storage\n const [displayWatermark, setDisplayWatermark] = useState(() => {\n const { displayWatermark } = readB2CInternals(client).bootstrap.getSync();\n return displayWatermark;\n });\n\n useEffect(() => {\n readB2CInternals(client)\n .bootstrap.getAsync()\n .then((data) => {\n readB2CInternals(client).networkClient.logEvent({\n name: 'render_login_screen',\n details: { options: config, bootstrap: data },\n });\n setDisplayWatermark(data.displayWatermark);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n }, [client]);\n\n RUN_IN_DEV(() => {\n if (styles) {\n logger.error(\n 'styles is deprecated and has no effect. Use the presentation prop instead.\\n' +\n 'See https://stytch.com/docs/api-reference/consumer/frontend-sdks/react/upgrade-guide#step-by-step-guide',\n );\n }\n });\n\n const presentationValue = usePresentationWithDefault(presentation, displayWatermark, config, 'Products');\n\n return (\n <GlobalContextProvider client={client} config={config} callbacks={callbacks}>\n <PresentationContext.Provider value={presentationValue}>\n <I18nProviderWrapper messages={messages} overrides={strings}>\n <Container />\n </I18nProviderWrapper>\n </PresentationContext.Provider>\n </GlobalContextProvider>\n );\n};\n"],"names":["AppContainer","client","config","presentation","callbacks","strings","styles","displayWatermark","setDisplayWatermark","useState","readB2CInternals","bootstrap","getSync","useEffect","getAsync","then","data","networkClient","logEvent","name","details","options","presentationValue","usePresentationWithDefault","React","GlobalContextProvider","PresentationContext","Provider","value","I18nProviderWrapper","messages","overrides","Container"],"mappings":";;;;;;;;MAWaA,YAAAA,GAAe,CAAgE,EAC1FC,MAAM,EACNC,MAAM,EACNC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,MAAM,EACiD,GAAA;;AAEvD,IAAA,MAAM,CAACC,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGC,QAAAA,CAAS,IAAA;QACvD,MAAM,EAAEF,gBAAgB,EAAE,GAAGG,iBAAiBT,MAAAA,CAAAA,CAAQU,SAAS,CAACC,OAAO,EAAA;QACvE,OAAOL,gBAAAA;AACT,IAAA,CAAA,CAAA;IAEAM,SAAAA,CAAU,IAAA;AACRH,QAAAA,gBAAAA,CAAiBT,QACdU,SAAS,CAACG,QAAQ,EAAA,CAClBC,IAAI,CAAC,CAACC,IAAAA,GAAAA;AACLN,YAAAA,gBAAAA,CAAiBT,MAAAA,CAAAA,CAAQgB,aAAa,CAACC,QAAQ,CAAC;gBAC9CC,IAAAA,EAAM,qBAAA;gBACNC,OAAAA,EAAS;oBAAEC,OAAAA,EAASnB,MAAAA;oBAAQS,SAAAA,EAAWK;AAAK;AAC9C,aAAA,CAAA;AACAR,YAAAA,mBAAAA,CAAoBQ,KAAKT,gBAAgB,CAAA;AAC3C,QAAA,CAAA,CAAA;;KAEJ,EAAG;AAACN,QAAAA;AAAO,KAAA,CAAA;AAWX,IAAA,MAAMqB,iBAAAA,GAAoBC,0BAAAA,CAA2BpB,YAAAA,EAAcI,gBAAAA,EAAkBL,MAAQ,CAAA;AAE7F,IAAA,qBACEsB,cAAA,CAAA,aAAA,CAACC,qBAAAA,EAAAA;QAAsBxB,MAAAA,EAAQA,MAAAA;QAAQC,MAAAA,EAAQA,MAAAA;QAAQE,SAAAA,EAAWA;AAChE,KAAA,gBAAAoB,cAAA,CAAA,aAAA,CAACE,oBAAoBC,QAAQ,EAAA;QAACC,KAAAA,EAAON;qBACnCE,cAAA,CAAA,aAAA,CAACK,mBAAAA,EAAAA;QAAoBC,QAAAA,EAAUA,QAAAA;QAAUC,SAAAA,EAAW1B;qBAClDmB,cAAA,CAAA,aAAA,CAACQ,cAAAA,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAKX;;;;"}
|