@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
|
@@ -6,7 +6,7 @@ import { useScimRouterController } from './SCIMRouter.mjs';
|
|
|
6
6
|
import { Select } from '../components/Select.mjs';
|
|
7
7
|
import { scimIdpMap } from './scimInfo.mjs';
|
|
8
8
|
import { Input } from '../components/Input.mjs';
|
|
9
|
-
import '../../../../../_virtual/
|
|
9
|
+
import '../../../../../_virtual/index.mjs';
|
|
10
10
|
import { useSWRConfig } from '../../../../../node_modules/swr/_internal/dist/index.mjs';
|
|
11
11
|
import { useStytchClient } from '../utils/useStytchClient.mjs';
|
|
12
12
|
import { organizationGetKey } from '../utils/organizationGetKey.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React__default, { useState, useCallback } from 'react';
|
|
2
|
-
import '../../../../../_virtual/
|
|
2
|
+
import '../../../../../_virtual/index.mjs';
|
|
3
3
|
import { useSWRConfig } from '../../../../../node_modules/swr/_internal/dist/index.mjs';
|
|
4
4
|
import { extractErrorMessage } from '../../utils/extractErrorMessage.mjs';
|
|
5
5
|
import { Button } from '../components/Button.mjs';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import merge from '../../../../../_virtual/
|
|
1
|
+
import merge from '../../../../../_virtual/index2.mjs';
|
|
2
2
|
import 'react';
|
|
3
3
|
import createTheme from '../../../../../node_modules/@mui/material/styles/createTheme.mjs';
|
|
4
4
|
import selectClasses from '../../../../../node_modules/@mui/material/Select/selectClasses.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
|
-
import '../../../../../_virtual/
|
|
2
|
+
import '../../../../../_virtual/index.mjs';
|
|
3
3
|
import { useSWRConfig } from '../../../../../node_modules/swr/_internal/dist/index.mjs';
|
|
4
4
|
import { memberGetKey } from './memberGetKey.mjs';
|
|
5
5
|
import { useMutateWithToast } from './useMutateWithToast.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
|
-
import '../../../../../_virtual/
|
|
2
|
+
import '../../../../../_virtual/index.mjs';
|
|
3
3
|
import { useSWRConfig } from '../../../../../node_modules/swr/_internal/dist/index.mjs';
|
|
4
4
|
import { organizationGetKey } from './organizationGetKey.mjs';
|
|
5
5
|
import { useMutateWithToast } from './useMutateWithToast.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
|
-
import '../../../../../_virtual/
|
|
2
|
+
import '../../../../../_virtual/index.mjs';
|
|
3
3
|
import { useSWRConfig } from '../../../../../node_modules/swr/_internal/dist/index.mjs';
|
|
4
4
|
import { useMutateWithToast } from './useMutateWithToast.mjs';
|
|
5
5
|
import { useStytchClient } from './useStytchClient.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
|
-
import '../../../../../_virtual/
|
|
2
|
+
import '../../../../../_virtual/index.mjs';
|
|
3
3
|
import { useSWRConfig } from '../../../../../node_modules/swr/_internal/dist/index.mjs';
|
|
4
4
|
import { useMutateWithToast } from './useMutateWithToast.mjs';
|
|
5
5
|
import { useRevalidateConnectionList } from './useRevalidateConnectionList.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
|
-
import '../../../../../_virtual/
|
|
2
|
+
import '../../../../../_virtual/index.mjs';
|
|
3
3
|
import { useSWRConfig } from '../../../../../node_modules/swr/_internal/dist/index.mjs';
|
|
4
4
|
import { ssoGetConnectionsKey } from './useSsoConnections.mjs';
|
|
5
5
|
import { useStytchClient } from './useStytchClient.mjs';
|
|
@@ -11,55 +11,55 @@ import { StytchSDKUsageError } from '../../../core/src/public/SDKErrors.mjs';
|
|
|
11
11
|
class HeadlessB2BOAuthClient extends HeadlessB2BOAuthClient$1 {
|
|
12
12
|
_oneTap;
|
|
13
13
|
constructor(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth = DisabledDFPProtectedAuthProvider(), _oneTap){
|
|
14
|
-
super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth), this._oneTap = _oneTap
|
|
15
|
-
const clientResult = await this._oneTap.createOneTapClient();
|
|
16
|
-
if (!clientResult.success) {
|
|
17
|
-
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
18
|
-
}
|
|
19
|
-
const { client } = clientResult;
|
|
20
|
-
const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({
|
|
21
|
-
discoveryRedirectUrl: options.discovery_redirect_url,
|
|
22
|
-
onSuccess: this._oneTap.redirectOnSuccess
|
|
23
|
-
});
|
|
24
|
-
return client.render({
|
|
25
|
-
style: {
|
|
26
|
-
position: OneTapPositions.floating
|
|
27
|
-
},
|
|
28
|
-
callback: onSuccessCallback,
|
|
29
|
-
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
30
|
-
});
|
|
31
|
-
}, this.startOneTap = async (options)=>{
|
|
32
|
-
if (!options.organization_id) {
|
|
33
|
-
throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');
|
|
34
|
-
}
|
|
35
|
-
const clientResult = await this._oneTap.createOneTapClient();
|
|
36
|
-
if (!clientResult.success) {
|
|
37
|
-
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
38
|
-
}
|
|
39
|
-
const { client } = clientResult;
|
|
40
|
-
const onSuccessCallback = this._oneTap.createOnSuccessHandler({
|
|
41
|
-
organizationId: options.organization_id,
|
|
42
|
-
signupRedirectUrl: options.signup_redirect_url,
|
|
43
|
-
loginRedirectUrl: options.login_redirect_url,
|
|
44
|
-
onSuccess: this._oneTap.redirectOnSuccess
|
|
45
|
-
});
|
|
46
|
-
return client.render({
|
|
47
|
-
style: {
|
|
48
|
-
position: OneTapPositions.floating
|
|
49
|
-
},
|
|
50
|
-
callback: onSuccessCallback,
|
|
51
|
-
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
52
|
-
});
|
|
53
|
-
}, this.googleOneTap = {
|
|
54
|
-
discovery: {
|
|
55
|
-
start: this.startOneTapDiscovery
|
|
56
|
-
},
|
|
57
|
-
start: this.startOneTap
|
|
58
|
-
};
|
|
14
|
+
super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth), this._oneTap = _oneTap;
|
|
59
15
|
}
|
|
60
|
-
startOneTapDiscovery
|
|
61
|
-
|
|
62
|
-
|
|
16
|
+
startOneTapDiscovery = async (options)=>{
|
|
17
|
+
const clientResult = await this._oneTap.createOneTapClient();
|
|
18
|
+
if (!clientResult.success) {
|
|
19
|
+
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
20
|
+
}
|
|
21
|
+
const { client } = clientResult;
|
|
22
|
+
const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({
|
|
23
|
+
discoveryRedirectUrl: options.discovery_redirect_url,
|
|
24
|
+
onSuccess: this._oneTap.redirectOnSuccess
|
|
25
|
+
});
|
|
26
|
+
return client.render({
|
|
27
|
+
style: {
|
|
28
|
+
position: OneTapPositions.floating
|
|
29
|
+
},
|
|
30
|
+
callback: onSuccessCallback,
|
|
31
|
+
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
startOneTap = async (options)=>{
|
|
35
|
+
if (!options.organization_id) {
|
|
36
|
+
throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');
|
|
37
|
+
}
|
|
38
|
+
const clientResult = await this._oneTap.createOneTapClient();
|
|
39
|
+
if (!clientResult.success) {
|
|
40
|
+
throw new Error(`One Tap could not load: ${clientResult.reason}`);
|
|
41
|
+
}
|
|
42
|
+
const { client } = clientResult;
|
|
43
|
+
const onSuccessCallback = this._oneTap.createOnSuccessHandler({
|
|
44
|
+
organizationId: options.organization_id,
|
|
45
|
+
signupRedirectUrl: options.signup_redirect_url,
|
|
46
|
+
loginRedirectUrl: options.login_redirect_url,
|
|
47
|
+
onSuccess: this._oneTap.redirectOnSuccess
|
|
48
|
+
});
|
|
49
|
+
return client.render({
|
|
50
|
+
style: {
|
|
51
|
+
position: OneTapPositions.floating
|
|
52
|
+
},
|
|
53
|
+
callback: onSuccessCallback,
|
|
54
|
+
cancelOnTapOutside: options.cancel_on_tap_outside
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
googleOneTap = {
|
|
58
|
+
discovery: {
|
|
59
|
+
start: this.startOneTapDiscovery
|
|
60
|
+
},
|
|
61
|
+
start: this.startOneTap
|
|
62
|
+
};
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
export { HeadlessB2BOAuthClient };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessB2BOAuthClient.mjs","sources":["../../../../../../../web/src/b2b/HeadlessB2BOAuthClient.ts"],"sourcesContent":["import { OneTapRenderResult } from '../oneTap/GoogleOneTapClient';\nimport {\n IHeadlessB2BOAuthClient,\n OneTapPositions,\n StytchProjectConfigurationInput,\n StytchSDKUsageError,\n} from '@stytch/core/public';\nimport {\n HeadlessB2BOAuthClient as BaseHeadlessB2BOAuthClient,\n DisabledDFPProtectedAuthProvider,\n IDFPProtectedAuthProvider,\n INetworkClient,\n IPKCEManager,\n IB2BSubscriptionService,\n} from '@stytch/core';\nimport { B2BOneTapProvider } from './oneTap/B2BOneTapProvider';\n\nexport type B2BGoogleOneTapDiscoveryOAuthOptions = {\n /**\n * The URL that Stytch redirects to after the Google One Tap discovery flow is completed.\n * This should be a URL that verifies the request by querying Stytch's /oauth/discovery/authenticate endpoint.\n * If this value is not passed, the default discovery redirect URL that you set in your Dashboard is used.\n * If you have not set a default discovery redirect URL, an error is returned.\n */\n discovery_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\nexport type B2BGoogleOneTapOAuthOptions = {\n /**\n * The ID of the organization that the end user is logging in to.\n */\n organization_id: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who already exists.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default login redirect URL that you set in your Dashboard is used.\n * If you have not set a default login redirect URL, an error is returned.\n */\n login_redirect_url?: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who does not yet exist.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default signup redirect URL that you set in your Dashboard is used.\n * If you have not set a default signup redirect URL, an error is returned.\n */\n signup_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\ninterface IB2BGoogleOneTapOAuthProvider {\n discovery: {\n /**\n * Start a discovery OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.discovery.start({\n * discovery_redirect_url: 'https://example.com/oauth/callback',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapDiscoveryOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult>;\n };\n /**\n * Start an OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.start({\n * organization_id: 'organization-test-123',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult>;\n}\n\ntype DynamicConfig = Promise<{\n cnameDomain: null | string;\n pkceRequiredForOAuth: boolean;\n}>;\ntype Config = {\n publicToken: string;\n testAPIURL: string;\n liveAPIURL: string;\n};\n\nexport interface IWebB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends IHeadlessB2BOAuthClient<TProjectConfiguration> {\n googleOneTap: IB2BGoogleOneTapOAuthProvider;\n}\n\nexport class HeadlessB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseHeadlessB2BOAuthClient<TProjectConfiguration>\n implements IWebB2BOAuthClient<TProjectConfiguration>\n{\n constructor(\n _networkClient: INetworkClient,\n _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n _pkceManager: IPKCEManager,\n _dynamicConfig: DynamicConfig,\n _config: Config,\n _dfpProtectedAuth: IDFPProtectedAuthProvider = DisabledDFPProtectedAuthProvider(),\n private _oneTap: B2BOneTapProvider,\n ) {\n super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth);\n }\n\n private startOneTapDiscovery = async (options: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult> => {\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({\n discoveryRedirectUrl: options.discovery_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n private startOneTap = async (options: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult> => {\n if (!options.organization_id) {\n throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');\n }\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnSuccessHandler({\n organizationId: options.organization_id,\n signupRedirectUrl: options.signup_redirect_url,\n loginRedirectUrl: options.login_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n googleOneTap: IB2BGoogleOneTapOAuthProvider = {\n discovery: {\n start: this.startOneTapDiscovery,\n },\n start: this.startOneTap,\n };\n}\n"],"names":["HeadlessB2BOAuthClient","BaseHeadlessB2BOAuthClient","constructor","_networkClient","_subscriptionService","_pkceManager","_dynamicConfig","_config","_dfpProtectedAuth","DisabledDFPProtectedAuthProvider","_oneTap","startOneTapDiscovery","options","clientResult","createOneTapClient","success","Error","reason","client","onSuccessCallback","createOnDiscoverySuccessHandler","discoveryRedirectUrl","discovery_redirect_url","onSuccess","redirectOnSuccess","render","style","position","OneTapPositions","floating","callback","cancelOnTapOutside","cancel_on_tap_outside","startOneTap","organization_id","StytchSDKUsageError","createOnSuccessHandler","organizationId","signupRedirectUrl","signup_redirect_url","loginRedirectUrl","login_redirect_url","googleOneTap","discovery","start"],"mappings":";;;;;;;;;;AA0HO,MAAMA,sBAAAA,SACHC,wBAAAA,CAAAA;;AAGRC,IAAAA,WAAAA,CACEC,cAA8B,EAC9BC,oBAAoE,EACpEC,YAA0B,EAC1BC,cAA6B,EAC7BC,OAAe,EACfC,iBAAAA,GAA+CC,gCAAAA,EAAkC,EACzEC,OAA0B,CAClC;QACA,KAAK,CAACP,cAAAA,EAAgBC,oBAAAA,EAAsBC,YAAAA,EAAcC,cAAAA,EAAgBC,SAASC,iBAAAA,CAAAA,EAAAA,IAAAA,CAF3EE,OAAAA,GAAAA,OAAAA,EAAAA,IAAAA,CAKFC,oBAAAA,GAAuB,OAAOC,OAAAA,GAAAA;AACpC,YAAA,MAAMC,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;YAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,YAAA;YAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,YAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAACU,+BAA+B,CAAC;AACrEC,gBAAAA,oBAAAA,EAAsBT,QAAQU,sBAAsB;AACpDC,gBAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,aAAA,CAAA;YAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;gBACnBC,KAAAA,EAAO;AACLC,oBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,iBAAA;gBACAC,QAAAA,EAAUX,iBAAAA;AACVY,gBAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,aAAA,CAAA;AACF,QAAA,CAAA,EAAA,IAAA,CAEQC,cAAc,OAAOrB,OAAAA,GAAAA;YAC3B,IAAI,CAACA,OAAAA,CAAQsB,eAAe,EAAE;gBAC5B,MAAM,IAAIC,oBAAoB,iCAAA,EAAmC,wCAAA,CAAA;AACnE,YAAA;AACA,YAAA,MAAMtB,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;YAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,YAAA;YAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,YAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAAC0B,sBAAsB,CAAC;AAC5DC,gBAAAA,cAAAA,EAAgBzB,QAAQsB,eAAe;AACvCI,gBAAAA,iBAAAA,EAAmB1B,QAAQ2B,mBAAmB;AAC9CC,gBAAAA,gBAAAA,EAAkB5B,QAAQ6B,kBAAkB;AAC5ClB,gBAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,aAAA,CAAA;YAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;gBACnBC,KAAAA,EAAO;AACLC,oBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,iBAAA;gBACAC,QAAAA,EAAUX,iBAAAA;AACVY,gBAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,aAAA,CAAA;AACF,QAAA,CAAA,EAAA,IAAA,CAEAU,YAAAA,GAA8C;YAC5CC,SAAAA,EAAW;gBACTC,KAAAA,EAAO,IAAI,CAACjC;AACd,aAAA;YACAiC,KAAAA,EAAO,IAAI,CAACX;AACd,SAAA;AAxDA,IAAA;IAEQtB,oBAAAA;IAsBAsB,WAAAA;IA2BRS,YAAAA;AAMF;;;;"}
|
|
1
|
+
{"version":3,"file":"HeadlessB2BOAuthClient.mjs","sources":["../../../../../../../web/src/b2b/HeadlessB2BOAuthClient.ts"],"sourcesContent":["import { OneTapRenderResult } from '../oneTap/GoogleOneTapClient';\nimport {\n IHeadlessB2BOAuthClient,\n OneTapPositions,\n StytchProjectConfigurationInput,\n StytchSDKUsageError,\n} from '@stytch/core/public';\nimport {\n HeadlessB2BOAuthClient as BaseHeadlessB2BOAuthClient,\n DisabledDFPProtectedAuthProvider,\n IDFPProtectedAuthProvider,\n INetworkClient,\n IPKCEManager,\n IB2BSubscriptionService,\n} from '@stytch/core';\nimport { B2BOneTapProvider } from './oneTap/B2BOneTapProvider';\n\nexport type B2BGoogleOneTapDiscoveryOAuthOptions = {\n /**\n * The URL that Stytch redirects to after the Google One Tap discovery flow is completed.\n * This should be a URL that verifies the request by querying Stytch's /oauth/discovery/authenticate endpoint.\n * If this value is not passed, the default discovery redirect URL that you set in your Dashboard is used.\n * If you have not set a default discovery redirect URL, an error is returned.\n */\n discovery_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\nexport type B2BGoogleOneTapOAuthOptions = {\n /**\n * The ID of the organization that the end user is logging in to.\n */\n organization_id: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who already exists.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default login redirect URL that you set in your Dashboard is used.\n * If you have not set a default login redirect URL, an error is returned.\n */\n login_redirect_url?: string;\n\n /**\n * The URL that Stytch redirects to after the Google One Tap flow is completed for a member who does not yet exist.\n * This should be a URL that verifies the request by querying Stytch's /oauth/authenticate endpoint.\n * If this value is not passed, the default signup redirect URL that you set in your Dashboard is used.\n * If you have not set a default signup redirect URL, an error is returned.\n */\n signup_redirect_url?: string;\n /**\n * Controls whether clicking outside the One Tap prompt dismisses the prompt.\n * Defaults to true.\n */\n cancel_on_tap_outside?: boolean;\n};\n\ninterface IB2BGoogleOneTapOAuthProvider {\n discovery: {\n /**\n * Start a discovery OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.discovery.start({\n * discovery_redirect_url: 'https://example.com/oauth/callback',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapDiscoveryOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult>;\n };\n /**\n * Start an OAuth flow by showing the Google one tap prompt in the top right corner of the user's browser.\n * You can configure this to be started by a user action (i.e Button click) or on load/render.\n * @example\n * const showGoogleOneTap = useCallback(()=> {\n * stytch.oauth.googleOneTap.start({\n * organization_id: 'organization-test-123',\n * })\n * }, [stytch]);\n * return (\n * <Button onClick={showGoogleOneTap}> Show Google one tap </Button>\n * );\n *\n * @param options - A {@link B2BGoogleOneTapOAuthOptions} object\n *\n * @returns A {@link OneTapRenderResult} object. The result object includes if the one-tap prompt\n * was rendered, and a reason if it couldn't be rendered.\n *\n * @throws An Error if the one tap client cannot be created.\n */\n start(options?: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult>;\n}\n\ntype DynamicConfig = Promise<{\n cnameDomain: null | string;\n pkceRequiredForOAuth: boolean;\n}>;\ntype Config = {\n publicToken: string;\n testAPIURL: string;\n liveAPIURL: string;\n};\n\nexport interface IWebB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends IHeadlessB2BOAuthClient<TProjectConfiguration> {\n googleOneTap: IB2BGoogleOneTapOAuthProvider;\n}\n\nexport class HeadlessB2BOAuthClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n extends BaseHeadlessB2BOAuthClient<TProjectConfiguration>\n implements IWebB2BOAuthClient<TProjectConfiguration>\n{\n constructor(\n _networkClient: INetworkClient,\n _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n _pkceManager: IPKCEManager,\n _dynamicConfig: DynamicConfig,\n _config: Config,\n _dfpProtectedAuth: IDFPProtectedAuthProvider = DisabledDFPProtectedAuthProvider(),\n private _oneTap: B2BOneTapProvider,\n ) {\n super(_networkClient, _subscriptionService, _pkceManager, _dynamicConfig, _config, _dfpProtectedAuth);\n }\n\n private startOneTapDiscovery = async (options: B2BGoogleOneTapDiscoveryOAuthOptions): Promise<OneTapRenderResult> => {\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnDiscoverySuccessHandler({\n discoveryRedirectUrl: options.discovery_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n private startOneTap = async (options: B2BGoogleOneTapOAuthOptions): Promise<OneTapRenderResult> => {\n if (!options.organization_id) {\n throw new StytchSDKUsageError('stytch.oauth.googleOneTap.start', 'organization_id is a required argument');\n }\n const clientResult = await this._oneTap.createOneTapClient();\n if (!clientResult.success) {\n throw new Error(`One Tap could not load: ${clientResult.reason}`);\n }\n\n const { client } = clientResult;\n\n const onSuccessCallback = this._oneTap.createOnSuccessHandler({\n organizationId: options.organization_id,\n signupRedirectUrl: options.signup_redirect_url,\n loginRedirectUrl: options.login_redirect_url,\n onSuccess: this._oneTap.redirectOnSuccess,\n });\n\n return client.render({\n style: {\n position: OneTapPositions.floating,\n },\n callback: onSuccessCallback,\n cancelOnTapOutside: options.cancel_on_tap_outside,\n });\n };\n\n googleOneTap: IB2BGoogleOneTapOAuthProvider = {\n discovery: {\n start: this.startOneTapDiscovery,\n },\n start: this.startOneTap,\n };\n}\n"],"names":["HeadlessB2BOAuthClient","BaseHeadlessB2BOAuthClient","_networkClient","_subscriptionService","_pkceManager","_dynamicConfig","_config","_dfpProtectedAuth","DisabledDFPProtectedAuthProvider","_oneTap","startOneTapDiscovery","options","clientResult","createOneTapClient","success","Error","reason","client","onSuccessCallback","createOnDiscoverySuccessHandler","discoveryRedirectUrl","discovery_redirect_url","onSuccess","redirectOnSuccess","render","style","position","OneTapPositions","floating","callback","cancelOnTapOutside","cancel_on_tap_outside","startOneTap","organization_id","StytchSDKUsageError","createOnSuccessHandler","organizationId","signupRedirectUrl","signup_redirect_url","loginRedirectUrl","login_redirect_url","googleOneTap","discovery","start"],"mappings":";;;;;;;;;;AA0HO,MAAMA,sBAAAA,SACHC,wBAAAA,CAAAA;;AAGR,IAAA,WAAA,CACEC,cAA8B,EAC9BC,oBAAoE,EACpEC,YAA0B,EAC1BC,cAA6B,EAC7BC,OAAe,EACfC,iBAAAA,GAA+CC,gCAAAA,EAAkC,EACzEC,OAA0B,CAClC;AACA,QAAA,KAAK,CAACP,cAAAA,EAAgBC,oBAAAA,EAAsBC,cAAcC,cAAAA,EAAgBC,OAAAA,EAASC,yBAF3EE,OAAAA,GAAAA,OAAAA;AAGV,IAAA;AAEQC,IAAAA,oBAAAA,GAAuB,OAAOC,OAAAA,GAAAA;AACpC,QAAA,MAAMC,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;QAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,QAAA;QAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,QAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAACU,+BAA+B,CAAC;AACrEC,YAAAA,oBAAAA,EAAsBT,QAAQU,sBAAsB;AACpDC,YAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,SAAA,CAAA;QAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;YACnBC,KAAAA,EAAO;AACLC,gBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,aAAA;YACAC,QAAAA,EAAUX,iBAAAA;AACVY,YAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,SAAA,CAAA;IACF,CAAA;AAEQC,IAAAA,WAAAA,GAAc,OAAOrB,OAAAA,GAAAA;QAC3B,IAAI,CAACA,OAAAA,CAAQsB,eAAe,EAAE;YAC5B,MAAM,IAAIC,oBAAoB,iCAAA,EAAmC,wCAAA,CAAA;AACnE,QAAA;AACA,QAAA,MAAMtB,eAAe,MAAM,IAAI,CAACH,OAAO,CAACI,kBAAkB,EAAA;QAC1D,IAAI,CAACD,YAAAA,CAAaE,OAAO,EAAE;AACzB,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,wBAAwB,EAAEH,YAAAA,CAAaI,MAAM,CAAA,CAAE,CAAA;AAClE,QAAA;QAEA,MAAM,EAAEC,MAAM,EAAE,GAAGL,YAAAA;AAEnB,QAAA,MAAMM,oBAAoB,IAAI,CAACT,OAAO,CAAC0B,sBAAsB,CAAC;AAC5DC,YAAAA,cAAAA,EAAgBzB,QAAQsB,eAAe;AACvCI,YAAAA,iBAAAA,EAAmB1B,QAAQ2B,mBAAmB;AAC9CC,YAAAA,gBAAAA,EAAkB5B,QAAQ6B,kBAAkB;AAC5ClB,YAAAA,SAAAA,EAAW,IAAI,CAACb,OAAO,CAACc;AAC1B,SAAA,CAAA;QAEA,OAAON,MAAAA,CAAOO,MAAM,CAAC;YACnBC,KAAAA,EAAO;AACLC,gBAAAA,QAAAA,EAAUC,gBAAgBC;AAC5B,aAAA;YACAC,QAAAA,EAAUX,iBAAAA;AACVY,YAAAA,kBAAAA,EAAoBnB,QAAQoB;AAC9B,SAAA,CAAA;IACF,CAAA;IAEAU,YAAAA,GAA8C;QAC5CC,SAAAA,EAAW;YACTC,KAAAA,EAAO,IAAI,CAACjC;AACd,SAAA;QACAiC,KAAAA,EAAO,IAAI,CAACX;KACd;AACF;;;;"}
|
|
@@ -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":"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"}
|
|
@@ -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":";;;AAWA;;;;;AAKC,IACM,MAAMA,kBAAAA,CAAAA;;;AACX,IAAA,WAAA,CACE,aAAqC,EAC7BC,SAAiB,CACzB;aAFQC,aAAAA,GAAAA,aAAAA;aACAD,SAAAA,GAAAA,SAAAA;AACP,IAAA;IAEHE,MAAAA,GAAe;QACb,IAAI,CAACD,aAAa,CAACC,MAAM,EAAA;AAC3B,IAAA;IAEA,MAAMC,MAAAA,CAAO,EACXC,QAAQ,EACRC,iBAAiB,EACjBC,KAAK,EACLC,kBAAAA,GAAqB,IAAI,EAM1B,EAA+B;QAC9B,MAAMC,YAAAA,GAAeC,yBAAAA,CAA0BH,KAAAA,CAAMI,QAAQ,CAAA;QAC7D,MAAMC,0BAAAA,GAA6BC,6BAAAA,CAA8BN,KAAAA,CAAMI,QAAQ,CAAA;AAE/E,QAAA,MAAMG,MAAAA,GAA0B;YAC9BC,SAAAA,EAAW,IAAI,CAACd,SAAS;YACzBI,QAAAA,EAAUA,QAAAA;YACVW,WAAAA,EAAa,KAAA;YACbC,OAAAA,EAAS,KAAA;YACTC,WAAAA,EAAa,IAAA;AACbC,YAAAA,oBAAAA,EAAsBV,YAAAA,KAAiB,OAAA;YACvCW,qBAAAA,EAAuBZ;AACzB,SAAA;AACA,QAAA,IAAII,0BAAAA,EAA4B;AAC9BE,YAAAA,MAAAA,CAAOO,gBAAgB,GAAG,sBAAA;AAC1BP,YAAAA,MAAAA,CAAOM,qBAAqB,GAAG,KAAA;AACjC,QAAA;AACA,QAAA,IAAI,CAAClB,aAAa,CAACoB,UAAU,CAACR,MAAAA,CAAAA;QAE9B,OAAO,IAAIS,QAAQ,CAACC,OAAAA,GAAAA;AAClB,YAAA,IAAI,CAACtB,aAAa,CAACuB,MAAM,CAAC,CAACC,YAAAA,GAAAA;gBACzB,IAAIA,YAAAA,CAAaC,eAAe,EAAA,EAAI;;;oBAGlC,MAAMC,MAAAA,GAASF,YAAAA,CAAaG,gBAAgB,IAAA,IAAQ,gBAAA;AAEpD,oBAAA,IAAID,WAAW,aAAA,EAAe;AAC5BtB,wBAAAA,iBAAAA,IAAAA;AACF,oBAAA;AACA,oBAAA,OAAOkB,OAAAA,CAAQ;wBACbM,OAAAA,EAAS,KAAA;AACTF,wBAAAA;AACF,qBAAA,CAAA;AACF,gBAAA;;;;;;;gBAQA,IAAK,CAACF,YAAAA,CAAaK,cAAc,IAAInB,0BAAAA,IAA+Bc,YAAAA,CAAaK,cAAc,IAAA,EAAM;AACnG,oBAAA,OAAOP,OAAAA,CAAQ;wBACbM,OAAAA,EAAS,KAAA;wBACTF,MAAAA,EAAQF,YAAAA,CAAaM,qBAAqB,IAAA,IAAQ;AACpD,qBAAA,CAAA;AACF,gBAAA;gBAEA,IAAI,CAACN,YAAAA,CAAaO,iBAAiB,EAAA,EAAI;oBACrC,IAAI,CAACC,UAAU,CAACtB,0BAAAA,CAAAA;AAChB,oBAAA,OAAOY,OAAAA,CAAQ;wBAAEM,OAAAA,EAAS;AAAK,qBAAA,CAAA;AACjC,gBAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAEAI,IAAAA,UAAAA,CAAWtB,0BAAmC,EAAE;AAC9C,QAAA,IAAI,CAACA,0BAAAA,EAA4B;AAC/B,YAAA;AACF,QAAA;QACAuB,KAAAA,CAAMC,IAAI,CAACC,QAAAA,CAASC,oBAAoB,CAAC,QAAA,CAAA,CAAA,CAAWC,OAAO,CAAC,CAACC,KAAAA,GAAAA;AAC3D,YAAA,IAAIA,KAAAA,CAAMC,GAAG,CAACC,QAAQ,CAACC,mBAAAA,CAAAA,EAAsB;gBAC3CH,KAAAA,CAAMjC,KAAK,CAACqC,KAAK,GAAG,MAAA;AACtB,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -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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"}
|
|
@@ -31,7 +31,9 @@ import { logger } from '../../../../core/src/utils/logger.mjs';
|
|
|
31
31
|
});
|
|
32
32
|
};
|
|
33
33
|
const B2BIDPContainer = ({ client, presentation, callbacks, strings, getIDPConsentManifest, trustedAuthTokenParams, styles })=>{
|
|
34
|
-
const presentationValue = usePresentationWithDefault(presentation, false,
|
|
34
|
+
const presentationValue = usePresentationWithDefault(presentation, false, {
|
|
35
|
+
products: []
|
|
36
|
+
});
|
|
35
37
|
useEffect(()=>{
|
|
36
38
|
readB2BInternals(client).bootstrap.getAsync().then((data)=>{
|
|
37
39
|
readB2BInternals(client).networkClient.logEvent({
|