@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
|
@@ -7,135 +7,121 @@ class HeadlessUserClient {
|
|
|
7
7
|
constructor(_networkClient, _subscriptionService){
|
|
8
8
|
this._networkClient = _networkClient;
|
|
9
9
|
this._subscriptionService = _subscriptionService;
|
|
10
|
-
this.get = async ()=>{
|
|
11
|
-
const resp = await this._networkClient.fetchSDK({
|
|
12
|
-
url: '/users/me',
|
|
13
|
-
method: 'GET'
|
|
14
|
-
});
|
|
15
|
-
const user = removeResponseCommon(resp);
|
|
16
|
-
this._subscriptionService.updateUser(user);
|
|
17
|
-
return user;
|
|
18
|
-
};
|
|
19
|
-
this.getSync = ()=>{
|
|
20
|
-
return this._subscriptionService.getUser();
|
|
21
|
-
};
|
|
22
|
-
this.getInfo = ()=>({
|
|
23
|
-
user: this.getSync(),
|
|
24
|
-
fromCache: this._subscriptionService.getFromCache()
|
|
25
|
-
});
|
|
26
|
-
this.update = async (options)=>{
|
|
27
|
-
validateInDev('stytch.user.update', options, {
|
|
28
|
-
untrusted_metadata: 'optionalObject'
|
|
29
|
-
});
|
|
30
|
-
const resp = await this._networkClient.fetchSDK({
|
|
31
|
-
url: '/users/me',
|
|
32
|
-
body: options,
|
|
33
|
-
method: 'PUT'
|
|
34
|
-
});
|
|
35
|
-
const user = removeResponseCommon(resp.__user);
|
|
36
|
-
this._subscriptionService.updateUser(user);
|
|
37
|
-
return omitUser(resp);
|
|
38
|
-
};
|
|
39
|
-
this.deleteEmail = async (emailId)=>{
|
|
40
|
-
const resp = await this._networkClient.fetchSDK({
|
|
41
|
-
url: `/users/emails/${emailId}`,
|
|
42
|
-
method: 'DELETE'
|
|
43
|
-
});
|
|
44
|
-
const user = removeResponseCommon(resp.__user);
|
|
45
|
-
this._subscriptionService.updateUser(user);
|
|
46
|
-
return omitUser(resp);
|
|
47
|
-
};
|
|
48
|
-
this.deletePhoneNumber = async (phoneId)=>{
|
|
49
|
-
const resp = await this._networkClient.fetchSDK({
|
|
50
|
-
url: `/users/phone_numbers/${phoneId}`,
|
|
51
|
-
method: 'DELETE'
|
|
52
|
-
});
|
|
53
|
-
const user = removeResponseCommon(resp.__user);
|
|
54
|
-
this._subscriptionService.updateUser(user);
|
|
55
|
-
return omitUser(resp);
|
|
56
|
-
};
|
|
57
|
-
this.deleteTOTP = async (totpId)=>{
|
|
58
|
-
const resp = await this._networkClient.fetchSDK({
|
|
59
|
-
url: `/users/totps/${totpId}`,
|
|
60
|
-
method: 'DELETE'
|
|
61
|
-
});
|
|
62
|
-
const user = removeResponseCommon(resp.__user);
|
|
63
|
-
this._subscriptionService.updateUser(user);
|
|
64
|
-
return omitUser(resp);
|
|
65
|
-
};
|
|
66
|
-
this.deleteCryptoWallet = async (cryptoWalletId)=>{
|
|
67
|
-
const resp = await this._networkClient.fetchSDK({
|
|
68
|
-
url: `/users/crypto_wallets/${cryptoWalletId}`,
|
|
69
|
-
method: 'DELETE'
|
|
70
|
-
});
|
|
71
|
-
const user = removeResponseCommon(resp.__user);
|
|
72
|
-
this._subscriptionService.updateUser(user);
|
|
73
|
-
return omitUser(resp);
|
|
74
|
-
};
|
|
75
|
-
this.deleteOAuthRegistration = async (oauthUserRegistrationId)=>{
|
|
76
|
-
const resp = await this._networkClient.fetchSDK({
|
|
77
|
-
url: `/users/oauth/${oauthUserRegistrationId}`,
|
|
78
|
-
method: 'DELETE'
|
|
79
|
-
});
|
|
80
|
-
const user = removeResponseCommon(resp.__user);
|
|
81
|
-
this._subscriptionService.updateUser(user);
|
|
82
|
-
return omitUser(resp);
|
|
83
|
-
};
|
|
84
|
-
this.deleteWebauthnRegistration = async (webAuthnId)=>{
|
|
85
|
-
const resp = await this._networkClient.fetchSDK({
|
|
86
|
-
url: `/users/webauthn_registrations/${webAuthnId}`,
|
|
87
|
-
method: 'DELETE'
|
|
88
|
-
});
|
|
89
|
-
const user = removeResponseCommon(resp.__user);
|
|
90
|
-
this._subscriptionService.updateUser(user);
|
|
91
|
-
return omitUser(resp);
|
|
92
|
-
};
|
|
93
|
-
this.deleteBiometricRegistration = async (biometricRegistrationId)=>{
|
|
94
|
-
const resp = await this._networkClient.fetchSDK({
|
|
95
|
-
url: `/users/biometric_registrations/${biometricRegistrationId}`,
|
|
96
|
-
method: 'DELETE'
|
|
97
|
-
});
|
|
98
|
-
const user = removeResponseCommon(resp.__user);
|
|
99
|
-
this._subscriptionService.updateUser(user);
|
|
100
|
-
return omitUser(resp);
|
|
101
|
-
};
|
|
102
|
-
this.onChange = (callback)=>{
|
|
103
|
-
let lastVal = this._subscriptionService.getUser();
|
|
104
|
-
const listener = (state)=>{
|
|
105
|
-
if (state?.user !== lastVal) {
|
|
106
|
-
lastVal = state?.user ?? null;
|
|
107
|
-
callback(lastVal);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
return this._subscriptionService.subscribeToState(listener);
|
|
111
|
-
};
|
|
112
|
-
this.getConnectedApps = async ()=>{
|
|
113
|
-
return await this._networkClient.fetchSDK({
|
|
114
|
-
url: '/users/connected_apps',
|
|
115
|
-
method: 'GET'
|
|
116
|
-
});
|
|
117
|
-
};
|
|
118
|
-
this.revokedConnectedApp = async (connectedAppId)=>{
|
|
119
|
-
return await this._networkClient.fetchSDK({
|
|
120
|
-
url: `/users/connected_apps/${connectedAppId}/revoke`,
|
|
121
|
-
method: 'POST'
|
|
122
|
-
});
|
|
123
|
-
};
|
|
124
10
|
}
|
|
125
|
-
get
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
11
|
+
get = async ()=>{
|
|
12
|
+
const resp = await this._networkClient.fetchSDK({
|
|
13
|
+
url: '/users/me',
|
|
14
|
+
method: 'GET'
|
|
15
|
+
});
|
|
16
|
+
const user = removeResponseCommon(resp);
|
|
17
|
+
this._subscriptionService.updateUser(user);
|
|
18
|
+
return user;
|
|
19
|
+
};
|
|
20
|
+
getSync = ()=>{
|
|
21
|
+
return this._subscriptionService.getUser();
|
|
22
|
+
};
|
|
23
|
+
getInfo = ()=>({
|
|
24
|
+
user: this.getSync(),
|
|
25
|
+
fromCache: this._subscriptionService.getFromCache()
|
|
26
|
+
});
|
|
27
|
+
update = async (options)=>{
|
|
28
|
+
validateInDev('stytch.user.update', options, {
|
|
29
|
+
untrusted_metadata: 'optionalObject'
|
|
30
|
+
});
|
|
31
|
+
const resp = await this._networkClient.fetchSDK({
|
|
32
|
+
url: '/users/me',
|
|
33
|
+
body: options,
|
|
34
|
+
method: 'PUT'
|
|
35
|
+
});
|
|
36
|
+
const user = removeResponseCommon(resp.__user);
|
|
37
|
+
this._subscriptionService.updateUser(user);
|
|
38
|
+
return omitUser(resp);
|
|
39
|
+
};
|
|
40
|
+
deleteEmail = async (emailId)=>{
|
|
41
|
+
const resp = await this._networkClient.fetchSDK({
|
|
42
|
+
url: `/users/emails/${emailId}`,
|
|
43
|
+
method: 'DELETE'
|
|
44
|
+
});
|
|
45
|
+
const user = removeResponseCommon(resp.__user);
|
|
46
|
+
this._subscriptionService.updateUser(user);
|
|
47
|
+
return omitUser(resp);
|
|
48
|
+
};
|
|
49
|
+
deletePhoneNumber = async (phoneId)=>{
|
|
50
|
+
const resp = await this._networkClient.fetchSDK({
|
|
51
|
+
url: `/users/phone_numbers/${phoneId}`,
|
|
52
|
+
method: 'DELETE'
|
|
53
|
+
});
|
|
54
|
+
const user = removeResponseCommon(resp.__user);
|
|
55
|
+
this._subscriptionService.updateUser(user);
|
|
56
|
+
return omitUser(resp);
|
|
57
|
+
};
|
|
58
|
+
deleteTOTP = async (totpId)=>{
|
|
59
|
+
const resp = await this._networkClient.fetchSDK({
|
|
60
|
+
url: `/users/totps/${totpId}`,
|
|
61
|
+
method: 'DELETE'
|
|
62
|
+
});
|
|
63
|
+
const user = removeResponseCommon(resp.__user);
|
|
64
|
+
this._subscriptionService.updateUser(user);
|
|
65
|
+
return omitUser(resp);
|
|
66
|
+
};
|
|
67
|
+
deleteCryptoWallet = async (cryptoWalletId)=>{
|
|
68
|
+
const resp = await this._networkClient.fetchSDK({
|
|
69
|
+
url: `/users/crypto_wallets/${cryptoWalletId}`,
|
|
70
|
+
method: 'DELETE'
|
|
71
|
+
});
|
|
72
|
+
const user = removeResponseCommon(resp.__user);
|
|
73
|
+
this._subscriptionService.updateUser(user);
|
|
74
|
+
return omitUser(resp);
|
|
75
|
+
};
|
|
76
|
+
deleteOAuthRegistration = async (oauthUserRegistrationId)=>{
|
|
77
|
+
const resp = await this._networkClient.fetchSDK({
|
|
78
|
+
url: `/users/oauth/${oauthUserRegistrationId}`,
|
|
79
|
+
method: 'DELETE'
|
|
80
|
+
});
|
|
81
|
+
const user = removeResponseCommon(resp.__user);
|
|
82
|
+
this._subscriptionService.updateUser(user);
|
|
83
|
+
return omitUser(resp);
|
|
84
|
+
};
|
|
85
|
+
deleteWebauthnRegistration = async (webAuthnId)=>{
|
|
86
|
+
const resp = await this._networkClient.fetchSDK({
|
|
87
|
+
url: `/users/webauthn_registrations/${webAuthnId}`,
|
|
88
|
+
method: 'DELETE'
|
|
89
|
+
});
|
|
90
|
+
const user = removeResponseCommon(resp.__user);
|
|
91
|
+
this._subscriptionService.updateUser(user);
|
|
92
|
+
return omitUser(resp);
|
|
93
|
+
};
|
|
94
|
+
deleteBiometricRegistration = async (biometricRegistrationId)=>{
|
|
95
|
+
const resp = await this._networkClient.fetchSDK({
|
|
96
|
+
url: `/users/biometric_registrations/${biometricRegistrationId}`,
|
|
97
|
+
method: 'DELETE'
|
|
98
|
+
});
|
|
99
|
+
const user = removeResponseCommon(resp.__user);
|
|
100
|
+
this._subscriptionService.updateUser(user);
|
|
101
|
+
return omitUser(resp);
|
|
102
|
+
};
|
|
103
|
+
onChange = (callback)=>{
|
|
104
|
+
let lastVal = this._subscriptionService.getUser();
|
|
105
|
+
const listener = (state)=>{
|
|
106
|
+
if (state?.user !== lastVal) {
|
|
107
|
+
lastVal = state?.user ?? null;
|
|
108
|
+
callback(lastVal);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return this._subscriptionService.subscribeToState(listener);
|
|
112
|
+
};
|
|
113
|
+
getConnectedApps = async ()=>{
|
|
114
|
+
return await this._networkClient.fetchSDK({
|
|
115
|
+
url: '/users/connected_apps',
|
|
116
|
+
method: 'GET'
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
revokedConnectedApp = async (connectedAppId)=>{
|
|
120
|
+
return await this._networkClient.fetchSDK({
|
|
121
|
+
url: `/users/connected_apps/${connectedAppId}/revoke`,
|
|
122
|
+
method: 'POST'
|
|
123
|
+
});
|
|
124
|
+
};
|
|
139
125
|
}
|
|
140
126
|
|
|
141
127
|
export { HeadlessUserClient };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessUserClient.mjs","sources":["../../../../../../../core/src/HeadlessClients/HeadlessUserClient.ts"],"sourcesContent":["import {\n IHeadlessUserClient,\n User,\n ResponseCommon,\n UpdateResponse,\n UserUpdateOptions,\n UserUpdateResponse,\n UserOnChangeCallback,\n ConsumerState,\n UserInfo,\n StytchProjectConfigurationInput,\n UserGetConnectedAppsResponse,\n UnsubscribeFunction,\n} from '../public';\nimport { INetworkClient } from '../NetworkClient';\nimport { IConsumerSubscriptionService } from '../SubscriptionService';\nimport { omitUser, removeResponseCommon, WithUser } from '../utils';\nimport { validateInDev } from '../utils/dev';\n\nexport class HeadlessUserClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessUserClient\n{\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IConsumerSubscriptionService<TProjectConfiguration>,\n ) {}\n\n get = async (): Promise<User> => {\n const resp = await this._networkClient.fetchSDK<User & ResponseCommon>({\n url: '/users/me',\n method: 'GET',\n });\n const user = removeResponseCommon(resp);\n this._subscriptionService.updateUser(user);\n return user;\n };\n\n getSync = (): User | null => {\n return this._subscriptionService.getUser();\n };\n\n getInfo = (): UserInfo => ({\n user: this.getSync(),\n fromCache: this._subscriptionService.getFromCache(),\n });\n\n update = async (options: UserUpdateOptions) => {\n validateInDev('stytch.user.update', options, {\n untrusted_metadata: 'optionalObject',\n });\n const resp = await this._networkClient.fetchSDK<WithUser<UserUpdateResponse>>({\n url: '/users/me',\n body: options,\n method: 'PUT',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteEmail = async (emailId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/emails/${emailId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deletePhoneNumber = async (phoneId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/phone_numbers/${phoneId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteTOTP = async (totpId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/totps/${totpId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteCryptoWallet = async (cryptoWalletId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/crypto_wallets/${cryptoWalletId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteOAuthRegistration = async (oauthUserRegistrationId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/oauth/${oauthUserRegistrationId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteWebauthnRegistration = async (webAuthnId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/webauthn_registrations/${webAuthnId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteBiometricRegistration = async (biometricRegistrationId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/biometric_registrations/${biometricRegistrationId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n onChange = (callback: UserOnChangeCallback): UnsubscribeFunction => {\n let lastVal = this._subscriptionService.getUser();\n const listener = (state: ConsumerState | null) => {\n if (state?.user !== lastVal) {\n lastVal = state?.user ?? null;\n callback(lastVal);\n }\n };\n return this._subscriptionService.subscribeToState(listener);\n };\n\n getConnectedApps = async () => {\n return await this._networkClient.fetchSDK<UserGetConnectedAppsResponse>({\n url: '/users/connected_apps',\n method: 'GET',\n });\n };\n\n revokedConnectedApp = async (connectedAppId: string) => {\n return await this._networkClient.fetchSDK<ResponseCommon>({\n url: `/users/connected_apps/${connectedAppId}/revoke`,\n method: 'POST',\n });\n };\n}\n"],"names":["HeadlessUserClient","constructor","_subscriptionService","_networkClient","get","resp","fetchSDK","url","method","user","removeResponseCommon","updateUser","getSync","getUser","getInfo","fromCache","getFromCache","update","options","validateInDev","untrusted_metadata","body","__user","omitUser","deleteEmail","emailId","deletePhoneNumber","phoneId","deleteTOTP","totpId","deleteCryptoWallet","cryptoWalletId","deleteOAuthRegistration","oauthUserRegistrationId","deleteWebauthnRegistration","webAuthnId","deleteBiometricRegistration","biometricRegistrationId","onChange","callback","lastVal","listener","state","subscribeToState","getConnectedApps","revokedConnectedApp","connectedAppId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HeadlessUserClient.mjs","sources":["../../../../../../../core/src/HeadlessClients/HeadlessUserClient.ts"],"sourcesContent":["import {\n IHeadlessUserClient,\n User,\n ResponseCommon,\n UpdateResponse,\n UserUpdateOptions,\n UserUpdateResponse,\n UserOnChangeCallback,\n ConsumerState,\n UserInfo,\n StytchProjectConfigurationInput,\n UserGetConnectedAppsResponse,\n UnsubscribeFunction,\n} from '../public';\nimport { INetworkClient } from '../NetworkClient';\nimport { IConsumerSubscriptionService } from '../SubscriptionService';\nimport { omitUser, removeResponseCommon, WithUser } from '../utils';\nimport { validateInDev } from '../utils/dev';\n\nexport class HeadlessUserClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessUserClient\n{\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IConsumerSubscriptionService<TProjectConfiguration>,\n ) {}\n\n get = async (): Promise<User> => {\n const resp = await this._networkClient.fetchSDK<User & ResponseCommon>({\n url: '/users/me',\n method: 'GET',\n });\n const user = removeResponseCommon(resp);\n this._subscriptionService.updateUser(user);\n return user;\n };\n\n getSync = (): User | null => {\n return this._subscriptionService.getUser();\n };\n\n getInfo = (): UserInfo => ({\n user: this.getSync(),\n fromCache: this._subscriptionService.getFromCache(),\n });\n\n update = async (options: UserUpdateOptions) => {\n validateInDev('stytch.user.update', options, {\n untrusted_metadata: 'optionalObject',\n });\n const resp = await this._networkClient.fetchSDK<WithUser<UserUpdateResponse>>({\n url: '/users/me',\n body: options,\n method: 'PUT',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteEmail = async (emailId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/emails/${emailId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deletePhoneNumber = async (phoneId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/phone_numbers/${phoneId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteTOTP = async (totpId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/totps/${totpId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteCryptoWallet = async (cryptoWalletId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/crypto_wallets/${cryptoWalletId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteOAuthRegistration = async (oauthUserRegistrationId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/oauth/${oauthUserRegistrationId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteWebauthnRegistration = async (webAuthnId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/webauthn_registrations/${webAuthnId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n deleteBiometricRegistration = async (biometricRegistrationId: string) => {\n const resp = await this._networkClient.fetchSDK<WithUser<UpdateResponse>>({\n url: `/users/biometric_registrations/${biometricRegistrationId}`,\n method: 'DELETE',\n });\n const user = removeResponseCommon(resp.__user);\n this._subscriptionService.updateUser(user);\n return omitUser(resp);\n };\n\n onChange = (callback: UserOnChangeCallback): UnsubscribeFunction => {\n let lastVal = this._subscriptionService.getUser();\n const listener = (state: ConsumerState | null) => {\n if (state?.user !== lastVal) {\n lastVal = state?.user ?? null;\n callback(lastVal);\n }\n };\n return this._subscriptionService.subscribeToState(listener);\n };\n\n getConnectedApps = async () => {\n return await this._networkClient.fetchSDK<UserGetConnectedAppsResponse>({\n url: '/users/connected_apps',\n method: 'GET',\n });\n };\n\n revokedConnectedApp = async (connectedAppId: string) => {\n return await this._networkClient.fetchSDK<ResponseCommon>({\n url: `/users/connected_apps/${connectedAppId}/revoke`,\n method: 'POST',\n });\n };\n}\n"],"names":["HeadlessUserClient","_subscriptionService","_networkClient","get","resp","fetchSDK","url","method","user","removeResponseCommon","updateUser","getSync","getUser","getInfo","fromCache","getFromCache","update","options","validateInDev","untrusted_metadata","body","__user","omitUser","deleteEmail","emailId","deletePhoneNumber","phoneId","deleteTOTP","totpId","deleteCryptoWallet","cryptoWalletId","deleteOAuthRegistration","oauthUserRegistrationId","deleteWebauthnRegistration","webAuthnId","deleteBiometricRegistration","biometricRegistrationId","onChange","callback","lastVal","listener","state","subscribeToState","getConnectedApps","revokedConnectedApp","connectedAppId"],"mappings":"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"}
|
|
@@ -13,16 +13,6 @@ class HeadlessWebAuthnClient {
|
|
|
13
13
|
this._networkClient = _networkClient;
|
|
14
14
|
this._subscriptionService = _subscriptionService;
|
|
15
15
|
this.dfpProtectedAuth = dfpProtectedAuth;
|
|
16
|
-
this.checkEligibleInputs = ()=>{
|
|
17
|
-
// Check for an <input> with "webauthn" in its `autocomplete` attribute
|
|
18
|
-
const eligibleInputs = document.querySelectorAll("input[autocomplete*='webauthn']");
|
|
19
|
-
// WebAuthn autofill requires at least one valid input
|
|
20
|
-
if (eligibleInputs.length < 1) {
|
|
21
|
-
logger.error('No <input> with `"webauthn"` in its `autocomplete` attribute was detected');
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
return true;
|
|
25
|
-
};
|
|
26
16
|
this.register = this._subscriptionService.withUpdateSession(async (options)=>{
|
|
27
17
|
if (options) {
|
|
28
18
|
validateInDev('stytch.webauthn.register', options, {
|
|
@@ -136,7 +126,16 @@ class HeadlessWebAuthnClient {
|
|
|
136
126
|
async browserSupportsAutofill() {
|
|
137
127
|
return await window.PublicKeyCredential?.isConditionalMediationAvailable?.() ?? false;
|
|
138
128
|
}
|
|
139
|
-
checkEligibleInputs
|
|
129
|
+
checkEligibleInputs = ()=>{
|
|
130
|
+
// Check for an <input> with "webauthn" in its `autocomplete` attribute
|
|
131
|
+
const eligibleInputs = document.querySelectorAll("input[autocomplete*='webauthn']");
|
|
132
|
+
// WebAuthn autofill requires at least one valid input
|
|
133
|
+
if (eligibleInputs.length < 1) {
|
|
134
|
+
logger.error('No <input> with `"webauthn"` in its `autocomplete` attribute was detected');
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
return true;
|
|
138
|
+
};
|
|
140
139
|
}
|
|
141
140
|
|
|
142
141
|
export { HeadlessWebAuthnClient };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessWebAuthnClient.mjs","sources":["../../../../../../../core/src/HeadlessClients/HeadlessWebAuthnClient.ts"],"sourcesContent":["import * as webauthnJson from '@github/webauthn-json';\nimport {\n IHeadlessWebAuthnClient,\n StytchProjectConfigurationInput,\n WebAuthnAuthenticateResponse,\n WebAuthnAuthenticateStartOptions,\n WebAuthnAuthenticateStartResponse,\n WebAuthnRegisterResponse,\n WebAuthnRegisterStartOptions,\n WebAuthnRegisterStartResponse,\n WebAuthnUpdateOptions,\n WebAuthnUpdateResponse,\n} from '../public';\n\nimport { IConsumerSubscriptionService, IDFPProtectedAuthProvider, INetworkClient } from '..';\nimport { logger, omitUser, WithUser } from '../utils';\nimport { validateInDev } from '../utils/dev';\n\nexport class HeadlessWebAuthnClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessWebAuthnClient<TProjectConfiguration>\n{\n register: (options: WebAuthnRegisterStartOptions) => Promise<WebAuthnRegisterResponse<TProjectConfiguration>>;\n\n authenticate: (\n options: WebAuthnAuthenticateStartOptions,\n ) => Promise<WebAuthnAuthenticateResponse<TProjectConfiguration> | null>;\n\n constructor(\n public _networkClient: INetworkClient,\n private _subscriptionService: IConsumerSubscriptionService<TProjectConfiguration>,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {\n this.register = this._subscriptionService.withUpdateSession(\n async (options?: WebAuthnRegisterStartOptions): Promise<WebAuthnRegisterResponse<TProjectConfiguration>> => {\n if (options) {\n validateInDev('stytch.webauthn.register', options, {\n domain: 'optionalString',\n authenticator_type: 'optionalString',\n is_passkey: 'optionalBoolean',\n session_duration_minutes: 'number',\n override_id: 'optionalString',\n override_name: 'optionalString',\n override_display_name: 'optionalString',\n use_base64_url_encoding: 'optionalBoolean',\n });\n }\n\n const startResp = await this._networkClient.fetchSDK<WebAuthnRegisterStartResponse>({\n url: '/webauthn/register/start',\n method: 'POST',\n body: {\n domain: options?.domain ?? window.location.hostname,\n authenticator_type: options?.authenticator_type ?? undefined,\n return_passkey_credential_options: options?.is_passkey,\n override_id: options?.override_id,\n override_name: options?.override_name,\n override_display_name: options?.override_display_name,\n user_agent: navigator.userAgent,\n use_base64_url_encoding: options?.use_base64_url_encoding,\n },\n });\n\n const publicKeyCredentialCreationOptions = startResp.public_key_credential_creation_options;\n const publicKey = JSON.parse(publicKeyCredentialCreationOptions);\n\n const credential = await webauthnJson.create({\n publicKey: publicKey,\n });\n\n const resp = await this._networkClient.fetchSDK<WithUser<WebAuthnRegisterResponse<TProjectConfiguration>>>({\n url: '/webauthn/register',\n method: 'POST',\n body: {\n public_key_credential: JSON.stringify(credential),\n session_duration_minutes: options?.session_duration_minutes,\n },\n });\n\n return omitUser(resp);\n },\n );\n\n this.authenticate = this._subscriptionService.withUpdateSession(\n async (\n options: WebAuthnAuthenticateStartOptions,\n ): Promise<WebAuthnAuthenticateResponse<TProjectConfiguration> | null> => {\n validateInDev('stytch.webauthn.authenticate', options, {\n domain: 'optionalString',\n session_duration_minutes: 'number',\n is_passkey: 'optionalBoolean',\n signal: 'optionalObject',\n conditional_mediation: 'optionalBoolean',\n disable_input_check: 'optionalBoolean',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n if (options.conditional_mediation) {\n if (!(await this.browserSupportsAutofill())) {\n logger.error('Browser does not support WebAuthn autofill');\n return null;\n }\n\n if (!options.disable_input_check && !this.checkEligibleInputs()) {\n return null;\n }\n }\n\n const isLoggedIn = !!this._subscriptionService.getSession();\n\n const endpoint = isLoggedIn ? '/webauthn/authenticate/start/secondary' : '/webauthn/authenticate/start/primary';\n\n const startResp = await this._networkClient.fetchSDK<WebAuthnAuthenticateStartResponse>({\n url: endpoint,\n method: 'POST',\n body: {\n domain: options.domain ?? window.location.hostname,\n return_passkey_credential_options: options?.is_passkey,\n },\n });\n\n const publicKeyCredentialRequestOptions = startResp.public_key_credential_request_options;\n const abortController = new AbortController();\n const credReqOptions = {\n publicKey: JSON.parse(publicKeyCredentialRequestOptions),\n signal: options.signal ?? abortController.signal,\n };\n const conditionalMediationCredReqOption = {\n ...credReqOptions,\n mediation: 'conditional' as CredentialMediationRequirement,\n };\n const credential = await webauthnJson.get(\n options.conditional_mediation ? conditionalMediationCredReqOption : credReqOptions,\n );\n\n const authenticationData = await this._networkClient.retriableFetchSDK<\n WithUser<WebAuthnAuthenticateResponse<TProjectConfiguration>>\n >({\n url: '/webauthn/authenticate',\n method: 'POST',\n body: {\n public_key_credential: JSON.stringify(credential),\n session_duration_minutes: options.session_duration_minutes,\n dfp_telemetry_id,\n captcha_token,\n },\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n\n return omitUser(authenticationData);\n },\n );\n }\n\n async update(options: WebAuthnUpdateOptions): Promise<WebAuthnUpdateResponse> {\n validateInDev('stytch.webauthn.update', options, {\n webauthn_registration_id: 'string',\n name: 'string',\n });\n\n const url = '/webauthn/update/' + options.webauthn_registration_id;\n return await this._networkClient.fetchSDK<WebAuthnUpdateResponse>({\n url: url,\n method: 'PUT',\n body: {\n name: options.name,\n },\n });\n }\n\n async browserSupportsAutofill(): Promise<boolean> {\n return (await window.PublicKeyCredential?.isConditionalMediationAvailable?.()) ?? false;\n }\n\n private checkEligibleInputs = (): boolean => {\n // Check for an <input> with \"webauthn\" in its `autocomplete` attribute\n const eligibleInputs = document.querySelectorAll(\"input[autocomplete*='webauthn']\");\n // WebAuthn autofill requires at least one valid input\n if (eligibleInputs.length < 1) {\n logger.error('No <input> with `\"webauthn\"` in its `autocomplete` attribute was detected');\n return false;\n }\n return true;\n };\n}\n"],"names":["HeadlessWebAuthnClient","register","authenticate","constructor","_networkClient","_subscriptionService","dfpProtectedAuth","checkEligibleInputs","eligibleInputs","document","querySelectorAll","length","logger","error","withUpdateSession","options","validateInDev","domain","authenticator_type","is_passkey","session_duration_minutes","override_id","override_name","override_display_name","use_base64_url_encoding","startResp","fetchSDK","url","method","body","window","location","hostname","undefined","return_passkey_credential_options","user_agent","navigator","userAgent","publicKeyCredentialCreationOptions","public_key_credential_creation_options","publicKey","JSON","parse","credential","webauthnJson","resp","public_key_credential","stringify","omitUser","signal","conditional_mediation","disable_input_check","dfp_telemetry_id","captcha_token","getDFPTelemetryIDAndCaptcha","browserSupportsAutofill","isLoggedIn","getSession","endpoint","publicKeyCredentialRequestOptions","public_key_credential_request_options","abortController","AbortController","credReqOptions","conditionalMediationCredReqOption","mediation","authenticationData","retriableFetchSDK","retryCallback","retryWithCaptchaAndDFP","update","webauthn_registration_id","name","PublicKeyCredential","isConditionalMediationAvailable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HeadlessWebAuthnClient.mjs","sources":["../../../../../../../core/src/HeadlessClients/HeadlessWebAuthnClient.ts"],"sourcesContent":["import * as webauthnJson from '@github/webauthn-json';\nimport {\n IHeadlessWebAuthnClient,\n StytchProjectConfigurationInput,\n WebAuthnAuthenticateResponse,\n WebAuthnAuthenticateStartOptions,\n WebAuthnAuthenticateStartResponse,\n WebAuthnRegisterResponse,\n WebAuthnRegisterStartOptions,\n WebAuthnRegisterStartResponse,\n WebAuthnUpdateOptions,\n WebAuthnUpdateResponse,\n} from '../public';\n\nimport { IConsumerSubscriptionService, IDFPProtectedAuthProvider, INetworkClient } from '..';\nimport { logger, omitUser, WithUser } from '../utils';\nimport { validateInDev } from '../utils/dev';\n\nexport class HeadlessWebAuthnClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessWebAuthnClient<TProjectConfiguration>\n{\n register: (options: WebAuthnRegisterStartOptions) => Promise<WebAuthnRegisterResponse<TProjectConfiguration>>;\n\n authenticate: (\n options: WebAuthnAuthenticateStartOptions,\n ) => Promise<WebAuthnAuthenticateResponse<TProjectConfiguration> | null>;\n\n constructor(\n public _networkClient: INetworkClient,\n private _subscriptionService: IConsumerSubscriptionService<TProjectConfiguration>,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {\n this.register = this._subscriptionService.withUpdateSession(\n async (options?: WebAuthnRegisterStartOptions): Promise<WebAuthnRegisterResponse<TProjectConfiguration>> => {\n if (options) {\n validateInDev('stytch.webauthn.register', options, {\n domain: 'optionalString',\n authenticator_type: 'optionalString',\n is_passkey: 'optionalBoolean',\n session_duration_minutes: 'number',\n override_id: 'optionalString',\n override_name: 'optionalString',\n override_display_name: 'optionalString',\n use_base64_url_encoding: 'optionalBoolean',\n });\n }\n\n const startResp = await this._networkClient.fetchSDK<WebAuthnRegisterStartResponse>({\n url: '/webauthn/register/start',\n method: 'POST',\n body: {\n domain: options?.domain ?? window.location.hostname,\n authenticator_type: options?.authenticator_type ?? undefined,\n return_passkey_credential_options: options?.is_passkey,\n override_id: options?.override_id,\n override_name: options?.override_name,\n override_display_name: options?.override_display_name,\n user_agent: navigator.userAgent,\n use_base64_url_encoding: options?.use_base64_url_encoding,\n },\n });\n\n const publicKeyCredentialCreationOptions = startResp.public_key_credential_creation_options;\n const publicKey = JSON.parse(publicKeyCredentialCreationOptions);\n\n const credential = await webauthnJson.create({\n publicKey: publicKey,\n });\n\n const resp = await this._networkClient.fetchSDK<WithUser<WebAuthnRegisterResponse<TProjectConfiguration>>>({\n url: '/webauthn/register',\n method: 'POST',\n body: {\n public_key_credential: JSON.stringify(credential),\n session_duration_minutes: options?.session_duration_minutes,\n },\n });\n\n return omitUser(resp);\n },\n );\n\n this.authenticate = this._subscriptionService.withUpdateSession(\n async (\n options: WebAuthnAuthenticateStartOptions,\n ): Promise<WebAuthnAuthenticateResponse<TProjectConfiguration> | null> => {\n validateInDev('stytch.webauthn.authenticate', options, {\n domain: 'optionalString',\n session_duration_minutes: 'number',\n is_passkey: 'optionalBoolean',\n signal: 'optionalObject',\n conditional_mediation: 'optionalBoolean',\n disable_input_check: 'optionalBoolean',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n if (options.conditional_mediation) {\n if (!(await this.browserSupportsAutofill())) {\n logger.error('Browser does not support WebAuthn autofill');\n return null;\n }\n\n if (!options.disable_input_check && !this.checkEligibleInputs()) {\n return null;\n }\n }\n\n const isLoggedIn = !!this._subscriptionService.getSession();\n\n const endpoint = isLoggedIn ? '/webauthn/authenticate/start/secondary' : '/webauthn/authenticate/start/primary';\n\n const startResp = await this._networkClient.fetchSDK<WebAuthnAuthenticateStartResponse>({\n url: endpoint,\n method: 'POST',\n body: {\n domain: options.domain ?? window.location.hostname,\n return_passkey_credential_options: options?.is_passkey,\n },\n });\n\n const publicKeyCredentialRequestOptions = startResp.public_key_credential_request_options;\n const abortController = new AbortController();\n const credReqOptions = {\n publicKey: JSON.parse(publicKeyCredentialRequestOptions),\n signal: options.signal ?? abortController.signal,\n };\n const conditionalMediationCredReqOption = {\n ...credReqOptions,\n mediation: 'conditional' as CredentialMediationRequirement,\n };\n const credential = await webauthnJson.get(\n options.conditional_mediation ? conditionalMediationCredReqOption : credReqOptions,\n );\n\n const authenticationData = await this._networkClient.retriableFetchSDK<\n WithUser<WebAuthnAuthenticateResponse<TProjectConfiguration>>\n >({\n url: '/webauthn/authenticate',\n method: 'POST',\n body: {\n public_key_credential: JSON.stringify(credential),\n session_duration_minutes: options.session_duration_minutes,\n dfp_telemetry_id,\n captcha_token,\n },\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n\n return omitUser(authenticationData);\n },\n );\n }\n\n async update(options: WebAuthnUpdateOptions): Promise<WebAuthnUpdateResponse> {\n validateInDev('stytch.webauthn.update', options, {\n webauthn_registration_id: 'string',\n name: 'string',\n });\n\n const url = '/webauthn/update/' + options.webauthn_registration_id;\n return await this._networkClient.fetchSDK<WebAuthnUpdateResponse>({\n url: url,\n method: 'PUT',\n body: {\n name: options.name,\n },\n });\n }\n\n async browserSupportsAutofill(): Promise<boolean> {\n return (await window.PublicKeyCredential?.isConditionalMediationAvailable?.()) ?? false;\n }\n\n private checkEligibleInputs = (): boolean => {\n // Check for an <input> with \"webauthn\" in its `autocomplete` attribute\n const eligibleInputs = document.querySelectorAll(\"input[autocomplete*='webauthn']\");\n // WebAuthn autofill requires at least one valid input\n if (eligibleInputs.length < 1) {\n logger.error('No <input> with `\"webauthn\"` in its `autocomplete` attribute was detected');\n return false;\n }\n return true;\n };\n}\n"],"names":["HeadlessWebAuthnClient","register","authenticate","_networkClient","_subscriptionService","dfpProtectedAuth","withUpdateSession","options","validateInDev","domain","authenticator_type","is_passkey","session_duration_minutes","override_id","override_name","override_display_name","use_base64_url_encoding","startResp","fetchSDK","url","method","body","window","location","hostname","undefined","return_passkey_credential_options","user_agent","navigator","userAgent","publicKeyCredentialCreationOptions","public_key_credential_creation_options","publicKey","JSON","parse","credential","webauthnJson","resp","public_key_credential","stringify","omitUser","signal","conditional_mediation","disable_input_check","dfp_telemetry_id","captcha_token","getDFPTelemetryIDAndCaptcha","browserSupportsAutofill","logger","error","checkEligibleInputs","isLoggedIn","getSession","endpoint","publicKeyCredentialRequestOptions","public_key_credential_request_options","abortController","AbortController","credReqOptions","conditionalMediationCredReqOption","mediation","authenticationData","retriableFetchSDK","retryCallback","retryWithCaptchaAndDFP","update","webauthn_registration_id","name","PublicKeyCredential","isConditionalMediationAvailable","eligibleInputs","document","querySelectorAll","length"],"mappings":"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"}
|
package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessB2BDiscoveryClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.ts"],"sourcesContent":["import {\n B2BDiscoveryIntermediateSessionsExchangeOptions,\n B2BDiscoveryIntermediateSessionsExchangeResponse,\n B2BDiscoveryOrganizationsCreateOptions,\n B2BDiscoveryOrganizationsCreateResponse,\n B2BDiscoveryOrganizationsResponse,\n IHeadlessB2BDiscoveryClient,\n StytchProjectConfigurationInput,\n} from '../../public';\nimport { INetworkClient } from '../..';\nimport { IB2BSubscriptionService } from '../..';\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BDiscoveryClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BDiscoveryClient<TProjectConfiguration>\n{\n organizations: {\n list: () => Promise<B2BDiscoveryOrganizationsResponse>;\n create: (\n data: B2BDiscoveryOrganizationsCreateOptions,\n ) => Promise<B2BDiscoveryOrganizationsCreateResponse<TProjectConfiguration>>;\n };\n\n intermediateSessions: {\n exchange: (\n data: B2BDiscoveryIntermediateSessionsExchangeOptions,\n ) => Promise<B2BDiscoveryIntermediateSessionsExchangeResponse<TProjectConfiguration>>;\n };\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n ) {\n this.organizations = {\n list: async () =>\n this._networkClient.fetchSDK<B2BDiscoveryOrganizationsResponse>({\n url: '/b2b/discovery/organizations',\n body: {\n intermediate_session_token: (await this._subscriptionService.getIntermediateSessionToken()) || undefined,\n },\n method: 'POST',\n }),\n create: this._subscriptionService.withUpdateSession(\n async (\n data: B2BDiscoveryOrganizationsCreateOptions,\n ): Promise<B2BDiscoveryOrganizationsCreateResponse<TProjectConfiguration>> => {\n validateInDev('stytch.discovery.organizations.create', data, {\n session_duration_minutes: 'number',\n organization_name: 'optionalString',\n organization_slug: 'optionalString',\n organization_logo_url: 'optionalString',\n sso_jit_provisioning: 'optionalString',\n email_allowed_domains: 'optionalStringArray',\n email_invites: 'optionalString',\n auth_methods: 'optionalString',\n allowed_auth_methods: 'optionalStringArray',\n mfa_policy: 'optionalString',\n });\n\n const requestBody = {\n ...data,\n intermediate_session_token: (await this._subscriptionService.getIntermediateSessionToken()) || undefined,\n };\n\n return this._networkClient.fetchSDK<B2BDiscoveryOrganizationsCreateResponse<TProjectConfiguration>>({\n url: '/b2b/discovery/organizations/create',\n body: requestBody,\n method: 'POST',\n });\n },\n ),\n };\n\n this.intermediateSessions = {\n exchange: this._subscriptionService.withUpdateSession(\n async (\n data: B2BDiscoveryIntermediateSessionsExchangeOptions,\n ): Promise<B2BDiscoveryIntermediateSessionsExchangeResponse<TProjectConfiguration>> => {\n validateInDev('stytch.discovery.intermediateSessions.exchange', data, {\n organization_id: 'string',\n session_duration_minutes: 'number',\n locale: 'optionalString',\n });\n\n const requestBody = {\n ...data,\n intermediate_session_token: this._subscriptionService.getIntermediateSessionToken() || undefined,\n };\n return this._networkClient.fetchSDK<B2BDiscoveryIntermediateSessionsExchangeResponse<TProjectConfiguration>>({\n url: '/b2b/discovery/intermediate_sessions/exchange',\n body: requestBody,\n method: 'POST',\n });\n },\n ),\n };\n }\n}\n"],"names":["HeadlessB2BDiscoveryClient","organizations","intermediateSessions","
|
|
1
|
+
{"version":3,"file":"HeadlessB2BDiscoveryClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BDiscoveryClient.ts"],"sourcesContent":["import {\n B2BDiscoveryIntermediateSessionsExchangeOptions,\n B2BDiscoveryIntermediateSessionsExchangeResponse,\n B2BDiscoveryOrganizationsCreateOptions,\n B2BDiscoveryOrganizationsCreateResponse,\n B2BDiscoveryOrganizationsResponse,\n IHeadlessB2BDiscoveryClient,\n StytchProjectConfigurationInput,\n} from '../../public';\nimport { INetworkClient } from '../..';\nimport { IB2BSubscriptionService } from '../..';\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BDiscoveryClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BDiscoveryClient<TProjectConfiguration>\n{\n organizations: {\n list: () => Promise<B2BDiscoveryOrganizationsResponse>;\n create: (\n data: B2BDiscoveryOrganizationsCreateOptions,\n ) => Promise<B2BDiscoveryOrganizationsCreateResponse<TProjectConfiguration>>;\n };\n\n intermediateSessions: {\n exchange: (\n data: B2BDiscoveryIntermediateSessionsExchangeOptions,\n ) => Promise<B2BDiscoveryIntermediateSessionsExchangeResponse<TProjectConfiguration>>;\n };\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n ) {\n this.organizations = {\n list: async () =>\n this._networkClient.fetchSDK<B2BDiscoveryOrganizationsResponse>({\n url: '/b2b/discovery/organizations',\n body: {\n intermediate_session_token: (await this._subscriptionService.getIntermediateSessionToken()) || undefined,\n },\n method: 'POST',\n }),\n create: this._subscriptionService.withUpdateSession(\n async (\n data: B2BDiscoveryOrganizationsCreateOptions,\n ): Promise<B2BDiscoveryOrganizationsCreateResponse<TProjectConfiguration>> => {\n validateInDev('stytch.discovery.organizations.create', data, {\n session_duration_minutes: 'number',\n organization_name: 'optionalString',\n organization_slug: 'optionalString',\n organization_logo_url: 'optionalString',\n sso_jit_provisioning: 'optionalString',\n email_allowed_domains: 'optionalStringArray',\n email_invites: 'optionalString',\n auth_methods: 'optionalString',\n allowed_auth_methods: 'optionalStringArray',\n mfa_policy: 'optionalString',\n });\n\n const requestBody = {\n ...data,\n intermediate_session_token: (await this._subscriptionService.getIntermediateSessionToken()) || undefined,\n };\n\n return this._networkClient.fetchSDK<B2BDiscoveryOrganizationsCreateResponse<TProjectConfiguration>>({\n url: '/b2b/discovery/organizations/create',\n body: requestBody,\n method: 'POST',\n });\n },\n ),\n };\n\n this.intermediateSessions = {\n exchange: this._subscriptionService.withUpdateSession(\n async (\n data: B2BDiscoveryIntermediateSessionsExchangeOptions,\n ): Promise<B2BDiscoveryIntermediateSessionsExchangeResponse<TProjectConfiguration>> => {\n validateInDev('stytch.discovery.intermediateSessions.exchange', data, {\n organization_id: 'string',\n session_duration_minutes: 'number',\n locale: 'optionalString',\n });\n\n const requestBody = {\n ...data,\n intermediate_session_token: this._subscriptionService.getIntermediateSessionToken() || undefined,\n };\n return this._networkClient.fetchSDK<B2BDiscoveryIntermediateSessionsExchangeResponse<TProjectConfiguration>>({\n url: '/b2b/discovery/intermediate_sessions/exchange',\n body: requestBody,\n method: 'POST',\n });\n },\n ),\n };\n }\n}\n"],"names":["HeadlessB2BDiscoveryClient","organizations","intermediateSessions","_subscriptionService","_networkClient","list","fetchSDK","url","body","intermediate_session_token","getIntermediateSessionToken","undefined","method","create","withUpdateSession","data","validateInDev","session_duration_minutes","organization_name","organization_slug","organization_logo_url","sso_jit_provisioning","email_allowed_domains","email_invites","auth_methods","allowed_auth_methods","mfa_policy","requestBody","exchange","organization_id","locale"],"mappings":";;AAaO,MAAMA,0BAAAA,CAAAA;;;IAGXC,aAAAA;IAOAC,oBAAAA;AAMA,IAAA,WAAA,CACE,cAAsC,EAC9BC,oBAAoE,CAC5E;aAFQC,cAAAA,GAAAA,cAAAA;aACAD,oBAAAA,GAAAA,oBAAAA;QAER,IAAI,CAACF,aAAa,GAAG;AACnBI,YAAAA,IAAAA,EAAM,UACJ,IAAI,CAACD,cAAc,CAACE,QAAQ,CAAoC;oBAC9DC,GAAAA,EAAK,8BAAA;oBACLC,IAAAA,EAAM;AACJC,wBAAAA,0BAAAA,EAA4B,MAAO,IAAI,CAACN,oBAAoB,CAACO,2BAA2B,EAAA,IAAOC;AACjG,qBAAA;oBACAC,MAAAA,EAAQ;AACV,iBAAA,CAAA;AACFC,YAAAA,MAAAA,EAAQ,IAAI,CAACV,oBAAoB,CAACW,iBAAiB,CACjD,OACEC,IAAAA,GAAAA;AAEAC,gBAAAA,aAAAA,CAAc,yCAAyCD,IAAAA,EAAM;oBAC3DE,wBAAAA,EAA0B,QAAA;oBAC1BC,iBAAAA,EAAmB,gBAAA;oBACnBC,iBAAAA,EAAmB,gBAAA;oBACnBC,qBAAAA,EAAuB,gBAAA;oBACvBC,oBAAAA,EAAsB,gBAAA;oBACtBC,qBAAAA,EAAuB,qBAAA;oBACvBC,aAAAA,EAAe,gBAAA;oBACfC,YAAAA,EAAc,gBAAA;oBACdC,oBAAAA,EAAsB,qBAAA;oBACtBC,UAAAA,EAAY;AACd,iBAAA,CAAA;AAEA,gBAAA,MAAMC,WAAAA,GAAc;AAClB,oBAAA,GAAGZ,IAAI;AACPN,oBAAAA,0BAAAA,EAA4B,MAAO,IAAI,CAACN,oBAAoB,CAACO,2BAA2B,EAAA,IAAOC;AACjG,iBAAA;AAEA,gBAAA,OAAO,IAAI,CAACP,cAAc,CAACE,QAAQ,CAAiE;oBAClGC,GAAAA,EAAK,qCAAA;oBACLC,IAAAA,EAAMmB,WAAAA;oBACNf,MAAAA,EAAQ;AACV,iBAAA,CAAA;AACF,YAAA,CAAA;AAEJ,SAAA;QAEA,IAAI,CAACV,oBAAoB,GAAG;AAC1B0B,YAAAA,QAAAA,EAAU,IAAI,CAACzB,oBAAoB,CAACW,iBAAiB,CACnD,OACEC,IAAAA,GAAAA;AAEAC,gBAAAA,aAAAA,CAAc,kDAAkDD,IAAAA,EAAM;oBACpEc,eAAAA,EAAiB,QAAA;oBACjBZ,wBAAAA,EAA0B,QAAA;oBAC1Ba,MAAAA,EAAQ;AACV,iBAAA,CAAA;AAEA,gBAAA,MAAMH,WAAAA,GAAc;AAClB,oBAAA,GAAGZ,IAAI;AACPN,oBAAAA,0BAAAA,EAA4B,IAAI,CAACN,oBAAoB,CAACO,2BAA2B,EAAA,IAAMC;AACzF,iBAAA;AACA,gBAAA,OAAO,IAAI,CAACP,cAAc,CAACE,QAAQ,CAA0E;oBAC3GC,GAAAA,EAAK,+CAAA;oBACLC,IAAAA,EAAMmB,WAAAA;oBACNf,MAAAA,EAAQ;AACV,iBAAA,CAAA;AACF,YAAA,CAAA;AAEJ,SAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -2,7 +2,8 @@ class HeadlessB2BIDPClient {
|
|
|
2
2
|
_networkClient;
|
|
3
3
|
constructor(_networkClient){
|
|
4
4
|
this._networkClient = _networkClient;
|
|
5
|
-
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
6
7
|
* Initiates a request for authorization of a Connected App to access a Member's account.
|
|
7
8
|
*
|
|
8
9
|
* Call this endpoint using the query parameters from an OAuth Authorization request. This endpoint validates various fields (scope, client_id, redirect_uri, prompt, etc...) are correct and returns relevant information for rendering an OAuth Consent Screen.
|
|
@@ -14,11 +15,11 @@ class HeadlessB2BIDPClient {
|
|
|
14
15
|
* scope: 'openid email profile',
|
|
15
16
|
* });
|
|
16
17
|
*/ oauthAuthorizeStart = async (data)=>this._networkClient.fetchSDK({
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
url: '/idp/b2b/oauth/authorize/start',
|
|
19
|
+
method: 'POST',
|
|
20
|
+
body: data
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
22
23
|
* Completes a request for authorization of a Connected App to access a Member's account.
|
|
23
24
|
*
|
|
24
25
|
* Call this endpoint using the query parameters from an OAuth Authorization request, after previously validating those parameters using the Preflight Check API. Note that this endpoint takes in a few additional parameters the preflight check does not- state, nonce, and code_challenge.
|
|
@@ -39,19 +40,15 @@ class HeadlessB2BIDPClient {
|
|
|
39
40
|
* scope: 'openid email profile',
|
|
40
41
|
* });
|
|
41
42
|
*/ oauthAuthorizeSubmit = async (data)=>this._networkClient.fetchSDK({
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
oauthAuthorizeStart;
|
|
53
|
-
oauthAuthorizeSubmit;
|
|
54
|
-
oauthLogoutStart;
|
|
43
|
+
url: '/idp/b2b/oauth/authorize/submit',
|
|
44
|
+
method: 'POST',
|
|
45
|
+
body: data
|
|
46
|
+
});
|
|
47
|
+
oauthLogoutStart = async (data)=>this._networkClient.fetchSDK({
|
|
48
|
+
url: `/b2b/oauth/logout/start`,
|
|
49
|
+
method: 'POST',
|
|
50
|
+
body: data
|
|
51
|
+
});
|
|
55
52
|
}
|
|
56
53
|
|
|
57
54
|
export { HeadlessB2BIDPClient };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessB2BIDPClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.ts"],"sourcesContent":["import { INetworkClient } from '../../NetworkClient';\nimport {\n B2BOAuthAuthorizeStartOptions,\n B2BOAuthAuthorizeStartResponse,\n B2BOAuthAuthorizeSubmitOptions,\n B2BOAuthAuthorizeSubmitResponse,\n IHeadlessB2BIDPClient,\n B2BOAuthLogoutStartOptions,\n B2BOAuthLogoutStartResponse,\n} from '../../public/b2b/idp';\n\nexport class HeadlessB2BIDPClient implements IHeadlessB2BIDPClient {\n constructor(private _networkClient: INetworkClient) {}\n\n /**\n * Initiates a request for authorization of a Connected App to access a Member's account.\n *\n * Call this endpoint using the query parameters from an OAuth Authorization request. This endpoint validates various fields (scope, client_id, redirect_uri, prompt, etc...) are correct and returns relevant information for rendering an OAuth Consent Screen.\n *\n * @example\n * const response = await stytch.idp.oauthAuthorizeStart({\n * client_id: 'client_123',\n * redirect_uri: 'https://example.com/callback',\n * scope: 'openid email profile',\n * });\n */\n oauthAuthorizeStart = async (data: B2BOAuthAuthorizeStartOptions): Promise<B2BOAuthAuthorizeStartResponse> =>\n this._networkClient.fetchSDK<B2BOAuthAuthorizeStartResponse>({\n url: '/idp/b2b/oauth/authorize/start',\n method: 'POST',\n body: data,\n });\n\n /**\n * Completes a request for authorization of a Connected App to access a Member's account.\n *\n * Call this endpoint using the query parameters from an OAuth Authorization request, after previously validating those parameters using the Preflight Check API. Note that this endpoint takes in a few additional parameters the preflight check does not- state, nonce, and code_challenge.\n *\n * If the authorization was successful, the redirect_uri will contain a valid authorization_code embedded as a query parameter. If the authorization was unsuccessful, the redirect_uri will contain an OAuth2.1 error_code. In both cases, redirect the Member to the location for the response to be consumed by the Connected App.\n *\n * Exactly one of the following must be provided to identify the Member granting authorization:\n * organization_id + member_id\n * session_token\n * session_jwt\n *\n * If a session_token or session_jwt is passed, the OAuth Authorization will be linked to the Member's session for tracking purposes. One of these fields must be used if the Connected App intends to complete the Exchange Access Token flow.\n *\n * @example\n * const response = await stytch.idp.oauthAuthorizeSubmit({\n * client_id: 'client_123',\n * redirect_uri: 'https://example.com/callback',\n * scope: 'openid email profile',\n * });\n */\n oauthAuthorizeSubmit = async (data: B2BOAuthAuthorizeSubmitOptions): Promise<B2BOAuthAuthorizeSubmitResponse> =>\n this._networkClient.fetchSDK<B2BOAuthAuthorizeSubmitResponse>({\n url: '/idp/b2b/oauth/authorize/submit',\n method: 'POST',\n body: data,\n });\n\n oauthLogoutStart = async (data: B2BOAuthLogoutStartOptions): Promise<B2BOAuthLogoutStartResponse> =>\n this._networkClient.fetchSDK<B2BOAuthLogoutStartResponse>({\n url: `/b2b/oauth/logout/start`,\n method: 'POST',\n body: data,\n });\n}\n"],"names":["HeadlessB2BIDPClient","
|
|
1
|
+
{"version":3,"file":"HeadlessB2BIDPClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BIDPClient.ts"],"sourcesContent":["import { INetworkClient } from '../../NetworkClient';\nimport {\n B2BOAuthAuthorizeStartOptions,\n B2BOAuthAuthorizeStartResponse,\n B2BOAuthAuthorizeSubmitOptions,\n B2BOAuthAuthorizeSubmitResponse,\n IHeadlessB2BIDPClient,\n B2BOAuthLogoutStartOptions,\n B2BOAuthLogoutStartResponse,\n} from '../../public/b2b/idp';\n\nexport class HeadlessB2BIDPClient implements IHeadlessB2BIDPClient {\n constructor(private _networkClient: INetworkClient) {}\n\n /**\n * Initiates a request for authorization of a Connected App to access a Member's account.\n *\n * Call this endpoint using the query parameters from an OAuth Authorization request. This endpoint validates various fields (scope, client_id, redirect_uri, prompt, etc...) are correct and returns relevant information for rendering an OAuth Consent Screen.\n *\n * @example\n * const response = await stytch.idp.oauthAuthorizeStart({\n * client_id: 'client_123',\n * redirect_uri: 'https://example.com/callback',\n * scope: 'openid email profile',\n * });\n */\n oauthAuthorizeStart = async (data: B2BOAuthAuthorizeStartOptions): Promise<B2BOAuthAuthorizeStartResponse> =>\n this._networkClient.fetchSDK<B2BOAuthAuthorizeStartResponse>({\n url: '/idp/b2b/oauth/authorize/start',\n method: 'POST',\n body: data,\n });\n\n /**\n * Completes a request for authorization of a Connected App to access a Member's account.\n *\n * Call this endpoint using the query parameters from an OAuth Authorization request, after previously validating those parameters using the Preflight Check API. Note that this endpoint takes in a few additional parameters the preflight check does not- state, nonce, and code_challenge.\n *\n * If the authorization was successful, the redirect_uri will contain a valid authorization_code embedded as a query parameter. If the authorization was unsuccessful, the redirect_uri will contain an OAuth2.1 error_code. In both cases, redirect the Member to the location for the response to be consumed by the Connected App.\n *\n * Exactly one of the following must be provided to identify the Member granting authorization:\n * organization_id + member_id\n * session_token\n * session_jwt\n *\n * If a session_token or session_jwt is passed, the OAuth Authorization will be linked to the Member's session for tracking purposes. One of these fields must be used if the Connected App intends to complete the Exchange Access Token flow.\n *\n * @example\n * const response = await stytch.idp.oauthAuthorizeSubmit({\n * client_id: 'client_123',\n * redirect_uri: 'https://example.com/callback',\n * scope: 'openid email profile',\n * });\n */\n oauthAuthorizeSubmit = async (data: B2BOAuthAuthorizeSubmitOptions): Promise<B2BOAuthAuthorizeSubmitResponse> =>\n this._networkClient.fetchSDK<B2BOAuthAuthorizeSubmitResponse>({\n url: '/idp/b2b/oauth/authorize/submit',\n method: 'POST',\n body: data,\n });\n\n oauthLogoutStart = async (data: B2BOAuthLogoutStartOptions): Promise<B2BOAuthLogoutStartResponse> =>\n this._networkClient.fetchSDK<B2BOAuthLogoutStartResponse>({\n url: `/b2b/oauth/logout/start`,\n method: 'POST',\n body: data,\n });\n}\n"],"names":["HeadlessB2BIDPClient","_networkClient","oauthAuthorizeStart","data","fetchSDK","url","method","body","oauthAuthorizeSubmit","oauthLogoutStart"],"mappings":"AAWO,MAAMA,oBAAAA,CAAAA;;IACX,WAAA,CAAoBC,cAA8B,CAAE;aAAhCA,cAAAA,GAAAA,cAAAA;AAAiC,IAAA;AAErD;;;;;;;;;;;MAYAC,mBAAAA,GAAsB,OAAOC,IAAAA,GAC3B,IAAI,CAACF,cAAc,CAACG,QAAQ,CAAiC;YAC3DC,GAAAA,EAAK,gCAAA;YACLC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAMJ;SACR,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;MAqBAK,oBAAAA,GAAuB,OAAOL,IAAAA,GAC5B,IAAI,CAACF,cAAc,CAACG,QAAQ,CAAkC;YAC5DC,GAAAA,EAAK,iCAAA;YACLC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAMJ;SACR,CAAA;AAEFM,IAAAA,gBAAAA,GAAmB,OAAON,IAAAA,GACxB,IAAI,CAACF,cAAc,CAACG,QAAQ,CAA8B;YACxDC,GAAAA,EAAK,CAAC,uBAAuB,CAAC;YAC9BC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAMJ;SACR,CAAA;AACJ;;;;"}
|
package/dist/esm-dev/packages/core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessB2BImpersonationClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.ts"],"sourcesContent":["import { IB2BSubscriptionService, IDFPProtectedAuthProvider, INetworkClient } from '../..';\nimport {\n B2BImpersonationAuthenticateOptions,\n B2BImpersonationAuthenticateResponse,\n IHeadlessB2BImpersonationClient,\n} from '../../public/b2b/impersonation';\nimport { StytchProjectConfigurationInput } from '../../public/typeConfig';\n\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BImpersonationClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BImpersonationClient<TProjectConfiguration>\n{\n authenticate: (\n data: B2BImpersonationAuthenticateOptions,\n ) => Promise<B2BImpersonationAuthenticateResponse<TProjectConfiguration>>;\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {\n this.authenticate = this._subscriptionService.withUpdateSession(\n async (data: B2BImpersonationAuthenticateOptions) => {\n validateInDev('stytch.impersonation.authenticate', data, {\n impersonation_token: 'string',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n return this._networkClient.retriableFetchSDK<B2BImpersonationAuthenticateResponse<TProjectConfiguration>>({\n url: '/b2b/impersonation/authenticate',\n body: {\n ...data,\n dfp_telemetry_id,\n captcha_token,\n },\n method: 'POST',\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n },\n );\n }\n}\n"],"names":["HeadlessB2BImpersonationClient","authenticate","
|
|
1
|
+
{"version":3,"file":"HeadlessB2BImpersonationClient.mjs","sources":["../../../../../../../../core/src/HeadlessClients/b2b/HeadlessB2BImpersonationClient.ts"],"sourcesContent":["import { IB2BSubscriptionService, IDFPProtectedAuthProvider, INetworkClient } from '../..';\nimport {\n B2BImpersonationAuthenticateOptions,\n B2BImpersonationAuthenticateResponse,\n IHeadlessB2BImpersonationClient,\n} from '../../public/b2b/impersonation';\nimport { StytchProjectConfigurationInput } from '../../public/typeConfig';\n\nimport { validateInDev } from '../../utils/dev';\n\nexport class HeadlessB2BImpersonationClient<TProjectConfiguration extends StytchProjectConfigurationInput>\n implements IHeadlessB2BImpersonationClient<TProjectConfiguration>\n{\n authenticate: (\n data: B2BImpersonationAuthenticateOptions,\n ) => Promise<B2BImpersonationAuthenticateResponse<TProjectConfiguration>>;\n\n constructor(\n private _networkClient: INetworkClient,\n private _subscriptionService: IB2BSubscriptionService<TProjectConfiguration>,\n private dfpProtectedAuth: IDFPProtectedAuthProvider,\n ) {\n this.authenticate = this._subscriptionService.withUpdateSession(\n async (data: B2BImpersonationAuthenticateOptions) => {\n validateInDev('stytch.impersonation.authenticate', data, {\n impersonation_token: 'string',\n });\n const { dfp_telemetry_id, captcha_token } = await this.dfpProtectedAuth.getDFPTelemetryIDAndCaptcha();\n\n return this._networkClient.retriableFetchSDK<B2BImpersonationAuthenticateResponse<TProjectConfiguration>>({\n url: '/b2b/impersonation/authenticate',\n body: {\n ...data,\n dfp_telemetry_id,\n captcha_token,\n },\n method: 'POST',\n retryCallback: this.dfpProtectedAuth.retryWithCaptchaAndDFP,\n });\n },\n );\n }\n}\n"],"names":["HeadlessB2BImpersonationClient","authenticate","_networkClient","_subscriptionService","dfpProtectedAuth","withUpdateSession","data","validateInDev","impersonation_token","dfp_telemetry_id","captcha_token","getDFPTelemetryIDAndCaptcha","retriableFetchSDK","url","body","method","retryCallback","retryWithCaptchaAndDFP"],"mappings":";;AAUO,MAAMA,8BAAAA,CAAAA;;;;IAGXC,YAAAA;IAIA,WAAA,CACUC,cAA8B,EAC9BC,oBAAoE,EACpEC,gBAA2C,CACnD;aAHQF,cAAAA,GAAAA,cAAAA;aACAC,oBAAAA,GAAAA,oBAAAA;aACAC,gBAAAA,GAAAA,gBAAAA;QAER,IAAI,CAACH,YAAY,GAAG,IAAI,CAACE,oBAAoB,CAACE,iBAAiB,CAC7D,OAAOC,IAAAA,GAAAA;AACLC,YAAAA,aAAAA,CAAc,qCAAqCD,IAAAA,EAAM;gBACvDE,mBAAAA,EAAqB;AACvB,aAAA,CAAA;YACA,MAAM,EAAEC,gBAAgB,EAAEC,aAAa,EAAE,GAAG,MAAM,IAAI,CAACN,gBAAgB,CAACO,2BAA2B,EAAA;AAEnG,YAAA,OAAO,IAAI,CAACT,cAAc,CAACU,iBAAiB,CAA8D;gBACxGC,GAAAA,EAAK,iCAAA;gBACLC,IAAAA,EAAM;AACJ,oBAAA,GAAGR,IAAI;AACPG,oBAAAA,gBAAAA;AACAC,oBAAAA;AACF,iBAAA;gBACAK,MAAAA,EAAQ,MAAA;AACRC,gBAAAA,aAAAA,EAAe,IAAI,CAACZ,gBAAgB,CAACa;AACvC,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AAEJ,IAAA;AACF;;;;"}
|