From 0797deba087c314c7b5f45b33acb95a48d0bbb27 Mon Sep 17 00:00:00 2001 From: Bogdan Carpusor Date: Mon, 3 Feb 2025 15:00:23 +0200 Subject: [PATCH 01/24] improv: add an improved way of refreshing the session during SSR Update the function and add types Add more info about the proposal Account for pages directory in the function implementation Update types and clean things up Add comments Add nextjs init function Add the jose library Fix refreshing and add example Fix build and token config Fix payload processing Load config fron env variables Add a redirect location during refresh Refresh token from middleware Move everything in the library Rename files and update function singatures Use the correct refresh path Use normal responses instead of nextresponse Use normal request instead of nextrequest Cleanup implementation Revoke session inside the middleware Code review fixes Add tests for getSSRSession Add tests for middleware --- examples/with-next-ssr-app-directory/.env | 5 + .../.eslintrc.json | 3 + .../with-next-ssr-app-directory/.gitignore | 38 + .../with-next-ssr-app-directory/README.md | 42 + .../app/api/auth/[...path]/route.ts | 161 + .../app/api/user/route.ts | 23 + .../app/auth/[[...path]]/page.tsx | 27 + .../app/components/callApiButton.tsx | 17 + .../app/components/home.tsx | 43 + .../app/components/linksComponent.tsx | 64 + .../app/components/sessionAuthForNextJS.tsx | 19 + .../app/components/supertokensProvider.tsx | 18 + .../components/tryRefreshClientComponent.tsx | 31 + .../app/config/appInfo.ts | 7 + .../app/config/backend.ts | 101 + .../app/config/frontend.tsx | 57 + .../app/config/ssr.ts | 10 + .../app/favicon.ico | Bin 0 -> 25931 bytes .../app/globals.css | 3 + .../app/layout.tsx | 21 + .../app/page.module.css | 214 + .../with-next-ssr-app-directory/app/page.tsx | 10 + .../with-next-ssr-app-directory/app/util.ts | 31 + .../assets/fonts/MenloRegular.ttf | Bin 0 -> 475160 bytes .../assets/images/arrow-right-icon.svg | 3 + .../assets/images/background.png | Bin 0 -> 70254 bytes .../assets/images/blogs-icon.svg | 3 + .../assets/images/celebrate-icon.svg | 9 + .../assets/images/guide-icon.svg | 3 + .../assets/images/index.ts | 8 + .../assets/images/separator-line.svg | 10 + .../assets/images/sign-out-icon.svg | 3 + .../with-next-ssr-app-directory/middleware.ts | 14 + .../next.config.js | 4 + .../with-next-ssr-app-directory/package.json | 29 + .../public/next.svg | 1 + .../public/vercel.svg | 1 + .../with-next-ssr-app-directory/tsconfig.json | 27 + examples/with-next-ssr-pages-directory/.env | 14 + .../with-next-ssr-pages-directory/.gitignore | 36 + .../assets/fonts/MenloRegular.ttf | Bin 0 -> 475160 bytes .../assets/images/arrow-right-icon.svg | 3 + .../assets/images/background.png | Bin 0 -> 70254 bytes .../assets/images/blogs-icon.svg | 3 + .../assets/images/celebrate-icon.svg | 9 + .../assets/images/guide-icon.svg | 3 + .../assets/images/index.ts | 8 + .../assets/images/separator-line.svg | 10 + .../assets/images/sign-out-icon.svg | 3 + .../config/appInfo.ts | 12 + .../config/backendConfig.ts | 90 + .../config/frontendConfig.tsx | 52 + .../config/ssrConfig.ts | 10 + .../middleware.ts | 85 + .../next.config.js | 6 + .../package.json | 20 + .../pages/_app.tsx | 37 + .../pages/api/auth/[[...path]].ts | 21 + .../pages/api/user.ts | 23 + .../pages/auth/[[...path]].tsx | 39 + .../pages/index.tsx | 109 + .../public/favicon.ico | Bin 0 -> 9662 bytes .../public/vercel.svg | 4 + .../styles/Home.module.css | 122 + .../styles/ProtectedHome.module.css | 202 + .../styles/globals.css | 16 + .../tsconfig.json | 20 + lib/build/arrowLeftIcon.js | 63 +- lib/build/authCompWrapper.js | 18 +- lib/build/authRecipe-shared.js | 106 +- lib/build/authRecipe-shared2.js | 125 +- lib/build/claims/booleanClaim.d.ts | 20 +- lib/build/claims/primitiveArrayClaim.d.ts | 20 +- lib/build/claims/primitiveClaim.d.ts | 20 +- lib/build/components/SuperTokensBranding.d.ts | 4 +- .../components/assets/arrowLeftIcon.d.ts | 6 +- .../components/assets/arrowRightIcon.d.ts | 6 +- lib/build/components/assets/blockedIcon.d.ts | 2 +- lib/build/components/assets/checkedIcon.d.ts | 4 +- .../components/assets/checkedRoundIcon.d.ts | 4 +- .../components/assets/emailLargeIcon.d.ts | 4 +- lib/build/components/assets/errorIcon.d.ts | 4 +- .../components/assets/errorLargeIcon.d.ts | 4 +- .../components/assets/errorRoundIcon.d.ts | 4 +- .../components/assets/heavyArrowLeftIcon.d.ts | 6 +- lib/build/components/assets/logoutIcon.d.ts | 4 +- lib/build/components/assets/otpEmailIcon.d.ts | 2 +- lib/build/components/assets/otpSMSIcon.d.ts | 2 +- .../components/assets/showPasswordIcon.d.ts | 6 +- lib/build/components/assets/smsLargeIcon.d.ts | 4 +- lib/build/components/assets/spinnerIcon.d.ts | 4 +- lib/build/components/assets/totpIcon.d.ts | 2 +- lib/build/components/authCompWrapper.d.ts | 15 +- .../componentOverride/componentOverride.d.ts | 13 +- .../componentOverrideContext.d.ts | 16 +- .../genericComponentOverrideContext.d.ts | 16 +- .../useComponentOverride.d.ts | 8 +- .../componentOverride/withOverride.d.ts | 7 +- lib/build/components/featureWrapper.d.ts | 31 +- lib/build/components/routingComponent.d.ts | 16 +- lib/build/components/superTokensRoute.d.ts | 20 +- lib/build/components/superTokensRouteV6.d.ts | 20 +- lib/build/components/supertokensWrapper.d.ts | 12 +- lib/build/constants.d.ts | 13 +- lib/build/constants.js | 29 + lib/build/dateProvider/index.d.ts | 2 +- lib/build/dateProvider/types.d.ts | 2 +- lib/build/emailLargeIcon.js | 72 +- lib/build/emailpassword-shared.js | 40 +- lib/build/emailpassword-shared2.js | 8 +- lib/build/emailpassword-shared3.js | 1214 +- lib/build/emailpassword-shared4.js | 32 +- lib/build/emailpassword-shared5.js | 1277 +- lib/build/emailpassword.js | 250 +- lib/build/emailpasswordprebuiltui.js | 2202 +-- lib/build/emailverification-shared.js | 507 +- lib/build/emailverification-shared2.js | 46 +- lib/build/emailverification.js | 175 +- lib/build/emailverificationprebuiltui.js | 1672 +- lib/build/genericComponentOverrideContext.js | 2462 ++- lib/build/index.d.ts | 68 +- lib/build/index.js | 57 +- lib/build/index2.js | 4153 ++--- lib/build/logger.d.ts | 4 +- lib/build/logger.js | 158 + lib/build/multifactorauth-shared.js | 990 +- lib/build/multifactorauth-shared2.js | 1114 +- lib/build/multifactorauth-shared3.js | 8 +- lib/build/multifactorauth.js | 158 +- lib/build/multifactorauthprebuiltui.js | 831 +- lib/build/multitenancy-shared.js | 8 +- lib/build/multitenancy.js | 84 +- lib/build/nextjs/constants.d.ts | 13 + lib/build/nextjs/middleware.d.ts | 4 + lib/build/nextjs/ssr.d.ts | 32 + lib/build/nextjs/types.d.ts | 62 + lib/build/nextjsmiddleware.js | 273 + lib/build/nextjsssr.js | 1638 ++ lib/build/oauth2provider-shared.js | 321 +- lib/build/oauth2provider-shared2.js | 8 +- lib/build/oauth2provider.js | 180 +- lib/build/oauth2providerprebuiltui.js | 908 +- lib/build/passwordless-shared.js | 867 +- lib/build/passwordless.js | 345 +- lib/build/passwordlessprebuiltui.js | 11197 +++++------- .../authRecipe/componentOverrideContext.d.ts | 15 +- .../components/feature/authPage/authPage.d.ts | 34 +- .../theme/authPage/authPageComponentList.d.ts | 6 +- .../theme/authPage/authPageFooter.d.ts | 16 +- .../theme/authPage/authPageHeader.d.ts | 30 +- .../components/theme/authPage/index.d.ts | 10 +- .../components/theme/themeBase.d.ts | 12 +- lib/build/recipe/authRecipe/index.d.ts | 29 +- lib/build/recipe/authRecipe/types.d.ts | 117 +- lib/build/recipe/authRecipe/utils.d.ts | 11 +- .../componentOverrideContext.d.ts | 15 +- .../resetPasswordUsingToken/index.d.ts | 22 +- .../components/features/signin/index.d.ts | 36 +- .../components/features/signup/index.d.ts | 36 +- .../components/library/backButton.d.ts | 12 +- .../library/backToSignInButton.d.ts | 12 +- .../components/library/button.d.ts | 20 +- .../components/library/formBase.d.ts | 16 +- .../components/library/formRow.d.ts | 15 +- .../components/library/generalError.d.ts | 12 +- .../components/library/index.d.ts | 12 +- .../components/library/input.d.ts | 32 +- .../components/library/inputError.d.ts | 12 +- .../components/library/label.d.ts | 14 +- .../themes/resetPasswordUsingToken/index.d.ts | 10 +- .../resetPasswordEmail.d.ts | 30 +- .../submitNewPassword.d.ts | 32 +- .../components/themes/signIn/index.d.ts | 44 +- .../components/themes/signUp/index.d.ts | 42 +- .../components/themes/themeBase.d.ts | 12 +- .../components/themes/translations.d.ts | 190 +- lib/build/recipe/emailpassword/constants.d.ts | 4 +- .../emailpassword/functionOverrides.d.ts | 10 +- lib/build/recipe/emailpassword/index.d.ts | 298 +- .../recipe/emailpassword/prebuiltui.d.ts | 270 +- lib/build/recipe/emailpassword/recipe.d.ts | 50 +- lib/build/recipe/emailpassword/types.d.ts | 411 +- lib/build/recipe/emailpassword/utils.d.ts | 45 +- .../recipe/emailpassword/validators.d.ts | 8 +- .../componentOverrideContext.d.ts | 15 +- .../features/emailVerification/index.d.ts | 22 +- .../themes/emailVerification/index.d.ts | 10 +- .../emailVerification/sendVerifyEmail.d.ts | 26 +- .../verifyEmailLinkClicked.d.ts | 26 +- .../components/themes/translations.d.ts | 80 +- .../recipe/emailverification/constants.d.ts | 2 +- .../emailVerificationClaim.d.ts | 12 +- .../emailverification/functionOverrides.d.ts | 10 +- lib/build/recipe/emailverification/index.d.ts | 109 +- .../recipe/emailverification/prebuiltui.d.ts | 150 +- .../recipe/emailverification/recipe.d.ts | 65 +- lib/build/recipe/emailverification/types.d.ts | 139 +- lib/build/recipe/emailverification/utils.d.ts | 4 +- .../componentOverrideContext.d.ts | 15 +- .../features/factorChooser/index.d.ts | 22 +- .../factorChooser/factorChooserFooter.d.ts | 8 +- .../factorChooser/factorChooserHeader.d.ts | 10 +- .../themes/factorChooser/factorList.d.ts | 12 +- .../themes/factorChooser/factorOption.d.ts | 16 +- .../themes/factorChooser/index.d.ts | 10 +- .../components/themes/themeBase.d.ts | 12 +- .../components/themes/translations.d.ts | 68 +- .../recipe/multifactorauth/constants.d.ts | 4 +- .../multifactorauth/functionOverrides.d.ts | 10 +- lib/build/recipe/multifactorauth/index.d.ts | 138 +- .../multifactorauth/multiFactorAuthClaim.d.ts | 84 +- .../recipe/multifactorauth/prebuiltui.d.ts | 134 +- lib/build/recipe/multifactorauth/recipe.d.ts | 110 +- lib/build/recipe/multifactorauth/types.d.ts | 196 +- lib/build/recipe/multifactorauth/utils.d.ts | 17 +- .../componentOverrideContext.d.ts | 15 +- .../dynamicLoginMethodsSpinner/index.d.ts | 6 +- .../dynamicLoginMethodsSpinner/index.d.ts | 8 +- .../components/themes/themeBase.d.ts | 12 +- .../dynamicLoginMethodsContext.d.ts | 28 +- lib/build/recipe/multitenancy/index.d.ts | 36 +- lib/build/recipe/multitenancy/recipe.d.ts | 48 +- lib/build/recipe/multitenancy/types.d.ts | 65 +- lib/build/recipe/multitenancy/utils.d.ts | 11 +- .../componentOverrideContext.d.ts | 15 +- .../features/oauth2LogoutScreen/index.d.ts | 22 +- .../features/tryRefreshPage/index.d.ts | 22 +- .../OAuth2LogoutScreenInner.d.ts | 10 +- .../themes/oauth2LogoutScreen/index.d.ts | 6 +- .../components/themes/themeBase.d.ts | 12 +- .../components/themes/translations.d.ts | 54 +- .../recipe/oauth2provider/constants.d.ts | 4 +- .../oauth2provider/functionOverrides.d.ts | 10 +- lib/build/recipe/oauth2provider/index.d.ts | 177 +- .../recipe/oauth2provider/prebuiltui.d.ts | 128 +- lib/build/recipe/oauth2provider/recipe.d.ts | 48 +- lib/build/recipe/oauth2provider/types.d.ts | 155 +- lib/build/recipe/oauth2provider/utils.d.ts | 4 +- .../componentOverrideContext.d.ts | 15 +- .../continueWithPasswordless/index.d.ts | 24 +- .../features/linkClickedScreen/index.d.ts | 24 +- .../components/features/linkSent/index.d.ts | 35 +- .../components/features/mfa/index.d.ts | 42 +- .../features/signInAndUp/index.d.ts | 40 +- .../features/signInAndUpEPCombo/index.d.ts | 40 +- .../features/userInputCode/index.d.ts | 38 +- .../continueWithPasswordless/index.d.ts | 14 +- .../themes/linkClickedScreen/index.d.ts | 4 +- .../components/themes/linkSent/index.d.ts | 24 +- .../components/themes/mfa/index.d.ts | 26 +- .../components/themes/mfa/loadingScreen.d.ts | 8 +- .../components/themes/mfa/mfaFooter.d.ts | 6 +- .../components/themes/mfa/mfaHeader.d.ts | 6 +- .../components/themes/mfa/mfaOTPFooter.d.ts | 6 +- .../components/themes/mfa/mfaOTPHeader.d.ts | 6 +- .../components/themes/signInUp/emailForm.d.ts | 12 +- .../themes/signInUp/emailOrPhoneForm.d.ts | 12 +- .../components/themes/signInUp/index.d.ts | 20 +- .../components/themes/signInUp/phoneForm.d.ts | 12 +- .../themes/signInUp/phoneNumberInput.d.ts | 28 +- .../themes/signInUp/resendButton.d.ts | 14 +- .../continueWithPasswordlessFooter.d.ts | 33 +- .../themes/signInUpEPCombo/emailForm.d.ts | 6 +- .../signInUpEPCombo/emailOrPhoneForm.d.ts | 6 +- .../themes/signInUpEPCombo/index.d.ts | 16 +- .../components/themes/themeBase.d.ts | 12 +- .../components/themes/translations.d.ts | 158 +- .../userInputCodeFormFooter.d.ts | 6 +- .../userInputCodeFormHeader.d.ts | 6 +- .../userInputCodeFormScreen.d.ts | 32 +- .../defaultPhoneNumberValidator.d.ts | 4 +- .../passwordless/functionOverrides.d.ts | 10 +- lib/build/recipe/passwordless/index.d.ts | 290 +- .../recipe/passwordless/phoneNumberUtils.d.ts | 4 +- lib/build/recipe/passwordless/prebuiltui.d.ts | 282 +- lib/build/recipe/passwordless/recipe.d.ts | 78 +- lib/build/recipe/passwordless/types.d.ts | 781 +- lib/build/recipe/passwordless/utils.d.ts | 6 +- lib/build/recipe/passwordless/validators.d.ts | 6 +- .../recipe/recipeModule/baseRecipeModule.d.ts | 19 +- lib/build/recipe/recipeModule/index.d.ts | 32 +- lib/build/recipe/recipeModule/types.d.ts | 86 +- lib/build/recipe/recipeModule/utils.d.ts | 4 +- lib/build/recipe/recipeRouter/index.d.ts | 37 +- .../session/componentOverrideContext.d.ts | 15 +- .../features/accessDeniedScreen/index.d.ts | 26 +- .../components/library/backButton.d.ts | 12 +- .../components/library/logoutButton.d.ts | 12 +- .../themes/accessDeniedScreenTheme/index.d.ts | 6 +- .../session/components/themes/themeBase.d.ts | 12 +- .../components/themes/translations.d.ts | 54 +- lib/build/recipe/session/index.d.ts | 213 +- lib/build/recipe/session/prebuiltui.d.ts | 144 +- lib/build/recipe/session/recipe.d.ts | 144 +- lib/build/recipe/session/sessionAuth.d.ts | 57 +- lib/build/recipe/session/sessionContext.d.ts | 14 +- lib/build/recipe/session/types.d.ts | 99 +- lib/build/recipe/session/useClaimValue.d.ts | 18 +- .../recipe/session/useSessionContext.d.ts | 6 +- lib/build/recipe/session/utils.d.ts | 34 +- .../thirdparty/componentOverrideContext.d.ts | 15 +- .../features/signInAndUp/index.d.ts | 38 +- .../features/signInAndUpCallback/index.d.ts | 22 +- .../components/library/providerButton.d.ts | 14 +- .../components/themes/signInAndUp/index.d.ts | 16 +- .../themes/signInAndUp/providersForm.d.ts | 24 +- .../themes/signInAndUpCallback/index.d.ts | 8 +- .../components/themes/themeBase.d.ts | 12 +- .../components/themes/translations.d.ts | 68 +- lib/build/recipe/thirdparty/constants.d.ts | 22 +- .../recipe/thirdparty/functionOverrides.d.ts | 11 +- lib/build/recipe/thirdparty/index.d.ts | 216 +- lib/build/recipe/thirdparty/prebuiltui.d.ts | 150 +- .../thirdparty/providers/activeDirectory.d.ts | 20 +- .../recipe/thirdparty/providers/apple.d.ts | 22 +- .../thirdparty/providers/bitbucket.d.ts | 20 +- .../recipe/thirdparty/providers/boxySaml.d.ts | 20 +- .../recipe/thirdparty/providers/custom.d.ts | 18 +- .../recipe/thirdparty/providers/discord.d.ts | 20 +- .../recipe/thirdparty/providers/facebook.d.ts | 20 +- .../recipe/thirdparty/providers/github.d.ts | 20 +- .../recipe/thirdparty/providers/gitlab.d.ts | 20 +- .../recipe/thirdparty/providers/google.d.ts | 20 +- .../providers/googleWorkspaces.d.ts | 20 +- .../recipe/thirdparty/providers/index.d.ts | 24 +- .../recipe/thirdparty/providers/linkedIn.d.ts | 20 +- .../recipe/thirdparty/providers/okta.d.ts | 20 +- .../recipe/thirdparty/providers/twitter.d.ts | 28 +- .../recipe/thirdparty/providers/types.d.ts | 72 +- lib/build/recipe/thirdparty/recipe.d.ts | 50 +- lib/build/recipe/thirdparty/types.d.ts | 150 +- lib/build/recipe/thirdparty/utils.d.ts | 60 +- .../recipe/totp/componentOverrideContext.d.ts | 15 +- .../totp/components/features/mfa/index.d.ts | 33 +- .../components/themes/mfa/blockedScreen.d.ts | 18 +- .../totp/components/themes/mfa/index.d.ts | 24 +- .../components/themes/mfa/loadingScreen.d.ts | 8 +- .../components/themes/mfa/retryButton.d.ts | 10 +- .../components/themes/mfa/totpCodeForm.d.ts | 18 +- .../mfa/totpCodeVerificationFooter.d.ts | 12 +- .../mfa/totpCodeVerificationHeader.d.ts | 14 +- .../themes/mfa/totpDeviceInfoSection.d.ts | 18 +- .../themes/mfa/totpDeviceSetupFooter.d.ts | 12 +- .../themes/mfa/totpDeviceSetupHeader.d.ts | 14 +- .../totp/components/themes/themeBase.d.ts | 12 +- .../totp/components/themes/translations.d.ts | 92 +- lib/build/recipe/totp/constants.d.ts | 2 +- lib/build/recipe/totp/functionOverrides.d.ts | 10 +- lib/build/recipe/totp/index.d.ts | 223 +- lib/build/recipe/totp/prebuiltui.d.ts | 158 +- lib/build/recipe/totp/recipe.d.ts | 60 +- lib/build/recipe/totp/types.d.ts | 286 +- lib/build/recipe/totp/utils.d.ts | 6 +- lib/build/recipe/userroles/index.d.ts | 14 +- lib/build/recipeModule-shared.js | 158 +- lib/build/session-shared.js | 8 +- lib/build/session.js | 515 +- lib/build/sessionprebuiltui.js | 475 +- lib/build/superTokens.d.ts | 105 +- lib/build/thirdparty-shared.js | 3033 ++-- lib/build/thirdparty.js | 256 +- lib/build/thirdpartyprebuiltui.js | 1188 +- lib/build/totp-shared.js | 455 +- lib/build/totp.js | 164 +- lib/build/totpprebuiltui.js | 6683 +++----- lib/build/translation/translationContext.d.ts | 29 +- lib/build/translation/translationHelpers.d.ts | 47 +- lib/build/translation/translations.d.ts | 48 +- lib/build/translationContext.js | 187 +- lib/build/types.d.ts | 429 +- lib/build/ui-entry.js | 57 +- lib/build/ui/index.d.ts | 135 +- lib/build/ui/types.d.ts | 41 +- lib/build/usercontext/index.d.ts | 16 +- lib/build/usercontext/userContextWrapper.d.ts | 12 +- lib/build/userroles.js | 31 +- lib/build/utils.d.ts | 123 +- lib/build/utils.js | 14035 +--------------- lib/build/version.d.ts | 2 +- lib/ts/nextjs/constants.ts | 13 + lib/ts/nextjs/middleware.ts | 296 + lib/ts/nextjs/ssr.ts | 249 + lib/ts/nextjs/types.ts | 75 + nextjs/middleware.d.ts | 25 + nextjs/middleware.js | 21 + nextjs/ssr.d.ts | 25 + nextjs/ssr.js | 21 + package-lock.json | 48 +- package.json | 1 + rollup.config.mjs | 2 + test/unit/nextjs/middleware.test.ts | 461 + test/unit/nextjs/ssr.test.ts | 409 + 392 files changed, 28103 insertions(+), 47883 deletions(-) create mode 100644 examples/with-next-ssr-app-directory/.env create mode 100644 examples/with-next-ssr-app-directory/.eslintrc.json create mode 100644 examples/with-next-ssr-app-directory/.gitignore create mode 100644 examples/with-next-ssr-app-directory/README.md create mode 100644 examples/with-next-ssr-app-directory/app/api/auth/[...path]/route.ts create mode 100644 examples/with-next-ssr-app-directory/app/api/user/route.ts create mode 100644 examples/with-next-ssr-app-directory/app/auth/[[...path]]/page.tsx create mode 100644 examples/with-next-ssr-app-directory/app/components/callApiButton.tsx create mode 100644 examples/with-next-ssr-app-directory/app/components/home.tsx create mode 100644 examples/with-next-ssr-app-directory/app/components/linksComponent.tsx create mode 100644 examples/with-next-ssr-app-directory/app/components/sessionAuthForNextJS.tsx create mode 100644 examples/with-next-ssr-app-directory/app/components/supertokensProvider.tsx create mode 100644 examples/with-next-ssr-app-directory/app/components/tryRefreshClientComponent.tsx create mode 100644 examples/with-next-ssr-app-directory/app/config/appInfo.ts create mode 100644 examples/with-next-ssr-app-directory/app/config/backend.ts create mode 100644 examples/with-next-ssr-app-directory/app/config/frontend.tsx create mode 100644 examples/with-next-ssr-app-directory/app/config/ssr.ts create mode 100644 examples/with-next-ssr-app-directory/app/favicon.ico create mode 100644 examples/with-next-ssr-app-directory/app/globals.css create mode 100644 examples/with-next-ssr-app-directory/app/layout.tsx create mode 100644 examples/with-next-ssr-app-directory/app/page.module.css create mode 100644 examples/with-next-ssr-app-directory/app/page.tsx create mode 100644 examples/with-next-ssr-app-directory/app/util.ts create mode 100644 examples/with-next-ssr-app-directory/assets/fonts/MenloRegular.ttf create mode 100644 examples/with-next-ssr-app-directory/assets/images/arrow-right-icon.svg create mode 100644 examples/with-next-ssr-app-directory/assets/images/background.png create mode 100644 examples/with-next-ssr-app-directory/assets/images/blogs-icon.svg create mode 100644 examples/with-next-ssr-app-directory/assets/images/celebrate-icon.svg create mode 100644 examples/with-next-ssr-app-directory/assets/images/guide-icon.svg create mode 100644 examples/with-next-ssr-app-directory/assets/images/index.ts create mode 100644 examples/with-next-ssr-app-directory/assets/images/separator-line.svg create mode 100644 examples/with-next-ssr-app-directory/assets/images/sign-out-icon.svg create mode 100644 examples/with-next-ssr-app-directory/middleware.ts create mode 100644 examples/with-next-ssr-app-directory/next.config.js create mode 100644 examples/with-next-ssr-app-directory/package.json create mode 100644 examples/with-next-ssr-app-directory/public/next.svg create mode 100644 examples/with-next-ssr-app-directory/public/vercel.svg create mode 100644 examples/with-next-ssr-app-directory/tsconfig.json create mode 100644 examples/with-next-ssr-pages-directory/.env create mode 100644 examples/with-next-ssr-pages-directory/.gitignore create mode 100644 examples/with-next-ssr-pages-directory/assets/fonts/MenloRegular.ttf create mode 100644 examples/with-next-ssr-pages-directory/assets/images/arrow-right-icon.svg create mode 100644 examples/with-next-ssr-pages-directory/assets/images/background.png create mode 100644 examples/with-next-ssr-pages-directory/assets/images/blogs-icon.svg create mode 100644 examples/with-next-ssr-pages-directory/assets/images/celebrate-icon.svg create mode 100644 examples/with-next-ssr-pages-directory/assets/images/guide-icon.svg create mode 100644 examples/with-next-ssr-pages-directory/assets/images/index.ts create mode 100644 examples/with-next-ssr-pages-directory/assets/images/separator-line.svg create mode 100644 examples/with-next-ssr-pages-directory/assets/images/sign-out-icon.svg create mode 100644 examples/with-next-ssr-pages-directory/config/appInfo.ts create mode 100644 examples/with-next-ssr-pages-directory/config/backendConfig.ts create mode 100644 examples/with-next-ssr-pages-directory/config/frontendConfig.tsx create mode 100644 examples/with-next-ssr-pages-directory/config/ssrConfig.ts create mode 100644 examples/with-next-ssr-pages-directory/middleware.ts create mode 100644 examples/with-next-ssr-pages-directory/next.config.js create mode 100644 examples/with-next-ssr-pages-directory/package.json create mode 100644 examples/with-next-ssr-pages-directory/pages/_app.tsx create mode 100644 examples/with-next-ssr-pages-directory/pages/api/auth/[[...path]].ts create mode 100644 examples/with-next-ssr-pages-directory/pages/api/user.ts create mode 100644 examples/with-next-ssr-pages-directory/pages/auth/[[...path]].tsx create mode 100644 examples/with-next-ssr-pages-directory/pages/index.tsx create mode 100644 examples/with-next-ssr-pages-directory/public/favicon.ico create mode 100644 examples/with-next-ssr-pages-directory/public/vercel.svg create mode 100644 examples/with-next-ssr-pages-directory/styles/Home.module.css create mode 100644 examples/with-next-ssr-pages-directory/styles/ProtectedHome.module.css create mode 100644 examples/with-next-ssr-pages-directory/styles/globals.css create mode 100644 examples/with-next-ssr-pages-directory/tsconfig.json create mode 100644 lib/build/constants.js create mode 100644 lib/build/logger.js create mode 100644 lib/build/nextjs/constants.d.ts create mode 100644 lib/build/nextjs/middleware.d.ts create mode 100644 lib/build/nextjs/ssr.d.ts create mode 100644 lib/build/nextjs/types.d.ts create mode 100644 lib/build/nextjsmiddleware.js create mode 100644 lib/build/nextjsssr.js create mode 100644 lib/ts/nextjs/constants.ts create mode 100644 lib/ts/nextjs/middleware.ts create mode 100644 lib/ts/nextjs/ssr.ts create mode 100644 lib/ts/nextjs/types.ts create mode 100644 nextjs/middleware.d.ts create mode 100644 nextjs/middleware.js create mode 100644 nextjs/ssr.d.ts create mode 100644 nextjs/ssr.js create mode 100644 test/unit/nextjs/middleware.test.ts create mode 100644 test/unit/nextjs/ssr.test.ts diff --git a/examples/with-next-ssr-app-directory/.env b/examples/with-next-ssr-app-directory/.env new file mode 100644 index 000000000..4aa149a95 --- /dev/null +++ b/examples/with-next-ssr-app-directory/.env @@ -0,0 +1,5 @@ +NEXT_PUBLIC_SUPERTOKENS_APP_NAME=test +NEXT_PUBLIC_SUPERTOKENS_API_DOMAIN=http://localhost:3000 +NEXT_PUBLIC_SUPERTOKENS_WEBSITE_DOMAIN=http://localhost:3000 +NEXT_PUBLIC_SUPERTOKENS_API_BASE_PATH=/api/auth +NEXT_PUBLIC_SUPERTOKENS_WEBSITE_BASE_PATH=/auth diff --git a/examples/with-next-ssr-app-directory/.eslintrc.json b/examples/with-next-ssr-app-directory/.eslintrc.json new file mode 100644 index 000000000..1c2aa65d7 --- /dev/null +++ b/examples/with-next-ssr-app-directory/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/examples/with-next-ssr-app-directory/.gitignore b/examples/with-next-ssr-app-directory/.gitignore new file mode 100644 index 000000000..d22ad7987 --- /dev/null +++ b/examples/with-next-ssr-app-directory/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# VSCode +.vscode diff --git a/examples/with-next-ssr-app-directory/README.md b/examples/with-next-ssr-app-directory/README.md new file mode 100644 index 000000000..f552de67b --- /dev/null +++ b/examples/with-next-ssr-app-directory/README.md @@ -0,0 +1,42 @@ +# SuperTokens App with Next.js app directory + +This is a simple application that is protected by SuperTokens. This app uses the Next.js app directory. + +## How to use + +### Using `create-next-app` + +- Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init), [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/), or [pnpm](https://pnpm.io) to bootstrap the example: + +```bash +npx create-next-app --example with-supertokens with-supertokens-app +``` + +```bash +yarn create next-app --example with-supertokens with-supertokens-app +``` + +```bash +pnpm create next-app --example with-supertokens with-supertokens-app +``` + +- Run `yarn install` + +- Run `npm run dev` to start the application on `http://localhost:3000`. + +### Using `create-supertokens-app` + +- Run the following command + +```bash +npx create-supertokens-app@latest --frontend=next +``` + +- Select the option to use the app directory + +Follow the instructions after `create-supertokens-app` has finished + +## Notes + +- To know more about how this app works and to learn how to customise it based on your use cases refer to the [SuperTokens Documentation](https://supertokens.com/docs/guides) +- We have provided development OAuth keys for the various built-in third party providers in the `/app/config/backend.ts` file. Feel free to use them for development purposes, but **please create your own keys for production use**. diff --git a/examples/with-next-ssr-app-directory/app/api/auth/[...path]/route.ts b/examples/with-next-ssr-app-directory/app/api/auth/[...path]/route.ts new file mode 100644 index 000000000..a6ed0b8de --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/api/auth/[...path]/route.ts @@ -0,0 +1,161 @@ +import { getAppDirRequestHandler } from "supertokens-node/nextjs"; +import Session, { refreshSessionWithoutRequestResponse } from "supertokens-node/recipe/session"; +import { NextRequest, NextResponse } from "next/server"; +import { ensureSuperTokensInit } from "../../../config/backend"; +import { cookies } from "next/headers"; + +ensureSuperTokensInit(); + +const handleCall = getAppDirRequestHandler(); + +// input +// { refreshSessionWithoutRequestResponse } +// async function +// + +export async function GET(request: NextRequest) { + if (request.method === "GET" && request.url.includes("/session/refresh")) { + return refreshSession(request); + } + const res = await handleCall(request); + if (!res.headers.has("Cache-Control")) { + // This is needed for production deployments with Vercel + res.headers.set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate"); + } + return res; +} + +export async function POST(request: NextRequest) { + return handleCall(request); +} + +export async function DELETE(request: NextRequest) { + return handleCall(request); +} + +export async function PUT(request: NextRequest) { + return handleCall(request); +} + +export async function PATCH(request: NextRequest) { + return handleCall(request); +} + +export async function HEAD(request: NextRequest) { + return handleCall(request); +} + +const refreshTokenCookieName = "sRefreshToken"; +const refreshTokenHeaderName = "st-refresh-token"; +async function refreshSession(request: NextRequest) { + console.log("Attempting session refresh"); + const cookiesFromReq = await cookies(); + + const refreshToken = + request.cookies.get(refreshTokenCookieName)?.value || request.headers.get(refreshTokenHeaderName); + if (!refreshToken) { + return NextResponse.redirect(new URL("/auth", request.url)); + } + + const redirectTo = new URL("/", request.url); + + try { + const refreshResponse = await fetch(`http://localhost:3000/api/auth/session/refresh`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Cookie: `sRefreshToken=${refreshToken}`, + }, + credentials: "include", + }); + // console.log("Performed session refresh request"); + // console.log(refreshResponse); + // console.log(refreshResponse.headers); + // console.log(await refreshResponse.text()); + + const setCookieHeaders = refreshResponse.headers.getSetCookie(); + const frontToken = refreshResponse.headers.get("front-token"); + if (!frontToken) { + return NextResponse.redirect(new URL("/auth", request.url)); + } + + // TODO: Check for csrf token + if (!setCookieHeaders.length) { + return NextResponse.redirect(new URL("/auth", request.url)); + } + + const response = NextResponse.redirect(redirectTo); + let sAccessToken: string | null = null; + let sRefreshToken: string | null = null; + for (const header of setCookieHeaders) { + if (header.includes("sAccessToken")) { + const match = header.match(/sAccessToken=([^;]+)/); + sAccessToken = match ? match[1] : null; + } + if (header.includes("sRefreshToken")) { + const match = header.match(/sRefreshToken=([^;]+)/); + sRefreshToken = match ? match[1] : null; + } + response.headers.append("set-cookie", header); + } + + response.headers.append("set-cookie", `sFrontToken=${frontToken}`); + response.headers.append("front-token", frontToken); + response.headers.append("frontToken", frontToken); + if (sAccessToken) { + response.headers.append("sAccessToken", sAccessToken); + + cookiesFromReq.set("sAccessToken", sAccessToken); + } + if (sRefreshToken) { + response.headers.append("sRefreshToken", sRefreshToken); + + cookiesFromReq.set("sRefreshToken", sRefreshToken); + } + + cookiesFromReq.set("sFrontToken", frontToken); + + // console.log(sAccessToken, sRefreshToken); + + return response; + } catch (err) { + console.error("Error refreshing session"); + console.error(err); + return NextResponse.redirect(new URL("/auth", request.url)); + } +} + +// async function saveTokensFromHeaders(response: Response) { +// logDebugMessage("saveTokensFromHeaders: Saving updated tokens from the response headers"); +// +// const refreshToken = response.headers.get("st-refresh-token"); +// if (refreshToken !== null) { +// logDebugMessage("saveTokensFromHeaders: saving new refresh token"); +// await setToken("refresh", refreshToken); +// } +// +// const accessToken = response.headers.get("st-access-token"); +// if (accessToken !== null) { +// logDebugMessage("saveTokensFromHeaders: saving new access token"); +// await setToken("access", accessToken); +// } +// +// const frontToken = response.headers.get("front-token"); +// if (frontToken !== null) { +// logDebugMessage("saveTokensFromHeaders: Setting sFrontToken: " + frontToken); +// await FrontToken.setItem(frontToken); +// updateClockSkewUsingFrontToken({ frontToken, responseHeaders: response.headers }); +// } +// const antiCsrfToken = response.headers.get("anti-csrf"); +// if (antiCsrfToken !== null) { +// // At this point, the session has either been newly created or refreshed. +// // Thus, there's no need to call getLocalSessionState with tryRefresh: true. +// // Calling getLocalSessionState with tryRefresh: true will cause a refresh loop +// // if cookie writes are disabled. +// const tok = await getLocalSessionState(false); +// if (tok.status === "EXISTS") { +// logDebugMessage("saveTokensFromHeaders: Setting anti-csrf token"); +// await AntiCsrfToken.setItem(tok.lastAccessTokenUpdate, antiCsrfToken); +// } +// } +// } diff --git a/examples/with-next-ssr-app-directory/app/api/user/route.ts b/examples/with-next-ssr-app-directory/app/api/user/route.ts new file mode 100644 index 000000000..c052e571f --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/api/user/route.ts @@ -0,0 +1,23 @@ +import { ensureSuperTokensInit } from "@/app/config/backend"; +import { NextResponse, NextRequest } from "next/server"; +import { withSession } from "supertokens-node/nextjs"; + +ensureSuperTokensInit(); + +export function GET(request: NextRequest) { + return withSession(request, async (err, session) => { + if (err) { + return NextResponse.json(err, { status: 500 }); + } + if (!session) { + return new NextResponse("Authentication required", { status: 401 }); + } + + return NextResponse.json({ + note: "Fetch any data from your application for authenticated user after using verifySession middleware", + userId: session.getUserId(), + sessionHandle: session.getHandle(), + accessTokenPayload: session.getAccessTokenPayload(), + }); + }); +} diff --git a/examples/with-next-ssr-app-directory/app/auth/[[...path]]/page.tsx b/examples/with-next-ssr-app-directory/app/auth/[[...path]]/page.tsx new file mode 100644 index 000000000..ab603bd1e --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/auth/[[...path]]/page.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { redirectToAuth } from "supertokens-auth-react"; +import SuperTokens from "supertokens-auth-react/ui"; +import { PreBuiltUIList } from "../../config/frontend"; + +export default function Auth() { + // if the user visits a page that is not handled by us (like /auth/random), then we redirect them back to the auth page. + const [loaded, setLoaded] = useState(false); + + console.log("running this"); + + useEffect(() => { + if (SuperTokens.canHandleRoute(PreBuiltUIList) === false) { + redirectToAuth({ redirectBack: false }); + } else { + setLoaded(true); + } + }, []); + + if (loaded) { + return SuperTokens.getRoutingComponent(PreBuiltUIList); + } + + return null; +} diff --git a/examples/with-next-ssr-app-directory/app/components/callApiButton.tsx b/examples/with-next-ssr-app-directory/app/components/callApiButton.tsx new file mode 100644 index 000000000..cd3aa30bb --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/components/callApiButton.tsx @@ -0,0 +1,17 @@ +"use client"; + +import styles from "../page.module.css"; + +export const CallAPIButton = () => { + const fetchUserData = async () => { + const userInfoResponse = await fetch("http://localhost:3000/api/user"); + + alert(JSON.stringify(await userInfoResponse.json())); + }; + + return ( +
+ Call API +
+ ); +}; diff --git a/examples/with-next-ssr-app-directory/app/components/home.tsx b/examples/with-next-ssr-app-directory/app/components/home.tsx new file mode 100644 index 000000000..f32343fb2 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/components/home.tsx @@ -0,0 +1,43 @@ +import { cookies, headers } from "next/headers"; +import styles from "../page.module.css"; +import { redirect } from "next/navigation"; +import Image from "next/image"; +import { CelebrateIcon, SeparatorLine } from "../../assets/images"; +import { CallAPIButton } from "./callApiButton"; +import { LinksComponent } from "./linksComponent"; +import { SessionAuthForNextJS } from "./sessionAuthForNextJS"; + +import { getSSRSession, init } from "supertokens-auth-react/nextjs/ssr"; +import { ssrConfig } from "../config/ssr"; + +init(ssrConfig()); + +export async function HomePage() { + const cookiesStore = await cookies(); + const session = await getSSRSession(cookiesStore, redirect); + console.log(session); + + /** + * SessionAuthForNextJS will handle proper redirection for the user based on the different session states. + * It will redirect to the login page if the session does not exist etc. + */ + return ( + +
+
+
+ Login successful Login + successful +
+
+
Your userID is:
+
{session.userId}
+ +
+
+ + separator +
+
+ ); +} diff --git a/examples/with-next-ssr-app-directory/app/components/linksComponent.tsx b/examples/with-next-ssr-app-directory/app/components/linksComponent.tsx new file mode 100644 index 000000000..2c29291d8 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/components/linksComponent.tsx @@ -0,0 +1,64 @@ +"use client"; +import styles from "../page.module.css"; +import { BlogsIcon, GuideIcon, SignOutIcon } from "../../assets/images"; +import { recipeDetails } from "../config/frontend"; +import Link from "next/link"; +import Image from "next/image"; +import Session from "supertokens-auth-react/recipe/session"; +import SuperTokens from "supertokens-auth-react"; + +const SignOutLink = (props: { name: string; link: string; icon: string }) => { + return ( +
{ + await Session.signOut(); + SuperTokens.redirectToAuth(); + }} + > + {props.name} +
{props.name}
+
+ ); +}; + +export const LinksComponent = () => { + const links: { + name: string; + link: string; + icon: string; + }[] = [ + { + name: "Blogs", + link: "https://supertokens.com/blog", + icon: BlogsIcon, + }, + { + name: "Guides", + link: recipeDetails.docsLink, + icon: GuideIcon, + }, + { + name: "Sign Out", + link: "", + icon: SignOutIcon, + }, + ]; + + return ( +
+ {links.map((link) => { + if (link.name === "Sign Out") { + return ; + } + + return ( + + {link.name} +
{link.name}
+ + ); + })} +
+ ); +}; diff --git a/examples/with-next-ssr-app-directory/app/components/sessionAuthForNextJS.tsx b/examples/with-next-ssr-app-directory/app/components/sessionAuthForNextJS.tsx new file mode 100644 index 000000000..721aff640 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/components/sessionAuthForNextJS.tsx @@ -0,0 +1,19 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import { SessionAuth } from "supertokens-auth-react/recipe/session"; + +type Props = Parameters[0] & { + children?: React.ReactNode | undefined; +}; + +export const SessionAuthForNextJS = (props: Props) => { + const [loaded, setLoaded] = useState(false); + useEffect(() => { + setLoaded(true); + }, []); + if (!loaded) { + return props.children; + } + return {props.children}; +}; diff --git a/examples/with-next-ssr-app-directory/app/components/supertokensProvider.tsx b/examples/with-next-ssr-app-directory/app/components/supertokensProvider.tsx new file mode 100644 index 000000000..c0a0c7a89 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/components/supertokensProvider.tsx @@ -0,0 +1,18 @@ +"use client"; +import React from "react"; +import { SuperTokensWrapper } from "supertokens-auth-react"; +import SuperTokensReact from "supertokens-auth-react"; +import { frontendConfig, setRouter } from "../config/frontend"; +import { usePathname, useRouter } from "next/navigation"; + +if (typeof window !== "undefined") { + // we only want to call this init function on the frontend, so we check typeof window !== 'undefined' + SuperTokensReact.init(frontendConfig()); +} else { +} + +export const SuperTokensProvider: React.FC> = ({ children }) => { + setRouter(useRouter(), usePathname() || window.location.pathname); + + return {children}; +}; diff --git a/examples/with-next-ssr-app-directory/app/components/tryRefreshClientComponent.tsx b/examples/with-next-ssr-app-directory/app/components/tryRefreshClientComponent.tsx new file mode 100644 index 000000000..2c8b0f1d8 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/components/tryRefreshClientComponent.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import Session from "supertokens-auth-react/recipe/session"; +import SuperTokens from "supertokens-auth-react"; + +export const TryRefreshComponent = () => { + const router = useRouter(); + const [didError, setDidError] = useState(false); + + useEffect(() => { + void Session.attemptRefreshingSession() + .then((hasSession) => { + if (hasSession) { + router.refresh(); + } else { + SuperTokens.redirectToAuth(); + } + }) + .catch(() => { + setDidError(true); + }); + }, [router]); + + if (didError) { + return
Something went wrong, please reload the page
; + } + + return
Loading...
; +}; diff --git a/examples/with-next-ssr-app-directory/app/config/appInfo.ts b/examples/with-next-ssr-app-directory/app/config/appInfo.ts new file mode 100644 index 000000000..a1927699b --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/config/appInfo.ts @@ -0,0 +1,7 @@ +export const appInfo = { + appName: "SuperTokens Next.js demo app", + apiDomain: "http://localhost:3333", + websiteDomain: "http://localhost:3333", + apiBasePath: "/api/auth", + websiteBasePath: "/auth", +}; diff --git a/examples/with-next-ssr-app-directory/app/config/backend.ts b/examples/with-next-ssr-app-directory/app/config/backend.ts new file mode 100644 index 000000000..1fcfda30e --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/config/backend.ts @@ -0,0 +1,101 @@ +import EmailPasswordNode from "supertokens-node/recipe/emailpassword"; +import ThirdPartyNode from "supertokens-node/recipe/thirdparty"; +import PasswordlessNode from "supertokens-node/recipe/passwordless"; +import SessionNode from "supertokens-node/recipe/session"; +import Dashboard from "supertokens-node/recipe/dashboard"; +import UserRoles from "supertokens-node/recipe/userroles"; +import { appInfo } from "./appInfo"; +import { TypeInput } from "supertokens-node/types"; +import SuperTokens from "supertokens-node"; + +export let backendConfig = (): TypeInput => { + return { + // debug: true, + supertokens: { + // this is the location of the SuperTokens core. + connectionURI: "https://st-dev-bc3c6f90-79ba-11ef-ab9e-9bd286159eeb.aws.supertokens.io", + apiKey: "e9zZOI7yJ0-G6gms7iGKZ17Pb-", + }, + appInfo, + // recipeList contains all the modules that you want to + // use from SuperTokens. See the full list here: https://supertokens.com/docs/guides + recipeList: [ + EmailPasswordNode.init(), + ThirdPartyNode.init({ + signInAndUpFeature: { + providers: [ + // We have provided you with development keys which you can use for testing. + // IMPORTANT: Please replace them with your own OAuth keys for production use. + { + config: { + thirdPartyId: "google", + clients: [ + { + clientId: + "1060725074195-kmeum4crr01uirfl2op9kd5acmi9jutn.apps.googleusercontent.com", + clientSecret: "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", + }, + ], + }, + }, + { + config: { + thirdPartyId: "github", + clients: [ + { + clientId: "467101b197249757c71f", + clientSecret: "e97051221f4b6426e8fe8d51486396703012f5bd", + }, + ], + }, + }, + { + config: { + thirdPartyId: "apple", + clients: [ + { + clientId: "4398792-io.supertokens.example.service", + additionalConfig: { + keyId: "7M48Y4RYDL", + privateKey: + "-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgu8gXs+XYkqXD6Ala9Sf/iJXzhbwcoG5dMh1OonpdJUmgCgYIKoZIzj0DAQehRANCAASfrvlFbFCYqn3I2zeknYXLwtH30JuOKestDbSfZYxZNMqhF/OzdZFTV0zc5u5s3eN+oCWbnvl0hM+9IW0UlkdA\n-----END PRIVATE KEY-----", + teamId: "YWQCXGJRJL", + }, + }, + ], + }, + }, + { + config: { + thirdPartyId: "twitter", + clients: [ + { + clientId: "4398792-WXpqVXRiazdRMGNJdEZIa3RVQXc6MTpjaQ", + clientSecret: "BivMbtwmcygbRLNQ0zk45yxvW246tnYnTFFq-LH39NwZMxFpdC", + }, + ], + }, + }, + ], + }, + }), + PasswordlessNode.init({ + contactMethod: "EMAIL_OR_PHONE", + flowType: "USER_INPUT_CODE_AND_MAGIC_LINK", + }), + SessionNode.init(), + Dashboard.init(), + UserRoles.init(), + ], + isInServerlessEnv: true, + framework: "custom", + }; +}; + +let initialized = false; +export function ensureSuperTokensInit() { + if (!initialized) { + SuperTokens.init(backendConfig()); + initialized = true; + } +} diff --git a/examples/with-next-ssr-app-directory/app/config/frontend.tsx b/examples/with-next-ssr-app-directory/app/config/frontend.tsx new file mode 100644 index 000000000..899a2bb6a --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/config/frontend.tsx @@ -0,0 +1,57 @@ +import EmailPasswordReact from "supertokens-auth-react/recipe/emailpassword"; +import ThirdPartyReact from "supertokens-auth-react/recipe/thirdparty"; +import PasswordlessReact from "supertokens-auth-react/recipe/passwordless"; +import Session from "supertokens-auth-react/recipe/session"; +import { appInfo } from "./appInfo"; +import { useRouter } from "next/navigation"; +import { SuperTokensConfig } from "supertokens-auth-react/lib/build/types"; +import { ThirdPartyPreBuiltUI } from "supertokens-auth-react/recipe/thirdparty/prebuiltui"; +import { PasswordlessPreBuiltUI } from "supertokens-auth-react/recipe/passwordless/prebuiltui"; +import { EmailPasswordPreBuiltUI } from "supertokens-auth-react/recipe/emailpassword/prebuiltui"; + +const routerInfo: { router?: ReturnType; pathName?: string } = {}; + +export function setRouter(router: ReturnType, pathName: string) { + routerInfo.router = router; + routerInfo.pathName = pathName; +} + +export const frontendConfig = (): SuperTokensConfig => { + return { + appInfo, + enableDebugLogs: true, + recipeList: [ + EmailPasswordReact.init(), + ThirdPartyReact.init({ + signInAndUpFeature: { + providers: [ + ThirdPartyReact.Github.init(), + ThirdPartyReact.Google.init(), + ThirdPartyReact.Apple.init(), + ], + }, + }), + PasswordlessReact.init({ + contactMethod: "EMAIL_OR_PHONE", + }), + Session.init(), + ], + windowHandler: (orig) => { + return { + ...orig, + location: { + ...orig.location, + getPathName: () => routerInfo.pathName!, + assign: (url) => routerInfo.router!.push(url.toString()), + setHref: (url) => routerInfo.router!.push(url.toString()), + }, + }; + }, + }; +}; + +export const recipeDetails = { + docsLink: "https://supertokens.com/docs/thirdpartypasswordless/introduction", +}; + +export const PreBuiltUIList = [EmailPasswordPreBuiltUI, ThirdPartyPreBuiltUI, PasswordlessPreBuiltUI]; diff --git a/examples/with-next-ssr-app-directory/app/config/ssr.ts b/examples/with-next-ssr-app-directory/app/config/ssr.ts new file mode 100644 index 000000000..c6bc60a61 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/config/ssr.ts @@ -0,0 +1,10 @@ +import { appInfo } from "./appInfo"; +import { SuperTokensConfig } from "supertokens-auth-react/lib/build/types"; + +export const ssrConfig = (): SuperTokensConfig => { + return { + appInfo, + enableDebugLogs: true, + recipeList: [], + }; +}; diff --git a/examples/with-next-ssr-app-directory/app/favicon.ico b/examples/with-next-ssr-app-directory/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/examples/with-next-ssr-app-directory/app/globals.css b/examples/with-next-ssr-app-directory/app/globals.css new file mode 100644 index 000000000..34d61c0ff --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/globals.css @@ -0,0 +1,3 @@ +html { + height: 100%; +} diff --git a/examples/with-next-ssr-app-directory/app/layout.tsx b/examples/with-next-ssr-app-directory/app/layout.tsx new file mode 100644 index 000000000..fd4996f9f --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/layout.tsx @@ -0,0 +1,21 @@ +import "./globals.css"; +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import { SuperTokensProvider } from "./components/supertokensProvider"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "SuperTokens 💫", + description: "SuperTokens demo app", +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + {children} + + + ); +} diff --git a/examples/with-next-ssr-app-directory/app/page.module.css b/examples/with-next-ssr-app-directory/app/page.module.css new file mode 100644 index 000000000..e63fa0f16 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/page.module.css @@ -0,0 +1,214 @@ +.main { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 100vh; +} + +@font-face { + font-family: Menlo; + src: url("../assets/fonts/MenloRegular.ttf"); +} + +.appContainer { + font-family: Rubik, sans-serif; +} + +.appContainer * { + box-sizing: border-box; +} + +.bold400 { + font-variation-settings: "wght" 400; +} + +.bold500 { + font-variation-settings: "wght" 500; +} + +.bold600 { + font-variation-settings: "wght" 600; +} + +.homeContainer { + min-height: 100vh; + min-width: 100vw; + background: url("../assets/images/background.png"); + background-size: cover; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.bold700 { + font-variation-settings: "wght" 700; +} + +.mainContainer { + box-shadow: 0px 0px 60px 0px rgba(0, 0, 0, 0.16); + width: min(635px, calc(100% - 24px)); + border-radius: 16px; + margin-block-end: 159px; + background-color: #ffffff; +} + +.successTitle { + line-height: 1; + padding-block: 26px; + background-color: #e7ffed; + text-align: center; + color: #3eb655; + display: flex; + justify-content: center; + align-items: flex-end; + font-size: 20px; +} + +.successIcon { + margin-right: 8px; +} + +.innerContent { + padding-block: 48px; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; +} + +.userId { + position: relative; + padding: 14px 17px; + border-image-slice: 1; + width: min(430px, calc(100% - 30px)); + margin-inline: auto; + margin-block: 11px 23px; + border-radius: 9px; + line-height: 1; + font-family: Menlo, serif; + cursor: text; +} + +.userId:before { + content: ""; + position: absolute; + inset: 0; + border-radius: 9px; + padding: 2px; + background: linear-gradient(90.31deg, #ff9933 0.11%, #ff3f33 99.82%); + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; +} + +.topBand, +.bottomBand { + border-radius: inherit; +} + +.topBand { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.bottomBand { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.sessionButton { + padding-left: 13px; + padding-right: 13px; + padding-top: 8px; + padding-bottom: 8px; + cursor: pointer; + color: white; + font-weight: bold; + font-size: 17px; + + box-sizing: border-box; + background: #ff9933; + border: 1px solid #ff8a15; + box-shadow: 0px 3px 6px rgba(255, 153, 51, 0.16); + border-radius: 6px; + font-size: 16px; +} + +.bottomCTAContainer { + display: flex; + justify-content: flex-end; + padding-inline: 21px; + background-color: #212d4f; +} + +.viewCode { + padding-block: 11px; + color: #bac9f5; + cursor: pointer; + font-size: 14px; +} + +.bottomLinksContainer { + display: grid; + grid-template-columns: repeat(4, auto); + margin-bottom: 22px; +} + +.linksContainerLink { + display: flex; + align-items: center; + margin-inline-end: 68px; + cursor: pointer; + text-decoration: none; + color: #000000; +} + +.linksContainerLink:last-child { + margin-right: 0; +} + +.truncate { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.separatorLine { + max-width: 100%; +} + +.linkIcon { + width: 15px; + margin-right: 5px; +} + +@media screen and (max-width: 768px) { + .bottomLinksContainer { + grid-template-columns: repeat(2, 1fr); + column-gap: 64px; + row-gap: 34px; + } + + .linksContainerLink { + margin-inline-end: 0; + } + + .separatorLine { + max-width: 200px; + } +} + +@media screen and (max-width: 480px) { + .homeContainer { + justify-content: start; + padding-block-start: 25px; + } + + .mainContainer { + margin-block-end: 90px; + } +} diff --git a/examples/with-next-ssr-app-directory/app/page.tsx b/examples/with-next-ssr-app-directory/app/page.tsx new file mode 100644 index 000000000..8d9b991c4 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/page.tsx @@ -0,0 +1,10 @@ +import { HomePage } from "./components/home"; +import styles from "./page.module.css"; + +export default function Home() { + return ( +
+ +
+ ); +} diff --git a/examples/with-next-ssr-app-directory/app/util.ts b/examples/with-next-ssr-app-directory/app/util.ts new file mode 100644 index 000000000..289a6d5c2 --- /dev/null +++ b/examples/with-next-ssr-app-directory/app/util.ts @@ -0,0 +1,31 @@ +import JsonWebToken from "jsonwebtoken"; +import type { JwtHeader, JwtPayload, SigningKeyCallback } from "jsonwebtoken"; +import jwksClient from "jwks-rsa"; +import { appInfo } from "./config/appInfo"; + +const client = jwksClient({ + jwksUri: `${appInfo.apiDomain}${appInfo.apiBasePath}/jwt/jwks.json`, +}); + +async function verifyToken(token: string): Promise { + const getPublicKey = (header: JwtHeader, callback: SigningKeyCallback) => { + client.getSigningKey(header.kid, (err, key) => { + if (err) { + callback(err); + } else { + const signingKey = key?.getPublicKey(); + callback(null, signingKey); + } + }); + }; + + return new Promise((resolve, reject) => { + JsonWebToken.verify(token, getPublicKey, {}, (err, decoded) => { + if (err) { + reject(err); + } else { + resolve(decoded as JwtPayload); + } + }); + }); +} diff --git a/examples/with-next-ssr-app-directory/assets/fonts/MenloRegular.ttf b/examples/with-next-ssr-app-directory/assets/fonts/MenloRegular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..033dc6d21241618fcc5dfd40f70a2943f7e3a36f GIT binary patch literal 475160 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�-hq}v4-RV%bJJf9swK~(& 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


^7@wrJ=g$3Fo`?)gAC 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 aw!g3k3*Lpkl3$0Pe{C4|7XAO4+Wc>4`DVKS literal 0 HcmV?d00001 diff --git a/examples/with-next-ssr-app-directory/assets/images/arrow-right-icon.svg b/examples/with-next-ssr-app-directory/assets/images/arrow-right-icon.svg new file mode 100644 index 000000000..95aa1fec6 --- /dev/null +++ b/examples/with-next-ssr-app-directory/assets/images/arrow-right-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-app-directory/assets/images/background.png b/examples/with-next-ssr-app-directory/assets/images/background.png new file mode 100644 index 0000000000000000000000000000000000000000..2147c15c2b1fe01142b0a89ae1d478375610db66 GIT binary patch literal 70254 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

    9EIan`0#%EiL^9{& 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 W`=$8T4Ud5j!+nrema3983j9Cd$)#Zc literal 0 HcmV?d00001 diff --git a/examples/with-next-ssr-app-directory/assets/images/blogs-icon.svg b/examples/with-next-ssr-app-directory/assets/images/blogs-icon.svg new file mode 100644 index 000000000..a2fc9dd62 --- /dev/null +++ b/examples/with-next-ssr-app-directory/assets/images/blogs-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-app-directory/assets/images/celebrate-icon.svg b/examples/with-next-ssr-app-directory/assets/images/celebrate-icon.svg new file mode 100644 index 000000000..3b40b1efa --- /dev/null +++ b/examples/with-next-ssr-app-directory/assets/images/celebrate-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/examples/with-next-ssr-app-directory/assets/images/guide-icon.svg b/examples/with-next-ssr-app-directory/assets/images/guide-icon.svg new file mode 100644 index 000000000..bd85af72b --- /dev/null +++ b/examples/with-next-ssr-app-directory/assets/images/guide-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-app-directory/assets/images/index.ts b/examples/with-next-ssr-app-directory/assets/images/index.ts new file mode 100644 index 000000000..7adf036c4 --- /dev/null +++ b/examples/with-next-ssr-app-directory/assets/images/index.ts @@ -0,0 +1,8 @@ +import SeparatorLine from "./separator-line.svg"; +import ArrowRight from "./arrow-right-icon.svg"; +import SignOutIcon from "./sign-out-icon.svg"; +import GuideIcon from "./guide-icon.svg"; +import BlogsIcon from "./blogs-icon.svg"; +import CelebrateIcon from "./celebrate-icon.svg"; + +export { SeparatorLine, ArrowRight, SignOutIcon, GuideIcon, BlogsIcon, CelebrateIcon }; diff --git a/examples/with-next-ssr-app-directory/assets/images/separator-line.svg b/examples/with-next-ssr-app-directory/assets/images/separator-line.svg new file mode 100644 index 000000000..7127a00dc --- /dev/null +++ b/examples/with-next-ssr-app-directory/assets/images/separator-line.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/examples/with-next-ssr-app-directory/assets/images/sign-out-icon.svg b/examples/with-next-ssr-app-directory/assets/images/sign-out-icon.svg new file mode 100644 index 000000000..6cc4f85fd --- /dev/null +++ b/examples/with-next-ssr-app-directory/assets/images/sign-out-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-app-directory/middleware.ts b/examples/with-next-ssr-app-directory/middleware.ts new file mode 100644 index 000000000..b68939327 --- /dev/null +++ b/examples/with-next-ssr-app-directory/middleware.ts @@ -0,0 +1,14 @@ +import { withSession } from "supertokens-node/nextjs"; +import { ensureSuperTokensInit } from "./app/config/backend"; +import { ssrConfig } from "./app/config/ssr"; +import { superTokensMiddleware } from "supertokens-auth-react/nextjs/middleware"; + +ensureSuperTokensInit(); + +export default superTokensMiddleware(ssrConfig(), withSession); + +export const config = { + matcher: [ + "/((?!_next/static|_next/image|favicon.ico|robots.txt|sitemap.xml|manifest.json|sw.js|workbox-|public/).*)", + ], +}; diff --git a/examples/with-next-ssr-app-directory/next.config.js b/examples/with-next-ssr-app-directory/next.config.js new file mode 100644 index 000000000..658404ac6 --- /dev/null +++ b/examples/with-next-ssr-app-directory/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +module.exports = nextConfig; diff --git a/examples/with-next-ssr-app-directory/package.json b/examples/with-next-ssr-app-directory/package.json new file mode 100644 index 000000000..a282a2c72 --- /dev/null +++ b/examples/with-next-ssr-app-directory/package.json @@ -0,0 +1,29 @@ +{ + "name": "supertokens-app-dir", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev -p 3333", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "jsonwebtoken": "^9.0.2", + "jwks-rsa": "^3.1.0", + "next": "latest", + "react": "^18", + "react-dom": "^18", + "supertokens-auth-react": "latest", + "supertokens-node": "latest" + }, + "devDependencies": { + "@types/cookie": "^0.5.2", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "13.5.4", + "typescript": "^5" + } +} diff --git a/examples/with-next-ssr-app-directory/public/next.svg b/examples/with-next-ssr-app-directory/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/examples/with-next-ssr-app-directory/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/with-next-ssr-app-directory/public/vercel.svg b/examples/with-next-ssr-app-directory/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/examples/with-next-ssr-app-directory/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/with-next-ssr-app-directory/tsconfig.json b/examples/with-next-ssr-app-directory/tsconfig.json new file mode 100644 index 000000000..c265b30bb --- /dev/null +++ b/examples/with-next-ssr-app-directory/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/examples/with-next-ssr-pages-directory/.env b/examples/with-next-ssr-pages-directory/.env new file mode 100644 index 000000000..9a88ce3f1 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/.env @@ -0,0 +1,14 @@ +# These are all working development keys. +# IMPORTANT: You can use them during development, but for production use, +# make sure to change them to keys issued for your app. + +GOOGLE_CLIENT_ID=1060725074195-kmeum4crr01uirfl2op9kd5acmi9jutn.apps.googleusercontent.com +GOOGLE_CLIENT_SECRET=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 + +GITHUB_CLIENT_ID=467101b197249757c71f +GITHUB_CLIENT_SECRET=e97051221f4b6426e8fe8d51486396703012f5bd + +APPLE_CLIENT_ID=4398792-io.supertokens.example.service +APPLE_KEY_ID=7M48Y4RYDL +APPLE_TEAM_ID=YWQCXGJRJL +APPLE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgu8gXs+XYkqXD6Ala9Sf/iJXzhbwcoG5dMh1OonpdJUmgCgYIKoZIzj0DAQehRANCAASfrvlFbFCYqn3I2zeknYXLwtH30JuOKestDbSfZYxZNMqhF/OzdZFTV0zc5u5s3eN+oCWbnvl0hM+9IW0UlkdA\n-----END PRIVATE KEY----- \ No newline at end of file diff --git a/examples/with-next-ssr-pages-directory/.gitignore b/examples/with-next-ssr-pages-directory/.gitignore new file mode 100644 index 000000000..c87c9b392 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/with-next-ssr-pages-directory/assets/fonts/MenloRegular.ttf b/examples/with-next-ssr-pages-directory/assets/fonts/MenloRegular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..033dc6d21241618fcc5dfd40f70a2943f7e3a36f GIT binary patch literal 475160 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�-hq}v4-RV%bJJf9swK~(& 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


    ^7@wrJ=g$3Fo`?)gAC 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 aw!g3k3*Lpkl3$0Pe{C4|7XAO4+Wc>4`DVKS literal 0 HcmV?d00001 diff --git a/examples/with-next-ssr-pages-directory/assets/images/arrow-right-icon.svg b/examples/with-next-ssr-pages-directory/assets/images/arrow-right-icon.svg new file mode 100644 index 000000000..95aa1fec6 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/assets/images/arrow-right-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-pages-directory/assets/images/background.png b/examples/with-next-ssr-pages-directory/assets/images/background.png new file mode 100644 index 0000000000000000000000000000000000000000..2147c15c2b1fe01142b0a89ae1d478375610db66 GIT binary patch literal 70254 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

      9EIan`0#%EiL^9{& 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 W`=$8T4Ud5j!+nrema3983j9Cd$)#Zc literal 0 HcmV?d00001 diff --git a/examples/with-next-ssr-pages-directory/assets/images/blogs-icon.svg b/examples/with-next-ssr-pages-directory/assets/images/blogs-icon.svg new file mode 100644 index 000000000..a2fc9dd62 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/assets/images/blogs-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-pages-directory/assets/images/celebrate-icon.svg b/examples/with-next-ssr-pages-directory/assets/images/celebrate-icon.svg new file mode 100644 index 000000000..3b40b1efa --- /dev/null +++ b/examples/with-next-ssr-pages-directory/assets/images/celebrate-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/examples/with-next-ssr-pages-directory/assets/images/guide-icon.svg b/examples/with-next-ssr-pages-directory/assets/images/guide-icon.svg new file mode 100644 index 000000000..bd85af72b --- /dev/null +++ b/examples/with-next-ssr-pages-directory/assets/images/guide-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-pages-directory/assets/images/index.ts b/examples/with-next-ssr-pages-directory/assets/images/index.ts new file mode 100644 index 000000000..7adf036c4 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/assets/images/index.ts @@ -0,0 +1,8 @@ +import SeparatorLine from "./separator-line.svg"; +import ArrowRight from "./arrow-right-icon.svg"; +import SignOutIcon from "./sign-out-icon.svg"; +import GuideIcon from "./guide-icon.svg"; +import BlogsIcon from "./blogs-icon.svg"; +import CelebrateIcon from "./celebrate-icon.svg"; + +export { SeparatorLine, ArrowRight, SignOutIcon, GuideIcon, BlogsIcon, CelebrateIcon }; diff --git a/examples/with-next-ssr-pages-directory/assets/images/separator-line.svg b/examples/with-next-ssr-pages-directory/assets/images/separator-line.svg new file mode 100644 index 000000000..7127a00dc --- /dev/null +++ b/examples/with-next-ssr-pages-directory/assets/images/separator-line.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/examples/with-next-ssr-pages-directory/assets/images/sign-out-icon.svg b/examples/with-next-ssr-pages-directory/assets/images/sign-out-icon.svg new file mode 100644 index 000000000..6cc4f85fd --- /dev/null +++ b/examples/with-next-ssr-pages-directory/assets/images/sign-out-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/with-next-ssr-pages-directory/config/appInfo.ts b/examples/with-next-ssr-pages-directory/config/appInfo.ts new file mode 100644 index 000000000..13d8a40e5 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/config/appInfo.ts @@ -0,0 +1,12 @@ +const port = process.env.APP_PORT || 3232; + +const apiBasePath = "/api/auth"; + +export const websiteDomain = process.env.APP_URL || process.env.NEXT_PUBLIC_APP_URL || `http://localhost:${port}`; + +export const appInfo = { + appName: "SuperTokens Demo App", + websiteDomain, + apiDomain: websiteDomain, + apiBasePath, +}; diff --git a/examples/with-next-ssr-pages-directory/config/backendConfig.ts b/examples/with-next-ssr-pages-directory/config/backendConfig.ts new file mode 100644 index 000000000..a40a16e15 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/config/backendConfig.ts @@ -0,0 +1,90 @@ +import EmailPasswordNode from "supertokens-node/recipe/emailpassword"; +import ThirdPartyNode from "supertokens-node/recipe/thirdparty"; +import PasswordlessNode from "supertokens-node/recipe/passwordless"; +import SessionNode from "supertokens-node/recipe/session"; +import Dashboard from "supertokens-node/recipe/dashboard"; +import UserRoles from "supertokens-node/recipe/userroles"; +import { TypeInput } from "supertokens-node/types"; +import { appInfo } from "./appInfo"; + +export let backendConfig = (): TypeInput => { + return { + framework: "express", + supertokens: { + // this is the location of the SuperTokens core. + connectionURI: "https://try.supertokens.com", + }, + appInfo, + // recipeList contains all the modules that you want to + // use from SuperTokens. See the full list here: https://supertokens.com/docs/guides + recipeList: [ + EmailPasswordNode.init(), + ThirdPartyNode.init({ + signInAndUpFeature: { + providers: [ + // We have provided you with development keys which you can use for testing. + // IMPORTANT: Please replace them with your own OAuth keys for production use. + { + config: { + thirdPartyId: "google", + clients: [ + { + clientId: + "1060725074195-kmeum4crr01uirfl2op9kd5acmi9jutn.apps.googleusercontent.com", + clientSecret: "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", + }, + ], + }, + }, + { + config: { + thirdPartyId: "github", + clients: [ + { + clientId: "467101b197249757c71f", + clientSecret: "e97051221f4b6426e8fe8d51486396703012f5bd", + }, + ], + }, + }, + { + config: { + thirdPartyId: "apple", + clients: [ + { + clientId: "4398792-io.supertokens.example.service", + additionalConfig: { + keyId: "7M48Y4RYDL", + privateKey: + "-----BEGIN PRIVATE KEY-----\nMIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgu8gXs+XYkqXD6Ala9Sf/iJXzhbwcoG5dMh1OonpdJUmgCgYIKoZIzj0DAQehRANCAASfrvlFbFCYqn3I2zeknYXLwtH30JuOKestDbSfZYxZNMqhF/OzdZFTV0zc5u5s3eN+oCWbnvl0hM+9IW0UlkdA\n-----END PRIVATE KEY-----", + teamId: "YWQCXGJRJL", + }, + }, + ], + }, + }, + { + config: { + thirdPartyId: "twitter", + clients: [ + { + clientId: "4398792-WXpqVXRiazdRMGNJdEZIa3RVQXc6MTpjaQ", + clientSecret: "BivMbtwmcygbRLNQ0zk45yxvW246tnYnTFFq-LH39NwZMxFpdC", + }, + ], + }, + }, + ], + }, + }), + PasswordlessNode.init({ + contactMethod: "EMAIL_OR_PHONE", + flowType: "USER_INPUT_CODE_AND_MAGIC_LINK", + }), + SessionNode.init(), + Dashboard.init(), + UserRoles.init(), + ], + isInServerlessEnv: true, + }; +}; diff --git a/examples/with-next-ssr-pages-directory/config/frontendConfig.tsx b/examples/with-next-ssr-pages-directory/config/frontendConfig.tsx new file mode 100644 index 000000000..39538b6b8 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/config/frontendConfig.tsx @@ -0,0 +1,52 @@ +import EmailPasswordReact from "supertokens-auth-react/recipe/emailpassword"; +import ThirdPartyReact from "supertokens-auth-react/recipe/thirdparty"; +import PasswordlessReact from "supertokens-auth-react/recipe/passwordless"; +import { EmailPasswordPreBuiltUI } from "supertokens-auth-react/recipe/emailpassword/prebuiltui"; +import { ThirdPartyPreBuiltUI } from "supertokens-auth-react/recipe/thirdparty/prebuiltui"; +import { PasswordlessPreBuiltUI } from "supertokens-auth-react/recipe/passwordless/prebuiltui"; +import SessionReact from "supertokens-auth-react/recipe/session"; +import { SuperTokensConfig } from "supertokens-auth-react/lib/build/types"; +import { appInfo } from "./appInfo"; +import Router from "next/router"; + +export let frontendConfig = (): SuperTokensConfig => { + return { + appInfo, + // recipeList contains all the modules that you want to + // use from SuperTokens. See the full list here: https://supertokens.com/docs/guides + recipeList: [ + EmailPasswordReact.init(), + ThirdPartyReact.init({ + signInAndUpFeature: { + providers: [ + ThirdPartyReact.Github.init(), + ThirdPartyReact.Google.init(), + ThirdPartyReact.Apple.init(), + ], + }, + }), + PasswordlessReact.init({ + contactMethod: "EMAIL_OR_PHONE", + }), + SessionReact.init(), + ], + // this is so that the SDK uses the next router for navigation + windowHandler: (oI) => { + return { + ...oI, + location: { + ...oI.location, + setHref: (href) => { + Router.push(href); + }, + }, + }; + }, + }; +}; + +export const recipeDetails = { + docsLink: "https://supertokens.com/docs/thirdpartypasswordless/introduction", +}; + +export const PreBuiltUIList = [EmailPasswordPreBuiltUI, ThirdPartyPreBuiltUI, PasswordlessPreBuiltUI]; diff --git a/examples/with-next-ssr-pages-directory/config/ssrConfig.ts b/examples/with-next-ssr-pages-directory/config/ssrConfig.ts new file mode 100644 index 000000000..c6bc60a61 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/config/ssrConfig.ts @@ -0,0 +1,10 @@ +import { appInfo } from "./appInfo"; +import { SuperTokensConfig } from "supertokens-auth-react/lib/build/types"; + +export const ssrConfig = (): SuperTokensConfig => { + return { + appInfo, + enableDebugLogs: true, + recipeList: [], + }; +}; diff --git a/examples/with-next-ssr-pages-directory/middleware.ts b/examples/with-next-ssr-pages-directory/middleware.ts new file mode 100644 index 000000000..b5b3629a6 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/middleware.ts @@ -0,0 +1,85 @@ +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; +import { SessionContainer, VerifySessionOptions } from "supertokens-node/recipe/session"; +import { withSession } from "supertokens-node/nextjs"; +import { ssrConfig } from "./config/ssrConfig"; +import { refreshSession, revokeSession } from "supertokens-auth-react/nextjs/middleware"; +import { SuperTokensConfig } from "supertokens-auth-react/lib/build/types"; + +const CURRENT_PATH_COOKIE_NAME = "sCurrentPath"; +const FORCE_LOGOUT_PATH_PARAM_NAME = "forceLogout"; + +export default superTokensMiddleware(ssrConfig()); + +// This function should be exposed by the node sdk +function superTokensMiddleware( + config: SuperTokensConfig, + options?: VerifySessionOptions +): (request: NextRequest & { session?: SessionContainer }) => Promise { + // Determined by checking if the frontend and backend are on the same domain + const usesTheNextjsApiAsTheAuthenticationServer = true; + + return async (request: NextRequest & { session?: SessionContainer }) => { + if (request.nextUrl.pathname.startsWith("/api/auth/session/refresh") && request.method === "GET") { + return refreshSession(config, request); + } + + if (request.nextUrl.pathname.startsWith("/api") && usesTheNextjsApiAsTheAuthenticationServer) { + if (request.headers.has("x-user-id")) { + console.warn( + "The FE tried to pass x-user-id, which is only supposed to be a backend internal header. Ignoring." + ); + request.headers.delete("x-user-id"); + } + + if (request.nextUrl.pathname.startsWith("/api/auth")) { + // this hits our pages/api/auth/* endpoints + return NextResponse.next(); + } + + return withSession( + request, + async (err, session) => { + if (err) { + return NextResponse.json(err, { status: 500 }); + } + + if (session === undefined) { + return NextResponse.next(); + } + return NextResponse.next({ + headers: { + "x-user-id": session.getUserId(), + }, + }); + }, + options + ); + } + + if ( + request.nextUrl.pathname.startsWith("/auth") && + request.nextUrl.searchParams.get(FORCE_LOGOUT_PATH_PARAM_NAME) === "true" + ) { + return revokeSession(config, request); + } + + // Save the current path so that we can use it during SSR + // Used to redirect the user to the correct path after login/refresh + // https://github.com/vercel/next.js/issues/43704#issuecomment-2090798307 + // TL;DR: You can not access pathname in SSR and requests that originate from redirect() + const response = new Response(null, {}); + response.headers.set("x-middleware-next", "1"); + response.headers.append( + "set-cookie", + `${CURRENT_PATH_COOKIE_NAME}=${request.nextUrl.pathname}; Path=/; HttpOnly; SameSite=Strict` + ); + return response; + }; +} + +export const config = { + matcher: [ + "/((?!_next/static|_next/image|favicon.ico|robots.txt|sitemap.xml|manifest.json|sw.js|workbox-|public/).*)", + ], +}; diff --git a/examples/with-next-ssr-pages-directory/next.config.js b/examples/with-next-ssr-pages-directory/next.config.js new file mode 100644 index 000000000..b13dbe4e0 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +}; + +module.exports = nextConfig; diff --git a/examples/with-next-ssr-pages-directory/package.json b/examples/with-next-ssr-pages-directory/package.json new file mode 100644 index 000000000..9ed13158d --- /dev/null +++ b/examples/with-next-ssr-pages-directory/package.json @@ -0,0 +1,20 @@ +{ + "private": true, + "scripts": { + "dev": "next dev -p 3232", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "next": "latest", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "supertokens-auth-react": "git+https://github.com/supertokens/supertokens-auth-react.git#feat/nextjs-ssr", + "supertokens-node": "latest" + }, + "devDependencies": { + "@types/node": "18.7.13", + "@types/react": "18.0.17", + "typescript": "^4.8.2" + } +} diff --git a/examples/with-next-ssr-pages-directory/pages/_app.tsx b/examples/with-next-ssr-pages-directory/pages/_app.tsx new file mode 100644 index 000000000..01dd54bba --- /dev/null +++ b/examples/with-next-ssr-pages-directory/pages/_app.tsx @@ -0,0 +1,37 @@ +import "../styles/globals.css"; +import React from "react"; +import { useEffect } from "react"; +import SuperTokensReact, { SuperTokensWrapper } from "supertokens-auth-react"; +import * as SuperTokensConfig from "../config/frontendConfig"; +import Session from "supertokens-auth-react/recipe/session"; + +if (typeof window !== "undefined") { + SuperTokensReact.init(SuperTokensConfig.frontendConfig()); +} + +function MyApp({ Component, pageProps }): JSX.Element { + useEffect(() => { + async function doRefresh() { + if (pageProps.fromSupertokens === "needs-refresh") { + if (await Session.attemptRefreshingSession()) { + location.reload(); + } else { + // user has been logged out + SuperTokensReact.redirectToAuth(); + } + } + } + doRefresh(); + }, [pageProps.fromSupertokens]); + if (pageProps.fromSupertokens === "needs-refresh") { + return null; + } + + return ( + + + + ); +} + +export default MyApp; diff --git a/examples/with-next-ssr-pages-directory/pages/api/auth/[[...path]].ts b/examples/with-next-ssr-pages-directory/pages/api/auth/[[...path]].ts new file mode 100644 index 000000000..dbb392fb9 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/pages/api/auth/[[...path]].ts @@ -0,0 +1,21 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import { superTokensNextWrapper } from "supertokens-node/nextjs"; +import supertokens from "supertokens-node"; +import { middleware } from "supertokens-node/framework/express"; +import { backendConfig } from "../../../config/backendConfig"; + +supertokens.init(backendConfig()); + +export default async function superTokens(req, res) { + await superTokensNextWrapper( + async (next) => { + res.setHeader("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate"); + await middleware()(req, res, next); + }, + req, + res + ); + if (!res.writableEnded) { + res.status(404).send("Not found"); + } +} diff --git a/examples/with-next-ssr-pages-directory/pages/api/user.ts b/examples/with-next-ssr-pages-directory/pages/api/user.ts new file mode 100644 index 000000000..eb169559a --- /dev/null +++ b/examples/with-next-ssr-pages-directory/pages/api/user.ts @@ -0,0 +1,23 @@ +import { superTokensNextWrapper } from "supertokens-node/nextjs"; +import { verifySession } from "supertokens-node/recipe/session/framework/express"; +import supertokens from "supertokens-node"; +import { backendConfig } from "../../config/backendConfig"; + +supertokens.init(backendConfig()); + +export default async function user(req, res) { + await superTokensNextWrapper( + async (next) => { + return await verifySession()(req, res, next); + }, + req, + res + ); + + return res.json({ + note: "Fetch any data from your application for authenticated user after using verifySession middleware", + userId: req.session.getUserId(), + sessionHandle: req.session.getHandle(), + accessTokenPayload: req.session.getAccessTokenPayload(), + }); +} diff --git a/examples/with-next-ssr-pages-directory/pages/auth/[[...path]].tsx b/examples/with-next-ssr-pages-directory/pages/auth/[[...path]].tsx new file mode 100644 index 000000000..0ae741a34 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/pages/auth/[[...path]].tsx @@ -0,0 +1,39 @@ +import Head from "next/head"; +import React, { useEffect } from "react"; +import styles from "../../styles/Home.module.css"; +import dynamic from "next/dynamic"; +import SuperTokens from "supertokens-auth-react"; +import { canHandleRoute, getRoutingComponent } from "supertokens-auth-react/ui"; +import { PreBuiltUIList } from "../../config/frontendConfig"; + +const SuperTokensComponentNoSSR = dynamic<{}>(new Promise((res) => res(() => getRoutingComponent(PreBuiltUIList))), { + ssr: false, +}); + +export default function Auth(): JSX.Element { + useEffect(() => { + if (canHandleRoute(PreBuiltUIList) === false) { + SuperTokens.redirectToAuth({ + redirectBack: false, + }); + } + }, []); + + return ( +

      + + SuperTokens 💫 + + + + +
      + +
      +
      + ); +} diff --git a/examples/with-next-ssr-pages-directory/pages/index.tsx b/examples/with-next-ssr-pages-directory/pages/index.tsx new file mode 100644 index 000000000..5f7705291 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/pages/index.tsx @@ -0,0 +1,109 @@ +import React from "react"; +import Head from "next/head"; +import styles from "../styles/ProtectedHome.module.css"; +import SessionReact from "supertokens-auth-react/recipe/session"; +import SuperTokensReact from "supertokens-auth-react"; +import { useSessionContext } from "supertokens-auth-react/recipe/session"; +import { BlogsIcon, CelebrateIcon, GuideIcon, SeparatorLine, SignOutIcon } from "../assets/images"; +import Image from "next/image"; +import { recipeDetails } from "../config/frontendConfig"; +import { ssrConfig } from "../config/ssrConfig"; +import { init, getServerSidePropsSession } from "supertokens-auth-react/nextjs/ssr"; + +init(ssrConfig()); + +interface ILink { + name: string; + onClick: () => void; + icon: string; +} + +function ProtectedPage() { + const session = useSessionContext(); + + async function logoutClicked() { + await SessionReact.signOut(); + SuperTokensReact.redirectToAuth(); + } + + async function fetchUserData() { + const res = await fetch("/api/user"); + if (res.status === 200) { + const json = await res.json(); + alert(JSON.stringify(json)); + } + } + + if (session.loading === true) { + return null; + } + + function openLink(url: string) { + window.open(url, "_blank"); + } + + const links: ILink[] = [ + { + name: "Blogs", + onClick: () => openLink("https://supertokens.com/blog"), + icon: BlogsIcon, + }, + { + name: "Guides", + onClick: () => openLink(recipeDetails.docsLink), + icon: GuideIcon, + }, + { + name: "Sign Out", + onClick: logoutClicked, + icon: SignOutIcon, + }, + ]; + + return ( +
      + + SuperTokens 💫 + + +
      +
      + Login successful Login successful +
      +
      +
      Your userID is:
      +
      {session.userId}
      +
      + Call API +
      +
      +
      +
      + {links.map((link) => ( +
      + {link.name} +
      + {link.name} +
      +
      + ))} +
      + separator +
      + ); +} + +export async function getServerSideProps(ctx) { + const props = await getServerSidePropsSession(ctx.req); + return props; +} + +export default function Home(props) { + console.log(props); + + return ( + + + + ); +} diff --git a/examples/with-next-ssr-pages-directory/public/favicon.ico b/examples/with-next-ssr-pages-directory/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d14dbd1d8638dedb13d7e28fe6c3a3b9b5252921 GIT binary patch literal 9662 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 NmKV{Y3p@wx{lAx8wfg`7 literal 0 HcmV?d00001 diff --git a/examples/with-next-ssr-pages-directory/public/vercel.svg b/examples/with-next-ssr-pages-directory/public/vercel.svg new file mode 100644 index 000000000..fbf0e25a6 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/public/vercel.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/examples/with-next-ssr-pages-directory/styles/Home.module.css b/examples/with-next-ssr-pages-directory/styles/Home.module.css new file mode 100644 index 000000000..e69778204 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/styles/Home.module.css @@ -0,0 +1,122 @@ +.container { + min-height: 100vh; + padding: 0 0.5rem; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.main { + padding: 5rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + width: 100%; + height: 100px; + border-top: 1px solid #eaeaea; + display: flex; + justify-content: center; + align-items: center; +} + +.footer img { + margin-left: 0.5rem; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, + monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; + margin-top: 3rem; +} + +.card { + margin: 1rem; + flex-basis: 45%; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h3 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} diff --git a/examples/with-next-ssr-pages-directory/styles/ProtectedHome.module.css b/examples/with-next-ssr-pages-directory/styles/ProtectedHome.module.css new file mode 100644 index 000000000..74dfbb304 --- /dev/null +++ b/examples/with-next-ssr-pages-directory/styles/ProtectedHome.module.css @@ -0,0 +1,202 @@ +@font-face { + font-family: Menlo; + src: url("../assets/fonts/MenloRegular.ttf"); +} + +.appContainer { + font-family: Rubik, sans-serif; +} + +.appContainer * { + box-sizing: border-box; +} + +.bold400 { + font-variation-settings: "wght" 400; +} + +.bold500 { + font-variation-settings: "wght" 500; +} + +.bold600 { + font-variation-settings: "wght" 600; +} + +.homeContainer { + min-height: 100vh; + background: url("../assets/images/background.png"); + background-size: cover; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.bold700 { + font-variation-settings: "wght" 700; +} + +.mainContainer { + box-shadow: 0px 0px 60px 0px rgba(0, 0, 0, 0.16); + width: min(635px, calc(100% - 24px)); + border-radius: 16px; + margin-block-end: 159px; + background-color: #ffffff; +} + +.successTitle { + line-height: 1; + padding-block: 26px; + background-color: #e7ffed; + text-align: center; + color: #3eb655; + display: flex; + justify-content: center; + align-items: flex-end; + font-size: 20px; +} + +.successIcon { + margin-right: 8px; +} + +.innerContent { + padding-block: 48px; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; +} + +.userId { + position: relative; + padding: 14px 17px; + border-image-slice: 1; + width: min(430px, calc(100% - 30px)); + margin-inline: auto; + margin-block: 11px 23px; + border-radius: 9px; + line-height: 1; + font-family: Menlo, serif; + cursor: text; +} + +.userId:before { + content: ""; + position: absolute; + inset: 0; + border-radius: 9px; + padding: 2px; + background: linear-gradient(90.31deg, #ff9933 0.11%, #ff3f33 99.82%); + -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; +} + +.topBand, +.bottomBand { + border-radius: inherit; +} + +.topBand { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.bottomBand { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.sessionButton { + padding-left: 13px; + padding-right: 13px; + padding-top: 8px; + padding-bottom: 8px; + cursor: pointer; + color: white; + font-weight: bold; + font-size: 17px; + + box-sizing: border-box; + background: #ff9933; + border: 1px solid #ff8a15; + box-shadow: 0px 3px 6px rgba(255, 153, 51, 0.16); + border-radius: 6px; + font-size: 16px; +} + +.bottomCTAContainer { + display: flex; + justify-content: flex-end; + padding-inline: 21px; + background-color: #212d4f; +} + +.viewCode { + padding-block: 11px; + color: #bac9f5; + cursor: pointer; + font-size: 14px; +} + +.bottomLinksContainer { + display: grid; + grid-template-columns: repeat(4, auto); + margin-bottom: 22px; +} + +.linksContainerLink { + display: flex; + align-items: center; + margin-inline-end: 68px; + cursor: pointer; +} + +.linksContainerLink:last-child { + margin-right: 0; +} + +.truncate { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.separatorLine { + max-width: 100%; +} + +.linkIcon { + width: 15px; + margin-right: 5px; +} + +@media screen and (max-width: 768px) { + .bottomLinksContainer { + grid-template-columns: repeat(2, 1fr); + column-gap: 64px; + row-gap: 34px; + } + + .linksContainerLink { + margin-inline-end: 0; + } + + .separatorLine { + max-width: 200px; + } +} + +@media screen and (max-width: 480px) { + .homeContainer { + justify-content: start; + padding-block-start: 25px; + } + + .mainContainer { + margin-block-end: 90px; + } +} diff --git a/examples/with-next-ssr-pages-directory/styles/globals.css b/examples/with-next-ssr-pages-directory/styles/globals.css new file mode 100644 index 000000000..24bdae79c --- /dev/null +++ b/examples/with-next-ssr-pages-directory/styles/globals.css @@ -0,0 +1,16 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, + Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} diff --git a/examples/with-next-ssr-pages-directory/tsconfig.json b/examples/with-next-ssr-pages-directory/tsconfig.json new file mode 100644 index 000000000..c29a4153c --- /dev/null +++ b/examples/with-next-ssr-pages-directory/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "interfaces.d.ts"], + "exclude": ["node_modules"] +} diff --git a/lib/build/arrowLeftIcon.js b/lib/build/arrowLeftIcon.js index ae4718ff5..bd58b772e 100644 --- a/lib/build/arrowLeftIcon.js +++ b/lib/build/arrowLeftIcon.js @@ -1,42 +1,31 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function ArrowLeftIcon(_a) { - var color = _a.color; - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { width: "6", height: "8", viewBox: "0 0 6 8", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, - { - children: jsxRuntime.jsx("path", { - d: "M0.372871 3.24407C-0.0875903 3.64284 -0.0875899 4.35716 0.372872 4.75593L3.84535 7.76318C4.49299 8.32406 5.5 7.864 5.5 7.00725L5.5 0.992749C5.5 0.135997 4.49299 -0.324056 3.84535 0.23682L0.372871 3.24407Z", - fill: "".concat(color), - }), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function ArrowLeftIcon(_a) { + var color = _a.color; + return (jsxRuntime.jsx("svg", logger.__assign({ width: "6", height: "8", viewBox: "0 0 6 8", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: jsxRuntime.jsx("path", { d: "M0.372871 3.24407C-0.0875903 3.64284 -0.0875899 4.35716 0.372872 4.75593L3.84535 7.76318C4.49299 8.32406 5.5 7.864 5.5 7.00725L5.5 0.992749C5.5 0.135997 4.49299 -0.324056 3.84535 0.23682L0.372871 3.24407Z", fill: "".concat(color) }) }))); } exports.ArrowLeftIcon = ArrowLeftIcon; diff --git a/lib/build/authCompWrapper.js b/lib/build/authCompWrapper.js index ae3e8d5ec..cea2d914e 100644 --- a/lib/build/authCompWrapper.js +++ b/lib/build/authCompWrapper.js @@ -1,16 +1,12 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var uiEntry = require("./index2.js"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +var uiEntry = require('./index2.js'); -function AuthComponentWrapper(_a) { - var children = _a.children, - recipeComponentOverrides = _a.recipeComponentOverrides; - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign({ value: recipeComponentOverrides }, { children: children }) - ); +function AuthComponentWrapper(_a) { + var children = _a.children, recipeComponentOverrides = _a.recipeComponentOverrides; + return (jsxRuntime.jsx(uiEntry.ComponentOverrideContext.Provider, logger.__assign({ value: recipeComponentOverrides }, { children: children }))); } exports.AuthComponentWrapper = AuthComponentWrapper; diff --git a/lib/build/authRecipe-shared.js b/lib/build/authRecipe-shared.js index a49f45a02..ac9c3d954 100644 --- a/lib/build/authRecipe-shared.js +++ b/lib/build/authRecipe-shared.js @@ -1,60 +1,56 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); +var logger = require('./logger.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function normaliseAuthRecipe(config) { - return genericComponentOverrideContext.normaliseRecipeModuleConfig(config); -} -function selectComponentsToCoverAllFirstFactors(comps, firstFactorIds) { - if (firstFactorIds.length === 0) { - return undefined; - } - var _loop_1 = function (i) { - var c = comps[i]; - // We check what factorIds are left if we select c - var factorIdsLeft = firstFactorIds.filter(function (id) { - return !c.factorIds.includes(id); - }); - if (factorIdsLeft.length === 0) { - return { value: [c] }; - } - // If there are other factors we need to cover, we filter down the component list to things that - // fit the remaining factor ids. This will remove overlapping components - // E.g.: if we just selected the emailpassword+pwless component, the emailpassword sign in/up components - // will be removed, since emailpassword is not in factorIdsLeft - var componentsLeft = comps.filter(function (c) { - return c.factorIds.every(function (id) { - return factorIdsLeft.includes(id); - }); - }); - // if we both have components and factors left after selecting c, we recurse - if (componentsLeft.length !== 0) { - var nextComps = selectComponentsToCoverAllFirstFactors(componentsLeft, factorIdsLeft); - if (nextComps !== undefined) { - return { value: genericComponentOverrideContext.__spreadArray([c], nextComps, true) }; - } - } - }; - for (var i = 0; i < comps.length; ++i) { - var state_1 = _loop_1(i); - if (typeof state_1 === "object") return state_1.value; - } - // if we run out of components, we can't cover all factorids with this set of components - return undefined; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function normaliseAuthRecipe(config) { + return genericComponentOverrideContext.normaliseRecipeModuleConfig(config); +} +function selectComponentsToCoverAllFirstFactors(comps, firstFactorIds) { + if (firstFactorIds.length === 0) { + return undefined; + } + var _loop_1 = function (i) { + var c = comps[i]; + // We check what factorIds are left if we select c + var factorIdsLeft = firstFactorIds.filter(function (id) { return !c.factorIds.includes(id); }); + if (factorIdsLeft.length === 0) { + return { value: [c] }; + } + // If there are other factors we need to cover, we filter down the component list to things that + // fit the remaining factor ids. This will remove overlapping components + // E.g.: if we just selected the emailpassword+pwless component, the emailpassword sign in/up components + // will be removed, since emailpassword is not in factorIdsLeft + var componentsLeft = comps.filter(function (c) { return c.factorIds.every(function (id) { return factorIdsLeft.includes(id); }); }); + // if we both have components and factors left after selecting c, we recurse + if (componentsLeft.length !== 0) { + var nextComps = selectComponentsToCoverAllFirstFactors(componentsLeft, factorIdsLeft); + if (nextComps !== undefined) { + return { value: logger.__spreadArray([c], nextComps, true) }; + } + } + }; + for (var i = 0; i < comps.length; ++i) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // if we run out of components, we can't cover all factorids with this set of components + return undefined; } exports.normaliseAuthRecipe = normaliseAuthRecipe; diff --git a/lib/build/authRecipe-shared2.js b/lib/build/authRecipe-shared2.js index 6ac9fc7cf..1c39ba6cc 100644 --- a/lib/build/authRecipe-shared2.js +++ b/lib/build/authRecipe-shared2.js @@ -1,76 +1,57 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var index = require("./recipeModule-shared.js"); -var types = require("./multifactorauth-shared.js"); +var logger = require('./logger.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var index = require('./recipeModule-shared.js'); +var types = require('./multifactorauth-shared.js'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var AuthRecipe = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(AuthRecipe, _super); - function AuthRecipe() { - var _this = (_super !== null && _super.apply(this, arguments)) || this; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _this.getAuthRecipeDefaultRedirectionURL = function (_context) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - throw new Error("Should never come here"); - }); - }); - }; - _this.signOut = function (input) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().signOut({ - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }), - ]; - case 1: - return [2 /*return*/, _a.sent()]; - } - }); - }); - }; - _this.doesSessionExist = function (input) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().doesSessionExist({ - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }), - ]; - case 1: - return [2 /*return*/, _a.sent()]; - } - }); - }); - }; - return _this; - } - return AuthRecipe; -})(index.RecipeModule); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var AuthRecipe = /** @class */ (function (_super) { + logger.__extends(AuthRecipe, _super); + function AuthRecipe() { + var _this = _super !== null && _super.apply(this, arguments) || this; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _this.getAuthRecipeDefaultRedirectionURL = function (_context) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + throw new Error("Should never come here"); + }); + }); }; + _this.signOut = function (input) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, types.Session.getInstanceOrThrow().signOut({ + userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext), + })]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); }; + _this.doesSessionExist = function (input) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, types.Session.getInstanceOrThrow().doesSessionExist({ + userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext), + })]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); }; + return _this; + } + return AuthRecipe; +}(index.RecipeModule)); exports.AuthRecipe = AuthRecipe; diff --git a/lib/build/claims/booleanClaim.d.ts b/lib/build/claims/booleanClaim.d.ts index f5fa724ad..87ae0669b 100644 --- a/lib/build/claims/booleanClaim.d.ts +++ b/lib/build/claims/booleanClaim.d.ts @@ -1,11 +1,9 @@ -import { BooleanClaim as BooleanClaimWebJS } from "supertokens-web-js/recipe/session"; -import type { ValidationFailureCallback } from "../types"; -import type { PrimitiveClaimConfig } from "supertokens-web-js/recipe/session"; -export declare class BooleanClaim extends BooleanClaimWebJS { - constructor( - config: PrimitiveClaimConfig & { - onFailureRedirection?: ValidationFailureCallback; - showAccessDeniedOnFailure?: boolean; - } - ); -} +import { BooleanClaim as BooleanClaimWebJS } from "supertokens-web-js/recipe/session"; +import type { ValidationFailureCallback } from "../types"; +import type { PrimitiveClaimConfig } from "supertokens-web-js/recipe/session"; +export declare class BooleanClaim extends BooleanClaimWebJS { + constructor(config: PrimitiveClaimConfig & { + onFailureRedirection?: ValidationFailureCallback; + showAccessDeniedOnFailure?: boolean; + }); +} diff --git a/lib/build/claims/primitiveArrayClaim.d.ts b/lib/build/claims/primitiveArrayClaim.d.ts index 330562b67..7cca9741a 100644 --- a/lib/build/claims/primitiveArrayClaim.d.ts +++ b/lib/build/claims/primitiveArrayClaim.d.ts @@ -1,11 +1,9 @@ -import { PrimitiveArrayClaim as PrimitiveArrayClaimWebJS } from "supertokens-web-js/recipe/session"; -import type { ValidationFailureCallback } from "../types"; -import type { PrimitiveArrayClaimConfig } from "supertokens-web-js/recipe/session"; -export declare class PrimitiveArrayClaim extends PrimitiveArrayClaimWebJS { - constructor( - config: PrimitiveArrayClaimConfig & { - onFailureRedirection?: ValidationFailureCallback; - showAccessDeniedOnFailure?: boolean; - } - ); -} +import { PrimitiveArrayClaim as PrimitiveArrayClaimWebJS } from "supertokens-web-js/recipe/session"; +import type { ValidationFailureCallback } from "../types"; +import type { PrimitiveArrayClaimConfig } from "supertokens-web-js/recipe/session"; +export declare class PrimitiveArrayClaim extends PrimitiveArrayClaimWebJS { + constructor(config: PrimitiveArrayClaimConfig & { + onFailureRedirection?: ValidationFailureCallback; + showAccessDeniedOnFailure?: boolean; + }); +} diff --git a/lib/build/claims/primitiveClaim.d.ts b/lib/build/claims/primitiveClaim.d.ts index d6bbd0480..645780e22 100644 --- a/lib/build/claims/primitiveClaim.d.ts +++ b/lib/build/claims/primitiveClaim.d.ts @@ -1,11 +1,9 @@ -import { PrimitiveClaim as PrimitiveClaimWebJS } from "supertokens-web-js/recipe/session"; -import type { ValidationFailureCallback } from "../types"; -import type { PrimitiveClaimConfig } from "supertokens-web-js/recipe/session"; -export declare class PrimitiveClaim extends PrimitiveClaimWebJS { - constructor( - config: PrimitiveClaimConfig & { - onFailureRedirection?: ValidationFailureCallback; - showAccessDeniedOnFailure?: boolean; - } - ); -} +import { PrimitiveClaim as PrimitiveClaimWebJS } from "supertokens-web-js/recipe/session"; +import type { ValidationFailureCallback } from "../types"; +import type { PrimitiveClaimConfig } from "supertokens-web-js/recipe/session"; +export declare class PrimitiveClaim extends PrimitiveClaimWebJS { + constructor(config: PrimitiveClaimConfig & { + onFailureRedirection?: ValidationFailureCallback; + showAccessDeniedOnFailure?: boolean; + }); +} diff --git a/lib/build/components/SuperTokensBranding.d.ts b/lib/build/components/SuperTokensBranding.d.ts index 0f81ce774..cee9bd8f4 100644 --- a/lib/build/components/SuperTokensBranding.d.ts +++ b/lib/build/components/SuperTokensBranding.d.ts @@ -1,2 +1,2 @@ -/// -export declare function SuperTokensBranding(): JSX.Element; +/// +export declare function SuperTokensBranding(): JSX.Element; diff --git a/lib/build/components/assets/arrowLeftIcon.d.ts b/lib/build/components/assets/arrowLeftIcon.d.ts index 0524e444e..7dcc6d321 100644 --- a/lib/build/components/assets/arrowLeftIcon.d.ts +++ b/lib/build/components/assets/arrowLeftIcon.d.ts @@ -1,2 +1,4 @@ -/// -export default function ArrowLeftIcon({ color }: { color: string }): JSX.Element; +/// +export default function ArrowLeftIcon({ color }: { + color: string; +}): JSX.Element; diff --git a/lib/build/components/assets/arrowRightIcon.d.ts b/lib/build/components/assets/arrowRightIcon.d.ts index 92171e170..f9d560ba9 100644 --- a/lib/build/components/assets/arrowRightIcon.d.ts +++ b/lib/build/components/assets/arrowRightIcon.d.ts @@ -1,2 +1,4 @@ -/// -export default function ArrowRightIcon({ color }: { color: string }): JSX.Element; +/// +export default function ArrowRightIcon({ color }: { + color: string; +}): JSX.Element; diff --git a/lib/build/components/assets/blockedIcon.d.ts b/lib/build/components/assets/blockedIcon.d.ts index 36a055cab..b3a0759c6 100644 --- a/lib/build/components/assets/blockedIcon.d.ts +++ b/lib/build/components/assets/blockedIcon.d.ts @@ -1 +1 @@ -export declare const BlockedIcon: () => import("react/jsx-runtime").JSX.Element; +export declare const BlockedIcon: () => import("react/jsx-runtime").JSX.Element; diff --git a/lib/build/components/assets/checkedIcon.d.ts b/lib/build/components/assets/checkedIcon.d.ts index c77b17734..dfc818ca7 100644 --- a/lib/build/components/assets/checkedIcon.d.ts +++ b/lib/build/components/assets/checkedIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function CheckedIcon(): JSX.Element; +/// +export default function CheckedIcon(): JSX.Element; diff --git a/lib/build/components/assets/checkedRoundIcon.d.ts b/lib/build/components/assets/checkedRoundIcon.d.ts index d848bf1ff..684e946b1 100644 --- a/lib/build/components/assets/checkedRoundIcon.d.ts +++ b/lib/build/components/assets/checkedRoundIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function CheckedRoundIcon(): JSX.Element; +/// +export default function CheckedRoundIcon(): JSX.Element; diff --git a/lib/build/components/assets/emailLargeIcon.d.ts b/lib/build/components/assets/emailLargeIcon.d.ts index 78e4d6b64..7996cb8f1 100644 --- a/lib/build/components/assets/emailLargeIcon.d.ts +++ b/lib/build/components/assets/emailLargeIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function EmailLargeIcon(): JSX.Element; +/// +export default function EmailLargeIcon(): JSX.Element; diff --git a/lib/build/components/assets/errorIcon.d.ts b/lib/build/components/assets/errorIcon.d.ts index 28939aefc..3cb014e72 100644 --- a/lib/build/components/assets/errorIcon.d.ts +++ b/lib/build/components/assets/errorIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function ErrorIcon(): JSX.Element; +/// +export default function ErrorIcon(): JSX.Element; diff --git a/lib/build/components/assets/errorLargeIcon.d.ts b/lib/build/components/assets/errorLargeIcon.d.ts index a22a990df..b6241efe0 100644 --- a/lib/build/components/assets/errorLargeIcon.d.ts +++ b/lib/build/components/assets/errorLargeIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function ErrorLargeIcon(): JSX.Element; +/// +export default function ErrorLargeIcon(): JSX.Element; diff --git a/lib/build/components/assets/errorRoundIcon.d.ts b/lib/build/components/assets/errorRoundIcon.d.ts index 348bff543..49ebe1034 100644 --- a/lib/build/components/assets/errorRoundIcon.d.ts +++ b/lib/build/components/assets/errorRoundIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function ErrorRoundIcon(): JSX.Element; +/// +export default function ErrorRoundIcon(): JSX.Element; diff --git a/lib/build/components/assets/heavyArrowLeftIcon.d.ts b/lib/build/components/assets/heavyArrowLeftIcon.d.ts index aa7d7edfe..4c231237c 100644 --- a/lib/build/components/assets/heavyArrowLeftIcon.d.ts +++ b/lib/build/components/assets/heavyArrowLeftIcon.d.ts @@ -1,2 +1,4 @@ -/// -export default function HeavyArrowLeftIcon({ color }: { color: string }): JSX.Element; +/// +export default function HeavyArrowLeftIcon({ color }: { + color: string; +}): JSX.Element; diff --git a/lib/build/components/assets/logoutIcon.d.ts b/lib/build/components/assets/logoutIcon.d.ts index 4f3513ab8..e428254a3 100644 --- a/lib/build/components/assets/logoutIcon.d.ts +++ b/lib/build/components/assets/logoutIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function LogoutIcon(): JSX.Element; +/// +export default function LogoutIcon(): JSX.Element; diff --git a/lib/build/components/assets/otpEmailIcon.d.ts b/lib/build/components/assets/otpEmailIcon.d.ts index f1424c14b..8c254b2b5 100644 --- a/lib/build/components/assets/otpEmailIcon.d.ts +++ b/lib/build/components/assets/otpEmailIcon.d.ts @@ -1 +1 @@ -export declare const OTPEmailIcon: () => import("react/jsx-runtime").JSX.Element; +export declare const OTPEmailIcon: () => import("react/jsx-runtime").JSX.Element; diff --git a/lib/build/components/assets/otpSMSIcon.d.ts b/lib/build/components/assets/otpSMSIcon.d.ts index cb6600f53..e1955720e 100644 --- a/lib/build/components/assets/otpSMSIcon.d.ts +++ b/lib/build/components/assets/otpSMSIcon.d.ts @@ -1 +1 @@ -export declare const OTPSMSIcon: () => import("react/jsx-runtime").JSX.Element; +export declare const OTPSMSIcon: () => import("react/jsx-runtime").JSX.Element; diff --git a/lib/build/components/assets/showPasswordIcon.d.ts b/lib/build/components/assets/showPasswordIcon.d.ts index 4c9c78f4f..de7bb2926 100644 --- a/lib/build/components/assets/showPasswordIcon.d.ts +++ b/lib/build/components/assets/showPasswordIcon.d.ts @@ -1,2 +1,4 @@ -/// -export default function ShowPasswordIcon({ showPassword }: { showPassword: boolean }): JSX.Element; +/// +export default function ShowPasswordIcon({ showPassword }: { + showPassword: boolean; +}): JSX.Element; diff --git a/lib/build/components/assets/smsLargeIcon.d.ts b/lib/build/components/assets/smsLargeIcon.d.ts index 6bf4d9f76..c0c04c33f 100644 --- a/lib/build/components/assets/smsLargeIcon.d.ts +++ b/lib/build/components/assets/smsLargeIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function SMSLargeIcon(): JSX.Element; +/// +export default function SMSLargeIcon(): JSX.Element; diff --git a/lib/build/components/assets/spinnerIcon.d.ts b/lib/build/components/assets/spinnerIcon.d.ts index 40e198acb..d87dca28c 100644 --- a/lib/build/components/assets/spinnerIcon.d.ts +++ b/lib/build/components/assets/spinnerIcon.d.ts @@ -1,2 +1,2 @@ -/// -export default function SpinnerIcon(): JSX.Element; +/// +export default function SpinnerIcon(): JSX.Element; diff --git a/lib/build/components/assets/totpIcon.d.ts b/lib/build/components/assets/totpIcon.d.ts index 091d00d00..a5f481041 100644 --- a/lib/build/components/assets/totpIcon.d.ts +++ b/lib/build/components/assets/totpIcon.d.ts @@ -1 +1 @@ -export declare const TOTPIcon: () => import("react/jsx-runtime").JSX.Element; +export declare const TOTPIcon: () => import("react/jsx-runtime").JSX.Element; diff --git a/lib/build/components/authCompWrapper.d.ts b/lib/build/components/authCompWrapper.d.ts index f31497c86..91d8bb638 100644 --- a/lib/build/components/authCompWrapper.d.ts +++ b/lib/build/components/authCompWrapper.d.ts @@ -1,9 +1,6 @@ -import type { PropsWithChildren } from "react"; -declare type AuthComponentWrapperProps = { - recipeComponentOverrides: any; -}; -export default function AuthComponentWrapper({ - children, - recipeComponentOverrides, -}: PropsWithChildren): JSX.Element | null; -export {}; +import type { PropsWithChildren } from "react"; +declare type AuthComponentWrapperProps = { + recipeComponentOverrides: any; +}; +export default function AuthComponentWrapper({ children, recipeComponentOverrides, }: PropsWithChildren): JSX.Element | null; +export {}; diff --git a/lib/build/components/componentOverride/componentOverride.d.ts b/lib/build/components/componentOverride/componentOverride.d.ts index 9d23e0e4a..08b255a3a 100644 --- a/lib/build/components/componentOverride/componentOverride.d.ts +++ b/lib/build/components/componentOverride/componentOverride.d.ts @@ -1,8 +1,5 @@ -import type React from "react"; -export declare type ComponentOverrideProps> = - React.ComponentProps & { - DefaultComponent: TComponent; - }; -export declare type ComponentOverride> = React.ComponentType< - ComponentOverrideProps ->; +import type React from "react"; +export declare type ComponentOverrideProps> = React.ComponentProps & { + DefaultComponent: TComponent; +}; +export declare type ComponentOverride> = React.ComponentType>; diff --git a/lib/build/components/componentOverride/componentOverrideContext.d.ts b/lib/build/components/componentOverride/componentOverrideContext.d.ts index 052f9dc69..740b696a5 100644 --- a/lib/build/components/componentOverride/componentOverrideContext.d.ts +++ b/lib/build/components/componentOverride/componentOverrideContext.d.ts @@ -1,8 +1,8 @@ -import React from "react"; -import type { ComponentOverride } from "./componentOverride"; -export declare type GenericComponentOverrideMap = { - [K in keyof T]?: ComponentOverride; -}; -declare type ContextType = GenericComponentOverrideMap | "IS_DEFAULT"; -export declare const ComponentOverrideContext: React.Context>; -export {}; +import React from "react"; +import type { ComponentOverride } from "./componentOverride"; +export declare type GenericComponentOverrideMap = { + [K in keyof T]?: ComponentOverride; +}; +declare type ContextType = GenericComponentOverrideMap | "IS_DEFAULT"; +export declare const ComponentOverrideContext: React.Context>; +export {}; diff --git a/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts b/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts index 4c2800821..c24aba8c6 100644 --- a/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts +++ b/lib/build/components/componentOverride/genericComponentOverrideContext.d.ts @@ -1,12 +1,4 @@ -import React from "react"; -export declare const createGenericComponentsOverrideContext: >( - v?: T -) => readonly [ - () => T, - React.FC< - React.PropsWithChildren<{ - components: T; - }> - >, - React.Consumer -]; +import React from "react"; +export declare const createGenericComponentsOverrideContext: >(v?: T) => readonly [() => T, React.FC>, React.Consumer]; diff --git a/lib/build/components/componentOverride/useComponentOverride.d.ts b/lib/build/components/componentOverride/useComponentOverride.d.ts index 31ca2c97e..8f7a9deb5 100644 --- a/lib/build/components/componentOverride/useComponentOverride.d.ts +++ b/lib/build/components/componentOverride/useComponentOverride.d.ts @@ -1,5 +1,3 @@ -import type { ComponentOverride } from "./componentOverride"; -import type React from "react"; -export declare const useComponentOverride: >( - overrideKey: string -) => ComponentOverride | null; +import type { ComponentOverride } from "./componentOverride"; +import type React from "react"; +export declare const useComponentOverride: >(overrideKey: string) => ComponentOverride | null; diff --git a/lib/build/components/componentOverride/withOverride.d.ts b/lib/build/components/componentOverride/withOverride.d.ts index 1cdfe669c..4eee45cea 100644 --- a/lib/build/components/componentOverride/withOverride.d.ts +++ b/lib/build/components/componentOverride/withOverride.d.ts @@ -1,5 +1,2 @@ -import React from "react"; -export declare const withOverride: >( - overrideKey: string, - DefaultComponent: TComponent -) => React.ComponentType>; +import React from "react"; +export declare const withOverride: >(overrideKey: string, DefaultComponent: TComponent) => React.ComponentType>; diff --git a/lib/build/components/featureWrapper.d.ts b/lib/build/components/featureWrapper.d.ts index 235a0d9ce..948b71505 100644 --- a/lib/build/components/featureWrapper.d.ts +++ b/lib/build/components/featureWrapper.d.ts @@ -1,19 +1,12 @@ -import type { TranslationStore } from "../translation/translationHelpers"; -import type { PropsWithChildren } from "react"; -declare type FeatureWrapperProps = { - useShadowDom?: boolean; - defaultStore: TranslationStore; -}; -export default function FeatureWrapper({ - children, - useShadowDom, - defaultStore, -}: PropsWithChildren): JSX.Element | null; -declare type WithOrWithoutShadowDomProps = { - useShadowDom?: boolean; -}; -export declare function WithOrWithoutShadowDom({ - children, - useShadowDom, -}: PropsWithChildren): JSX.Element; -export {}; +import type { TranslationStore } from "../translation/translationHelpers"; +import type { PropsWithChildren } from "react"; +declare type FeatureWrapperProps = { + useShadowDom?: boolean; + defaultStore: TranslationStore; +}; +export default function FeatureWrapper({ children, useShadowDom, defaultStore, }: PropsWithChildren): JSX.Element | null; +declare type WithOrWithoutShadowDomProps = { + useShadowDom?: boolean; +}; +export declare function WithOrWithoutShadowDom({ children, useShadowDom, }: PropsWithChildren): JSX.Element; +export {}; diff --git a/lib/build/components/routingComponent.d.ts b/lib/build/components/routingComponent.d.ts index cb43eb986..4291f88d9 100644 --- a/lib/build/components/routingComponent.d.ts +++ b/lib/build/components/routingComponent.d.ts @@ -1,8 +1,8 @@ -/// -import { RecipeRouter } from "../recipe/recipeRouter"; -import type { ReactRouterDomWithCustomHistory } from "../ui/types"; -export declare function RoutingComponent(props: { - getReactRouterDomWithCustomHistory: () => ReactRouterDomWithCustomHistory | undefined; - preBuiltUIList: RecipeRouter[]; - path: string; -}): JSX.Element | null; +/// +import { RecipeRouter } from "../recipe/recipeRouter"; +import type { ReactRouterDomWithCustomHistory } from "../ui/types"; +export declare function RoutingComponent(props: { + getReactRouterDomWithCustomHistory: () => ReactRouterDomWithCustomHistory | undefined; + preBuiltUIList: RecipeRouter[]; + path: string; +}): JSX.Element | null; diff --git a/lib/build/components/superTokensRoute.d.ts b/lib/build/components/superTokensRoute.d.ts index 91216e1bf..7a5e12d93 100644 --- a/lib/build/components/superTokensRoute.d.ts +++ b/lib/build/components/superTokensRoute.d.ts @@ -1,12 +1,8 @@ -/// -import type { RecipeRouter } from "../recipe/recipeRouter"; -import type { ReactRouterDomWithCustomHistory } from "../ui/types"; -export declare function getSuperTokensRoutesForReactRouterDom({ - getReactRouterDomWithCustomHistory, - recipeList, - basePath, -}: { - getReactRouterDomWithCustomHistory: () => ReactRouterDomWithCustomHistory | undefined; - recipeList: RecipeRouter[]; - basePath: string | undefined; -}): JSX.Element[]; +/// +import type { RecipeRouter } from "../recipe/recipeRouter"; +import type { ReactRouterDomWithCustomHistory } from "../ui/types"; +export declare function getSuperTokensRoutesForReactRouterDom({ getReactRouterDomWithCustomHistory, recipeList, basePath, }: { + getReactRouterDomWithCustomHistory: () => ReactRouterDomWithCustomHistory | undefined; + recipeList: RecipeRouter[]; + basePath: string | undefined; +}): JSX.Element[]; diff --git a/lib/build/components/superTokensRouteV6.d.ts b/lib/build/components/superTokensRouteV6.d.ts index 9c56ef2c2..e4695742b 100644 --- a/lib/build/components/superTokensRouteV6.d.ts +++ b/lib/build/components/superTokensRouteV6.d.ts @@ -1,12 +1,8 @@ -/// -import type { RecipeRouter } from "../recipe/recipeRouter"; -import type { ReactRouterDomWithCustomHistory } from "../ui/types"; -export declare function getSuperTokensRoutesForReactRouterDomV6({ - getReactRouterDomWithCustomHistory, - recipeList, - basePath, -}: { - getReactRouterDomWithCustomHistory: () => ReactRouterDomWithCustomHistory | undefined; - recipeList: RecipeRouter[]; - basePath: string | undefined; -}): JSX.Element[]; +/// +import type { RecipeRouter } from "../recipe/recipeRouter"; +import type { ReactRouterDomWithCustomHistory } from "../ui/types"; +export declare function getSuperTokensRoutesForReactRouterDomV6({ getReactRouterDomWithCustomHistory, recipeList, basePath, }: { + getReactRouterDomWithCustomHistory: () => ReactRouterDomWithCustomHistory | undefined; + recipeList: RecipeRouter[]; + basePath: string | undefined; +}): JSX.Element[]; diff --git a/lib/build/components/supertokensWrapper.d.ts b/lib/build/components/supertokensWrapper.d.ts index e5606f3d6..6fe6aa425 100644 --- a/lib/build/components/supertokensWrapper.d.ts +++ b/lib/build/components/supertokensWrapper.d.ts @@ -1,7 +1,5 @@ -import type { UserContext } from "../types"; -import type { PropsWithChildren } from "react"; -export declare const SuperTokensWrapper: React.FC< - PropsWithChildren<{ - userContext?: UserContext; - }> ->; +import type { UserContext } from "../types"; +import type { PropsWithChildren } from "react"; +export declare const SuperTokensWrapper: React.FC>; diff --git a/lib/build/constants.d.ts b/lib/build/constants.d.ts index 8ba89d3bd..0a3832cc1 100644 --- a/lib/build/constants.d.ts +++ b/lib/build/constants.d.ts @@ -1,7 +1,6 @@ -export declare const RECIPE_ID_QUERY_PARAM = "rid"; -export declare const TENANT_ID_QUERY_PARAM = "tenantId"; -export declare const DEFAULT_API_BASE_PATH = "/auth"; -export declare const DEFAULT_WEBSITE_BASE_PATH = "/auth"; -export declare const ST_ROOT_ID = "supertokens-root"; -export declare const SSR_ERROR = - "\nIf you are trying to use this method doing server-side-rendering, please make sure you move this method inside a componentDidMount method or useEffect hook."; +export declare const RECIPE_ID_QUERY_PARAM = "rid"; +export declare const TENANT_ID_QUERY_PARAM = "tenantId"; +export declare const DEFAULT_API_BASE_PATH = "/auth"; +export declare const DEFAULT_WEBSITE_BASE_PATH = "/auth"; +export declare const ST_ROOT_ID = "supertokens-root"; +export declare const SSR_ERROR = "\nIf you are trying to use this method doing server-side-rendering, please make sure you move this method inside a componentDidMount method or useEffect hook."; diff --git a/lib/build/constants.js b/lib/build/constants.js new file mode 100644 index 000000000..782df66c0 --- /dev/null +++ b/lib/build/constants.js @@ -0,0 +1,29 @@ +'use strict'; + +var ACCESS_TOKEN_COOKIE_NAME = "sAccessToken"; +var ACCESS_TOKEN_HEADER_NAME = "st-access-token"; +var FRONT_TOKEN_COOKIE_NAME = "sFrontToken"; +var FRONT_TOKEN_HEADER_NAME = "front-token"; +var REFRESH_TOKEN_COOKIE_NAME = "sRefreshToken"; +var REFRESH_TOKEN_HEADER_NAME = "st-refresh-token"; +var ANTI_CSRF_TOKEN_COOKIE_NAME = "sAntiCsrf"; +var ANTI_CSRF_TOKEN_HEADER_NAME = "anti-csrf"; +var REDIRECT_ATTEMPT_MAX_COUNT = 5; +var REDIRECT_ATTEMPT_COUNT_COOKIE_NAME = "sSsrSessionRefreshAttempt"; +var CURRENT_PATH_COOKIE_NAME = "sCurrentPath"; +var FORCE_LOGOUT_PATH_PARAM_NAME = "forceLogout"; +var REDIRECT_PATH_PARAM_NAME = "stRedirectTo"; + +exports.ACCESS_TOKEN_COOKIE_NAME = ACCESS_TOKEN_COOKIE_NAME; +exports.ACCESS_TOKEN_HEADER_NAME = ACCESS_TOKEN_HEADER_NAME; +exports.ANTI_CSRF_TOKEN_COOKIE_NAME = ANTI_CSRF_TOKEN_COOKIE_NAME; +exports.ANTI_CSRF_TOKEN_HEADER_NAME = ANTI_CSRF_TOKEN_HEADER_NAME; +exports.CURRENT_PATH_COOKIE_NAME = CURRENT_PATH_COOKIE_NAME; +exports.FORCE_LOGOUT_PATH_PARAM_NAME = FORCE_LOGOUT_PATH_PARAM_NAME; +exports.FRONT_TOKEN_COOKIE_NAME = FRONT_TOKEN_COOKIE_NAME; +exports.FRONT_TOKEN_HEADER_NAME = FRONT_TOKEN_HEADER_NAME; +exports.REDIRECT_ATTEMPT_COUNT_COOKIE_NAME = REDIRECT_ATTEMPT_COUNT_COOKIE_NAME; +exports.REDIRECT_ATTEMPT_MAX_COUNT = REDIRECT_ATTEMPT_MAX_COUNT; +exports.REDIRECT_PATH_PARAM_NAME = REDIRECT_PATH_PARAM_NAME; +exports.REFRESH_TOKEN_COOKIE_NAME = REFRESH_TOKEN_COOKIE_NAME; +exports.REFRESH_TOKEN_HEADER_NAME = REFRESH_TOKEN_HEADER_NAME; diff --git a/lib/build/dateProvider/index.d.ts b/lib/build/dateProvider/index.d.ts index 26e63e67d..1ae1f99e8 100644 --- a/lib/build/dateProvider/index.d.ts +++ b/lib/build/dateProvider/index.d.ts @@ -1 +1 @@ -export { DateProviderReference } from "supertokens-web-js/utils/dateProvider"; +export { DateProviderReference } from "supertokens-web-js/utils/dateProvider"; diff --git a/lib/build/dateProvider/types.d.ts b/lib/build/dateProvider/types.d.ts index 158ae2ca9..d889546ae 100644 --- a/lib/build/dateProvider/types.d.ts +++ b/lib/build/dateProvider/types.d.ts @@ -1 +1 @@ -export { DateProviderInput, DateProviderInterface } from "supertokens-web-js/utils/dateProvider/types"; +export { DateProviderInput, DateProviderInterface } from "supertokens-web-js/utils/dateProvider/types"; diff --git a/lib/build/emailLargeIcon.js b/lib/build/emailLargeIcon.js index a3fb96723..e6fb4fa82 100644 --- a/lib/build/emailLargeIcon.js +++ b/lib/build/emailLargeIcon.js @@ -1,52 +1,30 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function EmailLargeIcon() { - return jsxRuntime.jsxs( - "svg", - genericComponentOverrideContext.__assign( - { width: "81", height: "74", viewBox: "0 0 81 74", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, - { - children: [ - jsxRuntime.jsx("rect", { - width: "81", - height: "74", - rx: "12", - fill: "#2D3644", - fillOpacity: "0.1", - }), - jsxRuntime.jsx("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M22.304 22.0647C21.4909 22.2023 20.7728 22.5533 20.1863 23.0998C18.7101 24.4753 18.6499 26.6951 20.0512 28.0797C20.366 28.3907 21.5186 29.123 29.4316 34.0394C34.3935 37.1223 38.5814 39.7052 38.7381 39.7792C39.2064 40.0002 39.6687 40.1143 40.2244 40.1458C40.8761 40.1827 41.4402 40.1043 41.985 39.9011C42.2986 39.784 44.5964 38.3819 51.3963 34.1584C56.3443 31.0851 60.5173 28.4732 60.6697 28.3541C61.6877 27.5591 62.2023 26.167 61.9144 24.9866C61.6226 23.7897 60.8986 22.9167 59.7616 22.3906C58.8649 21.9756 60.7985 22.015 40.6942 22.003C25.4606 21.9939 22.667 22.0033 22.304 22.0647ZM19.0395 30.4626C18.9759 30.522 18.9942 48.1686 19.0584 48.6611C19.1774 49.5735 19.5459 50.2964 20.1994 50.8994C20.8308 51.482 21.6026 51.8339 22.511 51.9535C22.8345 51.9961 27.7369 52.0074 40.7771 51.9956C57.6349 51.9804 58.6205 51.9745 58.9603 51.8882C60.2693 51.5556 61.3138 50.6712 61.7699 49.5095C62.0053 48.9096 62 49.1399 62 39.5359C62 32.263 61.986 30.4234 61.9309 30.4431C61.8929 30.4567 57.8079 32.987 52.8531 36.066C46.8009 39.8271 43.6631 41.747 43.2918 41.9165C42.9361 42.0787 42.4928 42.2268 42.0483 42.3318C41.4278 42.4783 41.273 42.4951 40.5284 42.4969C40.0474 42.498 39.5717 42.4714 39.3954 42.4335C38.8623 42.319 38.0528 42.0686 37.6821 41.9036C37.4845 41.8156 33.2326 39.2037 28.2334 36.0994C23.2342 32.995 19.129 30.4488 19.1107 30.4412C19.0924 30.4335 19.0604 30.4432 19.0395 30.4626Z", - fill: "#2D3644", - }), - ], - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function EmailLargeIcon() { + return (jsxRuntime.jsxs("svg", logger.__assign({ width: "81", height: "74", viewBox: "0 0 81 74", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: [jsxRuntime.jsx("rect", { width: "81", height: "74", rx: "12", fill: "#2D3644", fillOpacity: "0.1" }), jsxRuntime.jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M22.304 22.0647C21.4909 22.2023 20.7728 22.5533 20.1863 23.0998C18.7101 24.4753 18.6499 26.6951 20.0512 28.0797C20.366 28.3907 21.5186 29.123 29.4316 34.0394C34.3935 37.1223 38.5814 39.7052 38.7381 39.7792C39.2064 40.0002 39.6687 40.1143 40.2244 40.1458C40.8761 40.1827 41.4402 40.1043 41.985 39.9011C42.2986 39.784 44.5964 38.3819 51.3963 34.1584C56.3443 31.0851 60.5173 28.4732 60.6697 28.3541C61.6877 27.5591 62.2023 26.167 61.9144 24.9866C61.6226 23.7897 60.8986 22.9167 59.7616 22.3906C58.8649 21.9756 60.7985 22.015 40.6942 22.003C25.4606 21.9939 22.667 22.0033 22.304 22.0647ZM19.0395 30.4626C18.9759 30.522 18.9942 48.1686 19.0584 48.6611C19.1774 49.5735 19.5459 50.2964 20.1994 50.8994C20.8308 51.482 21.6026 51.8339 22.511 51.9535C22.8345 51.9961 27.7369 52.0074 40.7771 51.9956C57.6349 51.9804 58.6205 51.9745 58.9603 51.8882C60.2693 51.5556 61.3138 50.6712 61.7699 49.5095C62.0053 48.9096 62 49.1399 62 39.5359C62 32.263 61.986 30.4234 61.9309 30.4431C61.8929 30.4567 57.8079 32.987 52.8531 36.066C46.8009 39.8271 43.6631 41.747 43.2918 41.9165C42.9361 42.0787 42.4928 42.2268 42.0483 42.3318C41.4278 42.4783 41.273 42.4951 40.5284 42.4969C40.0474 42.498 39.5717 42.4714 39.3954 42.4335C38.8623 42.319 38.0528 42.0686 37.6821 41.9036C37.4845 41.8156 33.2326 39.2037 28.2334 36.0994C23.2342 32.995 19.129 30.4488 19.1107 30.4412C19.0924 30.4335 19.0604 30.4432 19.0395 30.4626Z", fill: "#2D3644" })] }))); } exports.EmailLargeIcon = EmailLargeIcon; diff --git a/lib/build/emailpassword-shared.js b/lib/build/emailpassword-shared.js index 2cf2045e7..fe60d9d0c 100644 --- a/lib/build/emailpassword-shared.js +++ b/lib/build/emailpassword-shared.js @@ -1,30 +1,20 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -require("./index2.js"); -var translationContext = require("./translationContext.js"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +require('./index2.js'); +var translationContext = require('./translationContext.js'); -/* - * Component. - */ -function Button(_a) { - var type = _a.type, - label = _a.label, - disabled = _a.disabled, - isLoading = _a.isLoading, - onClick = _a.onClick; - var t = translationContext.useTranslation(); - if (disabled === undefined) { - disabled = false; - } - return jsxRuntime.jsxs( - "button", - genericComponentOverrideContext.__assign( - { type: type, disabled: disabled, onClick: onClick, "data-supertokens": "button" }, - { children: [t(label), isLoading && "..."] } - ) - ); +/* + * Component. + */ +function Button(_a) { + var type = _a.type, label = _a.label, disabled = _a.disabled, isLoading = _a.isLoading, onClick = _a.onClick; + var t = translationContext.useTranslation(); + if (disabled === undefined) { + disabled = false; + } + return (jsxRuntime.jsxs("button", logger.__assign({ type: type, disabled: disabled, onClick: onClick, "data-supertokens": "button" }, { children: [t(label), isLoading && "..."] }))); } exports.Button = Button; diff --git a/lib/build/emailpassword-shared2.js b/lib/build/emailpassword-shared2.js index bd3b554b5..7d16271fd 100644 --- a/lib/build/emailpassword-shared2.js +++ b/lib/build/emailpassword-shared2.js @@ -1,10 +1,8 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); -var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), - useContext = _a[0], - Provider = _a[1]; +var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), useContext = _a[0], Provider = _a[1]; exports.Provider = Provider; exports.useContext = useContext; diff --git a/lib/build/emailpassword-shared3.js b/lib/build/emailpassword-shared3.js index 9abb90a67..69108b96a 100644 --- a/lib/build/emailpassword-shared3.js +++ b/lib/build/emailpassword-shared3.js @@ -1,679 +1,561 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var EmailPasswordWebJS = require("supertokens-web-js/recipe/emailpassword"); -var index = require("./authRecipe-shared2.js"); -var types = require("./multifactorauth-shared.js"); -var constants = require("./emailpassword-shared4.js"); -var utils = require("./authRecipe-shared.js"); +var logger = require('./logger.js'); +var EmailPasswordWebJS = require('supertokens-web-js/recipe/emailpassword'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var index = require('./authRecipe-shared2.js'); +var types = require('./multifactorauth-shared.js'); +var constants = require('./emailpassword-shared4.js'); +var utils = require('./authRecipe-shared.js'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var EmailPasswordWebJS__default = /*#__PURE__*/ _interopDefault(EmailPasswordWebJS); +var EmailPasswordWebJS__default = /*#__PURE__*/_interopDefault(EmailPasswordWebJS); -var getFunctionOverrides = function (onHandleEvent) { - return function (originalImp) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, originalImp), { - submitNewPassword: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - originalImp.submitNewPassword( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, input), - { formFields: [input.formFields[0]] } - ) - ), - ]; - case 1: - response = _a.sent(); - if (response.status === "OK") { - onHandleEvent({ - action: "PASSWORD_RESET_SUCCESSFUL", - userContext: input.userContext, - }); - } - return [2 /*return*/, response]; - } - }); - }); - }, - sendPasswordResetEmail: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImp.sendPasswordResetEmail(input)]; - case 1: - response = _a.sent(); - if (response.status === "OK") { - onHandleEvent({ - action: "RESET_PASSWORD_EMAIL_SENT", - email: input.formFields.find(function (_a) { - var id = _a.id; - return id === "email"; - }).value, - userContext: input.userContext, - }); - } - return [2 /*return*/, response]; - } - }); - }); - }, - signUp: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var payloadBeforeCall, response, payloadAfterCall; - return genericComponentOverrideContext.__generator(this, function (_c) { - switch (_c.label) { - case 0: - _c.trys.push([0, 2, , 3]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: input.userContext, - }), - ]; - case 1: - payloadBeforeCall = _c.sent(); - return [3 /*break*/, 3]; - case 2: - _c.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadBeforeCall = undefined; - return [3 /*break*/, 3]; - case 3: - return [4 /*yield*/, originalImp.signUp(input)]; - case 4: - response = _c.sent(); - if (!(response.status === "OK")) return [3 /*break*/, 9]; - payloadAfterCall = void 0; - _c.label = 5; - case 5: - _c.trys.push([5, 7, , 8]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: input.userContext, - }), - ]; - case 6: - payloadAfterCall = _c.sent(); - return [3 /*break*/, 8]; - case 7: - _c.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadAfterCall = undefined; - return [3 /*break*/, 8]; - case 8: - onHandleEvent({ - action: "SUCCESS", - isNewRecipeUser: true, - createdNewSession: - payloadAfterCall !== undefined && - (payloadBeforeCall === undefined || - payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), - user: response.user, - userContext: input.userContext, - }); - _c.label = 9; - case 9: - return [2 /*return*/, response]; - } - }); - }); - }, - signIn: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var payloadBeforeCall, response, payloadAfterCall; - return genericComponentOverrideContext.__generator(this, function (_c) { - switch (_c.label) { - case 0: - _c.trys.push([0, 2, , 3]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: input.userContext, - }), - ]; - case 1: - payloadBeforeCall = _c.sent(); - return [3 /*break*/, 3]; - case 2: - _c.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadBeforeCall = undefined; - return [3 /*break*/, 3]; - case 3: - return [4 /*yield*/, originalImp.signIn(input)]; - case 4: - response = _c.sent(); - if (!(response.status === "OK")) return [3 /*break*/, 9]; - payloadAfterCall = void 0; - _c.label = 5; - case 5: - _c.trys.push([5, 7, , 8]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: input.userContext, - }), - ]; - case 6: - payloadAfterCall = _c.sent(); - return [3 /*break*/, 8]; - case 7: - _c.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadAfterCall = undefined; - return [3 /*break*/, 8]; - case 8: - onHandleEvent({ - action: "SUCCESS", - isNewRecipeUser: false, - createdNewSession: - payloadAfterCall !== undefined && - (payloadBeforeCall === undefined || - payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), - user: response.user, - userContext: input.userContext, - }); - _c.label = 9; - case 9: - return [2 /*return*/, response]; - } - }); - }); - }, - }); - }; +var getFunctionOverrides = function (onHandleEvent) { + return function (originalImp) { return (logger.__assign(logger.__assign({}, originalImp), { submitNewPassword: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.submitNewPassword(logger.__assign(logger.__assign({}, input), { formFields: [input.formFields[0]] }))]; + case 1: + response = _a.sent(); + if (response.status === "OK") { + onHandleEvent({ + action: "PASSWORD_RESET_SUCCESSFUL", + userContext: input.userContext, + }); + } + return [2 /*return*/, response]; + } + }); + }); + }, sendPasswordResetEmail: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.sendPasswordResetEmail(input)]; + case 1: + response = _a.sent(); + if (response.status === "OK") { + onHandleEvent({ + action: "RESET_PASSWORD_EMAIL_SENT", + email: input.formFields.find(function (_a) { + var id = _a.id; + return id === "email"; + }).value, + userContext: input.userContext, + }); + } + return [2 /*return*/, response]; + } + }); + }); + }, signUp: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var payloadBeforeCall, response, payloadAfterCall; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + _c.trys.push([0, 2, , 3]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: input.userContext, + })]; + case 1: + payloadBeforeCall = _c.sent(); + return [3 /*break*/, 3]; + case 2: + _c.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadBeforeCall = undefined; + return [3 /*break*/, 3]; + case 3: return [4 /*yield*/, originalImp.signUp(input)]; + case 4: + response = _c.sent(); + if (!(response.status === "OK")) return [3 /*break*/, 9]; + payloadAfterCall = void 0; + _c.label = 5; + case 5: + _c.trys.push([5, 7, , 8]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: input.userContext, + })]; + case 6: + payloadAfterCall = _c.sent(); + return [3 /*break*/, 8]; + case 7: + _c.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadAfterCall = undefined; + return [3 /*break*/, 8]; + case 8: + onHandleEvent({ + action: "SUCCESS", + isNewRecipeUser: true, + createdNewSession: payloadAfterCall !== undefined && + (payloadBeforeCall === undefined || + payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), + user: response.user, + userContext: input.userContext, + }); + _c.label = 9; + case 9: return [2 /*return*/, response]; + } + }); + }); + }, signIn: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var payloadBeforeCall, response, payloadAfterCall; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + _c.trys.push([0, 2, , 3]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: input.userContext, + })]; + case 1: + payloadBeforeCall = _c.sent(); + return [3 /*break*/, 3]; + case 2: + _c.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadBeforeCall = undefined; + return [3 /*break*/, 3]; + case 3: return [4 /*yield*/, originalImp.signIn(input)]; + case 4: + response = _c.sent(); + if (!(response.status === "OK")) return [3 /*break*/, 9]; + payloadAfterCall = void 0; + _c.label = 5; + case 5: + _c.trys.push([5, 7, , 8]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: input.userContext, + })]; + case 6: + payloadAfterCall = _c.sent(); + return [3 /*break*/, 8]; + case 7: + _c.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadAfterCall = undefined; + return [3 /*break*/, 8]; + case 8: + onHandleEvent({ + action: "SUCCESS", + isNewRecipeUser: false, + createdNewSession: payloadAfterCall !== undefined && + (payloadBeforeCall === undefined || + payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), + user: response.user, + userContext: input.userContext, + }); + _c.label = 9; + case 9: return [2 /*return*/, response]; + } + }); + }); + } })); }; }; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * defaultEmailValidator. - */ -function defaultEmailValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var defaultEmailValidatorRegexp; - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "ERROR_EMAIL_NON_STRING"]; - } - value = value.trim(); - defaultEmailValidatorRegexp = - // eslint-disable-next-line no-useless-escape - /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - // We check if the email syntax is correct - // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 - // Regex from https://stackoverflow.com/a/46181/3867175 - if (value.match(defaultEmailValidatorRegexp) === null) { - return [2 /*return*/, "ERROR_EMAIL_INVALID"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultPasswordValidator. - * min 8 characters. - * Contains lowercase, uppercase, and numbers. - */ -function defaultPasswordValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; - } - // length >= 8 && < 100 - // must have a number and a character - // as per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 - if (value.length < 8) { - return [2 /*return*/, "ERROR_PASSWORD_TOO_SHORT"]; - } - if (value.length >= 100) { - return [2 /*return*/, "ERROR_PASSWORD_TOO_LONG"]; - } - if (value.match(/^.*[A-Za-z]+.*$/) === null) { - return [2 /*return*/, "ERROR_PASSWORD_NO_ALPHA"]; - } - if (value.match(/^.*[0-9]+.*$/) === null) { - return [2 /*return*/, "ERROR_PASSWORD_NO_NUM"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultLoginPasswordValidator. - * type string - */ -function defaultLoginPasswordValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultValidate - */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function defaultValidate(_) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [2 /*return*/, undefined]; - }); - }); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * defaultEmailValidator. + */ +function defaultEmailValidator(value) { + return logger.__awaiter(this, void 0, void 0, function () { + var defaultEmailValidatorRegexp; + return logger.__generator(this, function (_a) { + if (typeof value !== "string") { + return [2 /*return*/, "ERROR_EMAIL_NON_STRING"]; + } + value = value.trim(); + defaultEmailValidatorRegexp = + // eslint-disable-next-line no-useless-escape + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + // We check if the email syntax is correct + // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 + // Regex from https://stackoverflow.com/a/46181/3867175 + if (value.match(defaultEmailValidatorRegexp) === null) { + return [2 /*return*/, "ERROR_EMAIL_INVALID"]; + } + return [2 /*return*/, undefined]; + }); + }); +} +/* + * defaultPasswordValidator. + * min 8 characters. + * Contains lowercase, uppercase, and numbers. + */ +function defaultPasswordValidator(value) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (typeof value !== "string") { + return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; + } + // length >= 8 && < 100 + // must have a number and a character + // as per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 + if (value.length < 8) { + return [2 /*return*/, "ERROR_PASSWORD_TOO_SHORT"]; + } + if (value.length >= 100) { + return [2 /*return*/, "ERROR_PASSWORD_TOO_LONG"]; + } + if (value.match(/^.*[A-Za-z]+.*$/) === null) { + return [2 /*return*/, "ERROR_PASSWORD_NO_ALPHA"]; + } + if (value.match(/^.*[0-9]+.*$/) === null) { + return [2 /*return*/, "ERROR_PASSWORD_NO_NUM"]; + } + return [2 /*return*/, undefined]; + }); + }); +} +/* + * defaultLoginPasswordValidator. + * type string + */ +function defaultLoginPasswordValidator(value) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (typeof value !== "string") { + return [2 /*return*/, "ERROR_PASSWORD_NON_STRING"]; + } + return [2 /*return*/, undefined]; + }); + }); +} +/* + * defaultValidate + */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +function defaultValidate(_) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, undefined]; + }); + }); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function normaliseEmailPasswordConfig(config) { - if (config === undefined) { - config = {}; - } - var signInAndUpFeature = normaliseSignInAndUpFeature(config.signInAndUpFeature); - var signUpPasswordField = signInAndUpFeature.signUpForm.formFields.find(function (field) { - return field.id === "password"; - }); - var signUpEmailField = signInAndUpFeature.signUpForm.formFields.find(function (field) { - return field.id === "email"; - }); - var resetPasswordUsingTokenFeature = normaliseResetPasswordUsingTokenFeature( - signUpPasswordField.validate, - signUpEmailField, - config.resetPasswordUsingTokenFeature - ); - var override = genericComponentOverrideContext.__assign( - { - functions: function (originalImplementation) { - return originalImplementation; - }, - }, - config.override - ); - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, utils.normaliseAuthRecipe(config)), - { - signInAndUpFeature: signInAndUpFeature, - resetPasswordUsingTokenFeature: resetPasswordUsingTokenFeature, - override: override, - } - ); -} -function normaliseSignInAndUpFeature(config) { - if (config === undefined) { - config = {}; - } - var signUpForm = normaliseSignUpFormFeatureConfig(config.signUpForm); - /* - * Default Sign In corresponds to computed Sign Up fields filtered by email and password only. - * i.e. If the user overrides sign Up fields, that is propagated to default sign In fields. - * Exception made of the password validator which only verifies that the value is not empty for login - * https://github.com/supertokens/supertokens-auth-react/issues/21 - */ - var defaultSignInFields = signUpForm.formFields.reduce(function (signInFieldsAccumulator, field) { - if (field.id === "email") { - return genericComponentOverrideContext.__spreadArray( - genericComponentOverrideContext.__spreadArray([], signInFieldsAccumulator, true), - [field], - false - ); - } - if (field.id === "password") { - return genericComponentOverrideContext.__spreadArray( - genericComponentOverrideContext.__spreadArray([], signInFieldsAccumulator, true), - [ - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, field), { - autoComplete: "current-password", - validate: defaultLoginPasswordValidator, - }), - ], - false - ); - } - return signInFieldsAccumulator; - }, []); - var signInForm = normaliseSignInFormFeatureConfig(defaultSignInFields, config.signInForm); - return { - signUpForm: signUpForm, - signInForm: signInForm, - }; -} -function normaliseSignUpFormFeatureConfig(config) { - if (config === undefined) { - config = {}; - } - var defaultFormFields = getDefaultFormFields(); - var userFormFields = []; - if (config.formFields !== undefined) { - userFormFields = config.formFields; - } - var formFields = mergeFormFields(defaultFormFields, userFormFields); - var style = config.style !== undefined ? config.style : ""; - return { - style: style, - formFields: formFields, - }; -} -function normaliseSignInFormFeatureConfig(defaultFormFields, config) { - if (config === undefined) { - config = {}; - } - var userFormFields = []; - if (config.formFields !== undefined) { - userFormFields = config.formFields - // Filter on email and password only. - .filter(function (field) { - return constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id); - }) - // Sign In fields are never optional. - .map(function (field) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, field), { - optional: false, - }); - }); - } - var formFields = mergeFormFields(defaultFormFields, userFormFields); - var style = config.style !== undefined ? config.style : ""; - return { - style: style, - formFields: formFields, - }; -} -function getDefaultFormFields() { - return [getDefaultEmailFormField(), getDefaultPasswordFormField()]; -} -function getDefaultEmailFormField() { - return { - id: "email", - label: "EMAIL_PASSWORD_EMAIL_LABEL", - placeholder: "EMAIL_PASSWORD_EMAIL_PLACEHOLDER", - validate: defaultEmailValidator, - optional: false, - autoComplete: "email", - }; -} -function getDefaultPasswordFormField() { - return { - id: "password", - label: "EMAIL_PASSWORD_PASSWORD_LABEL", - placeholder: "EMAIL_PASSWORD_PASSWORD_PLACEHOLDER", - validate: defaultPasswordValidator, - optional: false, - autoComplete: "new-password", - }; -} -function normaliseResetPasswordUsingTokenFeature(signUpPasswordFieldValidate, signUpEmailField, config) { - if (config === undefined) { - config = {}; - } - var disableDefaultUI = config.disableDefaultUI === true; - var submitNewPasswordFormStyle = - config.submitNewPasswordForm !== undefined && config.submitNewPasswordForm.style !== undefined - ? config.submitNewPasswordForm.style - : ""; - var submitNewPasswordForm = { - style: submitNewPasswordFormStyle, - formFields: [ - { - id: "password", - label: "EMAIL_PASSWORD_NEW_PASSWORD_LABEL", - placeholder: "EMAIL_PASSWORD_NEW_PASSWORD_PLACEHOLDER", - validate: signUpPasswordFieldValidate, - optional: false, - autoComplete: "new-password", - }, - { - id: "confirm-password", - label: "EMAIL_PASSWORD_CONFIRM_PASSWORD_LABEL", - placeholder: "EMAIL_PASSWORD_CONFIRM_PASSWORD_PLACEHOLDER", - validate: signUpPasswordFieldValidate, - optional: false, - autoComplete: "new-password", - }, - ], - }; - var enterEmailFormStyle = - config.enterEmailForm !== undefined && config.enterEmailForm.style !== undefined - ? config.enterEmailForm.style - : ""; - var enterEmailForm = { - style: enterEmailFormStyle, - formFields: [ - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, getDefaultEmailFormField()), - { validate: signUpEmailField.validate, placeholder: "", autofocus: true } - ), - ], - }; - return { - disableDefaultUI: disableDefaultUI, - submitNewPasswordForm: submitNewPasswordForm, - enterEmailForm: enterEmailForm, - }; -} -/* - * mergeFormFields by keeping the provided order, defaultFormFields or merged first, and unmerged userFormFields after. - */ -function mergeFormFields(defaultFormFields, userFormFields) { - // Create a new array with default fields. - var mergedFormFields = defaultFormFields; - // Loop through user provided fields. - for (var i = 0; i < userFormFields.length; i++) { - var userField = userFormFields[i]; - var isNewField = true; - // Loop through the merged fields array. - for (var j = 0; j < mergedFormFields.length; j++) { - var mergedField = mergedFormFields[j]; - // If id is equal, merge the fields - if (userField.id === mergedField.id) { - // Make sure that email and password are kept mandatory. - var optional = mergedField.optional; // Init with default value. - // If user provided value, overwrite. - if (userField.optional !== undefined) { - optional = userField.optional; - } - // If "email" or "password", always mandatory. - if (constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(userField.id)) { - optional = false; - } - // Merge. - mergedFormFields[j] = genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, mergedFormFields[j]), - userField - ), - { optional: optional } - ); - isNewField = false; - break; - } - } - // If new field, push to mergeFormFields. - if (isNewField) { - mergedFormFields.push( - genericComponentOverrideContext.__assign( - { optional: false, placeholder: userField.label, validate: defaultValidate }, - userField - ) - ); - } - } - return mergedFormFields.map(function (field) { - return getFormattedFormField(field); - }); -} -function getFormattedFormField(field) { - var _this = this; - // Fields with the 'nonOptionalErrorMsg' property must have a valid message defined - if (field.optional === false && field.nonOptionalErrorMsg === "") { - throw new Error("nonOptionalErrorMsg for field ".concat(field.id, " cannot be an empty string")); - } - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, field), { - validate: function (value) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - // Absent or not optional empty field - if (value === "" && field.optional === false) { - if (field.nonOptionalErrorMsg !== undefined) { - return [2 /*return*/, field.nonOptionalErrorMsg]; - } - return [2 /*return*/, "ERROR_NON_OPTIONAL"]; - } - return [4 /*yield*/, field.validate(value)]; - case 1: - return [2 /*return*/, _a.sent()]; - } - }); - }); - }, - }); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function normaliseEmailPasswordConfig(config) { + if (config === undefined) { + config = {}; + } + var signInAndUpFeature = normaliseSignInAndUpFeature(config.signInAndUpFeature); + var signUpPasswordField = signInAndUpFeature.signUpForm.formFields.find(function (field) { + return field.id === "password"; + }); + var signUpEmailField = signInAndUpFeature.signUpForm.formFields.find(function (field) { + return field.id === "email"; + }); + var resetPasswordUsingTokenFeature = normaliseResetPasswordUsingTokenFeature(signUpPasswordField.validate, signUpEmailField, config.resetPasswordUsingTokenFeature); + var override = logger.__assign({ functions: function (originalImplementation) { return originalImplementation; } }, config.override); + return logger.__assign(logger.__assign({}, utils.normaliseAuthRecipe(config)), { signInAndUpFeature: signInAndUpFeature, resetPasswordUsingTokenFeature: resetPasswordUsingTokenFeature, override: override }); +} +function normaliseSignInAndUpFeature(config) { + if (config === undefined) { + config = {}; + } + var signUpForm = normaliseSignUpFormFeatureConfig(config.signUpForm); + /* + * Default Sign In corresponds to computed Sign Up fields filtered by email and password only. + * i.e. If the user overrides sign Up fields, that is propagated to default sign In fields. + * Exception made of the password validator which only verifies that the value is not empty for login + * https://github.com/supertokens/supertokens-auth-react/issues/21 + */ + var defaultSignInFields = signUpForm.formFields.reduce(function (signInFieldsAccumulator, field) { + if (field.id === "email") { + return logger.__spreadArray(logger.__spreadArray([], signInFieldsAccumulator, true), [field], false); + } + if (field.id === "password") { + return logger.__spreadArray(logger.__spreadArray([], signInFieldsAccumulator, true), [ + logger.__assign(logger.__assign({}, field), { autoComplete: "current-password", validate: defaultLoginPasswordValidator }), + ], false); + } + return signInFieldsAccumulator; + }, []); + var signInForm = normaliseSignInFormFeatureConfig(defaultSignInFields, config.signInForm); + return { + signUpForm: signUpForm, + signInForm: signInForm, + }; +} +function normaliseSignUpFormFeatureConfig(config) { + if (config === undefined) { + config = {}; + } + var defaultFormFields = getDefaultFormFields(); + var userFormFields = []; + if (config.formFields !== undefined) { + userFormFields = config.formFields; + } + var formFields = mergeFormFields(defaultFormFields, userFormFields); + var style = config.style !== undefined ? config.style : ""; + return { + style: style, + formFields: formFields, + }; +} +function normaliseSignInFormFeatureConfig(defaultFormFields, config) { + if (config === undefined) { + config = {}; + } + var userFormFields = []; + if (config.formFields !== undefined) { + userFormFields = config.formFields + // Filter on email and password only. + .filter(function (field) { return constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id); }) + // Sign In fields are never optional. + .map(function (field) { return (logger.__assign(logger.__assign({}, field), { optional: false })); }); + } + var formFields = mergeFormFields(defaultFormFields, userFormFields); + var style = config.style !== undefined ? config.style : ""; + return { + style: style, + formFields: formFields, + }; +} +function getDefaultFormFields() { + return [getDefaultEmailFormField(), getDefaultPasswordFormField()]; +} +function getDefaultEmailFormField() { + return { + id: "email", + label: "EMAIL_PASSWORD_EMAIL_LABEL", + placeholder: "EMAIL_PASSWORD_EMAIL_PLACEHOLDER", + validate: defaultEmailValidator, + optional: false, + autoComplete: "email", + }; +} +function getDefaultPasswordFormField() { + return { + id: "password", + label: "EMAIL_PASSWORD_PASSWORD_LABEL", + placeholder: "EMAIL_PASSWORD_PASSWORD_PLACEHOLDER", + validate: defaultPasswordValidator, + optional: false, + autoComplete: "new-password", + }; +} +function normaliseResetPasswordUsingTokenFeature(signUpPasswordFieldValidate, signUpEmailField, config) { + if (config === undefined) { + config = {}; + } + var disableDefaultUI = config.disableDefaultUI === true; + var submitNewPasswordFormStyle = config.submitNewPasswordForm !== undefined && config.submitNewPasswordForm.style !== undefined + ? config.submitNewPasswordForm.style + : ""; + var submitNewPasswordForm = { + style: submitNewPasswordFormStyle, + formFields: [ + { + id: "password", + label: "EMAIL_PASSWORD_NEW_PASSWORD_LABEL", + placeholder: "EMAIL_PASSWORD_NEW_PASSWORD_PLACEHOLDER", + validate: signUpPasswordFieldValidate, + optional: false, + autoComplete: "new-password", + }, + { + id: "confirm-password", + label: "EMAIL_PASSWORD_CONFIRM_PASSWORD_LABEL", + placeholder: "EMAIL_PASSWORD_CONFIRM_PASSWORD_PLACEHOLDER", + validate: signUpPasswordFieldValidate, + optional: false, + autoComplete: "new-password", + }, + ], + }; + var enterEmailFormStyle = config.enterEmailForm !== undefined && config.enterEmailForm.style !== undefined + ? config.enterEmailForm.style + : ""; + var enterEmailForm = { + style: enterEmailFormStyle, + formFields: [ + logger.__assign(logger.__assign({}, getDefaultEmailFormField()), { validate: signUpEmailField.validate, placeholder: "", autofocus: true }), + ], + }; + return { + disableDefaultUI: disableDefaultUI, + submitNewPasswordForm: submitNewPasswordForm, + enterEmailForm: enterEmailForm, + }; +} +/* + * mergeFormFields by keeping the provided order, defaultFormFields or merged first, and unmerged userFormFields after. + */ +function mergeFormFields(defaultFormFields, userFormFields) { + // Create a new array with default fields. + var mergedFormFields = defaultFormFields; + // Loop through user provided fields. + for (var i = 0; i < userFormFields.length; i++) { + var userField = userFormFields[i]; + var isNewField = true; + // Loop through the merged fields array. + for (var j = 0; j < mergedFormFields.length; j++) { + var mergedField = mergedFormFields[j]; + // If id is equal, merge the fields + if (userField.id === mergedField.id) { + // Make sure that email and password are kept mandatory. + var optional = mergedField.optional; // Init with default value. + // If user provided value, overwrite. + if (userField.optional !== undefined) { + optional = userField.optional; + } + // If "email" or "password", always mandatory. + if (constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(userField.id)) { + optional = false; + } + // Merge. + mergedFormFields[j] = logger.__assign(logger.__assign(logger.__assign({}, mergedFormFields[j]), userField), { optional: optional }); + isNewField = false; + break; + } + } + // If new field, push to mergeFormFields. + if (isNewField) { + mergedFormFields.push(logger.__assign({ optional: false, placeholder: userField.label, validate: defaultValidate }, userField)); + } + } + return mergedFormFields.map(function (field) { return getFormattedFormField(field); }); +} +function getFormattedFormField(field) { + var _this = this; + // Fields with the 'nonOptionalErrorMsg' property must have a valid message defined + if (field.optional === false && field.nonOptionalErrorMsg === "") { + throw new Error("nonOptionalErrorMsg for field ".concat(field.id, " cannot be an empty string")); + } + return logger.__assign(logger.__assign({}, field), { validate: function (value) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + // Absent or not optional empty field + if (value === "" && field.optional === false) { + if (field.nonOptionalErrorMsg !== undefined) { + return [2 /*return*/, field.nonOptionalErrorMsg]; + } + return [2 /*return*/, "ERROR_NON_OPTIONAL"]; + } + return [4 /*yield*/, field.validate(value)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); } }); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Class. - */ -var EmailPassword = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(EmailPassword, _super); - function EmailPassword(config, webJSRecipe) { - if (webJSRecipe === void 0) { - webJSRecipe = EmailPasswordWebJS__default.default; - } - var _this = _super.call(this, config) || this; - _this.webJSRecipe = webJSRecipe; - _this.recipeID = EmailPassword.RECIPE_ID; - _this.firstFactorIds = [types.FactorIds.EMAILPASSWORD]; - _this.getDefaultRedirectionURL = function (context) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (context.action === "RESET_PASSWORD") { - return [ - 2 /*return*/, - genericComponentOverrideContext.getDefaultRedirectionURLForPath( - this.config, - constants.DEFAULT_RESET_PASSWORD_PATH, - context - ), - ]; - } - return [2 /*return*/, this.getAuthRecipeDefaultRedirectionURL(context)]; - }); - }); - }; - return _this; - } - EmailPassword.prototype.getFirstFactorsForAuthPage = function () { - return this.firstFactorIds; - }; - EmailPassword.init = function (config) { - var normalisedConfig = normaliseEmailPasswordConfig(config); - return { - recipeID: EmailPassword.RECIPE_ID, - authReact: function (appInfo) { - EmailPassword.instance = new EmailPassword( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { appInfo: appInfo, recipeId: EmailPassword.RECIPE_ID } - ) - ); - return EmailPassword.instance; - }, - webJS: EmailPasswordWebJS__default.default.init( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { - override: { - functions: function (originalImpl, builder) { - var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; - }, - }, - } - ) - ), - }; - }; - EmailPassword.getInstanceOrThrow = function () { - if (EmailPassword.instance === undefined) { - var error = - "No instance of EmailPassword found. Make sure to call the EmailPassword.init method." + - "See https://supertokens.io/docs/emailpassword/quick-setup/frontend"; - // eslint-disable-next-line supertokens-auth-react/no-direct-window-object - if (typeof window === "undefined") { - error = error + genericComponentOverrideContext.SSR_ERROR; - } - throw Error(error); - } - return EmailPassword.instance; - }; - /* - * Tests methods. - */ - EmailPassword.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - EmailPassword.instance = undefined; - return; - }; - EmailPassword.RECIPE_ID = "emailpassword"; - return EmailPassword; -})(index.AuthRecipe); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Class. + */ +var EmailPassword = /** @class */ (function (_super) { + logger.__extends(EmailPassword, _super); + function EmailPassword(config, webJSRecipe) { + if (webJSRecipe === void 0) { webJSRecipe = EmailPasswordWebJS__default.default; } + var _this = _super.call(this, config) || this; + _this.webJSRecipe = webJSRecipe; + _this.recipeID = EmailPassword.RECIPE_ID; + _this.firstFactorIds = [types.FactorIds.EMAILPASSWORD]; + _this.getDefaultRedirectionURL = function (context) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (context.action === "RESET_PASSWORD") { + return [2 /*return*/, genericComponentOverrideContext.getDefaultRedirectionURLForPath(this.config, constants.DEFAULT_RESET_PASSWORD_PATH, context)]; + } + return [2 /*return*/, this.getAuthRecipeDefaultRedirectionURL(context)]; + }); + }); }; + return _this; + } + EmailPassword.prototype.getFirstFactorsForAuthPage = function () { + return this.firstFactorIds; + }; + EmailPassword.init = function (config) { + var normalisedConfig = normaliseEmailPasswordConfig(config); + return { + recipeID: EmailPassword.RECIPE_ID, + authReact: function (appInfo) { + EmailPassword.instance = new EmailPassword(logger.__assign(logger.__assign({}, normalisedConfig), { appInfo: appInfo, recipeId: EmailPassword.RECIPE_ID })); + return EmailPassword.instance; + }, + webJS: EmailPasswordWebJS__default.default.init(logger.__assign(logger.__assign({}, normalisedConfig), { override: { + functions: function (originalImpl, builder) { + var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, + } })), + }; + }; + EmailPassword.getInstanceOrThrow = function () { + if (EmailPassword.instance === undefined) { + var error = "No instance of EmailPassword found. Make sure to call the EmailPassword.init method." + + "See https://supertokens.io/docs/emailpassword/quick-setup/frontend"; + // eslint-disable-next-line supertokens-auth-react/no-direct-window-object + if (typeof window === "undefined") { + error = error + genericComponentOverrideContext.SSR_ERROR; + } + throw Error(error); + } + return EmailPassword.instance; + }; + /* + * Tests methods. + */ + EmailPassword.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + EmailPassword.instance = undefined; + return; + }; + EmailPassword.RECIPE_ID = "emailpassword"; + return EmailPassword; +}(index.AuthRecipe)); exports.EmailPassword = EmailPassword; exports.defaultValidate = defaultValidate; diff --git a/lib/build/emailpassword-shared4.js b/lib/build/emailpassword-shared4.js index 8b145c4f7..5ba637358 100644 --- a/lib/build/emailpassword-shared4.js +++ b/lib/build/emailpassword-shared4.js @@ -1,20 +1,20 @@ -"use strict"; +'use strict'; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var MANDATORY_FORM_FIELDS_ID_ARRAY = ["email", "password"]; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var MANDATORY_FORM_FIELDS_ID_ARRAY = ["email", "password"]; var DEFAULT_RESET_PASSWORD_PATH = "/reset-password"; exports.DEFAULT_RESET_PASSWORD_PATH = DEFAULT_RESET_PASSWORD_PATH; diff --git a/lib/build/emailpassword-shared5.js b/lib/build/emailpassword-shared5.js index aa56ddb98..5697bbc0f 100644 --- a/lib/build/emailpassword-shared5.js +++ b/lib/build/emailpassword-shared5.js @@ -1,929 +1,390 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var React = require("react"); -var STGeneralError = require("supertokens-web-js/utils/error"); -var constants = require("./emailpassword-shared4.js"); -var button = require("./emailpassword-shared.js"); -require("./index2.js"); -var translationContext = require("./translationContext.js"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +var React = require('react'); +var STGeneralError = require('supertokens-web-js/utils/error'); +var constants = require('./emailpassword-shared4.js'); +var button = require('./emailpassword-shared.js'); +require('./index2.js'); +var translationContext = require('./translationContext.js'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var React__default = /*#__PURE__*/ _interopDefault(React); -var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); +var React__default = /*#__PURE__*/_interopDefault(React); +var STGeneralError__default = /*#__PURE__*/_interopDefault(STGeneralError); -/* - * Component. - */ -function FormRow(_a) { - var children = _a.children, - hasError = _a.hasError; - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": ["formRow", hasError ? "hasError" : ""].join(" ") }, - { children: children } - ) - ); +/* + * Component. + */ +function FormRow(_a) { + var children = _a.children, hasError = _a.hasError; + return jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": ["formRow", hasError ? "hasError" : ""].join(" ") }, { children: children })); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function CheckedIcon() { - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "14.862", - height: "12.033", - viewBox: "0 0 14.862 12.033", - "data-supertokens": "checkedIcon", - }, - { - children: jsxRuntime.jsx("path", { - fill: "rgb(var(--palette-primary))", - d: "M12.629 49L5.06 56.572l-2.829-2.829L0 55.977l5.057 5.057.654-.651 9.152-9.152z", - transform: "translate(0 -49)", - }), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function CheckedIcon() { + return (jsxRuntime.jsx("svg", logger.__assign({ xmlns: "http://www.w3.org/2000/svg", width: "14.862", height: "12.033", viewBox: "0 0 14.862 12.033", "data-supertokens": "checkedIcon" }, { children: jsxRuntime.jsx("path", { fill: "rgb(var(--palette-primary))", d: "M12.629 49L5.06 56.572l-2.829-2.829L0 55.977l5.057 5.057.654-.651 9.152-9.152z", transform: "translate(0 -49)" }) }))); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function ErrorIcon() { - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "17", - height: "15", - viewBox: "0 0 17 15", - "data-supertokens": "errorIcon", - }, - { - children: jsxRuntime.jsxs("g", { - children: [ - jsxRuntime.jsx( - "g", - genericComponentOverrideContext.__assign( - { className: "Asdf", fill: "rgb(var(--palette-error))" }, - { - children: jsxRuntime.jsx("path", { - d: "M13.568 14.75H3.432c-.63 0-1.195-.325-1.512-.869-.317-.544-.32-1.196-.01-1.744l5.067-8.943c.315-.556.884-.887 1.523-.887.639 0 1.208.331 1.523.887l5.067 8.943c.31.548.307 1.2-.01 1.744s-.882.869-1.512.869z", - transform: "translate(-824.894 -352.829) translate(824.894 352.829)", - }), - } - ) - ), - jsxRuntime.jsx( - "text", - genericComponentOverrideContext.__assign( - { - fill: "#fff", - fontSize: "10px", - fontWeight: "700", - transform: "translate(-824.894 -352.829) translate(832.014 365.198)", - }, - { - children: jsxRuntime.jsx( - "tspan", - genericComponentOverrideContext.__assign({ x: "0", y: "0" }, { children: "!" }) - ), - } - ) - ), - ], - }), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function ErrorIcon() { + return (jsxRuntime.jsx("svg", logger.__assign({ xmlns: "http://www.w3.org/2000/svg", width: "17", height: "15", viewBox: "0 0 17 15", "data-supertokens": "errorIcon" }, { children: jsxRuntime.jsxs("g", { children: [jsxRuntime.jsx("g", logger.__assign({ className: "Asdf", fill: "rgb(var(--palette-error))" }, { children: jsxRuntime.jsx("path", { d: "M13.568 14.75H3.432c-.63 0-1.195-.325-1.512-.869-.317-.544-.32-1.196-.01-1.744l5.067-8.943c.315-.556.884-.887 1.523-.887.639 0 1.208.331 1.523.887l5.067 8.943c.31.548.307 1.2-.01 1.744s-.882.869-1.512.869z", transform: "translate(-824.894 -352.829) translate(824.894 352.829)" }) })), jsxRuntime.jsx("text", logger.__assign({ fill: "#fff", fontSize: "10px", fontWeight: "700", transform: "translate(-824.894 -352.829) translate(832.014 365.198)" }, { children: jsxRuntime.jsx("tspan", logger.__assign({ x: "0", y: "0" }, { children: "!" })) }))] }) }))); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function ShowPasswordIcon(_a) { - var showPassword = _a.showPassword; - if (showPassword === true) { - return jsxRuntime.jsx("div", { - children: jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "18.391", - height: "16.276", - viewBox: "0 0 18.391 16.276", - "data-supertokens": "showPasswordIcon show", - }, - { - children: jsxRuntime.jsxs("g", { - children: [ - jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("path", { - fill: "rgb(var(--palette-textPrimary))", - d: "M29.289 100.33c-2.4-3.63-5.619-5.63-9.069-5.63s-6.67 2-9.069 5.63a.767.767 0 0 0 0 .845c2.4 3.63 5.619 5.63 9.069 5.63s6.67-2 9.069-5.63a.767.767 0 0 0 0-.845zm-9.069 4.944c-2.785 0-5.435-1.6-7.5-4.519 2.065-2.92 4.715-4.519 7.5-4.519s5.435 1.6 7.5 4.519c-2.064 2.92-4.711 4.519-7.5 4.519z", - transform: - "translate(-822 -420.048) translate(822 422.035) translate(-11.025 -94.7)", - }), - }), - }), - }), - jsxRuntime.jsxs( - "g", - genericComponentOverrideContext.__assign( - { - fill: "rgb(var(--palette-textPrimary))", - stroke: "rgb(var(--palette-inputBackground))", - transform: "translate(-822 -420.048) translate(827.164 424.055)", - }, - { - children: [ - jsxRuntime.jsx("circle", { - cx: "4.036", - cy: "4.036", - r: "4.036", - stroke: "none", - }), - jsxRuntime.jsx("circle", { - cx: "4.036", - cy: "4.036", - r: "3.536", - fill: "none", - }), - ], - } - ) - ), - jsxRuntime.jsx("path", { - fill: "none", - stroke: "#707070", - strokeLinecap: "round", - strokeWidth: "2.25px", - d: "M11.981 0L0 11.981", - transform: "translate(-822 -420.048) translate(825.084 421.639)", - }), - jsxRuntime.jsx("path", { - fill: "none", - stroke: "rgb(var(--palette-inputBackground))", - strokeLinecap: "round", - d: "M13.978 0L0 13.978", - transform: "translate(-822 -420.048) translate(825.084 421.639)", - }), - ], - }), - } - ) - ), - }); - } - return jsxRuntime.jsx("div", { - children: jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "18.281", - height: "12.033", - viewBox: "0 0 18.281 12.033", - "data-supertokens": "showPasswordIcon hide", - }, - { - children: jsxRuntime.jsxs("g", { - children: [ - jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("g", { - children: jsxRuntime.jsx("path", { - fill: "rgb(var(--palette-textPrimary))", - d: "M29.18 100.3c-2.384-3.608-5.586-5.6-9.015-5.6s-6.63 1.989-9.015 5.6a.763.763 0 0 0 0 .84c2.384 3.608 5.586 5.6 9.015 5.6s6.63-1.989 9.015-5.6a.763.763 0 0 0 0-.84zm-9.015 4.914c-2.769 0-5.4-1.589-7.459-4.492 2.052-2.9 4.686-4.492 7.459-4.492s5.4 1.589 7.459 4.492c-2.056 2.899-4.686 4.489-7.458 4.489z", - transform: - "translate(-822 -422.088) translate(822 422.088) translate(-11.025 -94.7)", - }), - }), - }), - }), - jsxRuntime.jsxs( - "g", - genericComponentOverrideContext.__assign( - { - fill: "rgb(var(--palette-textPrimary))", - stroke: "rgb(var(--palette-inputBackground))", - transform: "translate(-822 -422.088) translate(827.133 424.096)", - }, - { - children: [ - jsxRuntime.jsx("circle", { - cx: "4.012", - cy: "4.012", - r: "4.012", - stroke: "none", - }), - jsxRuntime.jsx("circle", { - cx: "4.012", - cy: "4.012", - r: "3.512", - fill: "none", - }), - ], - } - ) - ), - ], - }), - } - ) - ), - }); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function ShowPasswordIcon(_a) { + var showPassword = _a.showPassword; + if (showPassword === true) { + return (jsxRuntime.jsx("div", { children: jsxRuntime.jsx("svg", logger.__assign({ xmlns: "http://www.w3.org/2000/svg", width: "18.391", height: "16.276", viewBox: "0 0 18.391 16.276", "data-supertokens": "showPasswordIcon show" }, { children: jsxRuntime.jsxs("g", { children: [jsxRuntime.jsx("g", { children: jsxRuntime.jsx("g", { children: jsxRuntime.jsx("g", { children: jsxRuntime.jsx("path", { fill: "rgb(var(--palette-textPrimary))", d: "M29.289 100.33c-2.4-3.63-5.619-5.63-9.069-5.63s-6.67 2-9.069 5.63a.767.767 0 0 0 0 .845c2.4 3.63 5.619 5.63 9.069 5.63s6.67-2 9.069-5.63a.767.767 0 0 0 0-.845zm-9.069 4.944c-2.785 0-5.435-1.6-7.5-4.519 2.065-2.92 4.715-4.519 7.5-4.519s5.435 1.6 7.5 4.519c-2.064 2.92-4.711 4.519-7.5 4.519z", transform: "translate(-822 -420.048) translate(822 422.035) translate(-11.025 -94.7)" }) }) }) }), jsxRuntime.jsxs("g", logger.__assign({ fill: "rgb(var(--palette-textPrimary))", stroke: "rgb(var(--palette-inputBackground))", transform: "translate(-822 -420.048) translate(827.164 424.055)" }, { children: [jsxRuntime.jsx("circle", { cx: "4.036", cy: "4.036", r: "4.036", stroke: "none" }), jsxRuntime.jsx("circle", { cx: "4.036", cy: "4.036", r: "3.536", fill: "none" })] })), jsxRuntime.jsx("path", { fill: "none", stroke: "#707070", strokeLinecap: "round", strokeWidth: "2.25px", d: "M11.981 0L0 11.981", transform: "translate(-822 -420.048) translate(825.084 421.639)" }), jsxRuntime.jsx("path", { fill: "none", stroke: "rgb(var(--palette-inputBackground))", strokeLinecap: "round", d: "M13.978 0L0 13.978", transform: "translate(-822 -420.048) translate(825.084 421.639)" })] }) })) })); + } + return (jsxRuntime.jsx("div", { children: jsxRuntime.jsx("svg", logger.__assign({ xmlns: "http://www.w3.org/2000/svg", width: "18.281", height: "12.033", viewBox: "0 0 18.281 12.033", "data-supertokens": "showPasswordIcon hide" }, { children: jsxRuntime.jsxs("g", { children: [jsxRuntime.jsx("g", { children: jsxRuntime.jsx("g", { children: jsxRuntime.jsx("g", { children: jsxRuntime.jsx("path", { fill: "rgb(var(--palette-textPrimary))", d: "M29.18 100.3c-2.384-3.608-5.586-5.6-9.015-5.6s-6.63 1.989-9.015 5.6a.763.763 0 0 0 0 .84c2.384 3.608 5.586 5.6 9.015 5.6s6.63-1.989 9.015-5.6a.763.763 0 0 0 0-.84zm-9.015 4.914c-2.769 0-5.4-1.589-7.459-4.492 2.052-2.9 4.686-4.492 7.459-4.492s5.4 1.589 7.459 4.492c-2.056 2.899-4.686 4.489-7.458 4.489z", transform: "translate(-822 -422.088) translate(822 422.088) translate(-11.025 -94.7)" }) }) }) }), jsxRuntime.jsxs("g", logger.__assign({ fill: "rgb(var(--palette-textPrimary))", stroke: "rgb(var(--palette-inputBackground))", transform: "translate(-822 -422.088) translate(827.133 424.096)" }, { children: [jsxRuntime.jsx("circle", { cx: "4.012", cy: "4.012", r: "4.012", stroke: "none" }), jsxRuntime.jsx("circle", { cx: "4.012", cy: "4.012", r: "3.512", fill: "none" })] }))] }) })) })); } -var Input = function (_a) { - var type = _a.type, - name = _a.name, - hasError = _a.hasError, - autoComplete = _a.autoComplete, - onInputFocus = _a.onInputFocus, - onInputBlur = _a.onInputBlur, - onChange = _a.onChange, - value = _a.value, - placeholder = _a.placeholder, - validated = _a.validated, - autofocus = _a.autofocus; - var t = translationContext.useTranslation(); - var _b = React.useState(false), - showPassword = _b[0], - setShowPassword = _b[1]; - /* - * Method. - */ - function handleFocus() { - if (onInputFocus !== undefined) { - onInputFocus(value); - } - } - function handleBlur() { - if (onInputBlur !== undefined) { - onInputBlur(value); - } - } - function handleChange(event) { - if (onChange) { - onChange(event.target.value); - } - } - if (autoComplete === undefined) { - autoComplete = "off"; - } - var inputType = type; - if (type === "password" && showPassword === true) { - inputType = "text"; - } - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "inputContainer" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": ["inputWrapper", hasError ? "inputError" : ""].join(" ") }, - { - children: [ - jsxRuntime.jsx("input", { - autoFocus: autofocus, - autoComplete: autoComplete, - "data-supertokens": "input input-".concat(name), - className: "supertokens-input", - onFocus: handleFocus, - onBlur: handleBlur, - type: inputType, - name: name, - placeholder: t(placeholder), - onChange: handleChange, - value: value, - }), - hasError === true && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "inputAdornment inputAdornmentError" }, - { children: jsxRuntime.jsx(ErrorIcon, {}) } - ) - ), - validated === true && - hasError === false && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "inputAdornment inputAdornmentSuccess" }, - { children: jsxRuntime.jsx(CheckedIcon, {}) } - ) - ), - type === "password" && - value.length > 0 && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { - onClick: function () { - return setShowPassword(showPassword === false); - }, - "data-supertokens": "inputAdornment showPassword", - }, - { - children: jsxRuntime.jsx(ShowPasswordIcon, { - showPassword: showPassword, - }), - } - ) - ), - ], - } - ) - ), - } - ) - ); +var Input = function (_a) { + var type = _a.type, name = _a.name, hasError = _a.hasError, autoComplete = _a.autoComplete, onInputFocus = _a.onInputFocus, onInputBlur = _a.onInputBlur, onChange = _a.onChange, value = _a.value, placeholder = _a.placeholder, validated = _a.validated, autofocus = _a.autofocus; + var t = translationContext.useTranslation(); + var _b = React.useState(false), showPassword = _b[0], setShowPassword = _b[1]; + /* + * Method. + */ + function handleFocus() { + if (onInputFocus !== undefined) { + onInputFocus(value); + } + } + function handleBlur() { + if (onInputBlur !== undefined) { + onInputBlur(value); + } + } + function handleChange(event) { + if (onChange) { + onChange(event.target.value); + } + } + if (autoComplete === undefined) { + autoComplete = "off"; + } + var inputType = type; + if (type === "password" && showPassword === true) { + inputType = "text"; + } + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "inputContainer" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": ["inputWrapper", hasError ? "inputError" : ""].join(" ") }, { children: [jsxRuntime.jsx("input", { autoFocus: autofocus, autoComplete: autoComplete, "data-supertokens": "input input-".concat(name), className: "supertokens-input", onFocus: handleFocus, onBlur: handleBlur, type: inputType, name: name, placeholder: t(placeholder), onChange: handleChange, value: value }), hasError === true && (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "inputAdornment inputAdornmentError" }, { children: jsxRuntime.jsx(ErrorIcon, {}) }))), validated === true && hasError === false && (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "inputAdornment inputAdornmentSuccess" }, { children: jsxRuntime.jsx(CheckedIcon, {}) }))), type === "password" && value.length > 0 && (jsxRuntime.jsx("div", logger.__assign({ onClick: function () { return setShowPassword(showPassword === false); }, "data-supertokens": "inputAdornment showPassword" }, { children: jsxRuntime.jsx(ShowPasswordIcon, { showPassword: showPassword }) })))] })) }))); }; -function InputError(_a) { - var error = _a.error; - var t = translationContext.useTranslation(); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign({ "data-supertokens": "inputErrorMessage" }, { children: t(error) }) - ); +function InputError(_a) { + var error = _a.error; + var t = translationContext.useTranslation(); + return jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "inputErrorMessage" }, { children: t(error) })); } -function Label(_a) { - var value = _a.value, - showIsRequired = _a.showIsRequired; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "label" }, - { children: [t(value), showIsRequired && value && value.trim() !== "" && " *"] } - ) - ); +function Label(_a) { + var value = _a.value, showIsRequired = _a.showIsRequired; + var t = translationContext.useTranslation(); + return (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "label" }, { children: [t(value), showIsRequired && value && value.trim() !== "" && " *"] }))); } -var fetchDefaultValue = function (field) { - if (field.getDefaultValue !== undefined) { - var defaultValue = field.getDefaultValue(); - if (typeof defaultValue !== "string") { - throw new Error("getDefaultValue for ".concat(field.id, " must return a string")); - } else { - return defaultValue; - } - } - return ""; -}; -function InputComponentWrapper(props) { - var field = props.field, - type = props.type, - fstate = props.fstate, - onInputFocus = props.onInputFocus, - onInputBlur = props.onInputBlur, - onInputChange = props.onInputChange; - var useCallbackOnInputFocus = React.useCallback( - function (value) { - onInputFocus({ - id: field.id, - value: value, - }); - }, - [onInputFocus, field.id] - ); - var useCallbackOnInputBlur = React.useCallback( - function (value) { - onInputBlur({ - id: field.id, - value: value, - }); - }, - [onInputBlur, field.id] - ); - var useCallbackOnInputChange = React.useCallback( - function (value) { - onInputChange({ - id: field.id, - value: value, - }); - }, - [onInputChange, field.id] - ); - return field.inputComponent !== undefined - ? jsxRuntime.jsx( - field.inputComponent, - { - type: type, - name: field.id, - validated: fstate.validated === true, - placeholder: field.placeholder, - value: fstate.value, - autoComplete: field.autoComplete, - autofocus: field.autofocus, - onInputFocus: useCallbackOnInputFocus, - onInputBlur: useCallbackOnInputBlur, - onChange: useCallbackOnInputChange, - hasError: fstate.error !== undefined, - }, - field.id - ) - : jsxRuntime.jsx( - Input, - { - type: type, - name: field.id, - validated: fstate.validated === true, - placeholder: field.placeholder, - value: fstate.value, - autoComplete: field.autoComplete, - onInputFocus: useCallbackOnInputFocus, - onInputBlur: useCallbackOnInputBlur, - onChange: useCallbackOnInputChange, - autofocus: field.autofocus, - hasError: fstate.error !== undefined, - }, - field.id - ); -} -var FormBase = function (props) { - var footer = props.footer, - buttonLabel = props.buttonLabel, - showLabels = props.showLabels, - validateOnBlur = props.validateOnBlur, - formFields = props.formFields; - var unmounting = React.useRef(new AbortController()); - React.useEffect( - function () { - // We need this because in some cases this gets called multiple times - unmounting.current = new AbortController(); - return function () { - unmounting.current.abort(); - }; - }, - [unmounting] - ); - var _a = React.useState( - props.formFields.map(function (f) { - return { id: f.id, value: fetchDefaultValue(f) }; - }) - ), - fieldStates = _a[0], - setFieldStates = _a[1]; - React.useEffect( - function () { - setFieldStates(function (fs) { - var ret = fs; - var fieldsWithoutState = props.formFields.filter(function (f) { - return !fieldStates.some(function (s) { - return f.id === s.id; - }); - }); - // If there is a formfield missing from the states array, we fill with the default value - if (fieldsWithoutState.length > 0) { - fs = genericComponentOverrideContext.__spreadArray( - genericComponentOverrideContext.__spreadArray([], fs, true), - fieldsWithoutState.map(function (f) { - return { id: f.id, value: fetchDefaultValue(f) }; - }), - true - ); - } - // If a field has been removed from formFields, we want to remove it from the states array as well. - if ( - fieldStates.some(function (s) { - return !props.formFields.some(function (f) { - return f.id === s.id; - }); - }) - ) { - ret = fs.filter(function (s) { - return props.formFields.some(function (f) { - return f.id === s.id; - }); - }); - } - return ret; - }); - }, - [props.formFields, setFieldStates] - ); - var _b = React.useState(false), - isLoading = _b[0], - setIsLoading = _b[1]; - var updateFieldState = React.useCallback( - function (id, update) { - setFieldStates(function (os) { - var field = os.find(function (f) { - return f.id === id; - }); - if (field === undefined) { - return genericComponentOverrideContext.__spreadArray( - genericComponentOverrideContext.__spreadArray([], os, true), - [update({ id: id, value: "" })], - false - ); - } - return os - .filter(function (f) { - return f.id !== field.id; - }) - .concat(update(field)); - }); - }, - [setFieldStates] - ); - var onInputFocus = React.useCallback( - function (field) { - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, os), { - validated: false, - }); - }); - }, - [updateFieldState] - ); - var onInputBlur = React.useCallback( - function (field) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var fieldConfig, error, _a; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if (!validateOnBlur) { - return [2 /*return*/]; - } - fieldConfig = props.formFields.find(function (f) { - return f.id === field.id; - }); - if (!(fieldConfig && field.value !== "")) return [3 /*break*/, 2]; - return [4 /*yield*/, fieldConfig.validate(field.value)]; - case 1: - _a = _b.sent(); - return [3 /*break*/, 3]; - case 2: - _a = undefined; - _b.label = 3; - case 3: - error = _a; - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, os), - { error: error, validated: error === undefined && field.value.length !== 0 } - ); - }); - return [2 /*return*/]; - } - }); - }); - }, - [validateOnBlur, updateFieldState, props.formFields] - ); - var onInputChange = React.useCallback( - function (field) { - if (typeof field.value !== "string") { - throw new Error("".concat(field.id, " value must be a string")); - } - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, os), { - value: field.value, - error: undefined, - }); - }); - props.clearError(); - }, - [updateFieldState] - ); - var onFormSubmit = React.useCallback( - function (e) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var apiFields, - fieldUpdates, - result, - generalError, - fetchError, - e_1, - _loop_1, - _i, - formFields_1, - field, - errorFields_1, - getErrorMessage_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - // Prevent default event propagation. - e.preventDefault(); - // Set loading state. - setIsLoading(true); - setFieldStates(function (os) { - return os.map(function (fs) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, fs), - { error: undefined } - ); - }); - }); - apiFields = formFields.map(function (field) { - var fieldState = fieldStates.find(function (fs) { - return fs.id === field.id; - }); - return { - id: field.id, - value: fieldState === undefined ? "" : fieldState.value, - }; - }); - fieldUpdates = []; - _a.label = 1; - case 1: - _a.trys.push([1, 6, 7, 8]); - result = void 0; - generalError = void 0; - fetchError = void 0; - _a.label = 2; - case 2: - _a.trys.push([2, 4, , 5]); - return [ - 4 /*yield*/, - props.callAPI(apiFields, function (id, value) { - return fieldUpdates.push({ id: id, value: value }); - }), - ]; - case 3: - result = _a.sent(); - return [3 /*break*/, 5]; - case 4: - e_1 = _a.sent(); - if (STGeneralError__default.default.isThisError(e_1)) { - generalError = e_1; - } else if (e_1 instanceof Response) { - fetchError = e_1; - } else { - throw e_1; - } - return [3 /*break*/, 5]; - case 5: - if (unmounting.current.signal.aborted) { - return [2 /*return*/]; - } - if (generalError !== undefined || (result !== undefined && result.status !== "OK")) { - _loop_1 = function (field) { - var update = fieldUpdates.find(function (f) { - return f.id === field.id; - }); - if (update || field.clearOnSubmit === true) { - // We can do these one by one, it's almost never more than one field - updateFieldState(field.id, function (os) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, os), - { value: update ? update.value : "" } - ); - }); - } - }; - for (_i = 0, formFields_1 = formFields; _i < formFields_1.length; _i++) { - field = formFields_1[_i]; - _loop_1(field); - } - } - if (generalError !== undefined) { - props.onError(generalError.message); - } else if (fetchError !== undefined) { - if (props.onFetchError) { - props.onFetchError(fetchError); - } else { - throw fetchError; - } - } else { - // If successful - if (result.status === "OK") { - setIsLoading(false); - props.clearError(); - if (props.onSuccess !== undefined) { - props.onSuccess(result); - } - } - if (unmounting.current.signal.aborted) { - return [2 /*return*/]; - } - // If field error. - if (result.status === "FIELD_ERROR") { - errorFields_1 = result.formFields; - getErrorMessage_1 = function (fs) { - var _a; - var errorMessage = - (_a = errorFields_1.find(function (ef) { - return ef.id === fs.id; - })) === null || _a === void 0 - ? void 0 - : _a.error; - if (errorMessage === "Field is not optional") { - var fieldConfigData = props.formFields.find(function (f) { - return f.id === fs.id; - }); - // replace non-optional server error message from nonOptionalErrorMsg - if ( - (fieldConfigData === null || fieldConfigData === void 0 - ? void 0 - : fieldConfigData.nonOptionalErrorMsg) !== undefined - ) { - return fieldConfigData === null || fieldConfigData === void 0 - ? void 0 - : fieldConfigData.nonOptionalErrorMsg; - } - } - return errorMessage; - }; - setFieldStates(function (os) { - return os.map(function (fs) { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, fs), - { error: getErrorMessage_1(fs) } - ); - }); - }); - } - } - return [3 /*break*/, 8]; - case 6: - _a.sent(); - props.onError("SOMETHING_WENT_WRONG_ERROR"); - return [3 /*break*/, 8]; - case 7: - setIsLoading(false); - return [7 /*endfinally*/]; - case 8: - return [2 /*return*/]; - } - }); - }); - }, - [setIsLoading, setFieldStates, props, formFields, fieldStates] - ); - return jsxRuntime.jsx( - FormStateContext.Provider, - genericComponentOverrideContext.__assign( - { value: fieldStates }, - { - children: jsxRuntime.jsxs( - "form", - genericComponentOverrideContext.__assign( - { - autoComplete: "on", - noValidate: true, - onSubmit: onFormSubmit, - "data-supertokens": props.formDataSupertokens, - }, - { - children: [ - formFields - .filter(function (f) { - return f.hidden !== true; - }) - .map(function (field) { - var type = "text"; - // If email or password, replace field type. - if (constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id)) { - type = field.id; - } - if (field.id === "confirm-password") { - type = "password"; - } - var fstate = fieldStates.find(function (s) { - return s.id === field.id; - }) || { - id: field.id, - value: fetchDefaultValue(field), - }; - return jsxRuntime.jsx( - FormRow, - genericComponentOverrideContext.__assign( - { hasError: fstate.error !== undefined }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - showLabels && - (field.labelComponent !== undefined - ? field.labelComponent - : jsxRuntime.jsx(Label, { - value: field.label, - showIsRequired: field.showIsRequired, - })), - jsxRuntime.jsx(InputComponentWrapper, { - type: type, - field: field, - fstate: fstate, - onInputFocus: onInputFocus, - onInputBlur: onInputBlur, - onInputChange: onInputChange, - }), - fstate.error && - jsxRuntime.jsx(InputError, { error: fstate.error }), - ], - }), - } - ), - field.id - ); - }), - jsxRuntime.jsx( - FormRow, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - jsxRuntime.jsx(button.Button, { - disabled: isLoading, - isLoading: isLoading, - type: "submit", - label: buttonLabel, - }), - footer, - ], - }), - }, - "form-button" - ), - ], - } - ) - ), - } - ) - ); -}; -var FormStateContext = React__default.default.createContext(undefined); -var useFormFields = function () { - var ctx = React.useContext(FormStateContext); - if (ctx === undefined) { - throw new Error("useFormState used outside FormBase"); - } - return ctx; +var fetchDefaultValue = function (field) { + if (field.getDefaultValue !== undefined) { + var defaultValue = field.getDefaultValue(); + if (typeof defaultValue !== "string") { + throw new Error("getDefaultValue for ".concat(field.id, " must return a string")); + } + else { + return defaultValue; + } + } + return ""; +}; +function InputComponentWrapper(props) { + var field = props.field, type = props.type, fstate = props.fstate, onInputFocus = props.onInputFocus, onInputBlur = props.onInputBlur, onInputChange = props.onInputChange; + var useCallbackOnInputFocus = React.useCallback(function (value) { + onInputFocus({ + id: field.id, + value: value, + }); + }, [onInputFocus, field.id]); + var useCallbackOnInputBlur = React.useCallback(function (value) { + onInputBlur({ + id: field.id, + value: value, + }); + }, [onInputBlur, field.id]); + var useCallbackOnInputChange = React.useCallback(function (value) { + onInputChange({ + id: field.id, + value: value, + }); + }, [onInputChange, field.id]); + return field.inputComponent !== undefined ? (jsxRuntime.jsx(field.inputComponent, { type: type, name: field.id, validated: fstate.validated === true, placeholder: field.placeholder, value: fstate.value, autoComplete: field.autoComplete, autofocus: field.autofocus, onInputFocus: useCallbackOnInputFocus, onInputBlur: useCallbackOnInputBlur, onChange: useCallbackOnInputChange, hasError: fstate.error !== undefined }, field.id)) : (jsxRuntime.jsx(Input, { type: type, name: field.id, validated: fstate.validated === true, placeholder: field.placeholder, value: fstate.value, autoComplete: field.autoComplete, onInputFocus: useCallbackOnInputFocus, onInputBlur: useCallbackOnInputBlur, onChange: useCallbackOnInputChange, autofocus: field.autofocus, hasError: fstate.error !== undefined }, field.id)); +} +var FormBase = function (props) { + var footer = props.footer, buttonLabel = props.buttonLabel, showLabels = props.showLabels, validateOnBlur = props.validateOnBlur, formFields = props.formFields; + var unmounting = React.useRef(new AbortController()); + React.useEffect(function () { + // We need this because in some cases this gets called multiple times + unmounting.current = new AbortController(); + return function () { + unmounting.current.abort(); + }; + }, [unmounting]); + var _a = React.useState(props.formFields.map(function (f) { return ({ id: f.id, value: fetchDefaultValue(f) }); })), fieldStates = _a[0], setFieldStates = _a[1]; + React.useEffect(function () { + setFieldStates(function (fs) { + var ret = fs; + var fieldsWithoutState = props.formFields.filter(function (f) { return !fieldStates.some(function (s) { return f.id === s.id; }); }); + // If there is a formfield missing from the states array, we fill with the default value + if (fieldsWithoutState.length > 0) { + fs = logger.__spreadArray(logger.__spreadArray([], fs, true), fieldsWithoutState.map(function (f) { return ({ id: f.id, value: fetchDefaultValue(f) }); }), true); + } + // If a field has been removed from formFields, we want to remove it from the states array as well. + if (fieldStates.some(function (s) { return !props.formFields.some(function (f) { return f.id === s.id; }); })) { + ret = fs.filter(function (s) { return props.formFields.some(function (f) { return f.id === s.id; }); }); + } + return ret; + }); + }, [props.formFields, setFieldStates]); + var _b = React.useState(false), isLoading = _b[0], setIsLoading = _b[1]; + var updateFieldState = React.useCallback(function (id, update) { + setFieldStates(function (os) { + var field = os.find(function (f) { return f.id === id; }); + if (field === undefined) { + return logger.__spreadArray(logger.__spreadArray([], os, true), [update({ id: id, value: "" })], false); + } + return os.filter(function (f) { return f.id !== field.id; }).concat(update(field)); + }); + }, [setFieldStates]); + var onInputFocus = React.useCallback(function (field) { + updateFieldState(field.id, function (os) { return (logger.__assign(logger.__assign({}, os), { validated: false })); }); + }, [updateFieldState]); + var onInputBlur = React.useCallback(function (field) { return logger.__awaiter(void 0, void 0, void 0, function () { + var fieldConfig, error, _a; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!validateOnBlur) { + return [2 /*return*/]; + } + fieldConfig = props.formFields.find(function (f) { return f.id === field.id; }); + if (!(fieldConfig && field.value !== "")) return [3 /*break*/, 2]; + return [4 /*yield*/, fieldConfig.validate(field.value)]; + case 1: + _a = _b.sent(); + return [3 /*break*/, 3]; + case 2: + _a = undefined; + _b.label = 3; + case 3: + error = _a; + updateFieldState(field.id, function (os) { return (logger.__assign(logger.__assign({}, os), { error: error, validated: error === undefined && field.value.length !== 0 })); }); + return [2 /*return*/]; + } + }); + }); }, [validateOnBlur, updateFieldState, props.formFields]); + var onInputChange = React.useCallback(function (field) { + if (typeof field.value !== "string") { + throw new Error("".concat(field.id, " value must be a string")); + } + updateFieldState(field.id, function (os) { return (logger.__assign(logger.__assign({}, os), { value: field.value, error: undefined })); }); + props.clearError(); + }, [updateFieldState]); + var onFormSubmit = React.useCallback(function (e) { return logger.__awaiter(void 0, void 0, void 0, function () { + var apiFields, fieldUpdates, result, generalError, fetchError, e_1, _loop_1, _i, formFields_1, field, errorFields_1, getErrorMessage_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + // Prevent default event propagation. + e.preventDefault(); + // Set loading state. + setIsLoading(true); + setFieldStates(function (os) { return os.map(function (fs) { return (logger.__assign(logger.__assign({}, fs), { error: undefined })); }); }); + apiFields = formFields.map(function (field) { + var fieldState = fieldStates.find(function (fs) { return fs.id === field.id; }); + return { + id: field.id, + value: fieldState === undefined ? "" : fieldState.value, + }; + }); + fieldUpdates = []; + _a.label = 1; + case 1: + _a.trys.push([1, 6, 7, 8]); + result = void 0; + generalError = void 0; + fetchError = void 0; + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 5]); + return [4 /*yield*/, props.callAPI(apiFields, function (id, value) { return fieldUpdates.push({ id: id, value: value }); })]; + case 3: + result = _a.sent(); + return [3 /*break*/, 5]; + case 4: + e_1 = _a.sent(); + if (STGeneralError__default.default.isThisError(e_1)) { + generalError = e_1; + } + else if (e_1 instanceof Response) { + fetchError = e_1; + } + else { + throw e_1; + } + return [3 /*break*/, 5]; + case 5: + if (unmounting.current.signal.aborted) { + return [2 /*return*/]; + } + if (generalError !== undefined || (result !== undefined && result.status !== "OK")) { + _loop_1 = function (field) { + var update = fieldUpdates.find(function (f) { return f.id === field.id; }); + if (update || field.clearOnSubmit === true) { + // We can do these one by one, it's almost never more than one field + updateFieldState(field.id, function (os) { return (logger.__assign(logger.__assign({}, os), { value: update ? update.value : "" })); }); + } + }; + for (_i = 0, formFields_1 = formFields; _i < formFields_1.length; _i++) { + field = formFields_1[_i]; + _loop_1(field); + } + } + if (generalError !== undefined) { + props.onError(generalError.message); + } + else if (fetchError !== undefined) { + if (props.onFetchError) { + props.onFetchError(fetchError); + } + else { + throw fetchError; + } + } + else { + // If successful + if (result.status === "OK") { + setIsLoading(false); + props.clearError(); + if (props.onSuccess !== undefined) { + props.onSuccess(result); + } + } + if (unmounting.current.signal.aborted) { + return [2 /*return*/]; + } + // If field error. + if (result.status === "FIELD_ERROR") { + errorFields_1 = result.formFields; + getErrorMessage_1 = function (fs) { + var _a; + var errorMessage = (_a = errorFields_1.find(function (ef) { return ef.id === fs.id; })) === null || _a === void 0 ? void 0 : _a.error; + if (errorMessage === "Field is not optional") { + var fieldConfigData = props.formFields.find(function (f) { return f.id === fs.id; }); + // replace non-optional server error message from nonOptionalErrorMsg + if ((fieldConfigData === null || fieldConfigData === void 0 ? void 0 : fieldConfigData.nonOptionalErrorMsg) !== undefined) { + return fieldConfigData === null || fieldConfigData === void 0 ? void 0 : fieldConfigData.nonOptionalErrorMsg; + } + } + return errorMessage; + }; + setFieldStates(function (os) { return os.map(function (fs) { return (logger.__assign(logger.__assign({}, fs), { error: getErrorMessage_1(fs) })); }); }); + } + } + return [3 /*break*/, 8]; + case 6: + _a.sent(); + props.onError("SOMETHING_WENT_WRONG_ERROR"); + return [3 /*break*/, 8]; + case 7: + setIsLoading(false); + return [7 /*endfinally*/]; + case 8: return [2 /*return*/]; + } + }); + }); }, [setIsLoading, setFieldStates, props, formFields, fieldStates]); + return (jsxRuntime.jsx(FormStateContext.Provider, logger.__assign({ value: fieldStates }, { children: jsxRuntime.jsxs("form", logger.__assign({ autoComplete: "on", noValidate: true, onSubmit: onFormSubmit, "data-supertokens": props.formDataSupertokens }, { children: [formFields + .filter(function (f) { return f.hidden !== true; }) + .map(function (field) { + var type = "text"; + // If email or password, replace field type. + if (constants.MANDATORY_FORM_FIELDS_ID_ARRAY.includes(field.id)) { + type = field.id; + } + if (field.id === "confirm-password") { + type = "password"; + } + var fstate = fieldStates.find(function (s) { return s.id === field.id; }) || { + id: field.id, + value: fetchDefaultValue(field), + }; + return (jsxRuntime.jsx(FormRow, logger.__assign({ hasError: fstate.error !== undefined }, { children: jsxRuntime.jsxs(React.Fragment, { children: [showLabels && + (field.labelComponent !== undefined ? (field.labelComponent) : (jsxRuntime.jsx(Label, { value: field.label, showIsRequired: field.showIsRequired }))), jsxRuntime.jsx(InputComponentWrapper, { type: type, field: field, fstate: fstate, onInputFocus: onInputFocus, onInputBlur: onInputBlur, onInputChange: onInputChange }), fstate.error && jsxRuntime.jsx(InputError, { error: fstate.error })] }) }), field.id)); + }), jsxRuntime.jsx(FormRow, { children: jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx(button.Button, { disabled: isLoading, isLoading: isLoading, type: "submit", label: buttonLabel }), footer] }) }, "form-button")] })) }))); +}; +var FormStateContext = React__default.default.createContext(undefined); +var useFormFields = function () { + var ctx = React.useContext(FormStateContext); + if (ctx === undefined) { + throw new Error("useFormState used outside FormBase"); + } + return ctx; }; exports.ErrorIcon = ErrorIcon; diff --git a/lib/build/emailpassword.js b/lib/build/emailpassword.js index d297074f3..62b368cea 100644 --- a/lib/build/emailpassword.js +++ b/lib/build/emailpassword.js @@ -1,153 +1,109 @@ -"use strict"; +'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, '__esModule', { value: true }); -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var componentOverrideContext = require("./emailpassword-shared2.js"); -var recipe = require("./emailpassword-shared3.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("react"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("supertokens-web-js/utils/normalisedURLPath"); -require("react/jsx-runtime"); -require("supertokens-web-js/recipe/emailpassword"); -require("./authRecipe-shared2.js"); -require("./recipeModule-shared.js"); -require("./multifactorauth-shared.js"); -require("supertokens-web-js/recipe/session"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./emailpassword-shared4.js"); -require("./authRecipe-shared.js"); +var logger = require('./logger.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var componentOverrideContext = require('./emailpassword-shared2.js'); +var recipe = require('./emailpassword-shared3.js'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/windowHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils'); +require('react'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/utils/normalisedURLPath'); +require('react/jsx-runtime'); +require('supertokens-web-js/recipe/emailpassword'); +require('./authRecipe-shared2.js'); +require('./recipeModule-shared.js'); +require('./multifactorauth-shared.js'); +require('supertokens-web-js/recipe/session'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./emailpassword-shared4.js'); +require('./authRecipe-shared.js'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var Wrapper = /** @class */ (function () { - function Wrapper() {} - Wrapper.init = function (config) { - return recipe.EmailPassword.init(config); - }; - Wrapper.signOut = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailPassword.getInstanceOrThrow().signOut({ - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }), - ]; - }); - }); - }; - Wrapper.submitNewPassword = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.submitNewPassword( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.sendPasswordResetEmail = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.sendPasswordResetEmail( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.signUp = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.signUp( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.signIn = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.signIn( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.doesEmailExist = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.doesEmailExist( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.getResetPasswordTokenFromURL = function (input) { - return recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.getResetPasswordTokenFromURL( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ); - }; - Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; - return Wrapper; -})(); -var init = Wrapper.init; -var signOut = Wrapper.signOut; -var submitNewPassword = Wrapper.submitNewPassword; -var sendPasswordResetEmail = Wrapper.sendPasswordResetEmail; -var signUp = Wrapper.signUp; -var signIn = Wrapper.signIn; -var doesEmailExist = Wrapper.doesEmailExist; -var getResetPasswordTokenFromURL = Wrapper.getResetPasswordTokenFromURL; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var Wrapper = /** @class */ (function () { + function Wrapper() { + } + Wrapper.init = function (config) { + return recipe.EmailPassword.init(config); + }; + Wrapper.signOut = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailPassword.getInstanceOrThrow().signOut({ + userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext), + })]; + }); + }); + }; + Wrapper.submitNewPassword = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.submitNewPassword(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.sendPasswordResetEmail = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.sendPasswordResetEmail(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.signUp = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.signUp(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.signIn = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.signIn(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.doesEmailExist = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.doesEmailExist(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.getResetPasswordTokenFromURL = function (input) { + return recipe.EmailPassword.getInstanceOrThrow().webJSRecipe.getResetPasswordTokenFromURL(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) })); + }; + Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; + return Wrapper; +}()); +var init = Wrapper.init; +var signOut = Wrapper.signOut; +var submitNewPassword = Wrapper.submitNewPassword; +var sendPasswordResetEmail = Wrapper.sendPasswordResetEmail; +var signUp = Wrapper.signUp; +var signIn = Wrapper.signIn; +var doesEmailExist = Wrapper.doesEmailExist; +var getResetPasswordTokenFromURL = Wrapper.getResetPasswordTokenFromURL; var EmailPasswordComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; exports.EmailPasswordComponentsOverrideProvider = EmailPasswordComponentsOverrideProvider; diff --git a/lib/build/emailpasswordprebuiltui.js b/lib/build/emailpasswordprebuiltui.js index 7614a23e1..eabbf196c 100644 --- a/lib/build/emailpasswordprebuiltui.js +++ b/lib/build/emailpasswordprebuiltui.js @@ -1,73 +1,64 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var uiEntry = require("./index2.js"); -require("./multifactorauth.js"); -var componentOverrideContext = require("./emailpassword-shared2.js"); -var React = require("react"); -var translations = require("./emailverification-shared2.js"); -var translationContext = require("./translationContext.js"); -var arrowLeftIcon = require("./arrowLeftIcon.js"); -var formBase = require("./emailpassword-shared5.js"); -var STGeneralError = require("supertokens-web-js/utils/error"); -var button = require("./emailpassword-shared.js"); -var authCompWrapper = require("./authCompWrapper.js"); -var emailverification = require("./emailverification.js"); -var recipe$1 = require("./emailverification-shared.js"); -var session = require("./session.js"); -var types = require("./multifactorauth-shared.js"); -var recipe = require("./emailpassword-shared3.js"); -var STGeneralError$1 = require("supertokens-web-js/lib/build/error"); -var constants = require("./emailpassword-shared4.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("react-dom"); -require("./multitenancy-shared.js"); -require("./multifactorauth-shared2.js"); -require("supertokens-web-js/recipe/multifactorauth"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("./recipeModule-shared.js"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./authRecipe-shared.js"); -require("supertokens-web-js/lib/build/normalisedURLPath"); -require("./multifactorauth-shared3.js"); -require("supertokens-web-js/recipe/emailverification"); -require("supertokens-web-js/recipe/session"); -require("./session-shared.js"); -require("supertokens-web-js/recipe/emailpassword"); -require("./authRecipe-shared2.js"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +var NormalisedURLPath = require('supertokens-web-js/utils/normalisedURLPath'); +var uiEntry = require('./index2.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +require('./multifactorauth.js'); +var componentOverrideContext = require('./emailpassword-shared2.js'); +var React = require('react'); +var translations = require('./emailverification-shared2.js'); +var translationContext = require('./translationContext.js'); +var arrowLeftIcon = require('./arrowLeftIcon.js'); +var formBase = require('./emailpassword-shared5.js'); +var STGeneralError = require('supertokens-web-js/utils/error'); +var button = require('./emailpassword-shared.js'); +var authCompWrapper = require('./authCompWrapper.js'); +var emailverification = require('./emailverification.js'); +var recipe$1 = require('./emailverification-shared.js'); +var session = require('./session.js'); +var types = require('./multifactorauth-shared.js'); +var recipe = require('./emailpassword-shared3.js'); +var STGeneralError$1 = require('supertokens-web-js/lib/build/error'); +var constants = require('./emailpassword-shared4.js'); +require('supertokens-web-js/utils/windowHandler'); +require('react-dom'); +require('./multitenancy-shared.js'); +require('./multifactorauth-shared2.js'); +require('supertokens-web-js/recipe/multifactorauth'); +require('supertokens-web-js/utils'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('./recipeModule-shared.js'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./authRecipe-shared.js'); +require('supertokens-web-js/lib/build/normalisedURLPath'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('./multifactorauth-shared3.js'); +require('supertokens-web-js/recipe/emailverification'); +require('supertokens-web-js/recipe/session'); +require('./session-shared.js'); +require('supertokens-web-js/recipe/emailpassword'); +require('./authRecipe-shared2.js'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { - if (k !== "default") { + if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty( - n, - k, - d.get - ? d - : { - enumerable: true, - get: function () { - return e[k]; - }, - } - ); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); } }); } @@ -75,1453 +66,690 @@ function _interopNamespace(e) { return Object.freeze(n); } -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var React__namespace = /*#__PURE__*/ _interopNamespace(React); -var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); -var STGeneralError__default$1 = /*#__PURE__*/ _interopDefault(STGeneralError$1); +var NormalisedURLPath__default = /*#__PURE__*/_interopDefault(NormalisedURLPath); +var React__namespace = /*#__PURE__*/_interopNamespace(React); +var STGeneralError__default = /*#__PURE__*/_interopDefault(STGeneralError); +var STGeneralError__default$1 = /*#__PURE__*/_interopDefault(STGeneralError$1); -/* - * Component. - */ -function BackToSignInButton(_a) { - var onClick = _a.onClick; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText secondaryLinkWithLeftArrow", onClick: onClick }, - { - children: [ - jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { color: "rgb(var(--palette-secondaryText))" }), - t("EMAIL_PASSWORD_RESET_SIGN_IN_LINK"), - ], - } - ) - ); +/* + * Component. + */ +function BackToSignInButton(_a) { + var onClick = _a.onClick; + var t = translationContext.useTranslation(); + return (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "secondaryText secondaryLinkWithLeftArrow", onClick: onClick }, { children: [jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { color: "rgb(var(--palette-secondaryText))" }), t("EMAIL_PASSWORD_RESET_SIGN_IN_LINK")] }))); } -var EmailPasswordResetPasswordEmail = function (props) { - var t = translationContext.useTranslation(); - var userContext = uiEntry.useUserContext(); - var _a = React.useState("READY"), - status = _a[0], - setStatus = _a[1]; - var _b = React.useState(""), - emailFieldValue = _b[0], - setEmailFieldValue = _b[1]; - var onSuccess = function () { - setStatus("SENT"); - }; - var resend = function () { - setStatus("READY"); - }; - var formFields = props.formFields; - var emailSuccessText = - t("EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL") + - (emailFieldValue !== undefined && emailFieldValue.length > 0 - ? emailFieldValue - : t("EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL")) + - t("EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL"); - if (status === "SENT") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "primaryText enterEmailSuccessMessage" }, - { - children: [ - emailSuccessText, - jsxRuntime.jsx( - "span", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link resendEmailLink", - onClick: resend, - }, - { children: t("EMAIL_PASSWORD_RESET_RESEND_LINK") } - ) - ), - ], - } - ) - ), - jsxRuntime.jsx(BackToSignInButton, { onClick: props.onBackButtonClicked }), - ], - } - ) - ), - } - ) - ); - } - // Otherwise, return Form. - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container resetPasswordEmailForm" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle withBackButton" }, - { - children: [ - jsxRuntime.jsx(uiEntry.BackButton, { - onClick: props.onBackButtonClicked, - }), - t("EMAIL_PASSWORD_RESET_HEADER_TITLE"), - jsxRuntime.jsx("span", { - "data-supertokens": "backButtonPlaceholder backButtonCommon", - }), - ], - } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { children: t("EMAIL_PASSWORD_RESET_HEADER_SUBTITLE") } - ) - ), - props.error !== undefined && - jsxRuntime.jsx(uiEntry.GeneralError, { error: props.error }), - jsxRuntime.jsx(formBase.FormBase, { - clearError: props.clearError, - onError: props.onError, - formFields: formFields, - buttonLabel: "EMAIL_PASSWORD_RESET_SEND_BTN", - onSuccess: onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter( - void 0, - void 0, - void 0, - function () { - var validationErrors, emailField, resp; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - formFields, - props.config.resetPasswordUsingTokenFeature - .enterEmailForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - emailField = formFields.find(function (field) { - return field.id === "email"; - }); - if (emailField !== undefined) { - setEmailFieldValue(emailField.value); - } - return [ - 4 /*yield*/, - props.recipeImplementation.sendPasswordResetEmail({ - formFields: formFields, - userContext: userContext, - }), - ]; - case 2: - resp = _a.sent(); - if (resp.status === "PASSWORD_RESET_NOT_ALLOWED") { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: [ - { id: "email", error: resp.reason }, - ], - }, - ]; - } - return [2 /*return*/, resp]; - } - }); - } - ); - }, - showLabels: true, - validateOnBlur: true, - }), - ], - } - ) - ), - } - ) - ); -}; +var EmailPasswordResetPasswordEmail = function (props) { + var t = translationContext.useTranslation(); + var userContext = uiEntry.useUserContext(); + var _a = React.useState("READY"), status = _a[0], setStatus = _a[1]; + var _b = React.useState(""), emailFieldValue = _b[0], setEmailFieldValue = _b[1]; + var onSuccess = function () { + setStatus("SENT"); + }; + var resend = function () { + setStatus("READY"); + }; + var formFields = props.formFields; + var emailSuccessText = t("EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL") + + (emailFieldValue !== undefined && emailFieldValue.length > 0 + ? emailFieldValue + : t("EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL")) + + t("EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL"); + if (status === "SENT") { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row" }, { children: [jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "primaryText enterEmailSuccessMessage" }, { children: [emailSuccessText, jsxRuntime.jsx("span", logger.__assign({ "data-supertokens": "link resendEmailLink", onClick: resend }, { children: t("EMAIL_PASSWORD_RESET_RESEND_LINK") }))] })), jsxRuntime.jsx(BackToSignInButton, { onClick: props.onBackButtonClicked })] })) }))); + } + // Otherwise, return Form. + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container resetPasswordEmailForm" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row" }, { children: [jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "headerTitle withBackButton" }, { children: [jsxRuntime.jsx(uiEntry.BackButton, { onClick: props.onBackButtonClicked }), t("EMAIL_PASSWORD_RESET_HEADER_TITLE"), jsxRuntime.jsx("span", { "data-supertokens": "backButtonPlaceholder backButtonCommon" })] })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerSubtitle secondaryText" }, { children: t("EMAIL_PASSWORD_RESET_HEADER_SUBTITLE") })), props.error !== undefined && jsxRuntime.jsx(uiEntry.GeneralError, { error: props.error }), jsxRuntime.jsx(formBase.FormBase, { clearError: props.clearError, onError: props.onError, formFields: formFields, buttonLabel: "EMAIL_PASSWORD_RESET_SEND_BTN", onSuccess: onSuccess, callAPI: function (formFields) { return logger.__awaiter(void 0, void 0, void 0, function () { + var validationErrors, emailField, resp; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, genericComponentOverrideContext.validateForm(formFields, props.config.resetPasswordUsingTokenFeature.enterEmailForm.formFields)]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [2 /*return*/, { + status: "FIELD_ERROR", + formFields: validationErrors, + }]; + } + emailField = formFields.find(function (field) { + return field.id === "email"; + }); + if (emailField !== undefined) { + setEmailFieldValue(emailField.value); + } + return [4 /*yield*/, props.recipeImplementation.sendPasswordResetEmail({ + formFields: formFields, + userContext: userContext, + })]; + case 2: + resp = _a.sent(); + if (resp.status === "PASSWORD_RESET_NOT_ALLOWED") { + return [2 /*return*/, { + status: "FIELD_ERROR", + formFields: [{ id: "email", error: resp.reason }], + }]; + } + return [2 /*return*/, resp]; + } + }); + }); }, showLabels: true, validateOnBlur: true })] })) }))); +}; var ResetPasswordEmail = uiEntry.withOverride("EmailPasswordResetPasswordEmail", EmailPasswordResetPasswordEmail); -var EmailPasswordSubmitNewPassword = function (props) { - var t = translationContext.useTranslation(); - var userContext = uiEntry.useUserContext(); - var _a = React.useState("READY"), - status = _a[0], - setStatus = _a[1]; - var onSuccess = function () { - setStatus("SUCCESS"); - }; - var formFields = props.formFields, - onSignInClicked = props.onSignInClicked; - if (status === "SUCCESS") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE") } - ) - ), - jsxRuntime.jsx( - formBase.FormRow, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { - "data-supertokens": - "primaryText submitNewPasswordSuccessMessage", - }, - { - children: t( - "EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC" - ), - } - ) - ), - jsxRuntime.jsx(button.Button, { - disabled: false, - isLoading: false, - type: "button", - onClick: onSignInClicked, - label: "EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN", - }), - ], - }), - }, - "form-button" - ), - ], - } - ) - ), - } - ) - ); - } - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container resetPasswordPasswordForm" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE") } - ) - ), - props.error !== undefined && - jsxRuntime.jsx(uiEntry.GeneralError, { error: props.error }), - jsxRuntime.jsx(formBase.FormBase, { - formFields: formFields, - clearError: props.clearError, - onError: props.onError, - buttonLabel: "EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN", - onSuccess: onSuccess, - validateOnBlur: true, - callAPI: function (fields) { - return genericComponentOverrideContext.__awaiter( - void 0, - void 0, - void 0, - function () { - var validationErrors, response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - fields, - props.config.resetPasswordUsingTokenFeature - .submitNewPasswordForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - // Verify that both passwords match. - if (fields[0].value !== fields[1].value) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: [ - { - id: fields[1].id, - error: "ERROR_CONFIRM_PASSWORD_NO_MATCH", - }, - ], - }, - ]; - } - return [ - 4 /*yield*/, - props.recipeImplementation.submitNewPassword({ - formFields: fields, - userContext: userContext, - }), - ]; - case 2: - response = _a.sent(); - if ( - response.status === "RESET_PASSWORD_INVALID_TOKEN_ERROR" - ) { - throw new STGeneralError__default.default( - "EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR" - ); - } - return [ - 2 /*return*/, - response.status === "FIELD_ERROR" - ? response - : { - status: "OK", - }, - ]; - } - }); - } - ); - }, - showLabels: true, - }), - ], - } - ) - ), - } - ) - ); -}; +var EmailPasswordSubmitNewPassword = function (props) { + var t = translationContext.useTranslation(); + var userContext = uiEntry.useUserContext(); + var _a = React.useState("READY"), status = _a[0], setStatus = _a[1]; + var onSuccess = function () { + setStatus("SUCCESS"); + }; + var formFields = props.formFields, onSignInClicked = props.onSignInClicked; + if (status === "SUCCESS") { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row" }, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle" }, { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE") })), jsxRuntime.jsx(formBase.FormRow, { children: jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "primaryText submitNewPasswordSuccessMessage" }, { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC") })), jsxRuntime.jsx(button.Button, { disabled: false, isLoading: false, type: "button", onClick: onSignInClicked, label: "EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN" })] }) }, "form-button")] })) }))); + } + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container resetPasswordPasswordForm" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row" }, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle" }, { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE") })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerSubtitle secondaryText" }, { children: t("EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE") })), props.error !== undefined && jsxRuntime.jsx(uiEntry.GeneralError, { error: props.error }), jsxRuntime.jsx(formBase.FormBase, { formFields: formFields, clearError: props.clearError, onError: props.onError, buttonLabel: "EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN", onSuccess: onSuccess, validateOnBlur: true, callAPI: function (fields) { return logger.__awaiter(void 0, void 0, void 0, function () { + var validationErrors, response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, genericComponentOverrideContext.validateForm(fields, props.config.resetPasswordUsingTokenFeature.submitNewPasswordForm.formFields)]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [2 /*return*/, { + status: "FIELD_ERROR", + formFields: validationErrors, + }]; + } + // Verify that both passwords match. + if (fields[0].value !== fields[1].value) { + return [2 /*return*/, { + status: "FIELD_ERROR", + formFields: [ + { + id: fields[1].id, + error: "ERROR_CONFIRM_PASSWORD_NO_MATCH", + }, + ], + }]; + } + return [4 /*yield*/, props.recipeImplementation.submitNewPassword({ + formFields: fields, + userContext: userContext, + })]; + case 2: + response = _a.sent(); + if (response.status === "RESET_PASSWORD_INVALID_TOKEN_ERROR") { + throw new STGeneralError__default.default("EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR"); + } + return [2 /*return*/, response.status === "FIELD_ERROR" + ? response + : { + status: "OK", + }]; + } + }); + }); }, showLabels: true })] })) }))); +}; var SubmitNewPassword = uiEntry.withOverride("EmailPasswordSubmitNewPassword", EmailPasswordSubmitNewPassword); -/* - * Component. - */ -function ResetPasswordUsingTokenTheme(props) { - /* - * Render. - */ - // If no token, return SubmitNewPassword. - if (props.submitNewPasswordForm !== undefined) { - return jsxRuntime.jsx( - SubmitNewPassword, - genericComponentOverrideContext.__assign({}, props.submitNewPasswordForm) - ); - } - // Otherwise, return EnterEmail. - return jsxRuntime.jsx(ResetPasswordEmail, genericComponentOverrideContext.__assign({}, props.enterEmailForm)); -} -function ResetPasswordUsingTokenThemeWrapper(props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - var userStyles = props.submitNewPasswordForm - ? props.config.resetPasswordUsingTokenFeature.submitNewPasswordForm.style - : props.config.resetPasswordUsingTokenFeature.enterEmailForm.style; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - translations.ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle, userStyles] }, - { - children: jsxRuntime.jsx( - ResetPasswordUsingTokenTheme, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ), - } - ) - ); +/* + * Component. + */ +function ResetPasswordUsingTokenTheme(props) { + /* + * Render. + */ + // If no token, return SubmitNewPassword. + if (props.submitNewPasswordForm !== undefined) { + return jsxRuntime.jsx(SubmitNewPassword, logger.__assign({}, props.submitNewPasswordForm)); + } + // Otherwise, return EnterEmail. + return jsxRuntime.jsx(ResetPasswordEmail, logger.__assign({}, props.enterEmailForm)); +} +function ResetPasswordUsingTokenThemeWrapper(props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + var userStyles = props.submitNewPasswordForm + ? props.config.resetPasswordUsingTokenFeature.submitNewPasswordForm.style + : props.config.resetPasswordUsingTokenFeature.enterEmailForm.style; + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(translations.ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle, userStyles] }, { children: jsxRuntime.jsx(ResetPasswordUsingTokenTheme, logger.__assign({}, props)) })) }))); } -var defaultTranslationsEmailPassword = { - en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), - translations.defaultTranslationsEmailVerification.en - ), - { - EMAIL_PASSWORD_EMAIL_LABEL: "Email", - EMAIL_PASSWORD_EMAIL_PLACEHOLDER: "Email address", - EMAIL_PASSWORD_PASSWORD_LABEL: "Password", - EMAIL_PASSWORD_PASSWORD_PLACEHOLDER: "Password", - EMAIL_PASSWORD_SIGN_IN_FORGOT_PW_LINK: "Forgot password?", - EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN: "SIGN IN", - EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR: "Incorrect email and password combination", - EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN: "SIGN UP", - EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS: "This email already exists. Please sign in instead", - EMAIL_PASSWORD_RESET_HEADER_TITLE: "Reset your password", - EMAIL_PASSWORD_RESET_HEADER_SUBTITLE: "We will send you an email to reset your password", - EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL: "your account", - EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL: "A password reset email has been sent to ", - EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL: ", if it exists in our system. ", - EMAIL_PASSWORD_RESET_RESEND_LINK: "Resend or change email", - EMAIL_PASSWORD_RESET_SEND_BTN: "Email me", - EMAIL_PASSWORD_RESET_SIGN_IN_LINK: "Sign In", - EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE: "Success!", - EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC: "Your password has been updated successfully", - EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN: "SIGN IN", - EMAIL_PASSWORD_NEW_PASSWORD_LABEL: "New password", - EMAIL_PASSWORD_NEW_PASSWORD_PLACEHOLDER: "New password", - EMAIL_PASSWORD_CONFIRM_PASSWORD_LABEL: "Confirm password", - EMAIL_PASSWORD_CONFIRM_PASSWORD_PLACEHOLDER: "Confirm your password", - EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE: "Change your password", - EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE: "Enter a new password below to change your password", - EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN: "CHANGE PASSWORD", - EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR: "Invalid password reset token", - ERROR_EMAIL_NON_STRING: "Email must be of type string", - ERROR_EMAIL_INVALID: "Email is invalid", - ERROR_PASSWORD_NON_STRING: "Password must be of type string", - ERROR_PASSWORD_TOO_SHORT: "Password must contain at least 8 characters, including a number", - ERROR_PASSWORD_TOO_LONG: "Password's length must be lesser than 100 characters", - ERROR_PASSWORD_NO_ALPHA: "Password must contain at least one alphabet", - ERROR_PASSWORD_NO_NUM: "Password must contain at least one number", - ERROR_CONFIRM_PASSWORD_NO_MATCH: "Confirmation password doesn't match", - ERROR_NON_OPTIONAL: "Field is not optional", - /* - * The following are error messages from our backend SDK. - * These are returned as full messages to preserver compatibilty, but they work just like the keys above. - * They are shown as is by default (setting the value to undefined will display the raw translation key) - */ - "This email already exists. Please sign in instead.": undefined, - "Field is not optional": undefined, - "Password must contain at least 8 characters, including a number": undefined, - "Password's length must be lesser than 100 characters": undefined, - "Password must contain at least one alphabet": undefined, - "Password must contain at least one number": undefined, - "Email is invalid": undefined, - "Reset password link was not created because of account take over risk. Please contact support. (ERR_CODE_001)": - undefined, - "Cannot sign up due to security reasons. Please try logging in, use a different login method or contact support. (ERR_CODE_007)": - undefined, - "Cannot sign in due to security reasons. Please try resetting your password, use a different login method or contact support. (ERR_CODE_008)": - undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_009)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_010)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_011)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_012)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_013)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_014)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_015)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_016)": undefined, - } - ), +var defaultTranslationsEmailPassword = { + en: logger.__assign(logger.__assign(logger.__assign({}, uiEntry.defaultTranslationsCommon.en), translations.defaultTranslationsEmailVerification.en), { EMAIL_PASSWORD_EMAIL_LABEL: "Email", EMAIL_PASSWORD_EMAIL_PLACEHOLDER: "Email address", EMAIL_PASSWORD_PASSWORD_LABEL: "Password", EMAIL_PASSWORD_PASSWORD_PLACEHOLDER: "Password", EMAIL_PASSWORD_SIGN_IN_FORGOT_PW_LINK: "Forgot password?", EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN: "SIGN IN", EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR: "Incorrect email and password combination", EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN: "SIGN UP", EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS: "This email already exists. Please sign in instead", EMAIL_PASSWORD_RESET_HEADER_TITLE: "Reset your password", EMAIL_PASSWORD_RESET_HEADER_SUBTITLE: "We will send you an email to reset your password", EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL: "your account", EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL: "A password reset email has been sent to ", EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL: ", if it exists in our system. ", EMAIL_PASSWORD_RESET_RESEND_LINK: "Resend or change email", EMAIL_PASSWORD_RESET_SEND_BTN: "Email me", EMAIL_PASSWORD_RESET_SIGN_IN_LINK: "Sign In", EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE: "Success!", EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC: "Your password has been updated successfully", EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN: "SIGN IN", EMAIL_PASSWORD_NEW_PASSWORD_LABEL: "New password", EMAIL_PASSWORD_NEW_PASSWORD_PLACEHOLDER: "New password", EMAIL_PASSWORD_CONFIRM_PASSWORD_LABEL: "Confirm password", EMAIL_PASSWORD_CONFIRM_PASSWORD_PLACEHOLDER: "Confirm your password", EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE: "Change your password", EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE: "Enter a new password below to change your password", EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN: "CHANGE PASSWORD", EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR: "Invalid password reset token", ERROR_EMAIL_NON_STRING: "Email must be of type string", ERROR_EMAIL_INVALID: "Email is invalid", ERROR_PASSWORD_NON_STRING: "Password must be of type string", ERROR_PASSWORD_TOO_SHORT: "Password must contain at least 8 characters, including a number", ERROR_PASSWORD_TOO_LONG: "Password's length must be lesser than 100 characters", ERROR_PASSWORD_NO_ALPHA: "Password must contain at least one alphabet", ERROR_PASSWORD_NO_NUM: "Password must contain at least one number", ERROR_CONFIRM_PASSWORD_NO_MATCH: "Confirmation password doesn't match", ERROR_NON_OPTIONAL: "Field is not optional", + /* + * The following are error messages from our backend SDK. + * These are returned as full messages to preserver compatibilty, but they work just like the keys above. + * They are shown as is by default (setting the value to undefined will display the raw translation key) + */ + "This email already exists. Please sign in instead.": undefined, "Field is not optional": undefined, "Password must contain at least 8 characters, including a number": undefined, "Password's length must be lesser than 100 characters": undefined, "Password must contain at least one alphabet": undefined, "Password must contain at least one number": undefined, "Email is invalid": undefined, "Reset password link was not created because of account take over risk. Please contact support. (ERR_CODE_001)": undefined, "Cannot sign up due to security reasons. Please try logging in, use a different login method or contact support. (ERR_CODE_007)": undefined, "Cannot sign in due to security reasons. Please try resetting your password, use a different login method or contact support. (ERR_CODE_008)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_009)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_010)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_011)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_012)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_013)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_014)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_015)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_016)": undefined }), }; -var ResetPasswordUsingToken$1 = function (props) { - var token = genericComponentOverrideContext.getQueryParams("token"); - var userContext = uiEntry.useUserContext(); - if (props.userContext !== undefined) { - userContext = props.userContext; - } - var _a = React__namespace.useState(), - error = _a[0], - setError = _a[1]; - var enterEmailFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.enterEmailForm; - var submitNewPasswordFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.submitNewPasswordForm; - var submitNewPasswordForm = - token === undefined || token === null - ? undefined - : { - error: error, - onError: function (error) { - return setError(error); - }, - clearError: function () { - return setError(undefined); - }, - styleFromInit: submitNewPasswordFormFeature.style, - formFields: submitNewPasswordFormFeature.formFields, - recipeImplementation: props.recipe.webJSRecipe, - config: props.recipe.config, - onSignInClicked: function () { - void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - show: "signin", - navigate: props.navigate, - redirectBack: false, - userContext: userContext, - }); - }, - token: token, - }; - var enterEmailForm = { - onBackButtonClicked: function () { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - show: "signin", - navigate: props.navigate, - redirectBack: false, - userContext: userContext, - }); - }, - error: error, - onError: function (error) { - return setError(error); - }, - clearError: function () { - return setError(undefined); - }, - styleFromInit: enterEmailFormFeature.style, - formFields: enterEmailFormFeature.formFields, - recipeImplementation: props.recipe.webJSRecipe, - config: props.recipe.config, - }; - var childProps = { - config: props.recipe.config, - submitNewPasswordForm: submitNewPasswordForm, - enterEmailForm: enterEmailForm, - }; - var recipeComponentOverrides = props.useComponentOverrides(); - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, - defaultStore: defaultTranslationsEmailPassword, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - ResetPasswordUsingTokenThemeWrapper, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ), - } - ) - ); +var ResetPasswordUsingToken$1 = function (props) { + var token = genericComponentOverrideContext.getQueryParams("token"); + var userContext = uiEntry.useUserContext(); + if (props.userContext !== undefined) { + userContext = props.userContext; + } + var _a = React__namespace.useState(), error = _a[0], setError = _a[1]; + var enterEmailFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.enterEmailForm; + var submitNewPasswordFormFeature = props.recipe.config.resetPasswordUsingTokenFeature.submitNewPasswordForm; + var submitNewPasswordForm = token === undefined || token === null + ? undefined + : { + error: error, + onError: function (error) { return setError(error); }, + clearError: function () { return setError(undefined); }, + styleFromInit: submitNewPasswordFormFeature.style, + formFields: submitNewPasswordFormFeature.formFields, + recipeImplementation: props.recipe.webJSRecipe, + config: props.recipe.config, + onSignInClicked: function () { + void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + show: "signin", + navigate: props.navigate, + redirectBack: false, + userContext: userContext, + }); + }, + token: token, + }; + var enterEmailForm = { + onBackButtonClicked: function () { + return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + show: "signin", + navigate: props.navigate, + redirectBack: false, + userContext: userContext, + }); + }, + error: error, + onError: function (error) { return setError(error); }, + clearError: function () { return setError(undefined); }, + styleFromInit: enterEmailFormFeature.style, + formFields: enterEmailFormFeature.formFields, + recipeImplementation: props.recipe.webJSRecipe, + config: props.recipe.config, + }; + var childProps = { + config: props.recipe.config, + submitNewPasswordForm: submitNewPasswordForm, + enterEmailForm: enterEmailForm, + }; + var recipeComponentOverrides = props.useComponentOverrides(); + return (jsxRuntime.jsx(uiEntry.ComponentOverrideContext.Provider, logger.__assign({ value: recipeComponentOverrides }, { children: jsxRuntime.jsx(uiEntry.FeatureWrapper, logger.__assign({ useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, defaultStore: defaultTranslationsEmailPassword }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(ResetPasswordUsingTokenThemeWrapper, logger.__assign({}, childProps)), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, childProps); + } + return child; + })] }) })) }))); }; -var SignInForm = uiEntry.withOverride("EmailPasswordSignInForm", function EmailPasswordSignInForm(props) { - var _this = this; - var userContext = uiEntry.useUserContext(); - return jsxRuntime.jsx(formBase.FormBase, { - formFields: props.formFields, - clearError: props.clearError, - onError: props.onError, - onFetchError: props.onFetchError, - buttonLabel: "EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN", - onSuccess: props.onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var validationErrors, response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - formFields, - props.config.signInAndUpFeature.signInForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - return [ - 4 /*yield*/, - props.recipeImplementation.signIn({ - formFields: formFields, - shouldTryLinkingWithSessionUser: false, - userContext: userContext, - }), - ]; - case 2: - response = _a.sent(); - if (response.status === "WRONG_CREDENTIALS_ERROR") { - throw new STGeneralError__default.default( - "EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR" - ); - } else if (response.status === "SIGN_IN_NOT_ALLOWED") { - throw new STGeneralError__default.default(response.reason); - } else { - return [2 /*return*/, response]; - } - } - }); - }); - }, - validateOnBlur: false, - showLabels: true, - footer: props.footer, - }); -}); -function SignInTheme(props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - var activeStyle = props.config.signInAndUpFeature.signInForm.style; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - translations.ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle, activeStyle] }, - { children: jsxRuntime.jsx(SignInForm, genericComponentOverrideContext.__assign({}, props)) } - ) - ), - } - ) - ); +var SignInForm = uiEntry.withOverride("EmailPasswordSignInForm", function EmailPasswordSignInForm(props) { + var _this = this; + var userContext = uiEntry.useUserContext(); + return (jsxRuntime.jsx(formBase.FormBase, { formFields: props.formFields, clearError: props.clearError, onError: props.onError, onFetchError: props.onFetchError, buttonLabel: "EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN", onSuccess: props.onSuccess, callAPI: function (formFields) { return logger.__awaiter(_this, void 0, void 0, function () { + var validationErrors, response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, genericComponentOverrideContext.validateForm(formFields, props.config.signInAndUpFeature.signInForm.formFields)]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [2 /*return*/, { + status: "FIELD_ERROR", + formFields: validationErrors, + }]; + } + return [4 /*yield*/, props.recipeImplementation.signIn({ + formFields: formFields, + shouldTryLinkingWithSessionUser: false, + userContext: userContext, + })]; + case 2: + response = _a.sent(); + if (response.status === "WRONG_CREDENTIALS_ERROR") { + throw new STGeneralError__default.default("EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR"); + } + else if (response.status === "SIGN_IN_NOT_ALLOWED") { + throw new STGeneralError__default.default(response.reason); + } + else { + return [2 /*return*/, response]; + } + } + }); + }); }, validateOnBlur: false, showLabels: true, footer: props.footer })); +}); +function SignInTheme(props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + var activeStyle = props.config.signInAndUpFeature.signInForm.style; + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(translations.ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle, activeStyle] }, { children: jsxRuntime.jsx(SignInForm, logger.__assign({}, props)) })) }))); } -function useChildProps$1(recipe$2, onAuthSuccess, error, onError, clearError, userContext, navigate) { - var _this = this; - var session$1 = uiEntry.useSessionContext(); - var recipeImplementation = React.useMemo( - function () { - return getModifiedRecipeImplementation$1(recipe$2.webJSRecipe); - }, - [recipe$2] - ); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var t = translationContext.useTranslation(); - var onSignInSuccess = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var payloadAfterCall; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - _b.trys.push([0, 2, , 3]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]; - case 1: - payloadAfterCall = _b.sent(); - return [3 /*break*/, 3]; - case 2: - _b.sent(); - payloadAfterCall = undefined; - return [3 /*break*/, 3]; - case 3: - return [ - 2 /*return*/, - onAuthSuccess({ - createdNewUser: false, - isNewRecipeUser: false, - newSessionCreated: - session$1.loading || - !session$1.doesSessionExist || - (payloadAfterCall !== undefined && - session$1.accessTokenPayload.sessionHandle !== - payloadAfterCall.sessionHandle), - recipeId: recipe.EmailPassword.RECIPE_ID, - }).catch(rethrowInRender), - ]; - } - }); - }); - }, - [recipe$2, userContext, navigate] - ); - return React.useMemo( - function () { - var onForgotPasswordClick = function () { - return recipe$2.redirect( - { - action: "RESET_PASSWORD", - tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - navigate, - undefined, - userContext - ); - }; - var signInAndUpFeature = recipe$2.config.signInAndUpFeature; - var signInFeature = signInAndUpFeature.signInForm; - var formFields = signInFeature.formFields.map(function (f) { - return f.id !== "password" - ? f - : genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, f), { - labelComponent: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "formLabelWithLinkWrapper" }, - { - children: [ - jsxRuntime.jsx(formBase.Label, { - value: f.label, - "data-supertokens": "passwordInputLabel", - }), - jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - onClick: onForgotPasswordClick, - "data-supertokens": - "link linkButton formLabelLinkBtn forgotPasswordLink", - }, - { children: t("EMAIL_PASSWORD_SIGN_IN_FORGOT_PW_LINK") } - ) - ), - ], - } - ) - ), - }); - }); - return { - recipeImplementation: recipeImplementation, - config: recipe$2.config, - styleFromInit: signInFeature.style, - formFields: formFields, - error: error, - clearError: clearError, - onError: onError, - onFetchError: function (err) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var invalidClaims, evInstance; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if ( - !( - err.status === - types.Session.getInstanceOrThrow().config.invalidClaimStatusCode - ) - ) - return [3 /*break*/, 5]; - return [ - 4 /*yield*/, - session.getInvalidClaimsFromResponse({ - response: err, - userContext: userContext, - }), - ]; - case 1: - invalidClaims = _b.sent(); - if ( - !invalidClaims.some(function (i) { - return i.id === emailverification.EmailVerificationClaim.id; - }) - ) - return [3 /*break*/, 5]; - _b.label = 2; - case 2: - _b.trys.push([2, 4, , 5]); - evInstance = recipe$1.EmailVerification.getInstanceOrThrow(); - return [ - 4 /*yield*/, - evInstance.redirect( - { - action: "VERIFY_EMAIL", - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - navigate, - undefined, - userContext - ), - ]; - case 3: - _b.sent(); - return [2 /*return*/]; - case 4: - _b.sent(); - return [3 /*break*/, 5]; - case 5: - onError("SOMETHING_WENT_WRONG_ERROR"); - return [2 /*return*/]; - } - }); - }); - }, - onSuccess: onSignInSuccess, - onForgotPasswordClick: onForgotPasswordClick, - userContext: userContext, - }; - }, - [recipe$2, error, userContext] - ); -} -var SignInFeature = function (props) { - var childProps = useChildProps$1( - props.recipe, - props.onAuthSuccess, - props.error, - props.onError, - props.clearError, - props.userContext, - props.navigate - ); - var recipeComponentOverrides = props.useComponentOverrides(); - return jsxRuntime.jsx( - authCompWrapper.AuthComponentWrapper, - genericComponentOverrideContext.__assign( - { recipeComponentOverrides: recipeComponentOverrides }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx(SignInTheme, genericComponentOverrideContext.__assign({}, childProps)), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement( - child, - genericComponentOverrideContext.__assign({}, childProps) - ); - } - return child; - }), - ], - }), - } - ) - ); -}; -var getModifiedRecipeImplementation$1 = function (origImpl) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, origImpl), { - signIn: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - origImpl.signIn( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, input), - { shouldTryLinkingWithSessionUser: false } - ) - ), - ]; - case 1: - response = _a.sent(); - return [2 /*return*/, response]; - } - }); - }); - }, - signUp: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - origImpl.signUp( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, input), - { shouldTryLinkingWithSessionUser: false } - ) - ), - ]; - case 1: - response = _a.sent(); - return [2 /*return*/, response]; - } - }); - }); - }, - }); +function useChildProps$1(recipe$2, onAuthSuccess, error, onError, clearError, userContext, navigate) { + var _this = this; + var session$1 = uiEntry.useSessionContext(); + var recipeImplementation = React.useMemo(function () { return getModifiedRecipeImplementation$1(recipe$2.webJSRecipe); }, [recipe$2]); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var t = translationContext.useTranslation(); + var onSignInSuccess = React.useCallback(function () { return logger.__awaiter(_this, void 0, void 0, function () { + var payloadAfterCall; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 2, , 3]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: userContext, + })]; + case 1: + payloadAfterCall = _b.sent(); + return [3 /*break*/, 3]; + case 2: + _b.sent(); + payloadAfterCall = undefined; + return [3 /*break*/, 3]; + case 3: return [2 /*return*/, onAuthSuccess({ + createdNewUser: false, + isNewRecipeUser: false, + newSessionCreated: session$1.loading || + !session$1.doesSessionExist || + (payloadAfterCall !== undefined && + session$1.accessTokenPayload.sessionHandle !== payloadAfterCall.sessionHandle), + recipeId: recipe.EmailPassword.RECIPE_ID, + }).catch(rethrowInRender)]; + } + }); + }); }, [recipe$2, userContext, navigate]); + return React.useMemo(function () { + var onForgotPasswordClick = function () { + return recipe$2.redirect({ action: "RESET_PASSWORD", tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams() }, navigate, undefined, userContext); + }; + var signInAndUpFeature = recipe$2.config.signInAndUpFeature; + var signInFeature = signInAndUpFeature.signInForm; + var formFields = signInFeature.formFields.map(function (f) { + return f.id !== "password" + ? f + : logger.__assign(logger.__assign({}, f), { labelComponent: (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "formLabelWithLinkWrapper" }, { children: [jsxRuntime.jsx(formBase.Label, { value: f.label, "data-supertokens": "passwordInputLabel" }), jsxRuntime.jsx("a", logger.__assign({ onClick: onForgotPasswordClick, "data-supertokens": "link linkButton formLabelLinkBtn forgotPasswordLink" }, { children: t("EMAIL_PASSWORD_SIGN_IN_FORGOT_PW_LINK") }))] }))) }); + }); + return { + recipeImplementation: recipeImplementation, + config: recipe$2.config, + styleFromInit: signInFeature.style, + formFields: formFields, + error: error, + clearError: clearError, + onError: onError, + onFetchError: function (err) { return logger.__awaiter(_this, void 0, void 0, function () { + var invalidClaims, evInstance; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!(err.status === types.Session.getInstanceOrThrow().config.invalidClaimStatusCode)) return [3 /*break*/, 5]; + return [4 /*yield*/, session.getInvalidClaimsFromResponse({ response: err, userContext: userContext })]; + case 1: + invalidClaims = _b.sent(); + if (!invalidClaims.some(function (i) { return i.id === emailverification.EmailVerificationClaim.id; })) return [3 /*break*/, 5]; + _b.label = 2; + case 2: + _b.trys.push([2, 4, , 5]); + evInstance = recipe$1.EmailVerification.getInstanceOrThrow(); + return [4 /*yield*/, evInstance.redirect({ + action: "VERIFY_EMAIL", + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + }, navigate, undefined, userContext)]; + case 3: + _b.sent(); + return [2 /*return*/]; + case 4: + _b.sent(); + return [3 /*break*/, 5]; + case 5: + onError("SOMETHING_WENT_WRONG_ERROR"); + return [2 /*return*/]; + } + }); + }); }, + onSuccess: onSignInSuccess, + onForgotPasswordClick: onForgotPasswordClick, + userContext: userContext, + }; + }, [recipe$2, error, userContext]); +} +var SignInFeature = function (props) { + var childProps = useChildProps$1(props.recipe, props.onAuthSuccess, props.error, props.onError, props.clearError, props.userContext, props.navigate); + var recipeComponentOverrides = props.useComponentOverrides(); + return (jsxRuntime.jsx(authCompWrapper.AuthComponentWrapper, logger.__assign({ recipeComponentOverrides: recipeComponentOverrides }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(SignInTheme, logger.__assign({}, childProps)), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, logger.__assign({}, childProps)); + } + return child; + })] }) }))); +}; +var getModifiedRecipeImplementation$1 = function (origImpl) { + return logger.__assign(logger.__assign({}, origImpl), { signIn: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, origImpl.signIn(logger.__assign(logger.__assign({}, input), { shouldTryLinkingWithSessionUser: false }))]; + case 1: + response = _a.sent(); + return [2 /*return*/, response]; + } + }); + }); + }, signUp: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, origImpl.signUp(logger.__assign(logger.__assign({}, input), { shouldTryLinkingWithSessionUser: false }))]; + case 1: + response = _a.sent(); + return [2 /*return*/, response]; + } + }); + }); + } }); }; -var SignUpForm = uiEntry.withOverride("EmailPasswordSignUpForm", function EmailPasswordSignUpForm(props) { - var _this = this; - var userContext = uiEntry.useUserContext(); - return jsxRuntime.jsx(formBase.FormBase, { - formFields: props.formFields, - clearError: props.clearError, - onError: props.onError, - onFetchError: props.onFetchError, - buttonLabel: "EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN", - onSuccess: props.onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var validationErrors, res; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - genericComponentOverrideContext.validateForm( - formFields, - props.config.signInAndUpFeature.signUpForm.formFields - ), - ]; - case 1: - validationErrors = _a.sent(); - if (validationErrors.length > 0) { - return [ - 2 /*return*/, - { - status: "FIELD_ERROR", - formFields: validationErrors, - }, - ]; - } - return [ - 4 /*yield*/, - props.recipeImplementation.signUp({ - formFields: formFields, - shouldTryLinkingWithSessionUser: false, - userContext: userContext, - }), - ]; - case 2: - res = _a.sent(); - if (res.status === "SIGN_UP_NOT_ALLOWED") { - throw new STGeneralError__default$1.default(res.reason); - } - return [2 /*return*/, res]; - } - }); - }); - }, - validateOnBlur: true, - showLabels: true, - footer: props.footer, - }); -}); -function SignUpTheme(props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - var activeStyle = props.config.signInAndUpFeature.signUpForm.style; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - translations.ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle, activeStyle] }, - { children: jsxRuntime.jsx(SignUpForm, genericComponentOverrideContext.__assign({}, props)) } - ) - ), - } - ) - ); +var SignUpForm = uiEntry.withOverride("EmailPasswordSignUpForm", function EmailPasswordSignUpForm(props) { + var _this = this; + var userContext = uiEntry.useUserContext(); + return (jsxRuntime.jsx(formBase.FormBase, { formFields: props.formFields, clearError: props.clearError, onError: props.onError, onFetchError: props.onFetchError, buttonLabel: "EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN", onSuccess: props.onSuccess, callAPI: function (formFields) { return logger.__awaiter(_this, void 0, void 0, function () { + var validationErrors, res; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, genericComponentOverrideContext.validateForm(formFields, props.config.signInAndUpFeature.signUpForm.formFields)]; + case 1: + validationErrors = _a.sent(); + if (validationErrors.length > 0) { + return [2 /*return*/, { + status: "FIELD_ERROR", + formFields: validationErrors, + }]; + } + return [4 /*yield*/, props.recipeImplementation.signUp({ + formFields: formFields, + shouldTryLinkingWithSessionUser: false, + userContext: userContext, + })]; + case 2: + res = _a.sent(); + if (res.status === "SIGN_UP_NOT_ALLOWED") { + throw new STGeneralError__default$1.default(res.reason); + } + return [2 /*return*/, res]; + } + }); + }); }, validateOnBlur: true, showLabels: true, footer: props.footer })); +}); +function SignUpTheme(props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + var activeStyle = props.config.signInAndUpFeature.signUpForm.style; + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(translations.ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle, activeStyle] }, { children: jsxRuntime.jsx(SignUpForm, logger.__assign({}, props)) })) }))); } -function useChildProps(recipe, onAuthSuccess, error, onError, clearError, userContext, navigate) { - var _this = this; - var session$1 = uiEntry.useSessionContext(); - var recipeImplementation = React.useMemo( - function () { - return recipe && getModifiedRecipeImplementation(recipe.webJSRecipe); - }, - [recipe] - ); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var onSignUpSuccess = React.useCallback( - function (result) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var payloadAfterCall; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - _b.trys.push([0, 2, , 3]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]; - case 1: - payloadAfterCall = _b.sent(); - return [3 /*break*/, 3]; - case 2: - _b.sent(); - payloadAfterCall = undefined; - return [3 /*break*/, 3]; - case 3: - return [ - 2 /*return*/, - onAuthSuccess({ - createdNewUser: result.user.loginMethods.length === 1, - isNewRecipeUser: true, - newSessionCreated: - session$1.loading || - !session$1.doesSessionExist || - (payloadAfterCall !== undefined && - session$1.accessTokenPayload.sessionHandle !== - payloadAfterCall.sessionHandle), - recipeId: recipe.recipeID, - }).catch(rethrowInRender), - ]; - } - }); - }); - }, - [recipe, userContext, navigate] - ); - return React.useMemo( - function () { - var signInAndUpFeature = recipe.config.signInAndUpFeature; - var signUpFeature = signInAndUpFeature.signUpForm; - return { - recipeImplementation: recipeImplementation, - config: recipe.config, - styleFromInit: signUpFeature.style, - formFields: getThemeSignUpFeatureFormFields(signUpFeature.formFields, recipe, userContext), - onFetchError: function (err) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var invalidClaims, evInstance; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if ( - !( - err.status === - types.Session.getInstanceOrThrow().config.invalidClaimStatusCode - ) - ) - return [3 /*break*/, 5]; - return [ - 4 /*yield*/, - session.getInvalidClaimsFromResponse({ - response: err, - userContext: userContext, - }), - ]; - case 1: - invalidClaims = _b.sent(); - if ( - !invalidClaims.some(function (i) { - return i.id === emailverification.EmailVerificationClaim.id; - }) - ) - return [3 /*break*/, 5]; - _b.label = 2; - case 2: - _b.trys.push([2, 4, , 5]); - evInstance = recipe$1.EmailVerification.getInstanceOrThrow(); - return [ - 4 /*yield*/, - evInstance.redirect( - { - action: "VERIFY_EMAIL", - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - navigate, - undefined, - userContext - ), - ]; - case 3: - _b.sent(); - return [2 /*return*/]; - case 4: - _b.sent(); - return [3 /*break*/, 5]; - case 5: - onError("SOMETHING_WENT_WRONG_ERROR"); - return [2 /*return*/]; - } - }); - }); - }, - onSuccess: onSignUpSuccess, - userContext: userContext, - error: error, - onError: onError, - clearError: clearError, - }; - }, - [recipe, error, userContext] - ); -} -var SignUpFeature = function (props) { - var userContext = uiEntry.useUserContext(); - if (props.userContext !== undefined) { - userContext = props.userContext; - } - var childProps = useChildProps( - props.recipe, - props.onAuthSuccess, - props.error, - props.onError, - props.clearError, - userContext, - props.navigate - ); - var recipeComponentOverrides = props.useComponentOverrides(); - return jsxRuntime.jsx( - authCompWrapper.AuthComponentWrapper, - genericComponentOverrideContext.__assign( - { recipeComponentOverrides: recipeComponentOverrides }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx(SignUpTheme, genericComponentOverrideContext.__assign({}, childProps)), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement( - child, - genericComponentOverrideContext.__assign({}, childProps) - ); - } - return child; - }), - ], - }), - } - ) - ); -}; -var getModifiedRecipeImplementation = function (origImpl) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, origImpl), { - signIn: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - origImpl.signIn( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, input), - { shouldTryLinkingWithSessionUser: false } - ) - ), - ]; - case 1: - response = _a.sent(); - return [2 /*return*/, response]; - } - }); - }); - }, - signUp: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - origImpl.signUp( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, input), - { shouldTryLinkingWithSessionUser: false } - ) - ), - ]; - case 1: - response = _a.sent(); - return [2 /*return*/, response]; - } - }); - }); - }, - }); -}; -function getThemeSignUpFeatureFormFields(formFields, recipe, userContext) { - var _this = this; - var emailPasswordOnly = formFields.length === 2; - return formFields.map(function (field) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, field), { - showIsRequired: (function () { - // If email and password only, do not show required indicator (*). - if (emailPasswordOnly) { - return false; - } - // Otherwise, show for all non optional fields (including email and password). - return field.optional === false; - })(), - validate: (function () { - // If field is not email, return field validate unchanged. - if (field.id !== "email") { - return field.validate; - } - // Otherwise, if email, use syntax validate method and check if email exists. - return function (value) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var error, emailExists, err_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, field.validate(value)]; - case 1: - error = _a.sent(); - if (error !== undefined) { - return [2 /*return*/, error]; - } - if (typeof value !== "string") { - return [2 /*return*/, "GENERAL_ERROR_EMAIL_NON_STRING"]; - } - _a.label = 2; - case 2: - _a.trys.push([2, 4, , 5]); - return [ - 4 /*yield*/, - recipe.webJSRecipe.doesEmailExist({ - email: value, - userContext: userContext, - }), - ]; - case 3: - emailExists = _a.sent().doesExist; - if (emailExists) { - return [2 /*return*/, "EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS"]; - } - return [3 /*break*/, 5]; - case 4: - err_1 = _a.sent(); - if (STGeneralError__default.default.isThisError(err_1)) { - return [2 /*return*/, err_1.message]; - } - return [3 /*break*/, 5]; - case 5: - return [2 /*return*/, undefined]; - } - }); - }); - }; - })(), - }); - }); +function useChildProps(recipe, onAuthSuccess, error, onError, clearError, userContext, navigate) { + var _this = this; + var session$1 = uiEntry.useSessionContext(); + var recipeImplementation = React.useMemo(function () { return recipe && getModifiedRecipeImplementation(recipe.webJSRecipe); }, [recipe]); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var onSignUpSuccess = React.useCallback(function (result) { return logger.__awaiter(_this, void 0, void 0, function () { + var payloadAfterCall; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 2, , 3]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: userContext, + })]; + case 1: + payloadAfterCall = _b.sent(); + return [3 /*break*/, 3]; + case 2: + _b.sent(); + payloadAfterCall = undefined; + return [3 /*break*/, 3]; + case 3: return [2 /*return*/, onAuthSuccess({ + createdNewUser: result.user.loginMethods.length === 1, + isNewRecipeUser: true, + newSessionCreated: session$1.loading || + !session$1.doesSessionExist || + (payloadAfterCall !== undefined && + session$1.accessTokenPayload.sessionHandle !== payloadAfterCall.sessionHandle), + recipeId: recipe.recipeID, + }).catch(rethrowInRender)]; + } + }); + }); }, [recipe, userContext, navigate]); + return React.useMemo(function () { + var signInAndUpFeature = recipe.config.signInAndUpFeature; + var signUpFeature = signInAndUpFeature.signUpForm; + return { + recipeImplementation: recipeImplementation, + config: recipe.config, + styleFromInit: signUpFeature.style, + formFields: getThemeSignUpFeatureFormFields(signUpFeature.formFields, recipe, userContext), + onFetchError: function (err) { return logger.__awaiter(_this, void 0, void 0, function () { + var invalidClaims, evInstance; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!(err.status === types.Session.getInstanceOrThrow().config.invalidClaimStatusCode)) return [3 /*break*/, 5]; + return [4 /*yield*/, session.getInvalidClaimsFromResponse({ response: err, userContext: userContext })]; + case 1: + invalidClaims = _b.sent(); + if (!invalidClaims.some(function (i) { return i.id === emailverification.EmailVerificationClaim.id; })) return [3 /*break*/, 5]; + _b.label = 2; + case 2: + _b.trys.push([2, 4, , 5]); + evInstance = recipe$1.EmailVerification.getInstanceOrThrow(); + return [4 /*yield*/, evInstance.redirect({ + action: "VERIFY_EMAIL", + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + }, navigate, undefined, userContext)]; + case 3: + _b.sent(); + return [2 /*return*/]; + case 4: + _b.sent(); + return [3 /*break*/, 5]; + case 5: + onError("SOMETHING_WENT_WRONG_ERROR"); + return [2 /*return*/]; + } + }); + }); }, + onSuccess: onSignUpSuccess, + userContext: userContext, + error: error, + onError: onError, + clearError: clearError, + }; + }, [recipe, error, userContext]); +} +var SignUpFeature = function (props) { + var userContext = uiEntry.useUserContext(); + if (props.userContext !== undefined) { + userContext = props.userContext; + } + var childProps = useChildProps(props.recipe, props.onAuthSuccess, props.error, props.onError, props.clearError, userContext, props.navigate); + var recipeComponentOverrides = props.useComponentOverrides(); + return (jsxRuntime.jsx(authCompWrapper.AuthComponentWrapper, logger.__assign({ recipeComponentOverrides: recipeComponentOverrides }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(SignUpTheme, logger.__assign({}, childProps)), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, logger.__assign({}, childProps)); + } + return child; + })] }) }))); +}; +var getModifiedRecipeImplementation = function (origImpl) { + return logger.__assign(logger.__assign({}, origImpl), { signIn: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, origImpl.signIn(logger.__assign(logger.__assign({}, input), { shouldTryLinkingWithSessionUser: false }))]; + case 1: + response = _a.sent(); + return [2 /*return*/, response]; + } + }); + }); + }, signUp: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, origImpl.signUp(logger.__assign(logger.__assign({}, input), { shouldTryLinkingWithSessionUser: false }))]; + case 1: + response = _a.sent(); + return [2 /*return*/, response]; + } + }); + }); + } }); +}; +function getThemeSignUpFeatureFormFields(formFields, recipe, userContext) { + var _this = this; + var emailPasswordOnly = formFields.length === 2; + return formFields.map(function (field) { return (logger.__assign(logger.__assign({}, field), { showIsRequired: (function () { + // If email and password only, do not show required indicator (*). + if (emailPasswordOnly) { + return false; + } + // Otherwise, show for all non optional fields (including email and password). + return field.optional === false; + })(), validate: (function () { + // If field is not email, return field validate unchanged. + if (field.id !== "email") { + return field.validate; + } + // Otherwise, if email, use syntax validate method and check if email exists. + return function (value) { return logger.__awaiter(_this, void 0, void 0, function () { + var error, emailExists, err_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, field.validate(value)]; + case 1: + error = _a.sent(); + if (error !== undefined) { + return [2 /*return*/, error]; + } + if (typeof value !== "string") { + return [2 /*return*/, "GENERAL_ERROR_EMAIL_NON_STRING"]; + } + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 5]); + return [4 /*yield*/, recipe.webJSRecipe.doesEmailExist({ + email: value, + userContext: userContext, + })]; + case 3: + emailExists = (_a.sent()).doesExist; + if (emailExists) { + return [2 /*return*/, "EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS"]; + } + return [3 /*break*/, 5]; + case 4: + err_1 = _a.sent(); + if (STGeneralError__default.default.isThisError(err_1)) { + return [2 /*return*/, err_1.message]; + } + return [3 /*break*/, 5]; + case 5: return [2 /*return*/, undefined]; + } + }); + }); }; + })() })); }); } -var EmailPasswordPreBuiltUI = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(EmailPasswordPreBuiltUI, _super); - function EmailPasswordPreBuiltUI(recipeInstance) { - var _this = _super.call(this) || this; - _this.recipeInstance = recipeInstance; - _this.languageTranslations = defaultTranslationsEmailPassword; - // Instance methods - _this.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - var features = {}; - if (_this.recipeInstance.config.resetPasswordUsingTokenFeature.disableDefaultUI !== true) { - var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( - new NormalisedURLPath__default.default(constants.DEFAULT_RESET_PASSWORD_PATH) - ); - features[normalisedFullPath.getAsStringDangerous()] = { - matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( - _this.recipeInstance.config.recipeId - ), - component: function (props) { - return _this.getFeatureComponent("resetpassword", props, useComponentOverrides); - }, - recipeID: recipe.EmailPassword.RECIPE_ID, - }; - } - return features; - }; - _this.getFeatureComponent = function (componentName, props, useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - if (componentName === "resetpassword") { - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - ResetPasswordUsingToken$1, - genericComponentOverrideContext.__assign({ recipe: _this.recipeInstance }, props, { - useComponentOverrides: useComponentOverrides, - }) - ), - } - ) - ); - } else { - throw new Error("Should never come here."); - } - }; - _this.requiresSignUpPage = true; - return _this; - } - // Static methods - EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance = function () { - if (EmailPasswordPreBuiltUI.instance === undefined) { - var recipeInstance = recipe.EmailPassword.getInstanceOrThrow(); - EmailPasswordPreBuiltUI.instance = new EmailPasswordPreBuiltUI(recipeInstance); - } - return EmailPasswordPreBuiltUI.instance; - }; - EmailPasswordPreBuiltUI.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); - }; - EmailPasswordPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - componentName, - props, - useComponentOverrides - ); - }; - EmailPasswordPreBuiltUI.prototype.getAuthComponents = function () { - var _this = this; - return [ - { - factorIds: [types.FactorIds.EMAILPASSWORD], - displayOrder: 2, - type: "SIGN_UP", - component: function (props) { - return jsxRuntime.jsx( - SignUpFeature, - genericComponentOverrideContext.__assign( - { - recipe: _this.recipeInstance, - useComponentOverrides: componentOverrideContext.useContext, - }, - props - ), - "emailpassword-sign-up" - ); - }, - }, - { - factorIds: [types.FactorIds.EMAILPASSWORD], - displayOrder: 2, - type: "SIGN_IN", - component: function (props) { - return jsxRuntime.jsx( - SignInFeature, - genericComponentOverrideContext.__assign( - { - recipe: _this.recipeInstance, - useComponentOverrides: componentOverrideContext.useContext, - }, - props - ), - "emailpassword-sign-in" - ); - }, - }, - ]; - }; - // For tests - EmailPasswordPreBuiltUI.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - EmailPasswordPreBuiltUI.instance = undefined; - return; - }; - EmailPasswordPreBuiltUI.ResetPasswordUsingToken = function (prop) { - return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("resetpassword", prop); - }; - EmailPasswordPreBuiltUI.ResetPasswordUsingTokenTheme = ResetPasswordUsingTokenThemeWrapper; - return EmailPasswordPreBuiltUI; -})(uiEntry.RecipeRouter); +var EmailPasswordPreBuiltUI = /** @class */ (function (_super) { + logger.__extends(EmailPasswordPreBuiltUI, _super); + function EmailPasswordPreBuiltUI(recipeInstance) { + var _this = _super.call(this) || this; + _this.recipeInstance = recipeInstance; + _this.languageTranslations = defaultTranslationsEmailPassword; + // Instance methods + _this.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + var features = {}; + if (_this.recipeInstance.config.resetPasswordUsingTokenFeature.disableDefaultUI !== true) { + var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default.default(constants.DEFAULT_RESET_PASSWORD_PATH)); + features[normalisedFullPath.getAsStringDangerous()] = { + matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams(_this.recipeInstance.config.recipeId), + component: function (props) { return _this.getFeatureComponent("resetpassword", props, useComponentOverrides); }, + recipeID: recipe.EmailPassword.RECIPE_ID, + }; + } + return features; + }; + _this.getFeatureComponent = function (componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + if (componentName === "resetpassword") { + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(ResetPasswordUsingToken$1, logger.__assign({ recipe: _this.recipeInstance }, props, { useComponentOverrides: useComponentOverrides })) }))); + } + else { + throw new Error("Should never come here."); + } + }; + _this.requiresSignUpPage = true; + return _this; + } + // Static methods + EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance = function () { + if (EmailPasswordPreBuiltUI.instance === undefined) { + var recipeInstance = recipe.EmailPassword.getInstanceOrThrow(); + EmailPasswordPreBuiltUI.instance = new EmailPasswordPreBuiltUI(recipeInstance); + } + return EmailPasswordPreBuiltUI.instance; + }; + EmailPasswordPreBuiltUI.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); + }; + EmailPasswordPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent(componentName, props, useComponentOverrides); + }; + EmailPasswordPreBuiltUI.prototype.getAuthComponents = function () { + var _this = this; + return [ + { + factorIds: [types.FactorIds.EMAILPASSWORD], + displayOrder: 2, + type: "SIGN_UP", + component: function (props) { return (jsxRuntime.jsx(SignUpFeature, logger.__assign({ recipe: _this.recipeInstance, useComponentOverrides: componentOverrideContext.useContext }, props), "emailpassword-sign-up")); }, + }, + { + factorIds: [types.FactorIds.EMAILPASSWORD], + displayOrder: 2, + type: "SIGN_IN", + component: function (props) { return (jsxRuntime.jsx(SignInFeature, logger.__assign({ recipe: _this.recipeInstance, useComponentOverrides: componentOverrideContext.useContext }, props), "emailpassword-sign-in")); }, + }, + ]; + }; + // For tests + EmailPasswordPreBuiltUI.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + EmailPasswordPreBuiltUI.instance = undefined; + return; + }; + EmailPasswordPreBuiltUI.ResetPasswordUsingToken = function (prop) { + return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("resetpassword", prop); + }; + EmailPasswordPreBuiltUI.ResetPasswordUsingTokenTheme = ResetPasswordUsingTokenThemeWrapper; + return EmailPasswordPreBuiltUI; +}(uiEntry.RecipeRouter)); var ResetPasswordUsingToken = EmailPasswordPreBuiltUI.ResetPasswordUsingToken; exports.EmailPasswordPreBuiltUI = EmailPasswordPreBuiltUI; diff --git a/lib/build/emailverification-shared.js b/lib/build/emailverification-shared.js index 1c7d9189f..dd8a64f1f 100644 --- a/lib/build/emailverification-shared.js +++ b/lib/build/emailverification-shared.js @@ -1,305 +1,232 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var EmailVerificationWebJS = require("supertokens-web-js/recipe/emailverification"); -var postSuperTokensInitCallbacks = require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -var sessionClaimValidatorStore = require("supertokens-web-js/utils/sessionClaimValidatorStore"); -var index = require("./recipeModule-shared.js"); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var logger = require('./logger.js'); +var EmailVerificationWebJS = require('supertokens-web-js/recipe/emailverification'); +var postSuperTokensInitCallbacks = require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +var sessionClaimValidatorStore = require('supertokens-web-js/utils/sessionClaimValidatorStore'); +var index = require('./recipeModule-shared.js'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var EmailVerificationWebJS__default = /*#__PURE__*/ _interopDefault(EmailVerificationWebJS); +var EmailVerificationWebJS__default = /*#__PURE__*/_interopDefault(EmailVerificationWebJS); -var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), - useContext = _a[0], - Provider = _a[1]; +var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), useContext = _a[0], Provider = _a[1]; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ var DEFAULT_VERIFY_EMAIL_PATH = "/verify-email"; -var EmailVerificationClaimClass = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(EmailVerificationClaimClass, _super); - function EmailVerificationClaimClass(getRecipeImpl, onFailureRedirection) { - var _this = _super.call(this, getRecipeImpl) || this; - var validatorsWithCallbacks = genericComponentOverrideContext.__assign({}, _this.validators); - var _loop_1 = function (key) { - var validator = validatorsWithCallbacks[key]; - validatorsWithCallbacks[key] = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, validator.apply(void 0, args)), - { - onFailureRedirection: function (args) { - if (onFailureRedirection !== undefined) { - return onFailureRedirection(args); - } - var recipe = EmailVerification.getInstanceOrThrow(); - if (recipe.config.mode === "REQUIRED") { - return recipe.getRedirectUrl( - { - action: "VERIFY_EMAIL", - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - args.userContext - ); - } - return undefined; - }, - showAccessDeniedOnFailure: false, - } - ); - }; - }; - for (var key in validatorsWithCallbacks) { - _loop_1(key); - } - _this.validators = validatorsWithCallbacks; - return _this; - } - return EmailVerificationClaimClass; -})(EmailVerificationWebJS.EmailVerificationClaimClass); +var EmailVerificationClaimClass = /** @class */ (function (_super) { + logger.__extends(EmailVerificationClaimClass, _super); + function EmailVerificationClaimClass(getRecipeImpl, onFailureRedirection) { + var _this = _super.call(this, getRecipeImpl) || this; + var validatorsWithCallbacks = logger.__assign({}, _this.validators); + var _loop_1 = function (key) { + var validator = validatorsWithCallbacks[key]; + validatorsWithCallbacks[key] = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return logger.__assign(logger.__assign({}, validator.apply(void 0, args)), { onFailureRedirection: function (args) { + if (onFailureRedirection !== undefined) { + return onFailureRedirection(args); + } + var recipe = EmailVerification.getInstanceOrThrow(); + if (recipe.config.mode === "REQUIRED") { + return recipe.getRedirectUrl({ action: "VERIFY_EMAIL", tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams() }, args.userContext); + } + return undefined; + }, showAccessDeniedOnFailure: false }); + }; + }; + for (var key in validatorsWithCallbacks) { + _loop_1(key); + } + _this.validators = validatorsWithCallbacks; + return _this; + } + return EmailVerificationClaimClass; +}(EmailVerificationWebJS.EmailVerificationClaimClass)); -var getFunctionOverrides = function (onHandleEvent) { - return function (originalImp) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, originalImp), { - verifyEmail: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImp.verifyEmail(input)]; - case 1: - response = _a.sent(); - if (response.status === "OK") { - onHandleEvent({ - action: "EMAIL_VERIFIED_SUCCESSFUL", - userContext: input.userContext, - }); - } - return [2 /*return*/, response]; - } - }); - }); - }, - sendVerificationEmail: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImp.sendVerificationEmail(input)]; - case 1: - response = _a.sent(); - if (response.status === "OK") { - onHandleEvent({ - action: "VERIFY_EMAIL_SENT", - userContext: input.userContext, - }); - } - return [2 /*return*/, response]; - } - }); - }); - }, - }); - }; +var getFunctionOverrides = function (onHandleEvent) { + return function (originalImp) { return (logger.__assign(logger.__assign({}, originalImp), { verifyEmail: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.verifyEmail(input)]; + case 1: + response = _a.sent(); + if (response.status === "OK") { + onHandleEvent({ + action: "EMAIL_VERIFIED_SUCCESSFUL", + userContext: input.userContext, + }); + } + return [2 /*return*/, response]; + } + }); + }); + }, sendVerificationEmail: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.sendVerificationEmail(input)]; + case 1: + response = _a.sent(); + if (response.status === "OK") { + onHandleEvent({ + action: "VERIFY_EMAIL_SENT", + userContext: input.userContext, + }); + } + return [2 /*return*/, response]; + } + }); + }); + } })); }; }; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function normaliseEmailVerificationFeature(config) { - if (config === undefined) { - config = {}; - } - var disableDefaultUI = config.disableDefaultUI === true; - var mode = config.mode === undefined ? "REQUIRED" : config.mode; - var sendVerifyEmailScreenStyle = - config.sendVerifyEmailScreen !== undefined && config.sendVerifyEmailScreen.style !== undefined - ? config.sendVerifyEmailScreen.style - : ""; - var sendVerifyEmailScreen = { - style: sendVerifyEmailScreenStyle, - }; - var verifyEmailLinkClickedScreenStyle = - config.verifyEmailLinkClickedScreen !== undefined && config.verifyEmailLinkClickedScreen.style !== undefined - ? config.verifyEmailLinkClickedScreen.style - : ""; - var verifyEmailLinkClickedScreen = { - style: verifyEmailLinkClickedScreenStyle, - }; - var override = genericComponentOverrideContext.__assign( - { - functions: function (originalImplementation) { - return originalImplementation; - }, - }, - config.override - ); - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - {}, - genericComponentOverrideContext.normaliseRecipeModuleConfig(config) - ), - { - disableDefaultUI: disableDefaultUI, - mode: mode, - sendVerifyEmailScreen: sendVerifyEmailScreen, - verifyEmailLinkClickedScreen: verifyEmailLinkClickedScreen, - override: override, - } - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function normaliseEmailVerificationFeature(config) { + if (config === undefined) { + config = {}; + } + var disableDefaultUI = config.disableDefaultUI === true; + var mode = config.mode === undefined ? "REQUIRED" : config.mode; + var sendVerifyEmailScreenStyle = config.sendVerifyEmailScreen !== undefined && config.sendVerifyEmailScreen.style !== undefined + ? config.sendVerifyEmailScreen.style + : ""; + var sendVerifyEmailScreen = { + style: sendVerifyEmailScreenStyle, + }; + var verifyEmailLinkClickedScreenStyle = config.verifyEmailLinkClickedScreen !== undefined && config.verifyEmailLinkClickedScreen.style !== undefined + ? config.verifyEmailLinkClickedScreen.style + : ""; + var verifyEmailLinkClickedScreen = { + style: verifyEmailLinkClickedScreenStyle, + }; + var override = logger.__assign({ functions: function (originalImplementation) { return originalImplementation; } }, config.override); + return logger.__assign(logger.__assign({}, genericComponentOverrideContext.normaliseRecipeModuleConfig(config)), { disableDefaultUI: disableDefaultUI, mode: mode, sendVerifyEmailScreen: sendVerifyEmailScreen, verifyEmailLinkClickedScreen: verifyEmailLinkClickedScreen, override: override }); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var EmailVerification = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(EmailVerification, _super); - function EmailVerification(config, webJSRecipe) { - if (webJSRecipe === void 0) { - webJSRecipe = EmailVerificationWebJS__default.default; - } - var _this = _super.call(this, config) || this; - _this.webJSRecipe = webJSRecipe; - _this.recipeID = EmailVerification.RECIPE_ID; - _this.getDefaultRedirectionURL = function (context) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (context.action === "VERIFY_EMAIL") { - return [ - 2 /*return*/, - genericComponentOverrideContext.getDefaultRedirectionURLForPath( - this.config, - DEFAULT_VERIFY_EMAIL_PATH, - context - ), - ]; - } else { - return [2 /*return*/, "/"]; - } - }); - }); - }; - postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.addPostInitCallback(function () { - var isVerifiedValidator = EmailVerification.EmailVerificationClaim.validators.isVerified(10); - sessionClaimValidatorStore.SessionClaimValidatorStore.addClaimValidatorFromOtherRecipe(isVerifiedValidator); - }); - return _this; - } - EmailVerification.init = function (config) { - var normalisedConfig = normaliseEmailVerificationFeature(config); - return { - recipeID: EmailVerification.RECIPE_ID, - authReact: function (appInfo) { - EmailVerification.instance = new EmailVerification( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { appInfo: appInfo, recipeId: EmailVerification.RECIPE_ID } - ) - ); - return EmailVerification.instance; - }, - webJS: EmailVerificationWebJS__default.default.init( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { - override: { - functions: function (originalImpl, builder) { - var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; - }, - }, - } - ) - ), - }; - }; - EmailVerification.getInstanceOrThrow = function () { - if (EmailVerification.instance === undefined) { - var error = "No instance of EmailVerification found. Make sure to call the EmailVerification.init method."; - // eslint-disable-next-line supertokens-auth-react/no-direct-window-object - if (typeof window === "undefined") { - error = error + genericComponentOverrideContext.SSR_ERROR; - } - throw Error(error); - } - return EmailVerification.instance; - }; - EmailVerification.prototype.isEmailVerified = function (userContext) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - this.webJSRecipe.isEmailVerified({ - userContext: userContext, - }), - ]; - case 1: - return [2 /*return*/, _a.sent()]; - } - }); - }); - }; - EmailVerification.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - EmailVerification.instance = undefined; - return; - }; - EmailVerification.RECIPE_ID = "emailverification"; - EmailVerification.EmailVerificationClaim = new EmailVerificationClaimClass(function () { - return EmailVerification.getInstanceOrThrow().webJSRecipe; - }); - return EmailVerification; -})(index.RecipeModule); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var EmailVerification = /** @class */ (function (_super) { + logger.__extends(EmailVerification, _super); + function EmailVerification(config, webJSRecipe) { + if (webJSRecipe === void 0) { webJSRecipe = EmailVerificationWebJS__default.default; } + var _this = _super.call(this, config) || this; + _this.webJSRecipe = webJSRecipe; + _this.recipeID = EmailVerification.RECIPE_ID; + _this.getDefaultRedirectionURL = function (context) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (context.action === "VERIFY_EMAIL") { + return [2 /*return*/, genericComponentOverrideContext.getDefaultRedirectionURLForPath(this.config, DEFAULT_VERIFY_EMAIL_PATH, context)]; + } + else { + return [2 /*return*/, "/"]; + } + }); + }); }; + postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.addPostInitCallback(function () { + var isVerifiedValidator = EmailVerification.EmailVerificationClaim.validators.isVerified(10); + sessionClaimValidatorStore.SessionClaimValidatorStore.addClaimValidatorFromOtherRecipe(isVerifiedValidator); + }); + return _this; + } + EmailVerification.init = function (config) { + var normalisedConfig = normaliseEmailVerificationFeature(config); + return { + recipeID: EmailVerification.RECIPE_ID, + authReact: function (appInfo) { + EmailVerification.instance = new EmailVerification(logger.__assign(logger.__assign({}, normalisedConfig), { appInfo: appInfo, recipeId: EmailVerification.RECIPE_ID })); + return EmailVerification.instance; + }, + webJS: EmailVerificationWebJS__default.default.init(logger.__assign(logger.__assign({}, normalisedConfig), { override: { + functions: function (originalImpl, builder) { + var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, + } })), + }; + }; + EmailVerification.getInstanceOrThrow = function () { + if (EmailVerification.instance === undefined) { + var error = "No instance of EmailVerification found. Make sure to call the EmailVerification.init method."; + // eslint-disable-next-line supertokens-auth-react/no-direct-window-object + if (typeof window === "undefined") { + error = error + genericComponentOverrideContext.SSR_ERROR; + } + throw Error(error); + } + return EmailVerification.instance; + }; + EmailVerification.prototype.isEmailVerified = function (userContext) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.webJSRecipe.isEmailVerified({ + userContext: userContext, + })]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + EmailVerification.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + EmailVerification.instance = undefined; + return; + }; + EmailVerification.RECIPE_ID = "emailverification"; + EmailVerification.EmailVerificationClaim = new EmailVerificationClaimClass(function () { return EmailVerification.getInstanceOrThrow().webJSRecipe; }); + return EmailVerification; +}(index.RecipeModule)); exports.DEFAULT_VERIFY_EMAIL_PATH = DEFAULT_VERIFY_EMAIL_PATH; exports.EmailVerification = EmailVerification; diff --git a/lib/build/emailverification-shared2.js b/lib/build/emailverification-shared2.js index bfc3d9cef..9895d0308 100644 --- a/lib/build/emailverification-shared2.js +++ b/lib/build/emailverification-shared2.js @@ -1,43 +1,19 @@ -"use strict"; +'use strict'; -var jsxRuntime = require("react/jsx-runtime"); -var React = require("react"); -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var uiEntry = require("./index2.js"); +var jsxRuntime = require('react/jsx-runtime'); +var React = require('react'); +var logger = require('./logger.js'); +var uiEntry = require('./index2.js'); -var styles = - '/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * "License") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n\n/*\n * Default styles.\n */\n\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n\n[data-supertokens~="container"] {\n font-family: "Arial", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n\n/* TODO: split the link style into separate things*/\n\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="secondaryText"] strong {\n font-weight: 600;\n}\n\n[data-supertokens~="divider"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n\n[data-supertokens~="linkButton"] {\n font-family: "Arial", sans-serif;\n background-color: transparent;\n border: 0;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n\n[data-supertokens~="button"] {\n font-family: "Arial", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n\n[data-supertokens~="delayedRender"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n\n[data-supertokens~="footerLinkGroupVert"] > div {\n cursor: pointer;\n margin: 0;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n\n[data-supertokens~="withBackButton"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="dividerWithOr"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="dividerText"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n\n[data-supertokens~="formLabelWithLinkWrapper"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="formLabelLinkBtn"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n\n[data-supertokens~="formLabelLinkBtn"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~="formLabelLinkBtn"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n\n[data-supertokens~="authComponentList"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~="authPageTitleOAuthClient"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n\n[data-supertokens~="authPageTitleOAuthClientUrl"] {\n text-decoration: none;\n}\n\n[data-supertokens~="authPageTitleOAuthClientLogo"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n\n[data-supertokens~="authPageTitleOAuthClient"] [data-supertokens~="authPageTitleOAuthClientName"] {\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~="buttonWithArrow"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryText"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithRightArrow"] ~ svg {\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n position: relative;\n left: -2px;\n}\n\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~="inputContainer"] {\n margin-top: 6px;\n}\n\n[data-supertokens~="inputWrapper"] {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n align-items: center;\n background-color: rgb(var(--palette-inputBackground));\n height: 34px;\n border-radius: 6px;\n border: 1px solid rgb(var(--palette-inputBorder));\n}\n\n[data-supertokens~="inputWrapper"][focus-within] {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputWrapper"]:focus-within {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"][focus-within] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"]:focus-within {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="input"] {\n box-sizing: border-box;\n padding-left: 15px;\n filter: none;\n color: rgb(var(--palette-textInput));\n background-color: transparent;\n border-radius: 6px;\n font-size: var(--font-size-1);\n border: none;\n padding-right: 25px;\n letter-spacing: 1.2px;\n flex: 9 1 75%;\n width: 75%;\n height: 32px;\n}\n\n[data-supertokens~="input"]:focus {\n border: none;\n outline: none;\n}\n\n[data-supertokens~="input"]:-webkit-autofill,\n[data-supertokens~="input"]:-webkit-autofill:hover,\n[data-supertokens~="input"]:-webkit-autofill:focus,\n[data-supertokens~="input"]:-webkit-autofill:active {\n -webkit-text-fill-color: rgb(var(--palette-textInput));\n box-shadow: 0 0 0 30px rgb(var(--palette-inputBackground)) inset;\n}\n\n[data-supertokens~="inputAdornment"] {\n justify-content: center;\n margin-right: 5px;\n}\n\n[data-supertokens~="showPassword"] {\n cursor: pointer;\n}\n\n[data-supertokens~="enterEmailSuccessMessage"] {\n margin-top: 15px;\n margin-bottom: 15px;\n word-break: break-word;\n}\n\n[data-supertokens~="submitNewPasswordSuccessMessage"] {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n\n[data-supertokens~="inputErrorMessage"] {\n padding-top: 5px;\n padding-bottom: 5px;\n color: rgb(var(--palette-error));\n line-height: 24px;\n font-weight: 400;\n font-size: var(--font-size-1);\n text-align: left;\n animation: slideTop 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;\n max-width: 330px;\n}\n\n@media (max-width: 440px) {\n [data-supertokens~="inputErrorMessage"] {\n max-width: 250px;\n }\n}\n\n[data-supertokens~="inputErrorSymbol"] {\n margin-right: 5px;\n top: 1px;\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~="label"] {\n text-align: left;\n font-weight: 700;\n font-size: var(--font-size-0);\n line-height: 24px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~="formRow"] {\n display: flex;\n flex-direction: column;\n padding-top: 0px;\n padding-bottom: 20px;\n}\n\n[data-supertokens~="formRow"][data-supertokens~="hasError"] {\n padding-bottom: 0;\n}\n\n[data-supertokens~="formRow"]:last-child {\n padding-bottom: 0;\n}\n\n[data-supertokens~="sendVerifyEmailIcon"] {\n margin-top: 11px;\n}\n\n[data-supertokens~="primaryText"][data-supertokens~="sendVerifyEmailText"] {\n text-align: center;\n letter-spacing: 0.8px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n font-weight: 700;\n}\n\n[data-supertokens~="sendVerifyEmailResend"] {\n margin-top: 13px;\n font-weight: 400;\n}\n\n[data-supertokens~="sendVerifyEmailResend"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~="noFormRow"] {\n padding-bottom: 25px;\n}\n\n[data-supertokens~="emailVerificationButtonWrapper"] {\n padding-top: 25px;\n max-width: 96px;\n margin: 0 auto;\n}\n\n[data-supertokens~="resendEmailLink"] {\n display: inline-block;\n}\n\n[data-supertokens~="resetPasswordEmailForm"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~="resetPasswordPasswordForm"] {\n padding-bottom: 20px;\n}\n'; +var styles = "/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * \"License\") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~=\"container\"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n\n/*\n * Default styles.\n */\n\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n\n[data-supertokens~=\"container\"] {\n font-family: \"Arial\", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n\n@media (max-width: 440px) {\n [data-supertokens~=\"container\"] {\n width: 95vw;\n }\n}\n\n[data-supertokens~=\"row\"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n\n[data-supertokens~=\"superTokensBranding\"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n\n[data-supertokens~=\"generalError\"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n\n[data-supertokens~=\"headerTitle\"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~=\"headerSubtitle\"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n\n[data-supertokens~=\"headerSubtitle\"][data-supertokens~=\"secondaryText\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] {\n max-width: 300px;\n margin-top: 10px;\n}\n\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] a {\n line-height: 21px;\n}\n\n/* TODO: split the link style into separate things*/\n\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n\n[data-supertokens~=\"link\"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n\n[data-supertokens~=\"primaryText\"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~=\"secondaryText\"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"secondaryText\"] strong {\n font-weight: 600;\n}\n\n[data-supertokens~=\"divider\"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n\n[data-supertokens~=\"headerTinyTitle\"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~=\"generalSuccess\"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n\n[data-supertokens~=\"spinner\"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n\n[data-supertokens~=\"error\"] {\n color: rgb(var(--palette-error));\n}\n\n[data-supertokens~=\"linkButton\"] {\n font-family: \"Arial\", sans-serif;\n background-color: transparent;\n border: 0;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n margin-right: 0.3em;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"]:hover svg {\n position: relative;\n left: -4px;\n}\n\n[data-supertokens~=\"button\"] {\n font-family: \"Arial\", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n\n[data-supertokens~=\"button\"]:disabled {\n border: none;\n cursor: no-drop;\n}\n\n[data-supertokens~=\"button\"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n\n[data-supertokens~=\"button\"]:focus {\n outline: none;\n}\n\n[data-supertokens~=\"backButtonCommon\"] {\n width: 16px;\n height: 13px;\n}\n\n[data-supertokens~=\"backButton\"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n\n[data-supertokens~=\"backButtonPlaceholder\"] {\n display: block;\n}\n\n[data-supertokens~=\"delayedRender\"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] > div {\n cursor: pointer;\n margin: 0;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 400;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n\n@media (max-width: 360px) {\n [data-supertokens~=\"footerLinkGroupVert\"] {\n flex-direction: column;\n }\n [data-supertokens~=\"footerLinkGroupVert\"] > div {\n margin: 0 auto;\n }\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n\n[data-supertokens~=\"withBackButton\"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~=\"dividerWithOr\"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"dividerText\"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n\n[data-supertokens~=\"formLabelWithLinkWrapper\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n\n[data-supertokens~=\"authComponentList\"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClient\"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClientUrl\"] {\n text-decoration: none;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClientLogo\"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClient\"] [data-supertokens~=\"authPageTitleOAuthClientName\"] {\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~=\"buttonWithArrow\"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithRightArrow\"] ~ svg {\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n position: relative;\n left: -2px;\n}\n\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~=\"inputContainer\"] {\n margin-top: 6px;\n}\n\n[data-supertokens~=\"inputWrapper\"] {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n align-items: center;\n background-color: rgb(var(--palette-inputBackground));\n height: 34px;\n border-radius: 6px;\n border: 1px solid rgb(var(--palette-inputBorder));\n}\n\n[data-supertokens~=\"inputWrapper\"][focus-within] {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputWrapper\"]:focus-within {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputError\"] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputError\"][focus-within] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputError\"]:focus-within {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"input\"] {\n box-sizing: border-box;\n padding-left: 15px;\n filter: none;\n color: rgb(var(--palette-textInput));\n background-color: transparent;\n border-radius: 6px;\n font-size: var(--font-size-1);\n border: none;\n padding-right: 25px;\n letter-spacing: 1.2px;\n flex: 9 1 75%;\n width: 75%;\n height: 32px;\n}\n\n[data-supertokens~=\"input\"]:focus {\n border: none;\n outline: none;\n}\n\n[data-supertokens~=\"input\"]:-webkit-autofill,\n[data-supertokens~=\"input\"]:-webkit-autofill:hover,\n[data-supertokens~=\"input\"]:-webkit-autofill:focus,\n[data-supertokens~=\"input\"]:-webkit-autofill:active {\n -webkit-text-fill-color: rgb(var(--palette-textInput));\n box-shadow: 0 0 0 30px rgb(var(--palette-inputBackground)) inset;\n}\n\n[data-supertokens~=\"inputAdornment\"] {\n justify-content: center;\n margin-right: 5px;\n}\n\n[data-supertokens~=\"showPassword\"] {\n cursor: pointer;\n}\n\n[data-supertokens~=\"enterEmailSuccessMessage\"] {\n margin-top: 15px;\n margin-bottom: 15px;\n word-break: break-word;\n}\n\n[data-supertokens~=\"submitNewPasswordSuccessMessage\"] {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n\n[data-supertokens~=\"inputErrorMessage\"] {\n padding-top: 5px;\n padding-bottom: 5px;\n color: rgb(var(--palette-error));\n line-height: 24px;\n font-weight: 400;\n font-size: var(--font-size-1);\n text-align: left;\n animation: slideTop 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;\n max-width: 330px;\n}\n\n@media (max-width: 440px) {\n [data-supertokens~=\"inputErrorMessage\"] {\n max-width: 250px;\n }\n}\n\n[data-supertokens~=\"inputErrorSymbol\"] {\n margin-right: 5px;\n top: 1px;\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~=\"label\"] {\n text-align: left;\n font-weight: 700;\n font-size: var(--font-size-0);\n line-height: 24px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~=\"formRow\"] {\n display: flex;\n flex-direction: column;\n padding-top: 0px;\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"formRow\"][data-supertokens~=\"hasError\"] {\n padding-bottom: 0;\n}\n\n[data-supertokens~=\"formRow\"]:last-child {\n padding-bottom: 0;\n}\n\n[data-supertokens~=\"sendVerifyEmailIcon\"] {\n margin-top: 11px;\n}\n\n[data-supertokens~=\"primaryText\"][data-supertokens~=\"sendVerifyEmailText\"] {\n text-align: center;\n letter-spacing: 0.8px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n font-weight: 700;\n}\n\n[data-supertokens~=\"sendVerifyEmailResend\"] {\n margin-top: 13px;\n font-weight: 400;\n}\n\n[data-supertokens~=\"sendVerifyEmailResend\"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~=\"noFormRow\"] {\n padding-bottom: 25px;\n}\n\n[data-supertokens~=\"emailVerificationButtonWrapper\"] {\n padding-top: 25px;\n max-width: 96px;\n margin: 0 auto;\n}\n\n[data-supertokens~=\"resendEmailLink\"] {\n display: inline-block;\n}\n\n[data-supertokens~=\"resetPasswordEmailForm\"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"resetPasswordPasswordForm\"] {\n padding-bottom: 20px;\n}\n"; -var ThemeBase = function (_a) { - var children = _a.children, - userStyles = _a.userStyles; - return jsxRuntime.jsxs(React.Fragment, { - children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })], - }); +var ThemeBase = function (_a) { + var children = _a.children, userStyles = _a.userStyles; + return (jsxRuntime.jsxs(React.Fragment, { children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })] })); }; -var defaultTranslationsEmailVerification = { - en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), - { - EMAIL_VERIFICATION_RESEND_SUCCESS: "Email resent", - EMAIL_VERIFICATION_SEND_TITLE: "Verify your email!", - EMAIL_VERIFICATION_SEND_DESC_START: "", - EMAIL_VERIFICATION_SEND_DESC_STRONG: "Please click on the link", - EMAIL_VERIFICATION_SEND_DESC_END: " in the email we just sent you to confirm your email address.", - EMAIL_VERIFICATION_RESEND_BTN: "Resend Email", - EMAIL_VERIFICATION_LOGOUT: "Logout ", - EMAIL_VERIFICATION_SUCCESS: "Email verification successful!", - EMAIL_VERIFICATION_CONTINUE_BTN: "CONTINUE", - EMAIL_VERIFICATION_CONTINUE_LINK: "Continue", - EMAIL_VERIFICATION_EXPIRED: "The email verification link has expired", - EMAIL_VERIFICATION_ERROR_TITLE: "Something went wrong", - EMAIL_VERIFICATION_ERROR_DESC: "We encountered an unexpected error. Please contact support for assistance", - EMAIL_VERIFICATION_LINK_CLICKED_HEADER: "Verify your email address", - EMAIL_VERIFICATION_LINK_CLICKED_DESC: "Please click on the button below to verify your email address", - EMAIL_VERIFICATION_LINK_CLICKED_CONTINUE_BUTTON: "CONTINUE", - } - ), +var defaultTranslationsEmailVerification = { + en: logger.__assign(logger.__assign({}, uiEntry.defaultTranslationsCommon.en), { EMAIL_VERIFICATION_RESEND_SUCCESS: "Email resent", EMAIL_VERIFICATION_SEND_TITLE: "Verify your email!", EMAIL_VERIFICATION_SEND_DESC_START: "", EMAIL_VERIFICATION_SEND_DESC_STRONG: "Please click on the link", EMAIL_VERIFICATION_SEND_DESC_END: " in the email we just sent you to confirm your email address.", EMAIL_VERIFICATION_RESEND_BTN: "Resend Email", EMAIL_VERIFICATION_LOGOUT: "Logout ", EMAIL_VERIFICATION_SUCCESS: "Email verification successful!", EMAIL_VERIFICATION_CONTINUE_BTN: "CONTINUE", EMAIL_VERIFICATION_CONTINUE_LINK: "Continue", EMAIL_VERIFICATION_EXPIRED: "The email verification link has expired", EMAIL_VERIFICATION_ERROR_TITLE: "Something went wrong", EMAIL_VERIFICATION_ERROR_DESC: "We encountered an unexpected error. Please contact support for assistance", EMAIL_VERIFICATION_LINK_CLICKED_HEADER: "Verify your email address", EMAIL_VERIFICATION_LINK_CLICKED_DESC: "Please click on the button below to verify your email address", EMAIL_VERIFICATION_LINK_CLICKED_CONTINUE_BUTTON: "CONTINUE" }), }; exports.ThemeBase = ThemeBase; diff --git a/lib/build/emailverification.js b/lib/build/emailverification.js index 57f8143f7..80d007591 100644 --- a/lib/build/emailverification.js +++ b/lib/build/emailverification.js @@ -1,109 +1,78 @@ -"use strict"; +'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, '__esModule', { value: true }); -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var recipe = require("./emailverification-shared.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("react"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("supertokens-web-js/utils/normalisedURLPath"); -require("react/jsx-runtime"); -require("supertokens-web-js/recipe/emailverification"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("./recipeModule-shared.js"); +var logger = require('./logger.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var recipe = require('./emailverification-shared.js'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/windowHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils'); +require('react'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/utils/normalisedURLPath'); +require('react/jsx-runtime'); +require('supertokens-web-js/recipe/emailverification'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('./recipeModule-shared.js'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var Wrapper = /** @class */ (function () { - function Wrapper() {} - Wrapper.init = function (config) { - return recipe.EmailVerification.init(config); - }; - Wrapper.isEmailVerified = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.isEmailVerified( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.verifyEmail = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.verifyEmail( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.sendVerificationEmail = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.sendVerificationEmail( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.getEmailVerificationTokenFromURL = function (input) { - return recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.getEmailVerificationTokenFromURL( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ); - }; - Wrapper.EmailVerificationClaim = recipe.EmailVerification.EmailVerificationClaim; - Wrapper.ComponentsOverrideProvider = recipe.Provider; - return Wrapper; -})(); -var init = Wrapper.init; -var isEmailVerified = Wrapper.isEmailVerified; -var verifyEmail = Wrapper.verifyEmail; -var sendVerificationEmail = Wrapper.sendVerificationEmail; -var getEmailVerificationTokenFromURL = Wrapper.getEmailVerificationTokenFromURL; -var EmailVerificationComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var Wrapper = /** @class */ (function () { + function Wrapper() { + } + Wrapper.init = function (config) { + return recipe.EmailVerification.init(config); + }; + Wrapper.isEmailVerified = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.isEmailVerified(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.verifyEmail = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.verifyEmail(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.sendVerificationEmail = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.sendVerificationEmail(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.getEmailVerificationTokenFromURL = function (input) { + return recipe.EmailVerification.getInstanceOrThrow().webJSRecipe.getEmailVerificationTokenFromURL(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) })); + }; + Wrapper.EmailVerificationClaim = recipe.EmailVerification.EmailVerificationClaim; + Wrapper.ComponentsOverrideProvider = recipe.Provider; + return Wrapper; +}()); +var init = Wrapper.init; +var isEmailVerified = Wrapper.isEmailVerified; +var verifyEmail = Wrapper.verifyEmail; +var sendVerificationEmail = Wrapper.sendVerificationEmail; +var getEmailVerificationTokenFromURL = Wrapper.getEmailVerificationTokenFromURL; +var EmailVerificationComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; var EmailVerificationClaim = recipe.EmailVerification.EmailVerificationClaim; exports.EmailVerificationClaim = EmailVerificationClaim; diff --git a/lib/build/emailverificationprebuiltui.js b/lib/build/emailverificationprebuiltui.js index abfc568bc..d39de0e97 100644 --- a/lib/build/emailverificationprebuiltui.js +++ b/lib/build/emailverificationprebuiltui.js @@ -1,62 +1,53 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var uiEntry = require("./index2.js"); -var session = require("./session.js"); -var recipe = require("./emailverification-shared.js"); -var React = require("react"); -var types = require("./multifactorauth-shared.js"); -var translations = require("./emailverification-shared2.js"); -var STGeneralError = require("supertokens-web-js/utils/error"); -var emailLargeIcon = require("./emailLargeIcon.js"); -var translationContext = require("./translationContext.js"); -var button = require("./emailpassword-shared.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("react-dom"); -require("./multitenancy-shared.js"); -require("./multifactorauth-shared2.js"); -require("supertokens-web-js/recipe/multifactorauth"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("./recipeModule-shared.js"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./authRecipe-shared.js"); -require("supertokens-web-js/lib/build/normalisedURLPath"); -require("supertokens-web-js/recipe/session"); -require("./session-shared.js"); -require("supertokens-web-js/recipe/emailverification"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +var NormalisedURLPath = require('supertokens-web-js/utils/normalisedURLPath'); +var uiEntry = require('./index2.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var session = require('./session.js'); +var recipe = require('./emailverification-shared.js'); +var React = require('react'); +var types = require('./multifactorauth-shared.js'); +var translations = require('./emailverification-shared2.js'); +var STGeneralError = require('supertokens-web-js/utils/error'); +var emailLargeIcon = require('./emailLargeIcon.js'); +var translationContext = require('./translationContext.js'); +var button = require('./emailpassword-shared.js'); +require('supertokens-web-js/utils/windowHandler'); +require('react-dom'); +require('./multitenancy-shared.js'); +require('./multifactorauth-shared2.js'); +require('supertokens-web-js/recipe/multifactorauth'); +require('supertokens-web-js/utils'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('./recipeModule-shared.js'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./authRecipe-shared.js'); +require('supertokens-web-js/lib/build/normalisedURLPath'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/recipe/session'); +require('./session-shared.js'); +require('supertokens-web-js/recipe/emailverification'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { - if (k !== "default") { + if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty( - n, - k, - d.get - ? d - : { - enumerable: true, - get: function () { - return e[k]; - }, - } - ); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); } }); } @@ -64,1125 +55,496 @@ function _interopNamespace(e) { return Object.freeze(n); } -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var React__namespace = /*#__PURE__*/ _interopNamespace(React); -var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); +var NormalisedURLPath__default = /*#__PURE__*/_interopDefault(NormalisedURLPath); +var React__namespace = /*#__PURE__*/_interopNamespace(React); +var STGeneralError__default = /*#__PURE__*/_interopDefault(STGeneralError); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function ArrowRightIcon(_a) { - var color = _a.color; - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { width: "6", height: "8", viewBox: "0 0 6 8", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, - { - children: jsxRuntime.jsx("path", { - d: "M5.62713 3.24407C6.08759 3.64284 6.08759 4.35716 5.62713 4.75593L2.15465 7.76318C1.50701 8.32406 0.5 7.864 0.5 7.00725L0.5 0.992749C0.5 0.135997 1.50701 -0.324056 2.15465 0.23682L5.62713 3.24407Z", - fill: "".concat(color), - }), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function ArrowRightIcon(_a) { + var color = _a.color; + return (jsxRuntime.jsx("svg", logger.__assign({ width: "6", height: "8", viewBox: "0 0 6 8", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: jsxRuntime.jsx("path", { d: "M5.62713 3.24407C6.08759 3.64284 6.08759 4.35716 5.62713 4.75593L2.15465 7.76318C1.50701 8.32406 0.5 7.864 0.5 7.00725L0.5 0.992749C0.5 0.135997 1.50701 -0.324056 2.15465 0.23682L5.62713 3.24407Z", fill: "".concat(color) }) }))); } -var EmailVerificationSendVerifyEmail = function (props) { - var t = translationContext.useTranslation(); - var userContext = uiEntry.useUserContext(); - var _a = React.useState("READY"), - status = _a[0], - setStatus = _a[1]; - var _b = React.useState(undefined), - errorMessage = _b[0], - setErrorMessage = _b[1]; - var resendEmail = function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var response, e_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 5, , 6]); - return [ - 4 /*yield*/, - props.recipeImplementation.sendVerificationEmail({ - userContext: userContext, - }), - ]; - case 1: - response = _a.sent(); - if (!(response.status === "EMAIL_ALREADY_VERIFIED_ERROR")) return [3 /*break*/, 3]; - return [4 /*yield*/, props.onEmailAlreadyVerified()]; - case 2: - _a.sent(); - return [3 /*break*/, 4]; - case 3: - if (response.status === "OK") { - setStatus("EMAIL_RESENT"); - } - _a.label = 4; - case 4: - return [3 /*break*/, 6]; - case 5: - e_1 = _a.sent(); - if (STGeneralError__default.default.isThisError(e_1)) { - setErrorMessage(e_1.message); - } - setStatus("ERROR"); - return [2 /*return*/, handleSendError()]; - case 6: - return [2 /*return*/]; - } - }); - }); - }; - var logout = function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var e_2; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, props.signOut()]; - case 1: - _a.sent(); - return [3 /*break*/, 3]; - case 2: - e_2 = _a.sent(); - if (STGeneralError__default.default.isThisError(e_2)) { - setErrorMessage(e_2.message); - } - setStatus("ERROR"); - return [3 /*break*/, 3]; - case 3: - return [2 /*return*/]; - } - }); - }); - }; - var sendVerificationEmail = React.useCallback( - function () { - return props.recipeImplementation.sendVerificationEmail({ - userContext: userContext, - }); - }, - [props.config, props.recipeImplementation] - ); - var checkSendResponse = React.useCallback( - function (response) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(response.status === "EMAIL_ALREADY_VERIFIED_ERROR")) return [3 /*break*/, 2]; - return [4 /*yield*/, props.onEmailAlreadyVerified()]; - case 1: - _a.sent(); - _a.label = 2; - case 2: - return [2 /*return*/]; - } - }); - }); - }, - [props.config, props.recipeImplementation, props.onEmailAlreadyVerified] - ); - var handleSendError = React.useCallback(function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().doesSessionExist({ userContext: userContext }), - ]; - case 1: - if (!(_a.sent() !== true)) return [3 /*break*/, 3]; - return [4 /*yield*/, props.redirectToAuth()]; - case 2: - _a.sent(); - _a.label = 3; - case 3: - return [2 /*return*/]; - } - }); - }); - }, []); - genericComponentOverrideContext.useOnMountAPICall(sendVerificationEmail, checkSendResponse, handleSendError); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - status === "ERROR" && - jsxRuntime.jsx(uiEntry.GeneralError, { - error: errorMessage === undefined ? "SOMETHING_WENT_WRONG_ERROR" : errorMessage, - }), - status === "EMAIL_RESENT" && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "generalSuccess" }, - { children: t("EMAIL_VERIFICATION_RESEND_SUCCESS") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "sendVerifyEmailIcon" }, - { children: jsxRuntime.jsx(emailLargeIcon.EmailLargeIcon, {}) } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle headerTinyTitle" }, - { children: t("EMAIL_VERIFICATION_SEND_TITLE") } - ) - ), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "primaryText sendVerifyEmailText" }, - { - children: [ - t("EMAIL_VERIFICATION_SEND_DESC_START"), - jsxRuntime.jsx("strong", { - children: t("EMAIL_VERIFICATION_SEND_DESC_STRONG"), - }), - t("EMAIL_VERIFICATION_SEND_DESC_END"), - ], - } - ) - ), - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "buttonWithArrow", onClick: logout }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { - "data-supertokens": - "secondaryText secondaryLinkWithRightArrow", - }, - { children: t("EMAIL_VERIFICATION_LOGOUT") } - ) - ), - jsxRuntime.jsx(ArrowRightIcon, { - color: "rgb(var(--palette-textGray))", - }), - ], - } - ) - ), - status !== "EMAIL_RESENT" && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "link sendVerifyEmailResend", onClick: resendEmail }, - { children: t("EMAIL_VERIFICATION_RESEND_BTN") } - ) - ), - ], - } - ) - ), - } - ) - ); -}; +var EmailVerificationSendVerifyEmail = function (props) { + var t = translationContext.useTranslation(); + var userContext = uiEntry.useUserContext(); + var _a = React.useState("READY"), status = _a[0], setStatus = _a[1]; + var _b = React.useState(undefined), errorMessage = _b[0], setErrorMessage = _b[1]; + var resendEmail = function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var response, e_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 5, , 6]); + return [4 /*yield*/, props.recipeImplementation.sendVerificationEmail({ + userContext: userContext, + })]; + case 1: + response = _a.sent(); + if (!(response.status === "EMAIL_ALREADY_VERIFIED_ERROR")) return [3 /*break*/, 3]; + return [4 /*yield*/, props.onEmailAlreadyVerified()]; + case 2: + _a.sent(); + return [3 /*break*/, 4]; + case 3: + if (response.status === "OK") { + setStatus("EMAIL_RESENT"); + } + _a.label = 4; + case 4: return [3 /*break*/, 6]; + case 5: + e_1 = _a.sent(); + if (STGeneralError__default.default.isThisError(e_1)) { + setErrorMessage(e_1.message); + } + setStatus("ERROR"); + return [2 /*return*/, handleSendError()]; + case 6: return [2 /*return*/]; + } + }); + }); }; + var logout = function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var e_2; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 2, , 3]); + return [4 /*yield*/, props.signOut()]; + case 1: + _a.sent(); + return [3 /*break*/, 3]; + case 2: + e_2 = _a.sent(); + if (STGeneralError__default.default.isThisError(e_2)) { + setErrorMessage(e_2.message); + } + setStatus("ERROR"); + return [3 /*break*/, 3]; + case 3: return [2 /*return*/]; + } + }); + }); }; + var sendVerificationEmail = React.useCallback(function () { + return props.recipeImplementation.sendVerificationEmail({ + userContext: userContext, + }); + }, [props.config, props.recipeImplementation]); + var checkSendResponse = React.useCallback(function (response) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(response.status === "EMAIL_ALREADY_VERIFIED_ERROR")) return [3 /*break*/, 2]; + return [4 /*yield*/, props.onEmailAlreadyVerified()]; + case 1: + _a.sent(); + _a.label = 2; + case 2: return [2 /*return*/]; + } + }); + }); }, [props.config, props.recipeImplementation, props.onEmailAlreadyVerified]); + var handleSendError = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, types.Session.getInstanceOrThrow().doesSessionExist({ userContext: userContext })]; + case 1: + if (!((_a.sent()) !== true)) return [3 /*break*/, 3]; + return [4 /*yield*/, props.redirectToAuth()]; + case 2: + _a.sent(); + _a.label = 3; + case 3: return [2 /*return*/]; + } + }); + }); }, []); + genericComponentOverrideContext.useOnMountAPICall(sendVerificationEmail, checkSendResponse, handleSendError); + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row" }, { children: [status === "ERROR" && (jsxRuntime.jsx(uiEntry.GeneralError, { error: errorMessage === undefined ? "SOMETHING_WENT_WRONG_ERROR" : errorMessage })), status === "EMAIL_RESENT" && (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "generalSuccess" }, { children: t("EMAIL_VERIFICATION_RESEND_SUCCESS") }))), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "sendVerifyEmailIcon" }, { children: jsxRuntime.jsx(emailLargeIcon.EmailLargeIcon, {}) })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle headerTinyTitle" }, { children: t("EMAIL_VERIFICATION_SEND_TITLE") })), jsxRuntime.jsx("div", { "data-supertokens": "divider" }), jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "primaryText sendVerifyEmailText" }, { children: [t("EMAIL_VERIFICATION_SEND_DESC_START"), jsxRuntime.jsx("strong", { children: t("EMAIL_VERIFICATION_SEND_DESC_STRONG") }), t("EMAIL_VERIFICATION_SEND_DESC_END")] })), jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "buttonWithArrow", onClick: logout }, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "secondaryText secondaryLinkWithRightArrow" }, { children: t("EMAIL_VERIFICATION_LOGOUT") })), jsxRuntime.jsx(ArrowRightIcon, { color: "rgb(var(--palette-textGray))" })] })), status !== "EMAIL_RESENT" && (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "link sendVerifyEmailResend", onClick: resendEmail }, { children: t("EMAIL_VERIFICATION_RESEND_BTN") })))] })) }))); +}; var SendVerifyEmail = uiEntry.withOverride("EmailVerificationSendVerifyEmail", EmailVerificationSendVerifyEmail); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function CheckedRoundIcon() { - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "33", - height: "33", - viewBox: "0 0 33 33", - "data-supertokens": "checkedRoundIcon", - }, - { - children: jsxRuntime.jsxs( - "g", - genericComponentOverrideContext.__assign( - { fill: "rgb(var(--palette-success))", stroke: "rgb(var(--palette-success))" }, - { - children: [ - jsxRuntime.jsx("path", { - d: "M6.715 15.334a1.135 1.135 0 0 1 1.605-1.605l4.558 4.558 9.573-9.573a1.135 1.135 0 0 1 1.605 1.605L13.748 20.627a1.231 1.231 0 0 1-1.741 0z", - transform: "translate(-.5 -.5) translate(1.242 1.703)", - }), - jsxRuntime.jsx("path", { - fillRule: "evenodd", - d: "M17 1a16 16 0 1 0 16 16A16 16 0 0 0 17 1zM3.462 17A13.538 13.538 0 1 1 17 30.538 13.538 13.538 0 0 1 3.462 17z", - transform: "translate(-.5 -.5)", - }), - ], - } - ) - ), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function CheckedRoundIcon() { + return (jsxRuntime.jsx("svg", logger.__assign({ xmlns: "http://www.w3.org/2000/svg", width: "33", height: "33", viewBox: "0 0 33 33", "data-supertokens": "checkedRoundIcon" }, { children: jsxRuntime.jsxs("g", logger.__assign({ fill: "rgb(var(--palette-success))", stroke: "rgb(var(--palette-success))" }, { children: [jsxRuntime.jsx("path", { d: "M6.715 15.334a1.135 1.135 0 0 1 1.605-1.605l4.558 4.558 9.573-9.573a1.135 1.135 0 0 1 1.605 1.605L13.748 20.627a1.231 1.231 0 0 1-1.741 0z", transform: "translate(-.5 -.5) translate(1.242 1.703)" }), jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M17 1a16 16 0 1 0 16 16A16 16 0 0 0 17 1zM3.462 17A13.538 13.538 0 1 1 17 30.538 13.538 13.538 0 0 1 3.462 17z", transform: "translate(-.5 -.5)" })] })) }))); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function ErrorLargeIcon() { - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "33", - height: "30", - viewBox: "0 0 33 30", - "data-supertokens": "errorLargeIcon", - }, - { - children: jsxRuntime.jsxs("g", { - children: [ - jsxRuntime.jsx( - "g", - genericComponentOverrideContext.__assign( - { fill: "rgb(var(--palette-error))" }, - { - children: jsxRuntime.jsx("path", { - d: "M29.617 29.75H3.383c-.626 0-1.189-.321-1.507-.86-.318-.537-.328-1.186-.027-1.733l13.118-23.85c.312-.568.885-.907 1.533-.907.648 0 1.221.339 1.533.907l13.118 23.85c.301.547.291 1.196-.027 1.734s-.881.859-1.507.859z", - transform: "translate(-824.894 -352.483) translate(824.894 352.483)", - }), - } - ) - ), - jsxRuntime.jsx( - "text", - genericComponentOverrideContext.__assign( - { - fill: "#fff", - "font-family": "Arial-Bold, Arial", - "font-size": "18px", - fontWeight: "700", - transform: "translate(-824.894 -352.483) translate(838.997 377.437)", - }, - { - children: jsxRuntime.jsx( - "tspan", - genericComponentOverrideContext.__assign({ x: "0", y: "0" }, { children: "!" }) - ), - } - ) - ), - ], - }), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function ErrorLargeIcon() { + return (jsxRuntime.jsx("svg", logger.__assign({ xmlns: "http://www.w3.org/2000/svg", width: "33", height: "30", viewBox: "0 0 33 30", "data-supertokens": "errorLargeIcon" }, { children: jsxRuntime.jsxs("g", { children: [jsxRuntime.jsx("g", logger.__assign({ fill: "rgb(var(--palette-error))" }, { children: jsxRuntime.jsx("path", { d: "M29.617 29.75H3.383c-.626 0-1.189-.321-1.507-.86-.318-.537-.328-1.186-.027-1.733l13.118-23.85c.312-.568.885-.907 1.533-.907.648 0 1.221.339 1.533.907l13.118 23.85c.301.547.291 1.196-.027 1.734s-.881.859-1.507.859z", transform: "translate(-824.894 -352.483) translate(824.894 352.483)" }) })), jsxRuntime.jsx("text", logger.__assign({ fill: "#fff", "font-family": "Arial-Bold, Arial", "font-size": "18px", fontWeight: "700", transform: "translate(-824.894 -352.483) translate(838.997 377.437)" }, { children: jsxRuntime.jsx("tspan", logger.__assign({ x: "0", y: "0" }, { children: "!" })) }))] }) }))); } -var EmailVerificationVerifyEmailLinkClicked = function (props) { - var t = translationContext.useTranslation(); - var sessionContext = uiEntry.useSessionContext(); - var userContext = uiEntry.useUserContext(); - var _a = React.useState("LOADING"), - status = _a[0], - setStatus = _a[1]; - var _b = React.useState(undefined), - errorMessage = _b[0], - setErrorMessage = _b[1]; - var _c = React.useState(false), - verifyLoading = _c[0], - setVerifyLoading = _c[1]; - var verifyEmailOnMount = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (sessionContext.loading === true) { - // This callback should only be called if the session is already loaded - throw new Error("Should never come here"); - } - // If there is no active session we know that the verification was started elsewhere, since it requires a session - // otherwise we assume it's the same session. The main purpose of this is to prevent mail scanners - // from accidentally validating an email address - if (!sessionContext.doesSessionExist) { - return [2 /*return*/, "INTERACTION_REQUIRED"]; - } - return [ - 2 /*return*/, - props.recipeImplementation.verifyEmail({ - userContext: userContext, - }), - ]; - }); - }); - }, - [props.recipeImplementation, sessionContext] - ); - var handleVerifyResp = React.useCallback( - function (response) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (response === "INTERACTION_REQUIRED") { - setStatus("INTERACTION_REQUIRED"); - } else if (response.status === "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR") { - setStatus("INVALID"); - } else { - setStatus("SUCCESSFUL"); - } - return [2 /*return*/]; - }); - }); - }, - [setStatus] - ); - var handleError = React.useCallback( - function (err) { - if (STGeneralError__default.default.isThisError(err)) { - setErrorMessage(err.message); - } - setStatus("GENERAL_ERROR"); - }, - [setStatus, setErrorMessage] - ); - genericComponentOverrideContext.useOnMountAPICall( - verifyEmailOnMount, - handleVerifyResp, - handleError, - sessionContext.loading === false - ); - var onTokenInvalidRedirect = props.onTokenInvalidRedirect, - onSuccess = props.onSuccess; - if (status === "LOADING") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "spinner" }, - { children: jsxRuntime.jsx(uiEntry.SpinnerIcon, {}) } - ) - ), - } - ) - ), - } - ) - ); - } - if (status === "INTERACTION_REQUIRED") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row noFormRow" }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("EMAIL_VERIFICATION_LINK_CLICKED_HEADER") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { children: t("EMAIL_VERIFICATION_LINK_CLICKED_DESC") } - ) - ), - jsxRuntime.jsx(button.Button, { - isLoading: verifyLoading, - onClick: function () { - return genericComponentOverrideContext.__awaiter( - void 0, - void 0, - void 0, - function () { - var resp, err_1; - return genericComponentOverrideContext.__generator( - this, - function (_a) { - switch (_a.label) { - case 0: - setVerifyLoading(true); - _a.label = 1; - case 1: - _a.trys.push([1, 4, , 5]); - return [ - 4 /*yield*/, - props.recipeImplementation.verifyEmail({ - userContext: userContext, - }), - ]; - case 2: - resp = _a.sent(); - return [4 /*yield*/, handleVerifyResp(resp)]; - case 3: - _a.sent(); - return [3 /*break*/, 5]; - case 4: - err_1 = _a.sent(); - void handleError(err_1); - return [3 /*break*/, 5]; - case 5: - return [2 /*return*/]; - } - } - ); - } - ); - }, - type: "button", - label: "EMAIL_VERIFICATION_LINK_CLICKED_CONTINUE_BUTTON", - }), - ], - } - ) - ), - } - ) - ); - } - if (status === "SUCCESSFUL") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row noFormRow" }, - { - children: [ - jsxRuntime.jsx(CheckedRoundIcon, {}), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle headerTinyTitle" }, - { children: t("EMAIL_VERIFICATION_SUCCESS") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "emailVerificationButtonWrapper" }, - { - children: jsxRuntime.jsx(button.Button, { - isLoading: false, - onClick: onSuccess, - type: "button", - label: "EMAIL_VERIFICATION_CONTINUE_BTN", - }), - } - ) - ), - ], - } - ) - ), - } - ) - ); - } - if (status === "INVALID") { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row noFormRow" }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle headerTinyTitle" }, - { children: t("EMAIL_VERIFICATION_EXPIRED") } - ) - ), - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { - onClick: onTokenInvalidRedirect, - "data-supertokens": "secondaryText secondaryLinkWithArrow", - }, - { - children: [ - t("EMAIL_VERIFICATION_CONTINUE_LINK"), - " ", - jsxRuntime.jsx(ArrowRightIcon, { - color: "rgb(var(--palette-textPrimary))", - }), - ], - } - ) - ), - ], - } - ) - ), - } - ) - ); - } - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row noFormRow" }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle error" }, - { - children: [ - jsxRuntime.jsx(ErrorLargeIcon, {}), - t("EMAIL_VERIFICATION_ERROR_TITLE"), - ], - } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "primaryText" }, - { - children: t( - errorMessage === undefined - ? "EMAIL_VERIFICATION_ERROR_DESC" - : errorMessage - ), - } - ) - ), - ], - } - ) - ), - } - ) - ); -}; -var VerifyEmailLinkClicked = uiEntry.withOverride( - "EmailVerificationVerifyEmailLinkClicked", - EmailVerificationVerifyEmailLinkClicked -); +var EmailVerificationVerifyEmailLinkClicked = function (props) { + var t = translationContext.useTranslation(); + var sessionContext = uiEntry.useSessionContext(); + var userContext = uiEntry.useUserContext(); + var _a = React.useState("LOADING"), status = _a[0], setStatus = _a[1]; + var _b = React.useState(undefined), errorMessage = _b[0], setErrorMessage = _b[1]; + var _c = React.useState(false), verifyLoading = _c[0], setVerifyLoading = _c[1]; + var verifyEmailOnMount = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (sessionContext.loading === true) { + // This callback should only be called if the session is already loaded + throw new Error("Should never come here"); + } + // If there is no active session we know that the verification was started elsewhere, since it requires a session + // otherwise we assume it's the same session. The main purpose of this is to prevent mail scanners + // from accidentally validating an email address + if (!sessionContext.doesSessionExist) { + return [2 /*return*/, "INTERACTION_REQUIRED"]; + } + return [2 /*return*/, props.recipeImplementation.verifyEmail({ + userContext: userContext, + })]; + }); + }); }, [props.recipeImplementation, sessionContext]); + var handleVerifyResp = React.useCallback(function (response) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (response === "INTERACTION_REQUIRED") { + setStatus("INTERACTION_REQUIRED"); + } + else if (response.status === "EMAIL_VERIFICATION_INVALID_TOKEN_ERROR") { + setStatus("INVALID"); + } + else { + setStatus("SUCCESSFUL"); + } + return [2 /*return*/]; + }); + }); }, [setStatus]); + var handleError = React.useCallback(function (err) { + if (STGeneralError__default.default.isThisError(err)) { + setErrorMessage(err.message); + } + setStatus("GENERAL_ERROR"); + }, [setStatus, setErrorMessage]); + genericComponentOverrideContext.useOnMountAPICall(verifyEmailOnMount, handleVerifyResp, handleError, sessionContext.loading === false); + var onTokenInvalidRedirect = props.onTokenInvalidRedirect, onSuccess = props.onSuccess; + if (status === "LOADING") { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "row" }, { children: jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "spinner" }, { children: jsxRuntime.jsx(uiEntry.SpinnerIcon, {}) })) })) }))); + } + if (status === "INTERACTION_REQUIRED") { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row noFormRow" }, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle" }, { children: t("EMAIL_VERIFICATION_LINK_CLICKED_HEADER") })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerSubtitle secondaryText" }, { children: t("EMAIL_VERIFICATION_LINK_CLICKED_DESC") })), jsxRuntime.jsx(button.Button, { isLoading: verifyLoading, onClick: function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var resp, err_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + setVerifyLoading(true); + _a.label = 1; + case 1: + _a.trys.push([1, 4, , 5]); + return [4 /*yield*/, props.recipeImplementation.verifyEmail({ + userContext: userContext, + })]; + case 2: + resp = _a.sent(); + return [4 /*yield*/, handleVerifyResp(resp)]; + case 3: + _a.sent(); + return [3 /*break*/, 5]; + case 4: + err_1 = _a.sent(); + void handleError(err_1); + return [3 /*break*/, 5]; + case 5: return [2 /*return*/]; + } + }); + }); }, type: "button", label: "EMAIL_VERIFICATION_LINK_CLICKED_CONTINUE_BUTTON" })] })) }))); + } + if (status === "SUCCESSFUL") { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row noFormRow" }, { children: [jsxRuntime.jsx(CheckedRoundIcon, {}), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle headerTinyTitle" }, { children: t("EMAIL_VERIFICATION_SUCCESS") })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "emailVerificationButtonWrapper" }, { children: jsxRuntime.jsx(button.Button, { isLoading: false, onClick: onSuccess, type: "button", label: "EMAIL_VERIFICATION_CONTINUE_BTN" }) }))] })) }))); + } + if (status === "INVALID") { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row noFormRow" }, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle headerTinyTitle" }, { children: t("EMAIL_VERIFICATION_EXPIRED") })), jsxRuntime.jsxs("div", logger.__assign({ onClick: onTokenInvalidRedirect, "data-supertokens": "secondaryText secondaryLinkWithArrow" }, { children: [t("EMAIL_VERIFICATION_CONTINUE_LINK"), " ", jsxRuntime.jsx(ArrowRightIcon, { color: "rgb(var(--palette-textPrimary))" })] }))] })) }))); + } + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row noFormRow" }, { children: [jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "headerTitle error" }, { children: [jsxRuntime.jsx(ErrorLargeIcon, {}), t("EMAIL_VERIFICATION_ERROR_TITLE")] })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "primaryText" }, { children: t(errorMessage === undefined ? "EMAIL_VERIFICATION_ERROR_DESC" : errorMessage) }))] })) }))); +}; +var VerifyEmailLinkClicked = uiEntry.withOverride("EmailVerificationVerifyEmailLinkClicked", EmailVerificationVerifyEmailLinkClicked); -function EmailVerificationTheme(props) { - var sessionContext = session.useSessionContext(); - // If we have a token, return VerifyEmailLinkClicked. - if (props.verifyEmailLinkClickedScreen !== undefined) { - return jsxRuntime.jsx( - VerifyEmailLinkClicked, - genericComponentOverrideContext.__assign({}, props.verifyEmailLinkClickedScreen) - ); - } - // If we have an active session, we want to send the verification email - if (sessionContext.loading === false && sessionContext.doesSessionExist === true) { - return jsxRuntime.jsx( - SendVerifyEmail, - genericComponentOverrideContext.__assign({}, props.sendVerifyEmailScreen) - ); - } - // Otherwise, return an empty screen, waiting for the feature component to redirection to complete. - return jsxRuntime.jsx(jsxRuntime.Fragment, {}); -} -function EmailVerificationThemeWrapper(props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - translations.ThemeBase, - genericComponentOverrideContext.__assign( - { - userStyles: [ - rootStyle, - props.config.recipeRootStyle, - props.verifyEmailLinkClickedScreen === undefined - ? props.config.sendVerifyEmailScreen.style - : props.config.verifyEmailLinkClickedScreen.style, - ], - }, - { - children: jsxRuntime.jsx( - EmailVerificationTheme, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ), - } - ) - ); +function EmailVerificationTheme(props) { + var sessionContext = session.useSessionContext(); + // If we have a token, return VerifyEmailLinkClicked. + if (props.verifyEmailLinkClickedScreen !== undefined) { + return jsxRuntime.jsx(VerifyEmailLinkClicked, logger.__assign({}, props.verifyEmailLinkClickedScreen)); + } + // If we have an active session, we want to send the verification email + if (sessionContext.loading === false && sessionContext.doesSessionExist === true) { + return jsxRuntime.jsx(SendVerifyEmail, logger.__assign({}, props.sendVerifyEmailScreen)); + } + // Otherwise, return an empty screen, waiting for the feature component to redirection to complete. + return jsxRuntime.jsx(jsxRuntime.Fragment, {}); +} +function EmailVerificationThemeWrapper(props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(translations.ThemeBase, logger.__assign({ userStyles: [ + rootStyle, + props.config.recipeRootStyle, + props.verifyEmailLinkClickedScreen === undefined + ? props.config.sendVerifyEmailScreen.style + : props.config.verifyEmailLinkClickedScreen.style, + ] }, { children: jsxRuntime.jsx(EmailVerificationTheme, logger.__assign({}, props)) })) }))); } -var EmailVerification$1 = function (props) { - var _a; - var sessionContext = React.useContext(uiEntry.SessionContext); - var _b = React.useState("LOADING"), - status = _b[0], - setStatus = _b[1]; - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var recipeComponentOverrides = props.useComponentOverrides(); - var userContext = uiEntry.useUserContext(); - if (props.userContext !== undefined) { - userContext = props.userContext; - } - var redirectToAuthWithHistory = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - uiEntry.redirectToAuth({ redirectBack: false, navigate: props.navigate }), - ]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); - }, - [props.navigate] - ); - var modifiedRecipeImplementation = React.useMemo( - function () { - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, props.recipe.webJSRecipe), - { - sendVerificationEmail: function (input) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, props.recipe.webJSRecipe.sendVerificationEmail(input)]; - case 1: - response = _a.sent(); - genericComponentOverrideContext.clearQueryParams(["token"]); - return [2 /*return*/, response]; - } - }); - }); - }, - } - ); - }, - [props.recipe] - ); - var onSuccess = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - types.Session.getInstanceOrThrow() - .validateGlobalClaimsAndHandleSuccessRedirection( - undefined, - props.recipe.recipeID, - undefined, - userContext, - props.navigate - ) - .catch(rethrowInRender), - ]; - }); - }); - }, - [props.recipe, props.navigate, userContext] - ); - var fetchIsEmailVerified = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var token; - var _a; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if (sessionContext.loading === true) { - // This callback should only be called if the session is already loaded - throw new Error("Should never come here"); - } - token = - (_a = genericComponentOverrideContext.getQueryParams("token")) !== null && _a !== void 0 - ? _a - : undefined; - if (!(token === undefined)) return [3 /*break*/, 4]; - if (!!sessionContext.doesSessionExist) return [3 /*break*/, 2]; - return [4 /*yield*/, redirectToAuthWithHistory()]; - case 1: - _b.sent(); - return [3 /*break*/, 4]; - case 2: - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.isEmailVerified({ userContext: userContext }), - ]; - case 3: - // we check if the email is already verified, and if it is, then we redirect the user - return [2 /*return*/, _b.sent().isVerified]; - case 4: - return [2 /*return*/, false]; - } - }); - }); - }, - [props.recipe, sessionContext, redirectToAuthWithHistory] - ); - var checkIsEmailVerified = React.useCallback( - function (isVerified) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (isVerified) { - return [2 /*return*/, onSuccess()]; - } - setStatus("READY"); - return [2 /*return*/]; - }); - }); - }, - [props.recipe, setStatus, onSuccess] - ); - var handleError = React.useCallback( - function (err) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().doesSessionExist({ userContext: userContext }), - ]; - case 1: - if (!_a.sent()) return [3 /*break*/, 2]; - throw err; - case 2: - return [4 /*yield*/, redirectToAuthWithHistory()]; - case 3: - _a.sent(); - _a.label = 4; - case 4: - return [2 /*return*/]; - } - }); - }); - }, - [redirectToAuthWithHistory] - ); - genericComponentOverrideContext.useOnMountAPICall( - fetchIsEmailVerified, - checkIsEmailVerified, - handleError, - sessionContext.loading === false - ); - var signOut = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var session; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - session = types.Session.getInstanceOrThrow(); - return [4 /*yield*/, session.signOut({ userContext: userContext })]; - case 1: - _a.sent(); - return [2 /*return*/, redirectToAuthWithHistory()]; - } - }); - }); - }, - [redirectToAuthWithHistory, userContext] - ); - if (status === "LOADING") { - return jsxRuntime.jsx(React.Fragment, {}); - } - var sendVerifyEmailScreenFeature = props.recipe.config.sendVerifyEmailScreen; - var sendVerifyEmailScreen = { - styleFromInit: sendVerifyEmailScreenFeature.style, - recipeImplementation: modifiedRecipeImplementation, - config: props.recipe.config, - signOut: signOut, - onEmailAlreadyVerified: onSuccess, - redirectToAuth: redirectToAuthWithHistory, - }; - var verifyEmailLinkClickedScreenFeature = props.recipe.config.verifyEmailLinkClickedScreen; - var token = - (_a = genericComponentOverrideContext.getQueryParams("token")) !== null && _a !== void 0 ? _a : undefined; - var verifyEmailLinkClickedScreen = - token === undefined - ? undefined - : { - styleFromInit: verifyEmailLinkClickedScreenFeature.style, - onTokenInvalidRedirect: redirectToAuthWithHistory, - onSuccess: onSuccess, - recipeImplementation: modifiedRecipeImplementation, - config: props.recipe.config, - token: token, - }; - var childProps = { - config: props.recipe.config, - sendVerifyEmailScreen: sendVerifyEmailScreen, - verifyEmailLinkClickedScreen: verifyEmailLinkClickedScreen, - hasToken: token !== undefined, - }; - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, - defaultStore: translations.defaultTranslationsEmailVerification, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - EmailVerificationThemeWrapper, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ), - } - ) - ); +var EmailVerification$1 = function (props) { + var _a; + var sessionContext = React.useContext(uiEntry.SessionContext); + var _b = React.useState("LOADING"), status = _b[0], setStatus = _b[1]; + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var recipeComponentOverrides = props.useComponentOverrides(); + var userContext = uiEntry.useUserContext(); + if (props.userContext !== undefined) { + userContext = props.userContext; + } + var redirectToAuthWithHistory = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, uiEntry.redirectToAuth({ redirectBack: false, navigate: props.navigate })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }, [props.navigate]); + var modifiedRecipeImplementation = React.useMemo(function () { return (logger.__assign(logger.__assign({}, props.recipe.webJSRecipe), { sendVerificationEmail: function (input) { return logger.__awaiter(void 0, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, props.recipe.webJSRecipe.sendVerificationEmail(input)]; + case 1: + response = _a.sent(); + genericComponentOverrideContext.clearQueryParams(["token"]); + return [2 /*return*/, response]; + } + }); + }); } })); }, [props.recipe]); + var onSuccess = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, types.Session.getInstanceOrThrow() + .validateGlobalClaimsAndHandleSuccessRedirection(undefined, props.recipe.recipeID, undefined, userContext, props.navigate) + .catch(rethrowInRender)]; + }); + }); }, [props.recipe, props.navigate, userContext]); + var fetchIsEmailVerified = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var token; + var _a; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (sessionContext.loading === true) { + // This callback should only be called if the session is already loaded + throw new Error("Should never come here"); + } + token = (_a = genericComponentOverrideContext.getQueryParams("token")) !== null && _a !== void 0 ? _a : undefined; + if (!(token === undefined)) return [3 /*break*/, 4]; + if (!!sessionContext.doesSessionExist) return [3 /*break*/, 2]; + return [4 /*yield*/, redirectToAuthWithHistory()]; + case 1: + _b.sent(); + return [3 /*break*/, 4]; + case 2: return [4 /*yield*/, props.recipe.webJSRecipe.isEmailVerified({ userContext: userContext })]; + case 3: + // we check if the email is already verified, and if it is, then we redirect the user + return [2 /*return*/, (_b.sent()).isVerified]; + case 4: return [2 /*return*/, false]; + } + }); + }); }, [props.recipe, sessionContext, redirectToAuthWithHistory]); + var checkIsEmailVerified = React.useCallback(function (isVerified) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (isVerified) { + return [2 /*return*/, onSuccess()]; + } + setStatus("READY"); + return [2 /*return*/]; + }); + }); }, [props.recipe, setStatus, onSuccess]); + var handleError = React.useCallback(function (err) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, types.Session.getInstanceOrThrow().doesSessionExist({ userContext: userContext })]; + case 1: + if (!_a.sent()) return [3 /*break*/, 2]; + throw err; + case 2: return [4 /*yield*/, redirectToAuthWithHistory()]; + case 3: + _a.sent(); + _a.label = 4; + case 4: return [2 /*return*/]; + } + }); + }); }, [redirectToAuthWithHistory]); + genericComponentOverrideContext.useOnMountAPICall(fetchIsEmailVerified, checkIsEmailVerified, handleError, sessionContext.loading === false); + var signOut = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var session; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + session = types.Session.getInstanceOrThrow(); + return [4 /*yield*/, session.signOut({ userContext: userContext })]; + case 1: + _a.sent(); + return [2 /*return*/, redirectToAuthWithHistory()]; + } + }); + }); }, [redirectToAuthWithHistory, userContext]); + if (status === "LOADING") { + return jsxRuntime.jsx(React.Fragment, {}); + } + var sendVerifyEmailScreenFeature = props.recipe.config.sendVerifyEmailScreen; + var sendVerifyEmailScreen = { + styleFromInit: sendVerifyEmailScreenFeature.style, + recipeImplementation: modifiedRecipeImplementation, + config: props.recipe.config, + signOut: signOut, + onEmailAlreadyVerified: onSuccess, + redirectToAuth: redirectToAuthWithHistory, + }; + var verifyEmailLinkClickedScreenFeature = props.recipe.config.verifyEmailLinkClickedScreen; + var token = (_a = genericComponentOverrideContext.getQueryParams("token")) !== null && _a !== void 0 ? _a : undefined; + var verifyEmailLinkClickedScreen = token === undefined + ? undefined + : { + styleFromInit: verifyEmailLinkClickedScreenFeature.style, + onTokenInvalidRedirect: redirectToAuthWithHistory, + onSuccess: onSuccess, + recipeImplementation: modifiedRecipeImplementation, + config: props.recipe.config, + token: token, + }; + var childProps = { + config: props.recipe.config, + sendVerifyEmailScreen: sendVerifyEmailScreen, + verifyEmailLinkClickedScreen: verifyEmailLinkClickedScreen, + hasToken: token !== undefined, + }; + return (jsxRuntime.jsx(uiEntry.ComponentOverrideContext.Provider, logger.__assign({ value: recipeComponentOverrides }, { children: jsxRuntime.jsx(uiEntry.FeatureWrapper, logger.__assign({ useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, defaultStore: translations.defaultTranslationsEmailVerification }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(EmailVerificationThemeWrapper, logger.__assign({}, childProps)), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, childProps); + } + return child; + })] }) })) }))); }; -var EmailVerificationPreBuiltUI = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(EmailVerificationPreBuiltUI, _super); - function EmailVerificationPreBuiltUI(recipeInstance) { - var _this = _super.call(this) || this; - _this.recipeInstance = recipeInstance; - _this.languageTranslations = translations.defaultTranslationsEmailVerification; - // Instance methods - _this.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = recipe.useContext; - } - var features = {}; - if (_this.recipeInstance.config.disableDefaultUI !== true) { - var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( - new NormalisedURLPath__default.default(recipe.DEFAULT_VERIFY_EMAIL_PATH) - ); - features[normalisedFullPath.getAsStringDangerous()] = { - matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( - _this.recipeInstance.config.recipeId - ), - component: function (props) { - return _this.getFeatureComponent("emailverification", props, useComponentOverrides); - }, - recipeID: recipe.EmailVerification.RECIPE_ID, - }; - } - return features; - }; - _this.getFeatureComponent = function ( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _, - props, - useComponentOverrides - ) { - if (useComponentOverrides === void 0) { - useComponentOverrides = recipe.useContext; - } - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - session.SessionAuth, - genericComponentOverrideContext.__assign( - { - requireAuth: false, - overrideGlobalClaimValidators: function () { - return []; - }, - }, - { - children: jsxRuntime.jsx(uiEntry.UserContextContext.Consumer, { - children: function (value) { - return jsxRuntime.jsx( - EmailVerification$1, - genericComponentOverrideContext.__assign( - { - recipe: _this.recipeInstance, - useComponentOverrides: useComponentOverrides, - }, - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, props), - { - // We do this to make sure it does not add another provider - userContext: value, - } - ) - ) - ); - }, - }), - } - ) - ), - } - ) - ); - }; - return _this; - } - // Static methods - EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance = function () { - if (EmailVerificationPreBuiltUI.instance === undefined) { - var recipeInstance = recipe.EmailVerification.getInstanceOrThrow(); - EmailVerificationPreBuiltUI.instance = new EmailVerificationPreBuiltUI(recipeInstance); - } - return EmailVerificationPreBuiltUI.instance; - }; - EmailVerificationPreBuiltUI.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = recipe.useContext; - } - return EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); - }; - EmailVerificationPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = recipe.useContext; - } - return EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - componentName, - props, - useComponentOverrides - ); - }; - EmailVerificationPreBuiltUI.prototype.getAuthComponents = function () { - return []; - }; - // For tests - EmailVerificationPreBuiltUI.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - EmailVerificationPreBuiltUI.instance = undefined; - return; - }; - EmailVerificationPreBuiltUI.EmailVerification = function (props) { - return EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - "emailverification", - props - ); - }; - EmailVerificationPreBuiltUI.EmailVerificationTheme = EmailVerificationTheme; - return EmailVerificationPreBuiltUI; -})(uiEntry.RecipeRouter); +var EmailVerificationPreBuiltUI = /** @class */ (function (_super) { + logger.__extends(EmailVerificationPreBuiltUI, _super); + function EmailVerificationPreBuiltUI(recipeInstance) { + var _this = _super.call(this) || this; + _this.recipeInstance = recipeInstance; + _this.languageTranslations = translations.defaultTranslationsEmailVerification; + // Instance methods + _this.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = recipe.useContext; } + var features = {}; + if (_this.recipeInstance.config.disableDefaultUI !== true) { + var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default.default(recipe.DEFAULT_VERIFY_EMAIL_PATH)); + features[normalisedFullPath.getAsStringDangerous()] = { + matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams(_this.recipeInstance.config.recipeId), + component: function (props) { return _this.getFeatureComponent("emailverification", props, useComponentOverrides); }, + recipeID: recipe.EmailVerification.RECIPE_ID, + }; + } + return features; + }; + _this.getFeatureComponent = function ( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = recipe.useContext; } + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(session.SessionAuth, logger.__assign({ requireAuth: false, overrideGlobalClaimValidators: function () { return []; } }, { children: jsxRuntime.jsx(uiEntry.UserContextContext.Consumer, { children: function (value) { + return (jsxRuntime.jsx(EmailVerification$1, logger.__assign({ recipe: _this.recipeInstance, useComponentOverrides: useComponentOverrides }, logger.__assign(logger.__assign({}, props), { + // We do this to make sure it does not add another provider + userContext: value })))); + } }) })) }))); + }; + return _this; + } + // Static methods + EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance = function () { + if (EmailVerificationPreBuiltUI.instance === undefined) { + var recipeInstance = recipe.EmailVerification.getInstanceOrThrow(); + EmailVerificationPreBuiltUI.instance = new EmailVerificationPreBuiltUI(recipeInstance); + } + return EmailVerificationPreBuiltUI.instance; + }; + EmailVerificationPreBuiltUI.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = recipe.useContext; } + return EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); + }; + EmailVerificationPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = recipe.useContext; } + return EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent(componentName, props, useComponentOverrides); + }; + EmailVerificationPreBuiltUI.prototype.getAuthComponents = function () { + return []; + }; + // For tests + EmailVerificationPreBuiltUI.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + EmailVerificationPreBuiltUI.instance = undefined; + return; + }; + EmailVerificationPreBuiltUI.EmailVerification = function (props) { + return EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("emailverification", props); + }; + EmailVerificationPreBuiltUI.EmailVerificationTheme = EmailVerificationTheme; + return EmailVerificationPreBuiltUI; +}(uiEntry.RecipeRouter)); var EmailVerification = EmailVerificationPreBuiltUI.EmailVerification; exports.EmailVerification = EmailVerification; diff --git a/lib/build/genericComponentOverrideContext.js b/lib/build/genericComponentOverrideContext.js index c488e0ce2..e013df0ed 100644 --- a/lib/build/genericComponentOverrideContext.js +++ b/lib/build/genericComponentOverrideContext.js @@ -1,1475 +1,1021 @@ -"use strict"; +'use strict'; -var SuperTokensWebJS = require("supertokens-web-js"); -var cookieHandler = require("supertokens-web-js/utils/cookieHandler"); -var postSuperTokensInitCallbacks = require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -var windowHandler = require("supertokens-web-js/utils/windowHandler"); -var MultitenancyWebJS = require("supertokens-web-js/recipe/multitenancy"); -var utils = require("supertokens-web-js/utils"); -var React = require("react"); -var NormalisedURLDomain = require("supertokens-web-js/utils/normalisedURLDomain"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var jsxRuntime = require("react/jsx-runtime"); +var logger = require('./logger.js'); +var SuperTokensWebJS = require('supertokens-web-js'); +var cookieHandler = require('supertokens-web-js/utils/cookieHandler'); +var postSuperTokensInitCallbacks = require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +var windowHandler = require('supertokens-web-js/utils/windowHandler'); +var MultitenancyWebJS = require('supertokens-web-js/recipe/multitenancy'); +var utils = require('supertokens-web-js/utils'); +var React = require('react'); +var NormalisedURLDomain = require('supertokens-web-js/utils/normalisedURLDomain'); +var NormalisedURLPath = require('supertokens-web-js/utils/normalisedURLPath'); +var jsxRuntime = require('react/jsx-runtime'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} - -var SuperTokensWebJS__default = /*#__PURE__*/ _interopDefault(SuperTokensWebJS); -var MultitenancyWebJS__default = /*#__PURE__*/ _interopDefault(MultitenancyWebJS); -var React__default = /*#__PURE__*/ _interopDefault(React); -var NormalisedURLDomain__default = /*#__PURE__*/ _interopDefault(NormalisedURLDomain); -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); - -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise, SuppressedError, Symbol */ - -var extendStatics = function (d, b) { - extendStatics = - Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && - function (d, b) { - d.__proto__ = b; - }) || - function (d, b) { - for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; - }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { - this.constructor = d; - } - d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __()); -} - -exports.__assign = function () { - exports.__assign = - Object.assign || - function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return exports.__assign.apply(this, arguments); -}; - -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; - } - return t; -} - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P - ? value - : new P(function (resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { - label: 0, - sent: function () { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [], - }, - f, - y, - t, - g; - return ( - (g = { next: verb(0), throw: verb(1), return: verb(2) }), - typeof Symbol === "function" && - (g[Symbol.iterator] = function () { - return this; - }), - g - ); - function verb(n) { - return function (v) { - return step([n, v]); - }; - } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while ((g && ((g = 0), op[0] && (_ = 0)), _)) - try { - if ( - ((f = 1), - y && - (t = - op[0] & 2 - ? y["return"] - : op[0] - ? y["throw"] || ((t = y["return"]) && t.call(y), 0) - : y.next) && - !(t = t.call(y, op[1])).done) - ) - return t; - if (((y = 0), t)) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if (!((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - if (op[0] & 5) throw op[1]; - return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) - for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); -} - -typeof SuppressedError === "function" - ? SuppressedError - : function (error, suppressed, message) { - var e = new Error(message); - return (e.name = "SuppressedError"), (e.error = error), (e.suppressed = suppressed), e; - }; - -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Consts. - */ -var RECIPE_ID_QUERY_PARAM = "rid"; -var TENANT_ID_QUERY_PARAM = "tenantId"; -var DEFAULT_API_BASE_PATH = "/auth"; -var DEFAULT_WEBSITE_BASE_PATH = "/auth"; -var ST_ROOT_ID = "supertokens-root"; -var SSR_ERROR = - "\nIf you are trying to use this method doing server-side-rendering, please make sure you move this method inside a componentDidMount method or useEffect hook."; +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var package_version = "0.48.0"; +var SuperTokensWebJS__default = /*#__PURE__*/_interopDefault(SuperTokensWebJS); +var MultitenancyWebJS__default = /*#__PURE__*/_interopDefault(MultitenancyWebJS); +var React__default = /*#__PURE__*/_interopDefault(React); +var NormalisedURLDomain__default = /*#__PURE__*/_interopDefault(NormalisedURLDomain); +var NormalisedURLPath__default = /*#__PURE__*/_interopDefault(NormalisedURLPath); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var SUPERTOKENS_DEBUG_NAMESPACE = "com.supertokens.auth-react"; -var __debugLogsEnabled = false; -function enableLogging() { - __debugLogsEnabled = true; -} -function logDebugMessage(message) { - if (__debugLogsEnabled) { - // eslint-disable-next-line no-console - console.log( - "" - .concat(SUPERTOKENS_DEBUG_NAMESPACE, ' {t: "') - .concat(new Date().toISOString(), '", message: "') - .concat(message, '", supertokens-auth-react-ver: "') - .concat(package_version, '"}') - ); - } -} +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Consts. + */ +var RECIPE_ID_QUERY_PARAM = "rid"; +var TENANT_ID_QUERY_PARAM = "tenantId"; +var DEFAULT_API_BASE_PATH = "/auth"; +var DEFAULT_WEBSITE_BASE_PATH = "/auth"; +var ST_ROOT_ID = "supertokens-root"; +var SSR_ERROR = "\nIf you are trying to use this method doing server-side-rendering, please make sure you move this method inside a componentDidMount method or useEffect hook."; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * getRecipeIdFromPath - * Input: - * Output: The "rid" query param if present, null otherwise. - */ -function getRecipeIdFromSearch(search) { - var urlParams = new URLSearchParams(search); - return urlParams.get(RECIPE_ID_QUERY_PARAM); -} -function clearQueryParams(paramNames) { - var newURL = new URL(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHref()); - for (var _i = 0, paramNames_1 = paramNames; _i < paramNames_1.length; _i++) { - var param = paramNames_1[_i]; - newURL.searchParams.delete(param); - } - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.replaceState( - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.getState(), - "", - newURL.toString() - ); -} -function updateQueryParam(name, value) { - var newURL = new URL(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHref()); - newURL.searchParams.set(name, value); - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.replaceState( - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.getState(), - "", - newURL.toString() - ); -} -function clearErrorQueryParam() { - clearQueryParams(["error", "message"]); -} -function getQueryParams(param) { - var urlParams = new URLSearchParams( - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getSearch() - ); - return urlParams.get(param); -} -function getURLHash() { - // By default it is returined with the "#" at the beginning, we cut that off here. - return windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHash().substr(1); -} -function getRedirectToPathFromURL() { - var redirectToPath = getQueryParams("redirectToPath"); - if (redirectToPath === null) { - return undefined; - } else { - try { - var url = void 0; - try { - url = new URL(redirectToPath); - } catch (error) { - var fakeDomain = redirectToPath.startsWith("/") ? "http://localhost" : "http://localhost/"; - url = new URL("".concat(fakeDomain).concat(redirectToPath)); - } - // Prevent Open redirects by normalising path. - var normalisedURLPath = new NormalisedURLPath__default.default(redirectToPath).getAsStringDangerous(); - var pathQueryParams = url.search || ""; // url.search contains the leading ? - var pathHash = url.hash || ""; // url.hash contains the leading # - var pathWithQueryParamsAndHash = normalisedURLPath + pathQueryParams + pathHash; - // Ensure a leading "/" if `normalisedUrlPath` is empty but `pathWithQueryParamsAndHash` is not to ensure proper redirection. - // Example: "?test=1" will not redirect the user to `/?test=1` if we don't add a leading "/". - if ( - normalisedURLPath.length === 0 && - pathWithQueryParamsAndHash.length > 0 && - !pathWithQueryParamsAndHash.startsWith("/") - ) { - return "/" + pathWithQueryParamsAndHash; - } - return pathWithQueryParamsAndHash; - } catch (_a) { - return undefined; - } - } -} -function getTenantIdFromQueryParams() { - var _a; - return (_a = getQueryParams(TENANT_ID_QUERY_PARAM)) !== null && _a !== void 0 ? _a : undefined; -} -function getDefaultRedirectionURLForPath(config, defaultPath, context, extraQueryParams) { - var redirectPath = config.appInfo.websiteBasePath - .appendPath(new NormalisedURLPath__default.default(defaultPath)) - .getAsStringDangerous(); - var queryParams = new URLSearchParams(); - if (context.tenantIdFromQueryParams !== undefined) { - queryParams.set(TENANT_ID_QUERY_PARAM, context.tenantIdFromQueryParams); - } - if (extraQueryParams !== undefined) { - Object.entries(extraQueryParams).forEach(function (_a) { - var key = _a[0], - value = _a[1]; - if (value !== undefined) { - queryParams.set(key, value); - } - }); - } - if (queryParams.toString() !== "") { - return "".concat(redirectPath, "?").concat(queryParams.toString()); - } - return redirectPath; -} -/* - * isTest - */ -function isTest() { - try { - return process.env.TEST_MODE === "testing" || process.env.REACT_APP_TEST_MODE === "testing"; - } catch (err) { - // can get Uncaught ReferenceError: process is not defined error - return false; - } -} -function normaliseInputAppInfoOrThrowError(appInfo) { - if (appInfo === undefined) { - throw new Error("Please provide the appInfo object when calling supertokens.init"); - } - if (appInfo.apiDomain === undefined) { - throw new Error("Please provide your apiDomain inside the appInfo object when calling supertokens.init"); - } - if (appInfo.appName === undefined) { - throw new Error("Please provide your appName inside the appInfo object when calling supertokens.init"); - } - if (appInfo.websiteDomain === undefined) { - throw new Error("Please provide your websiteDomain inside the appInfo object when calling supertokens.init"); - } - var apiGatewayPath = new NormalisedURLPath__default.default(""); - if (appInfo.apiGatewayPath !== undefined) { - apiGatewayPath = new NormalisedURLPath__default.default(appInfo.apiGatewayPath); - } - return { - appName: appInfo.appName, - apiDomain: new NormalisedURLDomain__default.default(appInfo.apiDomain), - websiteDomain: new NormalisedURLDomain__default.default(appInfo.websiteDomain), - apiBasePath: apiGatewayPath.appendPath( - getNormalisedURLPathOrDefault(DEFAULT_API_BASE_PATH, appInfo.apiBasePath) - ), - websiteBasePath: getNormalisedURLPathOrDefault(DEFAULT_WEBSITE_BASE_PATH, appInfo.websiteBasePath), - }; -} -function getNormalisedURLPathOrDefault(defaultPath, path) { - if (path !== undefined) { - return new NormalisedURLPath__default.default(path); - } else { - return new NormalisedURLPath__default.default(defaultPath); - } -} -/* - * validateForm - */ -// We check that the number of fields in input and config form field is the same. -// We check that each item in the config form field is also present in the input form field -function validateForm(inputs, configFormFields) { - return __awaiter(this, void 0, void 0, function () { - var validationErrors, _loop_1, i; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - validationErrors = []; - if (configFormFields.length !== inputs.length) { - throw Error("Are you sending too many / too few formFields?"); - } - _loop_1 = function (i) { - var field, input, value, error; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - field = configFormFields[i]; - input = inputs.find(function (i) { - return i.id === field.id; - }); - value = input.value; - if (input.id === "email") { - value = value.trim(); - } - return [4 /*yield*/, field.validate(value)]; - case 1: - error = _b.sent(); - // If error, add it. - if (error !== undefined) { - validationErrors.push({ - error: error, - id: field.id, - }); - } - return [2 /*return*/]; - } - }); - }; - i = 0; - _a.label = 1; - case 1: - if (!(i < configFormFields.length)) return [3 /*break*/, 4]; - return [5 /*yield**/, _loop_1(i)]; - case 2: - _a.sent(); - _a.label = 3; - case 3: - i++; - return [3 /*break*/, 1]; - case 4: - return [2 /*return*/, validationErrors]; - } - }); - }); -} -/* - * getCurrentNormalisedUrlPath - */ -function getCurrentNormalisedUrlPath() { - return new NormalisedURLPath__default.default( - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getPathName() - ); -} -function getCurrentNormalisedUrlPathWithQueryParamsAndFragments() { - var normalisedUrlPath = getCurrentNormalisedUrlPath().getAsStringDangerous(); - return ( - normalisedUrlPath + - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getSearch() + - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHash() - ); -} -function appendQueryParamsToURL(stringUrl, queryParams) { - if (queryParams === undefined) { - return stringUrl; - } - try { - var url_1 = new URL(stringUrl); - Object.entries(queryParams).forEach(function (_a) { - var key = _a[0], - value = _a[1]; - url_1.searchParams.set(key, value); - }); - return url_1.href; - } catch (e) { - var fakeDomain = stringUrl.startsWith("/") ? "http://localhost" : "http://localhost/"; - var url_2 = new URL("".concat(fakeDomain).concat(stringUrl)); - Object.entries(queryParams).forEach(function (_a) { - var key = _a[0], - value = _a[1]; - url_2.searchParams.set(key, value); - }); - return "".concat(url_2.pathname).concat(url_2.search).concat(url_2.hash); - } -} -function appendTrailingSlashToURL(stringUrl) { - return stringUrl.endsWith("/") ? stringUrl : stringUrl + "/"; -} -/* - * Default method for matching recipe route based on query params. - */ -function matchRecipeIdUsingQueryParams(recipeId) { - return function () { - var recipeIdFromSearch = getRecipeIdFromSearch( - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getSearch() - ); - return recipeIdFromSearch === recipeId; - }; -} -function redirectWithFullPageReload(to) { - if (to.trim() === "") { - to = "/"; - } - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.setHref(to); -} -function redirectWithNavigate(to, navigate) { - if (to.trim() === "") { - to = "/"; - } - if ("push" in navigate) { - // we are using react-router-dom that is before v6 - navigate.push(to); - } else { - // in react-router-dom v6, it is just navigate(to) - navigate(to); - } -} -function getOriginOfPage() { - return new NormalisedURLDomain__default.default( - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getOrigin() - ); -} -function getLocalStorage(key) { - return __awaiter(this, void 0, void 0, function () { - var res; - return __generator(this, function (_a) { - res = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.localStorage.getItem(key); - if (res === null || res === undefined) { - return [2 /*return*/, null]; - } - return [2 /*return*/, res]; - }); - }); -} -function setLocalStorage(key, value) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.localStorage.setItem( - key, - value - ), - ]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); -} -function removeFromLocalStorage(key) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.localStorage.removeItem( - key - ), - ]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); -} -function mergeObjects(obj1, obj2) { - var res = exports.__assign({}, obj1); - for (var key in obj2) { - if (typeof res[key] === "object" && typeof obj2[key] === "object") { - res[key] = mergeObjects(res[key], obj2[key]); - } else { - res[key] = obj2[key]; - } - } - return res; -} -function normaliseCookieScopeOrThrowError(cookieScope) { - function helper(cookieScope) { - cookieScope = cookieScope.trim().toLowerCase(); - // first we convert it to a URL so that we can use the URL class - if (cookieScope.startsWith(".")) { - cookieScope = cookieScope.substr(1); - } - if (!cookieScope.startsWith("http://") && !cookieScope.startsWith("https://")) { - cookieScope = "http://" + cookieScope; - } - try { - var urlObj = new URL(cookieScope); - cookieScope = urlObj.hostname; - // remove leading dot - if (cookieScope.startsWith(".")) { - cookieScope = cookieScope.substr(1); - } - return cookieScope; - } catch (err) { - throw new Error("Please provide a valid cookie scope"); - } - } - function isAnIpAddress(ipaddress) { - return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test( - ipaddress - ); - } - var noDotNormalised = helper(cookieScope); - if (noDotNormalised === "localhost" || isAnIpAddress(noDotNormalised)) { - return noDotNormalised; - } - if (cookieScope.startsWith(".")) { - return "." + noDotNormalised; - } - return noDotNormalised; -} -function getDefaultCookieScope() { - try { - return normaliseCookieScopeOrThrowError( - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHostName() - ); - } catch (_a) { - return undefined; - } -} -function getCookieValue(name) { - return __awaiter(this, void 0, void 0, function () { - var value, _a, parts, last, temp; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - _a = "; "; - return [ - 4 /*yield*/, - cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.getCookie(), - ]; - case 1: - value = _a + _b.sent(); - parts = value.split("; " + name + "="); - if (parts.length >= 2) { - last = parts.pop(); - if (last !== undefined) { - temp = last.split(";").shift(); - if (temp === undefined) { - return [2 /*return*/, null]; - } - return [2 /*return*/, temp]; - } - } - return [2 /*return*/, null]; - } - }); - }); -} -// undefined value will remove the cookie -function setFrontendCookie(name, value, scope) { - return __awaiter(this, void 0, void 0, function () { - var expires, cookieVal; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - expires = "Thu, 01 Jan 1970 00:00:01 GMT"; - cookieVal = ""; - if (value !== undefined) { - cookieVal = value; - expires = undefined; // set cookie without expiry - } - if ( - !( - scope === "localhost" || - scope === - windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHostName() || - scope === undefined - ) - ) - return [3 /*break*/, 5]; - if (!(expires !== undefined)) return [3 /*break*/, 2]; - return [ - 4 /*yield*/, - cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie( - "".concat(name, "=").concat(cookieVal, ";expires=").concat(expires, ";path=/;samesite=lax") - ), - ]; - case 1: - _a.sent(); - return [3 /*break*/, 4]; - case 2: - return [ - 4 /*yield*/, - cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie( - "" - .concat(name, "=") - .concat(cookieVal, ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;samesite=lax") - ), - ]; - case 3: - _a.sent(); - _a.label = 4; - case 4: - return [3 /*break*/, 9]; - case 5: - if (!(expires !== undefined)) return [3 /*break*/, 7]; - return [ - 4 /*yield*/, - cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie( - "" - .concat(name, "=") - .concat(cookieVal, ";expires=") - .concat(expires, ";domain=") - .concat(scope, ";path=/;samesite=lax") - ), - ]; - case 6: - _a.sent(); - return [3 /*break*/, 9]; - case 7: - return [ - 4 /*yield*/, - cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie( - "" - .concat(name, "=") - .concat(cookieVal, ";domain=") - .concat(scope, ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;samesite=lax") - ), - ]; - case 8: - _a.sent(); - _a.label = 9; - case 9: - return [2 /*return*/]; - } - }); - }); -} -function getNormalisedUserContext(userContext) { - return userContext === undefined ? {} : userContext; -} -/** - * This function handles calling APIs that should only be called once during mount (mostly on mount of a route/feature component). - * It's split into multiple callbacks (fetch + handleResponse/handleError) because we expect fetch to take longer and - * and the component may be unmounted during the first fetch, in which case we want to avoid updating state/redirecting. - * This is especially relevant for development in strict mode with React 18 (and in the future for concurrent rendering). - * - * @param fetch This is a callback that is only called once on mount. Mostly it's for consuming tokens/doing one time only API calls - * @param handleResponse This is called with the result of the first (fetch) call if it succeeds. - * @param handleError This is called with the error of the first (fetch) call if it rejects. - * @param startLoading Will start the whole process if this is set to true (or omitted). Mostly used to wait for session loading. - */ -var useOnMountAPICall = function (fetch, handleResponse, handleError, startLoading) { - if (startLoading === void 0) { - startLoading = true; - } - var consumeReq = React.useRef(); - var _a = React.useState(undefined), - error = _a[0], - setError = _a[1]; - React.useEffect( - function () { - var effect = function (signal) { - return __awaiter(void 0, void 0, void 0, function () { - var resp, err_1, err_2; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 9]); - if (consumeReq.current === undefined) { - consumeReq.current = fetch(); - } - return [4 /*yield*/, consumeReq.current]; - case 1: - resp = _a.sent(); - if (!signal.aborted) { - void handleResponse(resp); - } - return [3 /*break*/, 9]; - case 2: - err_1 = _a.sent(); - if (!!signal.aborted) return [3 /*break*/, 8]; - if (!(handleError !== undefined)) return [3 /*break*/, 7]; - _a.label = 3; - case 3: - _a.trys.push([3, 5, , 6]); - return [4 /*yield*/, handleError(err_1, resp)]; - case 4: - _a.sent(); - return [3 /*break*/, 6]; - case 5: - err_2 = _a.sent(); - setError(err_2); - return [3 /*break*/, 6]; - case 6: - return [3 /*break*/, 8]; - case 7: - setError(err_1); - _a.label = 8; - case 8: - return [3 /*break*/, 9]; - case 9: - return [2 /*return*/]; - } - }); - }); - }; - if (startLoading) { - var ctrl_1 = new AbortController(); - void effect(ctrl_1.signal); - return function () { - ctrl_1.abort(); - }; - } - return; - }, - [setError, consumeReq, fetch, handleResponse, handleError, startLoading] - ); - if (error) { - throw error; - } -}; -function useRethrowInRender() { - var _a = React.useState(undefined), - error = _a[0], - setError = _a[1]; - if (error) { - throw error; - } - return setError; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * getRecipeIdFromPath + * Input: + * Output: The "rid" query param if present, null otherwise. + */ +function getRecipeIdFromSearch(search) { + var urlParams = new URLSearchParams(search); + return urlParams.get(RECIPE_ID_QUERY_PARAM); +} +function clearQueryParams(paramNames) { + var newURL = new URL(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHref()); + for (var _i = 0, paramNames_1 = paramNames; _i < paramNames_1.length; _i++) { + var param = paramNames_1[_i]; + newURL.searchParams.delete(param); + } + windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.replaceState(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.getState(), "", newURL.toString()); +} +function updateQueryParam(name, value) { + var newURL = new URL(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHref()); + newURL.searchParams.set(name, value); + windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.replaceState(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.history.getState(), "", newURL.toString()); +} +function clearErrorQueryParam() { + clearQueryParams(["error", "message"]); +} +function getQueryParams(param) { + var urlParams = new URLSearchParams(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getSearch()); + return urlParams.get(param); +} +function getURLHash() { + // By default it is returined with the "#" at the beginning, we cut that off here. + return windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHash().substr(1); +} +function getRedirectToPathFromURL() { + var redirectToPath = getQueryParams("redirectToPath"); + if (redirectToPath === null) { + return undefined; + } + else { + try { + var url = void 0; + try { + url = new URL(redirectToPath); + } + catch (error) { + var fakeDomain = redirectToPath.startsWith("/") ? "http://localhost" : "http://localhost/"; + url = new URL("".concat(fakeDomain).concat(redirectToPath)); + } + // Prevent Open redirects by normalising path. + var normalisedURLPath = new NormalisedURLPath__default.default(redirectToPath).getAsStringDangerous(); + var pathQueryParams = url.search || ""; // url.search contains the leading ? + var pathHash = url.hash || ""; // url.hash contains the leading # + var pathWithQueryParamsAndHash = normalisedURLPath + pathQueryParams + pathHash; + // Ensure a leading "/" if `normalisedUrlPath` is empty but `pathWithQueryParamsAndHash` is not to ensure proper redirection. + // Example: "?test=1" will not redirect the user to `/?test=1` if we don't add a leading "/". + if (normalisedURLPath.length === 0 && + pathWithQueryParamsAndHash.length > 0 && + !pathWithQueryParamsAndHash.startsWith("/")) { + return "/" + pathWithQueryParamsAndHash; + } + return pathWithQueryParamsAndHash; + } + catch (_a) { + return undefined; + } + } +} +function getTenantIdFromQueryParams() { + var _a; + return (_a = getQueryParams(TENANT_ID_QUERY_PARAM)) !== null && _a !== void 0 ? _a : undefined; +} +function getDefaultRedirectionURLForPath(config, defaultPath, context, extraQueryParams) { + var redirectPath = config.appInfo.websiteBasePath + .appendPath(new NormalisedURLPath__default.default(defaultPath)) + .getAsStringDangerous(); + var queryParams = new URLSearchParams(); + if (context.tenantIdFromQueryParams !== undefined) { + queryParams.set(TENANT_ID_QUERY_PARAM, context.tenantIdFromQueryParams); + } + if (extraQueryParams !== undefined) { + Object.entries(extraQueryParams).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (value !== undefined) { + queryParams.set(key, value); + } + }); + } + if (queryParams.toString() !== "") { + return "".concat(redirectPath, "?").concat(queryParams.toString()); + } + return redirectPath; +} +/* + * isTest + */ +function isTest() { + try { + return process.env.TEST_MODE === "testing" || process.env.REACT_APP_TEST_MODE === "testing"; + } + catch (err) { + // can get Uncaught ReferenceError: process is not defined error + return false; + } +} +function normaliseInputAppInfoOrThrowError(appInfo) { + if (appInfo === undefined) { + throw new Error("Please provide the appInfo object when calling supertokens.init"); + } + if (appInfo.apiDomain === undefined) { + throw new Error("Please provide your apiDomain inside the appInfo object when calling supertokens.init"); + } + if (appInfo.appName === undefined) { + throw new Error("Please provide your appName inside the appInfo object when calling supertokens.init"); + } + if (appInfo.websiteDomain === undefined) { + throw new Error("Please provide your websiteDomain inside the appInfo object when calling supertokens.init"); + } + var apiGatewayPath = new NormalisedURLPath__default.default(""); + if (appInfo.apiGatewayPath !== undefined) { + apiGatewayPath = new NormalisedURLPath__default.default(appInfo.apiGatewayPath); + } + return { + appName: appInfo.appName, + apiDomain: new NormalisedURLDomain__default.default(appInfo.apiDomain), + websiteDomain: new NormalisedURLDomain__default.default(appInfo.websiteDomain), + apiBasePath: apiGatewayPath.appendPath(getNormalisedURLPathOrDefault(DEFAULT_API_BASE_PATH, appInfo.apiBasePath)), + websiteBasePath: getNormalisedURLPathOrDefault(DEFAULT_WEBSITE_BASE_PATH, appInfo.websiteBasePath), + }; +} +function getNormalisedURLPathOrDefault(defaultPath, path) { + if (path !== undefined) { + return new NormalisedURLPath__default.default(path); + } + else { + return new NormalisedURLPath__default.default(defaultPath); + } +} +/* + * validateForm + */ +// We check that the number of fields in input and config form field is the same. +// We check that each item in the config form field is also present in the input form field +function validateForm(inputs, configFormFields) { + return logger.__awaiter(this, void 0, void 0, function () { + var validationErrors, _loop_1, i; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + validationErrors = []; + if (configFormFields.length !== inputs.length) { + throw Error("Are you sending too many / too few formFields?"); + } + _loop_1 = function (i) { + var field, input, value, error; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + field = configFormFields[i]; + input = inputs.find(function (i) { return i.id === field.id; }); + value = input.value; + if (input.id === "email") { + value = value.trim(); + } + return [4 /*yield*/, field.validate(value)]; + case 1: + error = _b.sent(); + // If error, add it. + if (error !== undefined) { + validationErrors.push({ + error: error, + id: field.id, + }); + } + return [2 /*return*/]; + } + }); + }; + i = 0; + _a.label = 1; + case 1: + if (!(i < configFormFields.length)) return [3 /*break*/, 4]; + return [5 /*yield**/, _loop_1(i)]; + case 2: + _a.sent(); + _a.label = 3; + case 3: + i++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/, validationErrors]; + } + }); + }); +} +/* + * getCurrentNormalisedUrlPath + */ +function getCurrentNormalisedUrlPath() { + return new NormalisedURLPath__default.default(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getPathName()); +} +function getCurrentNormalisedUrlPathWithQueryParamsAndFragments() { + var normalisedUrlPath = getCurrentNormalisedUrlPath().getAsStringDangerous(); + return (normalisedUrlPath + + windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getSearch() + + windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHash()); +} +function appendQueryParamsToURL(stringUrl, queryParams) { + if (queryParams === undefined) { + return stringUrl; + } + try { + var url_1 = new URL(stringUrl); + Object.entries(queryParams).forEach(function (_a) { + var key = _a[0], value = _a[1]; + url_1.searchParams.set(key, value); + }); + return url_1.href; + } + catch (e) { + var fakeDomain = stringUrl.startsWith("/") ? "http://localhost" : "http://localhost/"; + var url_2 = new URL("".concat(fakeDomain).concat(stringUrl)); + Object.entries(queryParams).forEach(function (_a) { + var key = _a[0], value = _a[1]; + url_2.searchParams.set(key, value); + }); + return "".concat(url_2.pathname).concat(url_2.search).concat(url_2.hash); + } +} +function appendTrailingSlashToURL(stringUrl) { + return stringUrl.endsWith("/") ? stringUrl : stringUrl + "/"; +} +/* + * Default method for matching recipe route based on query params. + */ +function matchRecipeIdUsingQueryParams(recipeId) { + return function () { + var recipeIdFromSearch = getRecipeIdFromSearch(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getSearch()); + return recipeIdFromSearch === recipeId; + }; +} +function redirectWithFullPageReload(to) { + if (to.trim() === "") { + to = "/"; + } + windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.setHref(to); +} +function redirectWithNavigate(to, navigate) { + if (to.trim() === "") { + to = "/"; + } + if ("push" in navigate) { + // we are using react-router-dom that is before v6 + navigate.push(to); + } + else { + // in react-router-dom v6, it is just navigate(to) + navigate(to); + } +} +function getOriginOfPage() { + return new NormalisedURLDomain__default.default(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getOrigin()); +} +function getLocalStorage(key) { + return logger.__awaiter(this, void 0, void 0, function () { + var res; + return logger.__generator(this, function (_a) { + res = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.localStorage.getItem(key); + if (res === null || res === undefined) { + return [2 /*return*/, null]; + } + return [2 /*return*/, res]; + }); + }); +} +function setLocalStorage(key, value) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.localStorage.setItem(key, value)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); +} +function removeFromLocalStorage(key) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.localStorage.removeItem(key)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); +} +function mergeObjects(obj1, obj2) { + var res = logger.__assign({}, obj1); + for (var key in obj2) { + if (typeof res[key] === "object" && typeof obj2[key] === "object") { + res[key] = mergeObjects(res[key], obj2[key]); + } + else { + res[key] = obj2[key]; + } + } + return res; +} +function normaliseCookieScopeOrThrowError(cookieScope) { + function helper(cookieScope) { + cookieScope = cookieScope.trim().toLowerCase(); + // first we convert it to a URL so that we can use the URL class + if (cookieScope.startsWith(".")) { + cookieScope = cookieScope.substr(1); + } + if (!cookieScope.startsWith("http://") && !cookieScope.startsWith("https://")) { + cookieScope = "http://" + cookieScope; + } + try { + var urlObj = new URL(cookieScope); + cookieScope = urlObj.hostname; + // remove leading dot + if (cookieScope.startsWith(".")) { + cookieScope = cookieScope.substr(1); + } + return cookieScope; + } + catch (err) { + throw new Error("Please provide a valid cookie scope"); + } + } + function isAnIpAddress(ipaddress) { + return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress); + } + var noDotNormalised = helper(cookieScope); + if (noDotNormalised === "localhost" || isAnIpAddress(noDotNormalised)) { + return noDotNormalised; + } + if (cookieScope.startsWith(".")) { + return "." + noDotNormalised; + } + return noDotNormalised; +} +function getDefaultCookieScope() { + try { + return normaliseCookieScopeOrThrowError(windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHostName()); + } + catch (_a) { + return undefined; + } +} +function getCookieValue(name) { + return logger.__awaiter(this, void 0, void 0, function () { + var value, _a, parts, last, temp; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _a = "; "; + return [4 /*yield*/, cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.getCookie()]; + case 1: + value = _a + (_b.sent()); + parts = value.split("; " + name + "="); + if (parts.length >= 2) { + last = parts.pop(); + if (last !== undefined) { + temp = last.split(";").shift(); + if (temp === undefined) { + return [2 /*return*/, null]; + } + return [2 /*return*/, temp]; + } + } + return [2 /*return*/, null]; + } + }); + }); +} +// undefined value will remove the cookie +function setFrontendCookie(name, value, scope) { + return logger.__awaiter(this, void 0, void 0, function () { + var expires, cookieVal; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + expires = "Thu, 01 Jan 1970 00:00:01 GMT"; + cookieVal = ""; + if (value !== undefined) { + cookieVal = value; + expires = undefined; // set cookie without expiry + } + if (!(scope === "localhost" || + scope === windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHostName() || + scope === undefined)) return [3 /*break*/, 5]; + if (!(expires !== undefined)) return [3 /*break*/, 2]; + return [4 /*yield*/, cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie("".concat(name, "=").concat(cookieVal, ";expires=").concat(expires, ";path=/;samesite=lax"))]; + case 1: + _a.sent(); + return [3 /*break*/, 4]; + case 2: return [4 /*yield*/, cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie("".concat(name, "=").concat(cookieVal, ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;samesite=lax"))]; + case 3: + _a.sent(); + _a.label = 4; + case 4: return [3 /*break*/, 9]; + case 5: + if (!(expires !== undefined)) return [3 /*break*/, 7]; + return [4 /*yield*/, cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie("".concat(name, "=").concat(cookieVal, ";expires=").concat(expires, ";domain=").concat(scope, ";path=/;samesite=lax"))]; + case 6: + _a.sent(); + return [3 /*break*/, 9]; + case 7: return [4 /*yield*/, cookieHandler.CookieHandlerReference.getReferenceOrThrow().cookieHandler.setCookie("".concat(name, "=").concat(cookieVal, ";domain=").concat(scope, ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;samesite=lax"))]; + case 8: + _a.sent(); + _a.label = 9; + case 9: return [2 /*return*/]; + } + }); + }); +} +function getNormalisedUserContext(userContext) { + return userContext === undefined ? {} : userContext; +} +/** + * This function handles calling APIs that should only be called once during mount (mostly on mount of a route/feature component). + * It's split into multiple callbacks (fetch + handleResponse/handleError) because we expect fetch to take longer and + * and the component may be unmounted during the first fetch, in which case we want to avoid updating state/redirecting. + * This is especially relevant for development in strict mode with React 18 (and in the future for concurrent rendering). + * + * @param fetch This is a callback that is only called once on mount. Mostly it's for consuming tokens/doing one time only API calls + * @param handleResponse This is called with the result of the first (fetch) call if it succeeds. + * @param handleError This is called with the error of the first (fetch) call if it rejects. + * @param startLoading Will start the whole process if this is set to true (or omitted). Mostly used to wait for session loading. + */ +var useOnMountAPICall = function (fetch, handleResponse, handleError, startLoading) { + if (startLoading === void 0) { startLoading = true; } + var consumeReq = React.useRef(); + var _a = React.useState(undefined), error = _a[0], setError = _a[1]; + React.useEffect(function () { + var effect = function (signal) { return logger.__awaiter(void 0, void 0, void 0, function () { + var resp, err_1, err_2; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 2, , 9]); + if (consumeReq.current === undefined) { + consumeReq.current = fetch(); + } + return [4 /*yield*/, consumeReq.current]; + case 1: + resp = _a.sent(); + if (!signal.aborted) { + void handleResponse(resp); + } + return [3 /*break*/, 9]; + case 2: + err_1 = _a.sent(); + if (!!signal.aborted) return [3 /*break*/, 8]; + if (!(handleError !== undefined)) return [3 /*break*/, 7]; + _a.label = 3; + case 3: + _a.trys.push([3, 5, , 6]); + return [4 /*yield*/, handleError(err_1, resp)]; + case 4: + _a.sent(); + return [3 /*break*/, 6]; + case 5: + err_2 = _a.sent(); + setError(err_2); + return [3 /*break*/, 6]; + case 6: return [3 /*break*/, 8]; + case 7: + setError(err_1); + _a.label = 8; + case 8: return [3 /*break*/, 9]; + case 9: return [2 /*return*/]; + } + }); + }); }; + if (startLoading) { + var ctrl_1 = new AbortController(); + void effect(ctrl_1.signal); + return function () { + ctrl_1.abort(); + }; + } + return; + }, [setError, consumeReq, fetch, handleResponse, handleError, startLoading]); + if (error) { + throw error; + } +}; +function useRethrowInRender() { + var _a = React.useState(undefined), error = _a[0], setError = _a[1]; + if (error) { + throw error; + } + return setError; } -var BaseRecipeModule = /** @class */ (function () { - /* - * Constructor. - */ - function BaseRecipeModule(config) { - this.config = config; - } - return BaseRecipeModule; -})(); +var BaseRecipeModule = /** @class */ (function () { + /* + * Constructor. + */ + function BaseRecipeModule(config) { + this.config = config; + } + return BaseRecipeModule; +}()); -function normaliseRecipeModuleConfig(config) { - var _this = this; - if (config === undefined) { - config = {}; - } - var onHandleEvent = config.onHandleEvent, - getRedirectionURL = config.getRedirectionURL, - preAPIHook = config.preAPIHook, - postAPIHook = config.postAPIHook; - if (onHandleEvent === undefined) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function - onHandleEvent = function (_) {}; - } - if (getRedirectionURL === undefined) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getRedirectionURL = function (_) { - return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, undefined]; - }); - }); - }; - } - if (preAPIHook === undefined) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - preAPIHook = function (context) { - return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, context]; - }); - }); - }; - } - if (postAPIHook === undefined) { - // eslint-disable-next-line @typescript-eslint/no-empty-function - postAPIHook = function () { - return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/]; - }); - }); - }; - } - var rootStyle = config.style === undefined ? "" : config.style; - return exports.__assign(exports.__assign({}, config), { - getRedirectionURL: getRedirectionURL, - onHandleEvent: onHandleEvent, - preAPIHook: preAPIHook, - postAPIHook: postAPIHook, - recipeRootStyle: rootStyle, - }); +function normaliseRecipeModuleConfig(config) { + var _this = this; + if (config === undefined) { + config = {}; + } + var onHandleEvent = config.onHandleEvent, getRedirectionURL = config.getRedirectionURL, preAPIHook = config.preAPIHook, postAPIHook = config.postAPIHook; + if (onHandleEvent === undefined) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function + onHandleEvent = function (_) { }; + } + if (getRedirectionURL === undefined) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getRedirectionURL = function (_) { return logger.__awaiter(_this, void 0, void 0, function () { return logger.__generator(this, function (_a) { + return [2 /*return*/, undefined]; + }); }); }; + } + if (preAPIHook === undefined) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + preAPIHook = function (context) { return logger.__awaiter(_this, void 0, void 0, function () { return logger.__generator(this, function (_a) { + return [2 /*return*/, context]; + }); }); }; + } + if (postAPIHook === undefined) { + // eslint-disable-next-line @typescript-eslint/no-empty-function + postAPIHook = function () { return logger.__awaiter(_this, void 0, void 0, function () { return logger.__generator(this, function (_a) { + return [2 /*return*/]; + }); }); }; + } + var rootStyle = config.style === undefined ? "" : config.style; + return logger.__assign(logger.__assign({}, config), { getRedirectionURL: getRedirectionURL, onHandleEvent: onHandleEvent, preAPIHook: preAPIHook, postAPIHook: postAPIHook, recipeRootStyle: rootStyle }); } -function normaliseMultitenancyConfig(config) { - return exports.__assign(exports.__assign({}, normaliseRecipeModuleConfig(config)), { - override: exports.__assign( - { - functions: function (originalImplementation) { - return originalImplementation; - }, - }, - config === null || config === void 0 ? void 0 : config.override - ), - }); -} -function hasIntersectingRecipes(tenantMethods, recipeList) { - return tenantMethods.firstFactors.some(function (factorId) { - return recipeList.some(function (r) { - return r.firstFactorIds.includes(factorId); - }); - }); +function normaliseMultitenancyConfig(config) { + return logger.__assign(logger.__assign({}, normaliseRecipeModuleConfig(config)), { override: logger.__assign({ functions: function (originalImplementation) { return originalImplementation; } }, config === null || config === void 0 ? void 0 : config.override) }); +} +function hasIntersectingRecipes(tenantMethods, recipeList) { + return tenantMethods.firstFactors.some(function (factorId) { return recipeList.some(function (r) { return r.firstFactorIds.includes(factorId); }); }); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Class. - */ -var Multitenancy = /** @class */ (function (_super) { - __extends(Multitenancy, _super); - function Multitenancy(config, webJSRecipe) { - if (webJSRecipe === void 0) { - webJSRecipe = MultitenancyWebJS__default.default; - } - var _this = _super.call(this, config) || this; - _this.webJSRecipe = webJSRecipe; - _this.recipeID = Multitenancy.RECIPE_ID; - _this.dynamicLoginMethodsCache = {}; - return _this; - } - Multitenancy.prototype.getCurrentDynamicLoginMethods = function (input) { - var _a; - return __awaiter(this, void 0, void 0, function () { - var userContext, tenantId, tenantMethods; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - if (SuperTokens.usesDynamicLoginMethods === false) { - return [2 /*return*/, undefined]; - } - userContext = utils.getNormalisedUserContext(input.userContext); - return [4 /*yield*/, Multitenancy.getInstanceOrThrow().webJSRecipe.getTenantId()]; - case 1: - tenantId = (_a = _b.sent()) !== null && _a !== void 0 ? _a : "public"; - if (this.dynamicLoginMethodsCache[tenantId] === undefined) { - this.dynamicLoginMethodsCache[tenantId] = Multitenancy.getDynamicLoginMethods({ - tenantId: tenantId, - userContext: userContext, - }); - } - return [4 /*yield*/, this.dynamicLoginMethodsCache[tenantId]]; - case 2: - tenantMethods = _b.sent(); - if ( - !hasIntersectingRecipes( - tenantMethods, - SuperTokens.getInstanceOrThrow().recipeList.filter(function (recipe) { - return "firstFactorIds" in recipe; - }) - ) - ) { - throw new Error( - "Initialized recipes have no overlap with core recipes or could not load login methods" - ); - } - return [2 /*return*/, tenantMethods]; - } - }); - }); - }; - Multitenancy.getDynamicLoginMethods = function (input) { - return __awaiter(this, void 0, void 0, function () { - var _a, thirdParty, firstFactors; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - return [4 /*yield*/, MultitenancyWebJS__default.default.getLoginMethods(input)]; - case 1: - (_a = _b.sent()), (thirdParty = _a.thirdParty), (firstFactors = _a.firstFactors); - return [ - 2 /*return*/, - { - thirdparty: thirdParty, - firstFactors: firstFactors, - }, - ]; - } - }); - }); - }; - Multitenancy.init = function (config) { - var normalisedConfig = normaliseMultitenancyConfig(config); - return { - recipeID: Multitenancy.RECIPE_ID, - authReact: function (appInfo) { - Multitenancy.instance = new Multitenancy( - exports.__assign(exports.__assign({}, normalisedConfig), { - appInfo: appInfo, - recipeId: Multitenancy.RECIPE_ID, - }) - ); - return Multitenancy.instance; - }, - webJS: MultitenancyWebJS__default.default.init(exports.__assign({}, normalisedConfig)), - }; - }; - Multitenancy.getInstanceOrThrow = function () { - if (Multitenancy.instance === undefined) { - var error = - "No instance of Multitenancy found. Make sure to call the Multitenancy.init method." + - "See https://supertokens.io/docs/multitenancy/quick-setup/frontend"; - // eslint-disable-next-line supertokens-auth-react/no-direct-window-object - if (typeof window === "undefined") { - error = error + SSR_ERROR; - } - throw Error(error); - } - return Multitenancy.instance; - }; - /* - * Tests methods. - */ - Multitenancy.reset = function () { - if (!isTest()) { - return; - } - Multitenancy.instance = undefined; - return; - }; - Multitenancy.RECIPE_ID = "multitenancy"; - return Multitenancy; -})(BaseRecipeModule); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Class. + */ +var Multitenancy = /** @class */ (function (_super) { + logger.__extends(Multitenancy, _super); + function Multitenancy(config, webJSRecipe) { + if (webJSRecipe === void 0) { webJSRecipe = MultitenancyWebJS__default.default; } + var _this = _super.call(this, config) || this; + _this.webJSRecipe = webJSRecipe; + _this.recipeID = Multitenancy.RECIPE_ID; + _this.dynamicLoginMethodsCache = {}; + return _this; + } + Multitenancy.prototype.getCurrentDynamicLoginMethods = function (input) { + var _a; + return logger.__awaiter(this, void 0, void 0, function () { + var userContext, tenantId, tenantMethods; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (SuperTokens.usesDynamicLoginMethods === false) { + return [2 /*return*/, undefined]; + } + userContext = utils.getNormalisedUserContext(input.userContext); + return [4 /*yield*/, Multitenancy.getInstanceOrThrow().webJSRecipe.getTenantId()]; + case 1: + tenantId = (_a = (_b.sent())) !== null && _a !== void 0 ? _a : "public"; + if (this.dynamicLoginMethodsCache[tenantId] === undefined) { + this.dynamicLoginMethodsCache[tenantId] = Multitenancy.getDynamicLoginMethods({ + tenantId: tenantId, + userContext: userContext, + }); + } + return [4 /*yield*/, this.dynamicLoginMethodsCache[tenantId]]; + case 2: + tenantMethods = _b.sent(); + if (!hasIntersectingRecipes(tenantMethods, SuperTokens.getInstanceOrThrow().recipeList.filter(function (recipe) { return "firstFactorIds" in recipe; }))) { + throw new Error("Initialized recipes have no overlap with core recipes or could not load login methods"); + } + return [2 /*return*/, tenantMethods]; + } + }); + }); + }; + Multitenancy.getDynamicLoginMethods = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var _a, thirdParty, firstFactors; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, MultitenancyWebJS__default.default.getLoginMethods(input)]; + case 1: + _a = _b.sent(), thirdParty = _a.thirdParty, firstFactors = _a.firstFactors; + return [2 /*return*/, { + thirdparty: thirdParty, + firstFactors: firstFactors, + }]; + } + }); + }); + }; + Multitenancy.init = function (config) { + var normalisedConfig = normaliseMultitenancyConfig(config); + return { + recipeID: Multitenancy.RECIPE_ID, + authReact: function (appInfo) { + Multitenancy.instance = new Multitenancy(logger.__assign(logger.__assign({}, normalisedConfig), { appInfo: appInfo, recipeId: Multitenancy.RECIPE_ID })); + return Multitenancy.instance; + }, + webJS: MultitenancyWebJS__default.default.init(logger.__assign({}, normalisedConfig)), + }; + }; + Multitenancy.getInstanceOrThrow = function () { + if (Multitenancy.instance === undefined) { + var error = "No instance of Multitenancy found. Make sure to call the Multitenancy.init method." + + "See https://supertokens.io/docs/multitenancy/quick-setup/frontend"; + // eslint-disable-next-line supertokens-auth-react/no-direct-window-object + if (typeof window === "undefined") { + error = error + SSR_ERROR; + } + throw Error(error); + } + return Multitenancy.instance; + }; + /* + * Tests methods. + */ + Multitenancy.reset = function () { + if (!isTest()) { + return; + } + Multitenancy.instance = undefined; + return; + }; + Multitenancy.RECIPE_ID = "multitenancy"; + return Multitenancy; +}(BaseRecipeModule)); -var TranslationController = /** @class */ (function () { - function TranslationController() { - this.handlers = new Map(); - } - TranslationController.prototype.emit = function (event, detail) { - var handlerList = this.handlers.get(event) || []; - for (var _i = 0, handlerList_1 = handlerList; _i < handlerList_1.length; _i++) { - var h = handlerList_1[_i]; - h(event, detail); - } - }; - TranslationController.prototype.on = function (event, handler) { - var handlerList = this.handlers.get(event) || []; - this.handlers.set(event, handlerList.concat(handler)); - }; - TranslationController.prototype.off = function (event, handler) { - var handlerList = this.handlers.get(event) || []; - this.handlers.set( - event, - handlerList.filter(function (h) { - return h !== handler; - }) - ); - }; - return TranslationController; -})(); -var CURRENT_LANGUAGE_COOKIE_NAME = "sCurrLanguage"; -function saveCurrentLanguage(language, cookieDomain) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - _b.trys.push([0, 2, , 3]); - return [4 /*yield*/, setFrontendCookie(CURRENT_LANGUAGE_COOKIE_NAME, language, cookieDomain)]; - case 1: - _b.sent(); - return [3 /*break*/, 3]; - case 2: - _b.sent(); - return [3 /*break*/, 3]; - case 3: - return [2 /*return*/]; - } - }); - }); -} -function getCurrentLanguageFromCookie() { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - _b.trys.push([0, 2, , 3]); - return [4 /*yield*/, getCookieValue(CURRENT_LANGUAGE_COOKIE_NAME)]; - case 1: - return [2 /*return*/, _b.sent()]; - case 2: - _b.sent(); - // This can throw if we are not in a browser - // Since this is just loading a preference we can safely ignore the exception - return [2 /*return*/, null]; - case 3: - return [2 /*return*/]; - } - }); - }); +var TranslationController = /** @class */ (function () { + function TranslationController() { + this.handlers = new Map(); + } + TranslationController.prototype.emit = function (event, detail) { + var handlerList = this.handlers.get(event) || []; + for (var _i = 0, handlerList_1 = handlerList; _i < handlerList_1.length; _i++) { + var h = handlerList_1[_i]; + h(event, detail); + } + }; + TranslationController.prototype.on = function (event, handler) { + var handlerList = this.handlers.get(event) || []; + this.handlers.set(event, handlerList.concat(handler)); + }; + TranslationController.prototype.off = function (event, handler) { + var handlerList = this.handlers.get(event) || []; + this.handlers.set(event, handlerList.filter(function (h) { return h !== handler; })); + }; + return TranslationController; +}()); +var CURRENT_LANGUAGE_COOKIE_NAME = "sCurrLanguage"; +function saveCurrentLanguage(language, cookieDomain) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 2, , 3]); + return [4 /*yield*/, setFrontendCookie(CURRENT_LANGUAGE_COOKIE_NAME, language, cookieDomain)]; + case 1: + _b.sent(); + return [3 /*break*/, 3]; + case 2: + _b.sent(); + return [3 /*break*/, 3]; + case 3: return [2 /*return*/]; + } + }); + }); +} +function getCurrentLanguageFromCookie() { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 2, , 3]); + return [4 /*yield*/, getCookieValue(CURRENT_LANGUAGE_COOKIE_NAME)]; + case 1: return [2 /*return*/, _b.sent()]; + case 2: + _b.sent(); + // This can throw if we are not in a browser + // Since this is just loading a preference we can safely ignore the exception + return [2 /*return*/, null]; + case 3: return [2 /*return*/]; + } + }); + }); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Class. - */ -var SuperTokens = /** @class */ (function () { - /* - * Constructor. - */ - function SuperTokens(config) { - var _this = this; - var _a, _b, _c, _d; - this.recipeList = []; - this.changeLanguage = function (lang) { - return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - saveCurrentLanguage(lang, this.languageTranslations.currentLanguageCookieScope), - ]; - case 1: - _a.sent(); - this.languageTranslations.translationEventSource.emit("LanguageChange", lang); - return [2 /*return*/]; - } - }); - }); - }; - this.redirectToAuth = function (options) { - return __awaiter(_this, void 0, void 0, function () { - var queryParams, redirectUrl; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - queryParams = options.queryParams === undefined ? {} : options.queryParams; - if (options.show !== undefined) { - queryParams.show = options.show; - } - if (options.redirectBack === true) { - queryParams.redirectToPath = getCurrentNormalisedUrlPathWithQueryParamsAndFragments(); - } - return [ - 4 /*yield*/, - this.getRedirectUrl( - { - action: "TO_AUTH", - showSignIn: options.show === "signin", - tenantIdFromQueryParams: getTenantIdFromQueryParams(), - }, - options.userContext - ), - ]; - case 1: - redirectUrl = _a.sent(); - if (redirectUrl === null) { - logDebugMessage("Skipping redirection because the user override returned null"); - return [2 /*return*/]; - } - redirectUrl = appendQueryParamsToURL(redirectUrl, queryParams); - return [2 /*return*/, this.redirectToUrl(redirectUrl, options.navigate)]; - } - }); - }); - }; - this.redirectToUrl = function (redirectUrl, navigate) { - return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - doRedirection(this.appInfo, redirectUrl, navigate); - return [2 /*return*/]; - }); - }); - }; - this.redirect = function (context, navigate, queryParams, userContext) { - return __awaiter(_this, void 0, void 0, function () { - var redirectUrl; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, this.getRedirectUrl(context, getNormalisedUserContext(userContext))]; - case 1: - redirectUrl = _a.sent(); - if (redirectUrl === null) { - logDebugMessage( - "Skipping redirection because the user override returned null for context ".concat( - JSON.stringify(context, null, 2) - ) - ); - return [2 /*return*/]; - } - redirectUrl = appendQueryParamsToURL(redirectUrl, queryParams); - return [ - 2 /*return*/, - SuperTokens.getInstanceOrThrow().redirectToUrl(redirectUrl, navigate), - ]; - } - }); - }); - }; - this.appInfo = normaliseInputAppInfoOrThrowError(config.appInfo); - if (config.recipeList === undefined || config.recipeList.length === 0) { - throw new Error( - "Please provide at least one recipe to the supertokens.init function call. See https://supertokens.io/docs/emailpassword/quick-setup/frontend" - ); - } - var translationConfig = config.languageTranslations === undefined ? {} : config.languageTranslations; - this.languageTranslations = { - defaultLanguage: translationConfig.defaultLanguage === undefined ? "en" : translationConfig.defaultLanguage, - currentLanguageCookieScope: - translationConfig.currentLanguageCookieScope !== undefined - ? normaliseCookieScopeOrThrowError(translationConfig.currentLanguageCookieScope) - : getDefaultCookieScope(), - userTranslationStore: translationConfig.translations !== undefined ? translationConfig.translations : {}, - translationEventSource: new TranslationController(), - userTranslationFunc: translationConfig.translationFunc, - }; - var enableDebugLogs = Boolean(config === null || config === void 0 ? void 0 : config.enableDebugLogs); - if (enableDebugLogs) { - enableLogging(); - } - this.userGetRedirectionURL = config.getRedirectionURL; - this.recipeList = config.recipeList.map(function (_a) { - var authReact = _a.authReact; - return authReact(_this.appInfo, enableDebugLogs); - }); - this.rootStyle = (_a = config.style) !== null && _a !== void 0 ? _a : ""; - this.privacyPolicyLink = config.privacyPolicyLink; - this.termsOfServiceLink = config.termsOfServiceLink; - this.useShadowDom = (_b = config.useShadowDom) !== null && _b !== void 0 ? _b : true; - this.defaultToSignUp = (_c = config.defaultToSignUp) !== null && _c !== void 0 ? _c : false; - this.disableAuthRoute = (_d = config.disableAuthRoute) !== null && _d !== void 0 ? _d : false; - } - /* - * Static Methods. - */ - SuperTokens.init = function (config) { - var _a; - cookieHandler.CookieHandlerReference.init(config.cookieHandler); - windowHandler.WindowHandlerReference.init(config.windowHandler); - if (SuperTokens.instance !== undefined) { - console.warn("SuperTokens was already initialized"); - return; - } - SuperTokens.usesDynamicLoginMethods = - (_a = config.usesDynamicLoginMethods) !== null && _a !== void 0 ? _a : false; - var recipes = - config.recipeList.find(function (recipe) { - return recipe.recipeID === Multitenancy.RECIPE_ID; - }) !== undefined - ? config.recipeList - : config.recipeList.concat(Multitenancy.init({})); - SuperTokensWebJS__default.default.init( - exports.__assign(exports.__assign({}, config), { - recipeList: recipes.map(function (_a) { - var webJS = _a.webJS; - return webJS; - }), - }) - ); - SuperTokens.instance = new SuperTokens(exports.__assign(exports.__assign({}, config), { recipeList: recipes })); - postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.runPostInitCallbacks(); - }; - SuperTokens.getInstanceOrThrow = function () { - if (SuperTokens.instance === undefined) { - var error = "SuperTokens must be initialized before calling this method."; - // eslint-disable-next-line supertokens-auth-react/no-direct-window-object - if (typeof window === "undefined") { - error = error + SSR_ERROR; - } - throw new Error(error); - } - return SuperTokens.instance; - }; - SuperTokens.prototype.getRecipeOrThrow = function (recipeId) { - var recipe = this.recipeList.find(function (recipe) { - return recipe.config.recipeId === recipeId; - }); - if (recipe === undefined) { - throw new Error("Missing recipe: ".concat(recipeId)); - } - return recipe; - }; - SuperTokens.prototype.loadTranslation = function (store) { - this.languageTranslations.translationEventSource.emit("TranslationLoaded", store); - }; - SuperTokens.prototype.getRedirectUrl = function (context, userContext) { - var _a; - return __awaiter(this, void 0, void 0, function () { - var userRes, redirectUrl, basePath; - var _b; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - if (!this.userGetRedirectionURL) return [3 /*break*/, 2]; - return [4 /*yield*/, this.userGetRedirectionURL(context, userContext)]; - case 1: - userRes = _c.sent(); - if (userRes !== undefined) { - return [2 /*return*/, userRes]; - } - _c.label = 2; - case 2: - if (context.action === "TO_AUTH") { - redirectUrl = this.appInfo.websiteBasePath.getAsStringDangerous(); - basePath = appendTrailingSlashToURL(redirectUrl); - if (context.tenantIdFromQueryParams) { - return [ - 2 /*return*/, - appendQueryParamsToURL( - basePath, - ((_b = {}), (_b[TENANT_ID_QUERY_PARAM] = context.tenantIdFromQueryParams), _b) - ), - ]; - } - return [2 /*return*/, basePath]; - } else if (context.action === "SUCCESS") { - return [2 /*return*/, (_a = context.redirectToPath) !== null && _a !== void 0 ? _a : "/"]; - } - throw new Error("Should never come here: unexpected redirection context"); - } - }); - }); - }; - /* - * Tests methods. - */ - SuperTokens.reset = function () { - if (!isTest()) { - return; - } - SuperTokens.instance = undefined; - return; - }; - SuperTokens.usesDynamicLoginMethods = false; - return SuperTokens; -})(); -function doRedirection(appInfo, redirectUrl, navigate) { - try { - new URL(redirectUrl); // If full URL, no error thrown, skip in app redirection. - } catch (e) { - // For multi tenancy, If mismatch between websiteDomain and current location, prepend URL relative path with websiteDomain. - var origin_1 = getOriginOfPage().getAsStringDangerous(); - if (origin_1 !== appInfo.websiteDomain.getAsStringDangerous()) { - redirectUrl = "".concat(appInfo.websiteDomain.getAsStringDangerous()).concat(redirectUrl); - redirectWithFullPageReload(redirectUrl); - return; - } - // If navigate was provided, use to redirect without reloading. - if (navigate !== undefined) { - redirectWithNavigate(redirectUrl, navigate); - return; - } - } - // Otherwise, redirect in app. - redirectWithFullPageReload(redirectUrl); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Class. + */ +var SuperTokens = /** @class */ (function () { + /* + * Constructor. + */ + function SuperTokens(config) { + var _this = this; + var _a, _b, _c, _d; + this.recipeList = []; + this.changeLanguage = function (lang) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, saveCurrentLanguage(lang, this.languageTranslations.currentLanguageCookieScope)]; + case 1: + _a.sent(); + this.languageTranslations.translationEventSource.emit("LanguageChange", lang); + return [2 /*return*/]; + } + }); + }); }; + this.redirectToAuth = function (options) { return logger.__awaiter(_this, void 0, void 0, function () { + var queryParams, redirectUrl; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + queryParams = options.queryParams === undefined ? {} : options.queryParams; + if (options.show !== undefined) { + queryParams.show = options.show; + } + if (options.redirectBack === true) { + queryParams.redirectToPath = getCurrentNormalisedUrlPathWithQueryParamsAndFragments(); + } + return [4 /*yield*/, this.getRedirectUrl({ + action: "TO_AUTH", + showSignIn: options.show === "signin", + tenantIdFromQueryParams: getTenantIdFromQueryParams(), + }, options.userContext)]; + case 1: + redirectUrl = _a.sent(); + if (redirectUrl === null) { + logger.logDebugMessage("Skipping redirection because the user override returned null"); + return [2 /*return*/]; + } + redirectUrl = appendQueryParamsToURL(redirectUrl, queryParams); + return [2 /*return*/, this.redirectToUrl(redirectUrl, options.navigate)]; + } + }); + }); }; + this.redirectToUrl = function (redirectUrl, navigate) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + doRedirection(this.appInfo, redirectUrl, navigate); + return [2 /*return*/]; + }); + }); }; + this.redirect = function (context, navigate, queryParams, userContext) { return logger.__awaiter(_this, void 0, void 0, function () { + var redirectUrl; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getRedirectUrl(context, getNormalisedUserContext(userContext))]; + case 1: + redirectUrl = _a.sent(); + if (redirectUrl === null) { + logger.logDebugMessage("Skipping redirection because the user override returned null for context ".concat(JSON.stringify(context, null, 2))); + return [2 /*return*/]; + } + redirectUrl = appendQueryParamsToURL(redirectUrl, queryParams); + return [2 /*return*/, SuperTokens.getInstanceOrThrow().redirectToUrl(redirectUrl, navigate)]; + } + }); + }); }; + this.appInfo = normaliseInputAppInfoOrThrowError(config.appInfo); + if (config.recipeList === undefined || config.recipeList.length === 0) { + throw new Error("Please provide at least one recipe to the supertokens.init function call. See https://supertokens.io/docs/emailpassword/quick-setup/frontend"); + } + var translationConfig = config.languageTranslations === undefined ? {} : config.languageTranslations; + this.languageTranslations = { + defaultLanguage: translationConfig.defaultLanguage === undefined ? "en" : translationConfig.defaultLanguage, + currentLanguageCookieScope: translationConfig.currentLanguageCookieScope !== undefined + ? normaliseCookieScopeOrThrowError(translationConfig.currentLanguageCookieScope) + : getDefaultCookieScope(), + userTranslationStore: translationConfig.translations !== undefined ? translationConfig.translations : {}, + translationEventSource: new TranslationController(), + userTranslationFunc: translationConfig.translationFunc, + }; + var enableDebugLogs = Boolean(config === null || config === void 0 ? void 0 : config.enableDebugLogs); + if (enableDebugLogs) { + logger.enableLogging(); + } + this.userGetRedirectionURL = config.getRedirectionURL; + this.recipeList = config.recipeList.map(function (_a) { + var authReact = _a.authReact; + return authReact(_this.appInfo, enableDebugLogs); + }); + this.rootStyle = (_a = config.style) !== null && _a !== void 0 ? _a : ""; + this.privacyPolicyLink = config.privacyPolicyLink; + this.termsOfServiceLink = config.termsOfServiceLink; + this.useShadowDom = (_b = config.useShadowDom) !== null && _b !== void 0 ? _b : true; + this.defaultToSignUp = (_c = config.defaultToSignUp) !== null && _c !== void 0 ? _c : false; + this.disableAuthRoute = (_d = config.disableAuthRoute) !== null && _d !== void 0 ? _d : false; + } + /* + * Static Methods. + */ + SuperTokens.init = function (config) { + var _a; + cookieHandler.CookieHandlerReference.init(config.cookieHandler); + windowHandler.WindowHandlerReference.init(config.windowHandler); + if (SuperTokens.instance !== undefined) { + console.warn("SuperTokens was already initialized"); + return; + } + SuperTokens.usesDynamicLoginMethods = (_a = config.usesDynamicLoginMethods) !== null && _a !== void 0 ? _a : false; + var recipes = config.recipeList.find(function (recipe) { return recipe.recipeID === Multitenancy.RECIPE_ID; }) !== undefined + ? config.recipeList + : config.recipeList.concat(Multitenancy.init({})); + SuperTokensWebJS__default.default.init(logger.__assign(logger.__assign({}, config), { recipeList: recipes.map(function (_a) { + var webJS = _a.webJS; + return webJS; + }) })); + SuperTokens.instance = new SuperTokens(logger.__assign(logger.__assign({}, config), { recipeList: recipes })); + postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.runPostInitCallbacks(); + }; + SuperTokens.getInstanceOrThrow = function () { + if (SuperTokens.instance === undefined) { + var error = "SuperTokens must be initialized before calling this method."; + // eslint-disable-next-line supertokens-auth-react/no-direct-window-object + if (typeof window === "undefined") { + error = error + SSR_ERROR; + } + throw new Error(error); + } + return SuperTokens.instance; + }; + SuperTokens.prototype.getRecipeOrThrow = function (recipeId) { + var recipe = this.recipeList.find(function (recipe) { + return recipe.config.recipeId === recipeId; + }); + if (recipe === undefined) { + throw new Error("Missing recipe: ".concat(recipeId)); + } + return recipe; + }; + SuperTokens.prototype.loadTranslation = function (store) { + this.languageTranslations.translationEventSource.emit("TranslationLoaded", store); + }; + SuperTokens.prototype.getRedirectUrl = function (context, userContext) { + var _a; + return logger.__awaiter(this, void 0, void 0, function () { + var userRes, redirectUrl, basePath; + var _b; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + if (!this.userGetRedirectionURL) return [3 /*break*/, 2]; + return [4 /*yield*/, this.userGetRedirectionURL(context, userContext)]; + case 1: + userRes = _c.sent(); + if (userRes !== undefined) { + return [2 /*return*/, userRes]; + } + _c.label = 2; + case 2: + if (context.action === "TO_AUTH") { + redirectUrl = this.appInfo.websiteBasePath.getAsStringDangerous(); + basePath = appendTrailingSlashToURL(redirectUrl); + if (context.tenantIdFromQueryParams) { + return [2 /*return*/, appendQueryParamsToURL(basePath, (_b = {}, _b[TENANT_ID_QUERY_PARAM] = context.tenantIdFromQueryParams, _b))]; + } + return [2 /*return*/, basePath]; + } + else if (context.action === "SUCCESS") { + return [2 /*return*/, (_a = context.redirectToPath) !== null && _a !== void 0 ? _a : "/"]; + } + throw new Error("Should never come here: unexpected redirection context"); + } + }); + }); + }; + /* + * Tests methods. + */ + SuperTokens.reset = function () { + if (!isTest()) { + return; + } + SuperTokens.instance = undefined; + return; + }; + SuperTokens.usesDynamicLoginMethods = false; + return SuperTokens; +}()); +function doRedirection(appInfo, redirectUrl, navigate) { + try { + new URL(redirectUrl); // If full URL, no error thrown, skip in app redirection. + } + catch (e) { + // For multi tenancy, If mismatch between websiteDomain and current location, prepend URL relative path with websiteDomain. + var origin_1 = getOriginOfPage().getAsStringDangerous(); + if (origin_1 !== appInfo.websiteDomain.getAsStringDangerous()) { + redirectUrl = "".concat(appInfo.websiteDomain.getAsStringDangerous()).concat(redirectUrl); + redirectWithFullPageReload(redirectUrl); + return; + } + // If navigate was provided, use to redirect without reloading. + if (navigate !== undefined) { + redirectWithNavigate(redirectUrl, navigate); + return; + } + } + // Otherwise, redirect in app. + redirectWithFullPageReload(redirectUrl); } -var createGenericComponentsOverrideContext = function (v) { - if (v === void 0) { - v = {}; - } - var genericContext = React__default.default.createContext(v); - var useComponentsOverrideContext = function () { - return React__default.default.useContext(genericContext); - }; - var Provider = function (_a) { - var children = _a.children, - components = _a.components; - return jsxRuntime.jsx(genericContext.Provider, exports.__assign({ value: components }, { children: children })); - }; - return [useComponentsOverrideContext, Provider, genericContext.Consumer]; +var createGenericComponentsOverrideContext = function (v) { + if (v === void 0) { v = {}; } + var genericContext = React__default.default.createContext(v); + var useComponentsOverrideContext = function () { + return React__default.default.useContext(genericContext); + }; + var Provider = function (_a) { + var children = _a.children, components = _a.components; + return jsxRuntime.jsx(genericContext.Provider, logger.__assign({ value: components }, { children: children })); + }; + return [useComponentsOverrideContext, Provider, genericContext.Consumer]; }; exports.BaseRecipeModule = BaseRecipeModule; @@ -1477,11 +1023,6 @@ exports.Multitenancy = Multitenancy; exports.SSR_ERROR = SSR_ERROR; exports.ST_ROOT_ID = ST_ROOT_ID; exports.SuperTokens = SuperTokens; -exports.__awaiter = __awaiter; -exports.__extends = __extends; -exports.__generator = __generator; -exports.__rest = __rest; -exports.__spreadArray = __spreadArray; exports.appendQueryParamsToURL = appendQueryParamsToURL; exports.clearErrorQueryParam = clearErrorQueryParam; exports.clearQueryParams = clearQueryParams; @@ -1497,7 +1038,6 @@ exports.getRedirectToPathFromURL = getRedirectToPathFromURL; exports.getTenantIdFromQueryParams = getTenantIdFromQueryParams; exports.getURLHash = getURLHash; exports.isTest = isTest; -exports.logDebugMessage = logDebugMessage; exports.matchRecipeIdUsingQueryParams = matchRecipeIdUsingQueryParams; exports.mergeObjects = mergeObjects; exports.normaliseRecipeModuleConfig = normaliseRecipeModuleConfig; diff --git a/lib/build/index.d.ts b/lib/build/index.d.ts index 3e0395d4b..a805832c5 100644 --- a/lib/build/index.d.ts +++ b/lib/build/index.d.ts @@ -1,35 +1,33 @@ -/// -import type { TranslationStore } from "./translation/translationHelpers"; -import type { Navigate, SuperTokensConfig, UserContext } from "./types"; -export default class SuperTokensAPIWrapper { - static SuperTokensWrapper: import("react").FC< - import("react").PropsWithChildren<{ - userContext?: UserContext | undefined; - }> - >; - static init(config: SuperTokensConfig): void; - static changeLanguage(language: string): Promise; - static loadTranslation(store: TranslationStore): void; - static redirectToAuth: (options?: { - show?: "signin" | "signup"; - navigate?: Navigate; - queryParams?: any; - redirectBack?: boolean; - userContext?: UserContext; - }) => Promise; - static useTranslation: () => import("./translation/translationHelpers").TranslationFunc; - static useUserContext: () => UserContext; -} -export declare const init: typeof SuperTokensAPIWrapper.init; -export declare const changeLanguage: typeof SuperTokensAPIWrapper.changeLanguage; -export declare const loadTranslation: typeof SuperTokensAPIWrapper.loadTranslation; -export declare const redirectToAuth: (options?: { - show?: "signin" | "signup"; - navigate?: Navigate; - queryParams?: any; - redirectBack?: boolean; - userContext?: UserContext; -}) => Promise; -export { SuperTokensWrapper } from "./components/supertokensWrapper"; -export { useTranslation } from "./translation/translationContext"; -export { useUserContext } from "./usercontext"; +/// +import type { TranslationStore } from "./translation/translationHelpers"; +import type { Navigate, SuperTokensConfig, UserContext } from "./types"; +export default class SuperTokensAPIWrapper { + static SuperTokensWrapper: import("react").FC>; + static init(config: SuperTokensConfig): void; + static changeLanguage(language: string): Promise; + static loadTranslation(store: TranslationStore): void; + static redirectToAuth: (options?: { + show?: "signin" | "signup"; + navigate?: Navigate; + queryParams?: any; + redirectBack?: boolean; + userContext?: UserContext; + }) => Promise; + static useTranslation: () => import("./translation/translationHelpers").TranslationFunc; + static useUserContext: () => UserContext; +} +export declare const init: typeof SuperTokensAPIWrapper.init; +export declare const changeLanguage: typeof SuperTokensAPIWrapper.changeLanguage; +export declare const loadTranslation: typeof SuperTokensAPIWrapper.loadTranslation; +export declare const redirectToAuth: (options?: { + show?: "signin" | "signup"; + navigate?: Navigate; + queryParams?: any; + redirectBack?: boolean; + userContext?: UserContext; +}) => Promise; +export { SuperTokensWrapper } from "./components/supertokensWrapper"; +export { useTranslation } from "./translation/translationContext"; +export { useUserContext } from "./usercontext"; diff --git a/lib/build/index.js b/lib/build/index.js index b2a26c6c8..ba1b8db53 100644 --- a/lib/build/index.js +++ b/lib/build/index.js @@ -1,32 +1,35 @@ -"use strict"; +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +require('./logger.js'); +var uiEntry = require('./index2.js'); +require('./genericComponentOverrideContext.js'); +var translationContext = require('./translationContext.js'); +require('react/jsx-runtime'); +require('react'); +require('supertokens-web-js/utils/normalisedURLPath'); +require('supertokens-web-js/utils/windowHandler'); +require('react-dom'); +require('./multitenancy-shared.js'); +require('./multifactorauth-shared2.js'); +require('supertokens-web-js/recipe/multifactorauth'); +require('supertokens-web-js/utils'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('./recipeModule-shared.js'); +require('./multifactorauth-shared.js'); +require('supertokens-web-js/recipe/session'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./authRecipe-shared.js'); +require('supertokens-web-js/lib/build/normalisedURLPath'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils/normalisedURLDomain'); -Object.defineProperty(exports, "__esModule", { value: true }); -require("./genericComponentOverrideContext.js"); -var uiEntry = require("./index2.js"); -var translationContext = require("./translationContext.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("react"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("supertokens-web-js/utils/normalisedURLPath"); -require("react/jsx-runtime"); -require("react-dom"); -require("./multitenancy-shared.js"); -require("./multifactorauth-shared2.js"); -require("supertokens-web-js/recipe/multifactorauth"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("./recipeModule-shared.js"); -require("./multifactorauth-shared.js"); -require("supertokens-web-js/recipe/session"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./authRecipe-shared.js"); -require("supertokens-web-js/lib/build/normalisedURLPath"); exports.SuperTokensWrapper = uiEntry.SuperTokensWrapper; exports.changeLanguage = uiEntry.changeLanguage; diff --git a/lib/build/index2.js b/lib/build/index2.js index 81099efc5..ba668285d 100644 --- a/lib/build/index2.js +++ b/lib/build/index2.js @@ -1,2762 +1,1541 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var React = require("react"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var translationContext = require("./translationContext.js"); -var windowHandler = require("supertokens-web-js/utils/windowHandler"); -var reactDom = require("react-dom"); -var componentOverrideContext = require("./multitenancy-shared.js"); -var recipe$1 = require("./multifactorauth-shared2.js"); -var types = require("./multifactorauth-shared.js"); -var recipe = require("./oauth2provider-shared.js"); -var utils = require("./authRecipe-shared.js"); -var NormalisedURLPath$1 = require("supertokens-web-js/lib/build/normalisedURLPath"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +var React = require('react'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var NormalisedURLPath = require('supertokens-web-js/utils/normalisedURLPath'); +var translationContext = require('./translationContext.js'); +var windowHandler = require('supertokens-web-js/utils/windowHandler'); +var reactDom = require('react-dom'); +var componentOverrideContext = require('./multitenancy-shared.js'); +var recipe$1 = require('./multifactorauth-shared2.js'); +var types = require('./multifactorauth-shared.js'); +var recipe = require('./oauth2provider-shared.js'); +var utils = require('./authRecipe-shared.js'); +var NormalisedURLPath$1 = require('supertokens-web-js/lib/build/normalisedURLPath'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var React__default = /*#__PURE__*/ _interopDefault(React); -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var NormalisedURLPath__default$1 = /*#__PURE__*/ _interopDefault(NormalisedURLPath$1); +var React__default = /*#__PURE__*/_interopDefault(React); +var NormalisedURLPath__default = /*#__PURE__*/_interopDefault(NormalisedURLPath); +var NormalisedURLPath__default$1 = /*#__PURE__*/_interopDefault(NormalisedURLPath$1); var ComponentOverrideContext = React__default.default.createContext("IS_DEFAULT"); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function SpinnerIcon() { - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { version: "1.1", viewBox: "25 25 50 50", "data-supertokens": "spinnerIcon" }, - { - children: jsxRuntime.jsxs( - "circle", - genericComponentOverrideContext.__assign( - { - cx: "50", - cy: "50", - r: "20", - fill: "none", - stroke: "rgb(var(--palette-primary))", - strokeWidth: "5", - strokeLinecap: "round", - strokeDashoffset: "0", - strokeDasharray: "100, 200", - }, - { - children: [ - jsxRuntime.jsx("animateTransform", { - attributeName: "transform", - attributeType: "XML", - type: "rotate", - from: "0 50 50", - to: "360 50 50", - dur: "4s", - repeatCount: "indefinite", - }), - jsxRuntime.jsx("animate", { - attributeName: "stroke-dashoffset", - values: "0;-30;-124", - dur: "2s", - repeatCount: "indefinite", - }), - jsxRuntime.jsx("animate", { - attributeName: "stroke-dasharray", - values: "0,200;110,200;110,200", - dur: "2s", - repeatCount: "indefinite", - }), - ], - } - ) - ), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function SpinnerIcon() { + return (jsxRuntime.jsx("svg", logger.__assign({ version: "1.1", viewBox: "25 25 50 50", "data-supertokens": "spinnerIcon" }, { children: jsxRuntime.jsxs("circle", logger.__assign({ cx: "50", cy: "50", r: "20", fill: "none", stroke: "rgb(var(--palette-primary))", strokeWidth: "5", strokeLinecap: "round", strokeDashoffset: "0", strokeDasharray: "100, 200" }, { children: [jsxRuntime.jsx("animateTransform", { attributeName: "transform", attributeType: "XML", type: "rotate", from: "0 50 50", to: "360 50 50", dur: "4s", repeatCount: "indefinite" }), jsxRuntime.jsx("animate", { attributeName: "stroke-dashoffset", values: "0;-30;-124", dur: "2s", repeatCount: "indefinite" }), jsxRuntime.jsx("animate", { attributeName: "stroke-dasharray", values: "0,200;110,200;110,200", dur: "2s", repeatCount: "indefinite" })] })) }))); } -var useComponentOverride = function (overrideKey) { - var ctx = React.useContext(ComponentOverrideContext); - if (ctx === "IS_DEFAULT") { - throw new Error("Cannot use component override outside ComponentOverrideContext provider."); - } - var OverrideComponent = ctx[overrideKey]; - return OverrideComponent === undefined ? null : OverrideComponent; +var useComponentOverride = function (overrideKey) { + var ctx = React.useContext(ComponentOverrideContext); + if (ctx === "IS_DEFAULT") { + throw new Error("Cannot use component override outside ComponentOverrideContext provider."); + } + var OverrideComponent = ctx[overrideKey]; + return OverrideComponent === undefined ? null : OverrideComponent; }; -var withOverride = function (overrideKey, DefaultComponent) { - var finalKey = overrideKey + "_Override"; - DefaultComponent.displayName = finalKey; - return function (props) { - var OverrideComponent = useComponentOverride(finalKey); - if (OverrideComponent !== null) { - return jsxRuntime.jsx( - OverrideComponent, - genericComponentOverrideContext.__assign({ DefaultComponent: DefaultComponent }, props) - ); - } - return jsxRuntime.jsx(DefaultComponent, genericComponentOverrideContext.__assign({}, props)); - }; +var withOverride = function (overrideKey, DefaultComponent) { + var finalKey = overrideKey + "_Override"; + DefaultComponent.displayName = finalKey; + return function (props) { + var OverrideComponent = useComponentOverride(finalKey); + if (OverrideComponent !== null) { + return jsxRuntime.jsx(OverrideComponent, logger.__assign({ DefaultComponent: DefaultComponent }, props)); + } + return jsxRuntime.jsx(DefaultComponent, logger.__assign({}, props)); + }; }; -var styles$1 = - '[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n/*\n * Default styles.\n */\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~="container"] {\n font-family: "Arial", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="secondaryText"] strong {\n font-weight: 600;\n}\n[data-supertokens~="divider"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~="linkButton"] {\n font-family: "Arial", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~="button"] {\n font-family: "Arial", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n[data-supertokens~="delayedRender"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~="footerLinkGroupVert"] > div {\n cursor: pointer;\n margin: 0;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n[data-supertokens~="withBackButton"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~="dividerWithOr"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="dividerText"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n[data-supertokens~="formLabelWithLinkWrapper"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~="formLabelLinkBtn"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n[data-supertokens~="formLabelLinkBtn"]:hover {\n text-decoration: underline;\n}\n[data-supertokens~="formLabelLinkBtn"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n[data-supertokens~="authComponentList"] {\n padding-bottom: 20px;\n}\n[data-supertokens~="authPageTitleOAuthClient"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n[data-supertokens~="authPageTitleOAuthClientUrl"] {\n text-decoration: none;\n}\n[data-supertokens~="authPageTitleOAuthClientLogo"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n[data-supertokens~="authPageTitleOAuthClient"] [data-supertokens~="authPageTitleOAuthClientName"] {\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="buttonWithArrow"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n[data-supertokens~="buttonWithArrow"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryText"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithRightArrow"] ~ svg {\n position: relative;\n left: 2px;\n}\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n position: relative;\n left: -2px;\n}\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n display: flex;\n align-items: center;\n}\n'; +var styles$1 = "[data-supertokens~=\"container\"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n/*\n * Default styles.\n */\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~=\"container\"] {\n font-family: \"Arial\", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~=\"container\"] {\n width: 95vw;\n }\n}\n[data-supertokens~=\"row\"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~=\"superTokensBranding\"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~=\"generalError\"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~=\"headerTitle\"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~=\"headerSubtitle\"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n[data-supertokens~=\"headerSubtitle\"][data-supertokens~=\"secondaryText\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~=\"link\"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~=\"primaryText\"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~=\"secondaryText\"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~=\"secondaryText\"] strong {\n font-weight: 600;\n}\n[data-supertokens~=\"divider\"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n[data-supertokens~=\"headerTinyTitle\"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~=\"secondaryLinkWithArrow\"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~=\"generalSuccess\"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~=\"spinner\"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~=\"error\"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~=\"linkButton\"] {\n font-family: \"Arial\", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~=\"button\"] {\n font-family: \"Arial\", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~=\"button\"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~=\"button\"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n[data-supertokens~=\"button\"]:focus {\n outline: none;\n}\n[data-supertokens~=\"backButtonCommon\"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~=\"backButton\"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~=\"backButtonPlaceholder\"] {\n display: block;\n}\n[data-supertokens~=\"delayedRender\"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~=\"footerLinkGroupVert\"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] > div {\n cursor: pointer;\n margin: 0;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 400;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~=\"footerLinkGroupVert\"] {\n flex-direction: column;\n }\n [data-supertokens~=\"footerLinkGroupVert\"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~=\"footerLinkGroupVert\"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n[data-supertokens~=\"withBackButton\"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~=\"dividerWithOr\"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~=\"dividerText\"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n[data-supertokens~=\"formLabelWithLinkWrapper\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~=\"formLabelLinkBtn\"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n[data-supertokens~=\"formLabelLinkBtn\"]:hover {\n text-decoration: underline;\n}\n[data-supertokens~=\"formLabelLinkBtn\"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n[data-supertokens~=\"authComponentList\"] {\n padding-bottom: 20px;\n}\n[data-supertokens~=\"authPageTitleOAuthClient\"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n[data-supertokens~=\"authPageTitleOAuthClientUrl\"] {\n text-decoration: none;\n}\n[data-supertokens~=\"authPageTitleOAuthClientLogo\"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n[data-supertokens~=\"authPageTitleOAuthClient\"] [data-supertokens~=\"authPageTitleOAuthClientName\"] {\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~=\"buttonWithArrow\"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithRightArrow\"] ~ svg {\n position: relative;\n left: 2px;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n position: relative;\n left: -2px;\n}\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n display: flex;\n align-items: center;\n}\n"; -var ThemeBase$1 = function (_a) { - var children = _a.children, - userStyles = _a.userStyles; - return jsxRuntime.jsxs(React.Fragment, { - children: [children, jsxRuntime.jsxs("style", { children: [styles$1, userStyles.join("\n")] })], - }); +var ThemeBase$1 = function (_a) { + var children = _a.children, userStyles = _a.userStyles; + return (jsxRuntime.jsxs(React.Fragment, { children: [children, jsxRuntime.jsxs("style", { children: [styles$1, userStyles.join("\n")] })] })); }; -var MultitenancyDynamicLoginMethodsSpinnerTheme = function () { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container delayedRender" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "spinner delayedRender" }, - { children: jsxRuntime.jsx(SpinnerIcon, {}) } - ) - ), - } - ) - ), - } - ) - ); -}; -var DynamicLoginMethodsSpinnerThemeWithOverride = withOverride( - "MultitenancyDynamicLoginMethodsSpinnerTheme", - MultitenancyDynamicLoginMethodsSpinnerTheme -); -var DynamicLoginMethodsSpinnerTheme = function (props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - return jsxRuntime.jsx( - ThemeBase$1, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle] }, - { children: jsxRuntime.jsx(DynamicLoginMethodsSpinnerThemeWithOverride, {}) } - ) - ); +var MultitenancyDynamicLoginMethodsSpinnerTheme = function () { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container delayedRender" }, { children: jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "row" }, { children: jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "spinner delayedRender" }, { children: jsxRuntime.jsx(SpinnerIcon, {}) })) })) }))); +}; +var DynamicLoginMethodsSpinnerThemeWithOverride = withOverride("MultitenancyDynamicLoginMethodsSpinnerTheme", MultitenancyDynamicLoginMethodsSpinnerTheme); +var DynamicLoginMethodsSpinnerTheme = function (props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + return (jsxRuntime.jsx(ThemeBase$1, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle] }, { children: jsxRuntime.jsx(DynamicLoginMethodsSpinnerThemeWithOverride, {}) }))); }; -// TODO: move this to the root components dir and rename (incl. the override) -// This is a special "feature" component: -// - it's used inside FeatureWrapper & RoutingComponent (meaning it can't use FeatureWrapper) -// - it's not used in any specific route (multitenancy doesn't have a pre-built UI) -var DynamicLoginMethodsSpinner = function () { - var recipe = genericComponentOverrideContext.Multitenancy.getInstanceOrThrow(); - var recipeComponentOverrides = componentOverrideContext.useContext(); - return jsxRuntime.jsx( - ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - WithOrWithoutShadowDom, - genericComponentOverrideContext.__assign( - { useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom }, - { children: jsxRuntime.jsx(DynamicLoginMethodsSpinnerTheme, { config: recipe.config }) } - ) - ), - } - ) - ); +// TODO: move this to the root components dir and rename (incl. the override) +// This is a special "feature" component: +// - it's used inside FeatureWrapper & RoutingComponent (meaning it can't use FeatureWrapper) +// - it's not used in any specific route (multitenancy doesn't have a pre-built UI) +var DynamicLoginMethodsSpinner = function () { + var recipe = genericComponentOverrideContext.Multitenancy.getInstanceOrThrow(); + var recipeComponentOverrides = componentOverrideContext.useContext(); + return (jsxRuntime.jsx(ComponentOverrideContext.Provider, logger.__assign({ value: recipeComponentOverrides }, { children: jsxRuntime.jsx(WithOrWithoutShadowDom, logger.__assign({ useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom }, { children: jsxRuntime.jsx(DynamicLoginMethodsSpinnerTheme, { config: recipe.config }) })) }))); }; -var dynamicLoginMethodsContext = React__default.default.createContext(undefined); -var useDynamicLoginMethods = function () { - var value = React__default.default.useContext(dynamicLoginMethodsContext); - if (value === undefined) { - throw new Error("useDynamicLoginMethods used outside of a valid provider (FeatureWrapper)"); - } - return value; -}; -var DynamicLoginMethodsProvider = function (_a) { - var value = _a.value, - children = _a.children; - var contextValue = value === undefined ? { loaded: false } : { loaded: true, loginMethods: value }; - return jsxRuntime.jsx( - dynamicLoginMethodsContext.Provider, - genericComponentOverrideContext.__assign({ value: contextValue }, { children: children }) - ); +var dynamicLoginMethodsContext = React__default.default.createContext(undefined); +var useDynamicLoginMethods = function () { + var value = React__default.default.useContext(dynamicLoginMethodsContext); + if (value === undefined) { + throw new Error("useDynamicLoginMethods used outside of a valid provider (FeatureWrapper)"); + } + return value; +}; +var DynamicLoginMethodsProvider = function (_a) { + var value = _a.value, children = _a.children; + var contextValue = value === undefined ? { loaded: false } : { loaded: true, loginMethods: value }; + return jsxRuntime.jsx(dynamicLoginMethodsContext.Provider, logger.__assign({ value: contextValue }, { children: children })); }; -var UserContextContext = React__default.default.createContext(undefined); -var useUserContext = function () { - return React__default.default.useContext(UserContextContext); -}; -var UserContextProvider = function (_a) { - var children = _a.children, - userContext = _a.userContext; - var currentUserContext = React.useState(genericComponentOverrideContext.getNormalisedUserContext(userContext))[0]; - return jsxRuntime.jsx( - UserContextContext.Provider, - genericComponentOverrideContext.__assign({ value: currentUserContext }, { children: children }) - ); +var UserContextContext = React__default.default.createContext(undefined); +var useUserContext = function () { + return React__default.default.useContext(UserContextContext); +}; +var UserContextProvider = function (_a) { + var children = _a.children, userContext = _a.userContext; + var currentUserContext = React.useState(genericComponentOverrideContext.getNormalisedUserContext(userContext))[0]; + return jsxRuntime.jsx(UserContextContext.Provider, logger.__assign({ value: currentUserContext }, { children: children })); }; -function FeatureWrapper(_a) { - var children = _a.children, - useShadowDom = _a.useShadowDom, - defaultStore = _a.defaultStore; - var userContext = useUserContext(); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var _b = React.useState(undefined), - loadedDynamicLoginMethods = _b[0], - setLoadedDynamicLoginMethods = _b[1]; - var st = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow(); - React.useEffect( - function () { - if (loadedDynamicLoginMethods) { - return; - } - genericComponentOverrideContext.Multitenancy.getInstanceOrThrow() - .getCurrentDynamicLoginMethods({ userContext: userContext }) - .then( - function (loginMethods) { - return setLoadedDynamicLoginMethods(loginMethods); - }, - function (err) { - return rethrowInRender(err); - } - ); - }, - [loadedDynamicLoginMethods, setLoadedDynamicLoginMethods] - ); - if (genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods && !loadedDynamicLoginMethods) { - return jsxRuntime.jsx(DynamicLoginMethodsSpinner, {}); - } - return jsxRuntime.jsx( - DynamicLoginMethodsProvider, - genericComponentOverrideContext.__assign( - { value: loadedDynamicLoginMethods }, - { - children: jsxRuntime.jsx( - translationContext.TranslationContextProvider, - genericComponentOverrideContext.__assign( - { - defaultLanguage: st.languageTranslations.defaultLanguage, - defaultStore: genericComponentOverrideContext.mergeObjects( - defaultStore, - st.languageTranslations.userTranslationStore - ), - translationControlEventSource: st.languageTranslations.translationEventSource, - userTranslationFunc: st.languageTranslations.userTranslationFunc, - }, - { - children: jsxRuntime.jsx( - WithOrWithoutShadowDom, - genericComponentOverrideContext.__assign( - { useShadowDom: useShadowDom }, - { children: children } - ) - ), - } - ) - ), - } - ) - ); -} -function WithShadowDom(_a) { - var children = _a.children; - var rootDiv = React.useRef(null); - var _b = React.useState(), - shadowRoot = _b[0], - setShadowRoot = _b[1]; - React.useEffect( - function () { - if (rootDiv.current) { - // defaults from react-shadow - setShadowRoot(function (os) { - return ( - os || - rootDiv.current.shadowRoot || - rootDiv.current.attachShadow({ mode: "open", delegatesFocus: false }) - ); - }); - } - }, - [rootDiv] - ); - // Otherwise, use shadow dom. - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { id: genericComponentOverrideContext.ST_ROOT_ID, ref: rootDiv }, - { children: shadowRoot && reactDom.createPortal(children, shadowRoot) } - ) - ); -} -function WithOrWithoutShadowDom(_a) { - var children = _a.children, - useShadowDom = _a.useShadowDom; - // If explicitely specified to not use shadow dom. - if (useShadowDom === false) { - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { id: genericComponentOverrideContext.ST_ROOT_ID }, - { children: [children, jsxRuntime.jsx(DisableAutoFillInput, {})] } - ) - ); - } - return jsxRuntime.jsxs(WithShadowDom, { children: [children, jsxRuntime.jsx(DisableAutoFillInput, {})] }); -} -function DisableAutoFillInput() { - /* eslint-disable react/jsx-no-literals */ - return jsxRuntime.jsx( - "style", - genericComponentOverrideContext.__assign( - { type: "text/css" }, - { - children: - "input.supertokens-input:-webkit-autofill,input.supertokens-input:-webkit-autofill:focus,input.supertokens-input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:focus,textarea:-webkit-autofill:hover{transition:background-color 5000s ease-in-out 0s}", - } - ) - ); - /* eslint-enable react/jsx-no-literals */ +function FeatureWrapper(_a) { + var children = _a.children, useShadowDom = _a.useShadowDom, defaultStore = _a.defaultStore; + var userContext = useUserContext(); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var _b = React.useState(undefined), loadedDynamicLoginMethods = _b[0], setLoadedDynamicLoginMethods = _b[1]; + var st = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow(); + React.useEffect(function () { + if (loadedDynamicLoginMethods) { + return; + } + genericComponentOverrideContext.Multitenancy.getInstanceOrThrow() + .getCurrentDynamicLoginMethods({ userContext: userContext }) + .then(function (loginMethods) { return setLoadedDynamicLoginMethods(loginMethods); }, function (err) { return rethrowInRender(err); }); + }, [loadedDynamicLoginMethods, setLoadedDynamicLoginMethods]); + if (genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods && !loadedDynamicLoginMethods) { + return jsxRuntime.jsx(DynamicLoginMethodsSpinner, {}); + } + return (jsxRuntime.jsx(DynamicLoginMethodsProvider, logger.__assign({ value: loadedDynamicLoginMethods }, { children: jsxRuntime.jsx(translationContext.TranslationContextProvider, logger.__assign({ defaultLanguage: st.languageTranslations.defaultLanguage, defaultStore: genericComponentOverrideContext.mergeObjects(defaultStore, st.languageTranslations.userTranslationStore), translationControlEventSource: st.languageTranslations.translationEventSource, userTranslationFunc: st.languageTranslations.userTranslationFunc }, { children: jsxRuntime.jsx(WithOrWithoutShadowDom, logger.__assign({ useShadowDom: useShadowDom }, { children: children })) })) }))); +} +function WithShadowDom(_a) { + var children = _a.children; + var rootDiv = React.useRef(null); + var _b = React.useState(), shadowRoot = _b[0], setShadowRoot = _b[1]; + React.useEffect(function () { + if (rootDiv.current) { + // defaults from react-shadow + setShadowRoot(function (os) { + return os || + rootDiv.current.shadowRoot || + rootDiv.current.attachShadow({ mode: "open", delegatesFocus: false }); + }); + } + }, [rootDiv]); + // Otherwise, use shadow dom. + return (jsxRuntime.jsx("div", logger.__assign({ id: genericComponentOverrideContext.ST_ROOT_ID, ref: rootDiv }, { children: shadowRoot && reactDom.createPortal(children, shadowRoot) }))); +} +function WithOrWithoutShadowDom(_a) { + var children = _a.children, useShadowDom = _a.useShadowDom; + // If explicitely specified to not use shadow dom. + if (useShadowDom === false) { + return (jsxRuntime.jsxs("div", logger.__assign({ id: genericComponentOverrideContext.ST_ROOT_ID }, { children: [children, jsxRuntime.jsx(DisableAutoFillInput, {})] }))); + } + return (jsxRuntime.jsxs(WithShadowDom, { children: [children, jsxRuntime.jsx(DisableAutoFillInput, {})] })); +} +function DisableAutoFillInput() { + /* eslint-disable react/jsx-no-literals */ + return (jsxRuntime.jsx("style", logger.__assign({ type: "text/css" }, { children: "input.supertokens-input:-webkit-autofill,input.supertokens-input:-webkit-autofill:focus,input.supertokens-input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:focus,textarea:-webkit-autofill:hover{transition:background-color 5000s ease-in-out 0s}" }))); + /* eslint-enable react/jsx-no-literals */ } -var defaultTranslationsCommon = { - en: { - AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: "Sign Up / Sign In", - AUTH_PAGE_HEADER_TITLE_SIGN_IN: "Sign In", - AUTH_PAGE_HEADER_TITLE_SIGN_UP: "Sign Up", - AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: " to continue to ", - AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: "Not registered yet?", - AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: "Sign Up", - AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: "", - AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: "Already have an account?", - AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: "Sign In", - AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: "", - AUTH_PAGE_FOOTER_START: "By continuing, you agree to our ", - AUTH_PAGE_FOOTER_TOS: "Terms of Service", - AUTH_PAGE_FOOTER_AND: " and ", - AUTH_PAGE_FOOTER_PP: "Privacy Policy", - AUTH_PAGE_FOOTER_END: "", - DIVIDER_OR: "or", - BRANDING_POWERED_BY_START: "Powered by ", - BRANDING_POWERED_BY_END: "", - SOMETHING_WENT_WRONG_ERROR: "Something went wrong. Please try again.", - SOMETHING_WENT_WRONG_ERROR_RELOAD: "Something went wrong. Please try again later or reload the page.", - }, +var defaultTranslationsCommon = { + en: { + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: "Sign Up / Sign In", + AUTH_PAGE_HEADER_TITLE_SIGN_IN: "Sign In", + AUTH_PAGE_HEADER_TITLE_SIGN_UP: "Sign Up", + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: " to continue to ", + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: "Not registered yet?", + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: "Sign Up", + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: "", + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: "Already have an account?", + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: "Sign In", + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: "", + AUTH_PAGE_FOOTER_START: "By continuing, you agree to our ", + AUTH_PAGE_FOOTER_TOS: "Terms of Service", + AUTH_PAGE_FOOTER_AND: " and ", + AUTH_PAGE_FOOTER_PP: "Privacy Policy", + AUTH_PAGE_FOOTER_END: "", + DIVIDER_OR: "or", + BRANDING_POWERED_BY_START: "Powered by ", + BRANDING_POWERED_BY_END: "", + SOMETHING_WENT_WRONG_ERROR: "Something went wrong. Please try again.", + SOMETHING_WENT_WRONG_ERROR_RELOAD: "Something went wrong. Please try again later or reload the page.", + }, }; -var SessionContext = React__default.default.createContext({ - loading: true, - isDefault: true, +var SessionContext = React__default.default.createContext({ + loading: true, + isDefault: true, }); -var useSessionContext = function () { - var ctx = React__default.default.useContext(SessionContext); - if (ctx.isDefault === true) { - throw new Error("Cannot use useSessionContext outside auth wrapper components."); - } - return ctx; +var useSessionContext = function () { + var ctx = React__default.default.useContext(SessionContext); + if (ctx.isDefault === true) { + throw new Error("Cannot use useSessionContext outside auth wrapper components."); + } + return ctx; }; -var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), - useContext = _a[0], - Provider = _a[1]; +var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), useContext = _a[0], Provider = _a[1]; -function SuperTokensBranding() { - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "superTokensBranding", - href: "https://supertokens.com?utm_campaign=poweredby", - target: "_blank", - }, - { - children: [ - t("BRANDING_POWERED_BY_START"), - jsxRuntime.jsx("strong", { children: "SuperTokens" }), - t("BRANDING_POWERED_BY_END"), - ], - } - ) - ); +function SuperTokensBranding() { + var t = translationContext.useTranslation(); + return (jsxRuntime.jsxs("a", logger.__assign({ "data-supertokens": "superTokensBranding", href: "https://supertokens.com?utm_campaign=poweredby", target: "_blank" }, { children: [t("BRANDING_POWERED_BY_START"), jsxRuntime.jsx("strong", { children: "SuperTokens" }), t("BRANDING_POWERED_BY_END")] }))); } -function UserContextWrapper(props) { - /** - * If we receive a userContext as a props we should assume that the user - * is either trying to use a theme component as standalone or that they - * want to override an existing value for userContext. - * - * In this case we should always return a Provider with the value of userContext - */ - if (props.userContext !== undefined) { - return jsxRuntime.jsx( - UserContextProvider, - genericComponentOverrideContext.__assign({ userContext: props.userContext }, { children: props.children }) - ); - } - return jsxRuntime.jsx(UserContextContext.Consumer, { - children: function (value) { - /** - * value is undefined only if there is no Provider in the tree. In this case it is safe to - * assume that the theme component is not being rendered by the SDK and that the user is not - * using this as a child of one of the pre-built feature components. - * - * In this case we return a provider so that the userContext hook can be used by the children - * of this theme component - */ - if (value === undefined) { - return jsxRuntime.jsx(UserContextProvider, { children: props.children }); - } - /** - * If value is not undefined then a provider exists in the tree. This means that this component - * is either being rendered by the SDK or the user has added it as a child of the pre-built - * feature components. In either case the userContext hook will be available so simply - * return the theme component. - */ - return props.children; - }, - }); +function UserContextWrapper(props) { + /** + * If we receive a userContext as a props we should assume that the user + * is either trying to use a theme component as standalone or that they + * want to override an existing value for userContext. + * + * In this case we should always return a Provider with the value of userContext + */ + if (props.userContext !== undefined) { + return jsxRuntime.jsx(UserContextProvider, logger.__assign({ userContext: props.userContext }, { children: props.children })); + } + return (jsxRuntime.jsx(UserContextContext.Consumer, { children: function (value) { + /** + * value is undefined only if there is no Provider in the tree. In this case it is safe to + * assume that the theme component is not being rendered by the SDK and that the user is not + * using this as a child of one of the pre-built feature components. + * + * In this case we return a provider so that the userContext hook can be used by the children + * of this theme component + */ + if (value === undefined) { + return jsxRuntime.jsx(UserContextProvider, { children: props.children }); + } + /** + * If value is not undefined then a provider exists in the tree. This means that this component + * is either being rendered by the SDK or the user has added it as a child of the pre-built + * feature components. In either case the userContext hook will be available so simply + * return the theme component. + */ + return props.children; + } })); } -function GeneralError(_a) { - var error = _a.error; - var t = translationContext.useTranslation(); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign({ "data-supertokens": "generalError" }, { children: t(error) }) - ); +function GeneralError(_a) { + var error = _a.error; + var t = translationContext.useTranslation(); + return jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "generalError" }, { children: t(error) })); } -var styles = - '[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n/*\n * Default styles.\n */\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~="container"] {\n font-family: "Arial", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="secondaryText"] strong {\n font-weight: 600;\n}\n[data-supertokens~="divider"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~="linkButton"] {\n font-family: "Arial", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~="button"] {\n font-family: "Arial", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n[data-supertokens~="delayedRender"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~="footerLinkGroupVert"] > div {\n cursor: pointer;\n margin: 0;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n[data-supertokens~="withBackButton"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~="dividerWithOr"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="dividerText"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n[data-supertokens~="formLabelWithLinkWrapper"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~="formLabelLinkBtn"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n[data-supertokens~="formLabelLinkBtn"]:hover {\n text-decoration: underline;\n}\n[data-supertokens~="formLabelLinkBtn"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n[data-supertokens~="authComponentList"] {\n padding-bottom: 20px;\n}\n[data-supertokens~="authPageTitleOAuthClient"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n[data-supertokens~="authPageTitleOAuthClientUrl"] {\n text-decoration: none;\n}\n[data-supertokens~="authPageTitleOAuthClientLogo"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n[data-supertokens~="authPageTitleOAuthClient"] [data-supertokens~="authPageTitleOAuthClientName"] {\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="buttonWithArrow"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n[data-supertokens~="buttonWithArrow"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryText"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithRightArrow"] ~ svg {\n position: relative;\n left: 2px;\n}\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n position: relative;\n left: -2px;\n}\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n display: flex;\n align-items: center;\n}\n'; +var styles = "[data-supertokens~=\"container\"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n/*\n * Default styles.\n */\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~=\"container\"] {\n font-family: \"Arial\", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~=\"container\"] {\n width: 95vw;\n }\n}\n[data-supertokens~=\"row\"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~=\"superTokensBranding\"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~=\"generalError\"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~=\"headerTitle\"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~=\"headerSubtitle\"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n[data-supertokens~=\"headerSubtitle\"][data-supertokens~=\"secondaryText\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~=\"link\"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~=\"primaryText\"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~=\"secondaryText\"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~=\"secondaryText\"] strong {\n font-weight: 600;\n}\n[data-supertokens~=\"divider\"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n[data-supertokens~=\"headerTinyTitle\"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~=\"secondaryLinkWithArrow\"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~=\"generalSuccess\"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~=\"spinner\"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~=\"error\"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~=\"linkButton\"] {\n font-family: \"Arial\", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~=\"button\"] {\n font-family: \"Arial\", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~=\"button\"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~=\"button\"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n[data-supertokens~=\"button\"]:focus {\n outline: none;\n}\n[data-supertokens~=\"backButtonCommon\"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~=\"backButton\"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~=\"backButtonPlaceholder\"] {\n display: block;\n}\n[data-supertokens~=\"delayedRender\"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~=\"footerLinkGroupVert\"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] > div {\n cursor: pointer;\n margin: 0;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 400;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~=\"footerLinkGroupVert\"] {\n flex-direction: column;\n }\n [data-supertokens~=\"footerLinkGroupVert\"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~=\"footerLinkGroupVert\"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n[data-supertokens~=\"withBackButton\"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~=\"dividerWithOr\"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~=\"dividerText\"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n[data-supertokens~=\"formLabelWithLinkWrapper\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~=\"formLabelLinkBtn\"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n[data-supertokens~=\"formLabelLinkBtn\"]:hover {\n text-decoration: underline;\n}\n[data-supertokens~=\"formLabelLinkBtn\"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n[data-supertokens~=\"authComponentList\"] {\n padding-bottom: 20px;\n}\n[data-supertokens~=\"authPageTitleOAuthClient\"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n[data-supertokens~=\"authPageTitleOAuthClientUrl\"] {\n text-decoration: none;\n}\n[data-supertokens~=\"authPageTitleOAuthClientLogo\"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n[data-supertokens~=\"authPageTitleOAuthClient\"] [data-supertokens~=\"authPageTitleOAuthClientName\"] {\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~=\"buttonWithArrow\"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithRightArrow\"] ~ svg {\n position: relative;\n left: 2px;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n position: relative;\n left: -2px;\n}\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n display: flex;\n align-items: center;\n}\n"; -var ThemeBase = function (_a) { - var children = _a.children, - userStyles = _a.userStyles; - return jsxRuntime.jsxs(React.Fragment, { - children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })], - }); +var ThemeBase = function (_a) { + var children = _a.children, userStyles = _a.userStyles; + return (jsxRuntime.jsxs(React.Fragment, { children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })] })); }; -var AuthPageComponentList = withOverride("AuthPageComponentList", function AuthPageComponentList(props) { - var t = translationContext.useTranslation(); - var list = [props.authComponents[0]]; - var _loop_1 = function (i) { - list.push(function () { - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "dividerWithOr" }, - { - children: [ - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "dividerText" }, - { children: t("DIVIDER_OR") } - ) - ), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - ], - } - ), - "divider-".concat(i) - ); - }); - list.push(props.authComponents[i]); - }; - for (var i = 1; i < props.authComponents.length; ++i) { - _loop_1(i); - } - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "authComponentList" }, - { - children: list.map(function (i) { - return i(genericComponentOverrideContext.__assign({}, props)); - }), - } - ) - ); +var AuthPageComponentList = withOverride("AuthPageComponentList", function AuthPageComponentList(props) { + var t = translationContext.useTranslation(); + var list = [props.authComponents[0]]; + var _loop_1 = function (i) { + list.push(function () { return (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "dividerWithOr" }, { children: [jsxRuntime.jsx("div", { "data-supertokens": "divider" }), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "dividerText" }, { children: t("DIVIDER_OR") })), jsxRuntime.jsx("div", { "data-supertokens": "divider" })] }), "divider-".concat(i))); }); + list.push(props.authComponents[i]); + }; + for (var i = 1; i < props.authComponents.length; ++i) { + _loop_1(i); + } + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "authComponentList" }, { children: list.map(function (i) { + return i(logger.__assign({}, props)); + }) }))); }); -var AuthPageFooter = withOverride("AuthPageFooter", function AuthPageFooter(_a) { - var hasSeparateSignUpView = _a.hasSeparateSignUpView, - isSignUp = _a.isSignUp, - termsOfServiceLink = _a.termsOfServiceLink, - privacyPolicyLink = _a.privacyPolicyLink; - var t = translationContext.useTranslation(); - if (termsOfServiceLink === undefined && privacyPolicyLink === undefined) { - return null; - } - if (hasSeparateSignUpView && !isSignUp) { - return null; - } - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText privacyPolicyAndTermsAndConditions" }, - { - children: [ - t("AUTH_PAGE_FOOTER_START"), - termsOfServiceLink !== undefined && - jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link", - href: termsOfServiceLink, - target: "_blank", - rel: "noopener noreferer", - }, - { children: t("AUTH_PAGE_FOOTER_TOS") } - ) - ), - termsOfServiceLink !== undefined && privacyPolicyLink !== undefined && t("AUTH_PAGE_FOOTER_AND"), - privacyPolicyLink !== undefined && - jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "link", - href: privacyPolicyLink, - target: "_blank", - rel: "noopener noreferer", - }, - { children: t("AUTH_PAGE_FOOTER_PP") } - ) - ), - t("AUTH_PAGE_FOOTER_END"), - ], - } - ) - ); +var AuthPageFooter = withOverride("AuthPageFooter", function AuthPageFooter(_a) { + var hasSeparateSignUpView = _a.hasSeparateSignUpView, isSignUp = _a.isSignUp, termsOfServiceLink = _a.termsOfServiceLink, privacyPolicyLink = _a.privacyPolicyLink; + var t = translationContext.useTranslation(); + if (termsOfServiceLink === undefined && privacyPolicyLink === undefined) { + return null; + } + if (hasSeparateSignUpView && !isSignUp) { + return null; + } + return (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "secondaryText privacyPolicyAndTermsAndConditions" }, { children: [t("AUTH_PAGE_FOOTER_START"), termsOfServiceLink !== undefined && (jsxRuntime.jsx("a", logger.__assign({ "data-supertokens": "link", href: termsOfServiceLink, target: "_blank", rel: "noopener noreferer" }, { children: t("AUTH_PAGE_FOOTER_TOS") }))), termsOfServiceLink !== undefined && privacyPolicyLink !== undefined && t("AUTH_PAGE_FOOTER_AND"), privacyPolicyLink !== undefined && (jsxRuntime.jsx("a", logger.__assign({ "data-supertokens": "link", href: privacyPolicyLink, target: "_blank", rel: "noopener noreferer" }, { children: t("AUTH_PAGE_FOOTER_PP") }))), t("AUTH_PAGE_FOOTER_END")] }))); }); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function HeavyArrowLeftIcon(_a) { - var color = _a.color; - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - xmlns: "http://www.w3.org/2000/svg", - width: "16", - height: "13", - viewBox: "0 0 16 13", - "data-supertokens": "heavyArrowLeftIcon", - }, - { - children: jsxRuntime.jsx("path", { - fill: color, - d: "M13 6.8h.022H3.8l2.9 2.9a.761.761 0 0 1 0 1.07l-.451.451a.754.754 0 0 1-1.064 0L.22 6.254a.759.759 0 0 1 0-1.068L5.186.22a.755.755 0 0 1 1.064 0l.45.451a.746.746 0 0 1 .22.532.724.724 0 0 1-.22.522l-2.93 2.92h9.24a.781.781 0 0 1 .764.773v.638A.766.766 0 0 1 13 6.8z", - transform: "translate(1.182 .708)", - }), - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function HeavyArrowLeftIcon(_a) { + var color = _a.color; + return (jsxRuntime.jsx("svg", logger.__assign({ xmlns: "http://www.w3.org/2000/svg", width: "16", height: "13", viewBox: "0 0 16 13", "data-supertokens": "heavyArrowLeftIcon" }, { children: jsxRuntime.jsx("path", { fill: color, d: "M13 6.8h.022H3.8l2.9 2.9a.761.761 0 0 1 0 1.07l-.451.451a.754.754 0 0 1-1.064 0L.22 6.254a.759.759 0 0 1 0-1.068L5.186.22a.755.755 0 0 1 1.064 0l.45.451a.746.746 0 0 1 .22.532.724.724 0 0 1-.22.522l-2.93 2.92h9.24a.781.781 0 0 1 .764.773v.638A.766.766 0 0 1 13 6.8z", transform: "translate(1.182 .708)" }) }))); } -/* - * Component. - */ -function BackButton(_a) { - var onClick = _a.onClick; - return jsxRuntime.jsx( - "button", - genericComponentOverrideContext.__assign( - { onClick: onClick, "data-supertokens": "backButton backButtonCommon" }, - { children: jsxRuntime.jsx(HeavyArrowLeftIcon, { color: "rgb(var(--palette-textTitle))" }) } - ) - ); +/* + * Component. + */ +function BackButton(_a) { + var onClick = _a.onClick; + return (jsxRuntime.jsx("button", logger.__assign({ onClick: onClick, "data-supertokens": "backButton backButtonCommon" }, { children: jsxRuntime.jsx(HeavyArrowLeftIcon, { color: "rgb(var(--palette-textTitle))" }) }))); } -var AuthPageHeader = withOverride("AuthPageHeader", function AuthPageHeader(_a) { - var onSignInUpSwitcherClick = _a.onSignInUpSwitcherClick, - hasSeparateSignUpView = _a.hasSeparateSignUpView, - isSignUp = _a.isSignUp, - showBackButton = _a.showBackButton, - resetFactorList = _a.resetFactorList, - oauth2ClientInfo = _a.oauth2ClientInfo; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs(React.Fragment, { - children: [ - (oauth2ClientInfo === null || oauth2ClientInfo === void 0 ? void 0 : oauth2ClientInfo.logoUri) && - jsxRuntime.jsx("img", { - src: oauth2ClientInfo.logoUri, - alt: oauth2ClientInfo.clientName, - "data-supertokens": "authPageTitleOAuthClientLogo", - }), - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle withBackButton" }, - { - children: [ - showBackButton - ? jsxRuntime.jsx(BackButton, { onClick: resetFactorList }) - : jsxRuntime.jsx("span", { - "data-supertokens": "backButtonPlaceholder backButtonCommon", - }), - !hasSeparateSignUpView - ? t("AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP") - : isSignUp - ? t("AUTH_PAGE_HEADER_TITLE_SIGN_UP") - : t("AUTH_PAGE_HEADER_TITLE_SIGN_IN"), - jsxRuntime.jsx("span", { "data-supertokens": "backButtonPlaceholder backButtonCommon" }), - ], - } - ) - ), - oauth2ClientInfo && - oauth2ClientInfo.clientName !== undefined && - oauth2ClientInfo.clientName.length > 0 && - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "authPageTitleOAuthClient" }, - { - children: [ - t("AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP"), - oauth2ClientInfo.clientUri !== undefined - ? jsxRuntime.jsx( - "a", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "authPageTitleOAuthClientUrl link", - href: oauth2ClientInfo.clientUri, - }, - { children: oauth2ClientInfo.clientName } - ) - ) - : jsxRuntime.jsx( - "span", - genericComponentOverrideContext.__assign( - { "data-supertokens": "authPageTitleOAuthClientName" }, - { children: oauth2ClientInfo.clientName } - ) - ), - ], - } - ) - ), - hasSeparateSignUpView && - (!isSignUp - ? jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { - children: [ - t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START"), - jsxRuntime.jsx( - "span", - genericComponentOverrideContext.__assign( - { "data-supertokens": "link", onClick: onSignInUpSwitcherClick }, - { children: t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK") } - ) - ), - t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END"), - ], - } - ) - ) - : jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { - children: [ - t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START"), - jsxRuntime.jsx( - "span", - genericComponentOverrideContext.__assign( - { "data-supertokens": "link", onClick: onSignInUpSwitcherClick }, - { children: t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK") } - ) - ), - t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END"), - ], - } - ) - )), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - ], - }); +var AuthPageHeader = withOverride("AuthPageHeader", function AuthPageHeader(_a) { + var onSignInUpSwitcherClick = _a.onSignInUpSwitcherClick, hasSeparateSignUpView = _a.hasSeparateSignUpView, isSignUp = _a.isSignUp, showBackButton = _a.showBackButton, resetFactorList = _a.resetFactorList, oauth2ClientInfo = _a.oauth2ClientInfo; + var t = translationContext.useTranslation(); + return (jsxRuntime.jsxs(React.Fragment, { children: [(oauth2ClientInfo === null || oauth2ClientInfo === void 0 ? void 0 : oauth2ClientInfo.logoUri) && (jsxRuntime.jsx("img", { src: oauth2ClientInfo.logoUri, alt: oauth2ClientInfo.clientName, "data-supertokens": "authPageTitleOAuthClientLogo" })), jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "headerTitle withBackButton" }, { children: [showBackButton ? (jsxRuntime.jsx(BackButton, { onClick: resetFactorList })) : (jsxRuntime.jsx("span", { "data-supertokens": "backButtonPlaceholder backButtonCommon" })), !hasSeparateSignUpView + ? t("AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP") + : isSignUp + ? t("AUTH_PAGE_HEADER_TITLE_SIGN_UP") + : t("AUTH_PAGE_HEADER_TITLE_SIGN_IN"), jsxRuntime.jsx("span", { "data-supertokens": "backButtonPlaceholder backButtonCommon" })] })), oauth2ClientInfo && + oauth2ClientInfo.clientName !== undefined && + oauth2ClientInfo.clientName.length > 0 && (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "authPageTitleOAuthClient" }, { children: [t("AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP"), oauth2ClientInfo.clientUri !== undefined ? (jsxRuntime.jsx("a", logger.__assign({ "data-supertokens": "authPageTitleOAuthClientUrl link", href: oauth2ClientInfo.clientUri }, { children: oauth2ClientInfo.clientName }))) : (jsxRuntime.jsx("span", logger.__assign({ "data-supertokens": "authPageTitleOAuthClientName" }, { children: oauth2ClientInfo.clientName })))] }))), hasSeparateSignUpView && + (!isSignUp ? (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "headerSubtitle secondaryText" }, { children: [t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START"), jsxRuntime.jsx("span", logger.__assign({ "data-supertokens": "link", onClick: onSignInUpSwitcherClick }, { children: t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK") })), t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END")] }))) : (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "headerSubtitle secondaryText" }, { children: [t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START"), jsxRuntime.jsx("span", logger.__assign({ "data-supertokens": "link", onClick: onSignInUpSwitcherClick }, { children: t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK") })), t("AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END")] })))), jsxRuntime.jsx("div", { "data-supertokens": "divider" })] })); }); -function AuthPageTheme(props) { - if (props.fullPageCompWithPreloadedInfo) { - return jsxRuntime.jsx(jsxRuntime.Fragment, { - children: props.fullPageCompWithPreloadedInfo.component( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, props), { - preloadInfo: props.fullPageCompWithPreloadedInfo.preloadInfo, - }) - ), - }); - } - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "container authPage ".concat( - props.factorIds.length > 1 ? "multiFactor" : "singleFactor" - ), - }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - jsxRuntime.jsx(AuthPageHeader, { - factorIds: props.factorIds, - isSignUp: props.isSignUp, - onSignInUpSwitcherClick: props.onSignInUpSwitcherClick, - hasSeparateSignUpView: props.hasSeparateSignUpView, - resetFactorList: props.resetFactorList, - showBackButton: props.showBackButton, - oauth2ClientInfo: props.oauth2ClientInfo, - }), - props.error !== undefined && jsxRuntime.jsx(GeneralError, { error: props.error }), - jsxRuntime.jsx( - AuthPageComponentList, - genericComponentOverrideContext.__assign({}, props) - ), - jsxRuntime.jsx(AuthPageFooter, { - factorIds: props.factorIds, - isSignUp: props.isSignUp, - hasSeparateSignUpView: props.hasSeparateSignUpView, - privacyPolicyLink: props.privacyPolicyLink, - termsOfServiceLink: props.termsOfServiceLink, - }), - ], - } - ) - ), - jsxRuntime.jsx(SuperTokensBranding, {}), - ], - } - ) - ); -} -function AuthPageThemeWrapper(props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - return jsxRuntime.jsx( - UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle] }, - { children: jsxRuntime.jsx(AuthPageTheme, genericComponentOverrideContext.__assign({}, props)) } - ) - ), - } - ) - ); +function AuthPageTheme(props) { + if (props.fullPageCompWithPreloadedInfo) { + return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: props.fullPageCompWithPreloadedInfo.component(logger.__assign(logger.__assign({}, props), { preloadInfo: props.fullPageCompWithPreloadedInfo.preloadInfo })) })); + } + return (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "container authPage ".concat(props.factorIds.length > 1 ? "multiFactor" : "singleFactor") }, { children: [jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row" }, { children: [jsxRuntime.jsx(AuthPageHeader, { factorIds: props.factorIds, isSignUp: props.isSignUp, onSignInUpSwitcherClick: props.onSignInUpSwitcherClick, hasSeparateSignUpView: props.hasSeparateSignUpView, resetFactorList: props.resetFactorList, showBackButton: props.showBackButton, oauth2ClientInfo: props.oauth2ClientInfo }), props.error !== undefined && jsxRuntime.jsx(GeneralError, { error: props.error }), jsxRuntime.jsx(AuthPageComponentList, logger.__assign({}, props)), jsxRuntime.jsx(AuthPageFooter, { factorIds: props.factorIds, isSignUp: props.isSignUp, hasSeparateSignUpView: props.hasSeparateSignUpView, privacyPolicyLink: props.privacyPolicyLink, termsOfServiceLink: props.termsOfServiceLink })] })), jsxRuntime.jsx(SuperTokensBranding, {})] }))); +} +function AuthPageThemeWrapper(props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + return (jsxRuntime.jsx(UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(ThemeBase, logger.__assign({ userStyles: [rootStyle] }, { children: jsxRuntime.jsx(AuthPageTheme, logger.__assign({}, props)) })) }))); } -var errorQSMap = { - signin: "SOMETHING_WENT_WRONG_ERROR", - no_email_present: "THIRD_PARTY_ERROR_NO_EMAIL", - restart_link: "ERROR_SIGN_IN_UP_LINK", -}; -var AuthPageWrapper = function (props) { - var authRecipeComponentOverrides = useContext(); - return jsxRuntime.jsx( - UserContextProvider, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - SessionAuthWrapper, - genericComponentOverrideContext.__assign( - { requireAuth: false, doRedirection: false }, - { - children: jsxRuntime.jsx( - ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: authRecipeComponentOverrides }, - { - children: jsxRuntime.jsx( - AuthPageInner, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ), - } - ) - ), - } - ) - ); -}; -var AuthPageInner = function (props) { - var _a, _b, _c, _d, _e; - if (props.factors !== undefined && props.factors.length === 0) { - throw new Error("The factors array cannot be empty"); - } - var windowHandler$1 = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler; - var search = new URLSearchParams(windowHandler$1.location.getSearch()); - var showStringFromQS = search.get("show"); - var isSignUpFromQS = - props.useSignUpStateFromQueryString !== true || showStringFromQS === null - ? undefined - : showStringFromQS === "signup"; - var errorFromQS = - search.get("error") !== null - ? (_b = (_a = search.get("message")) !== null && _a !== void 0 ? _a : search.get("error")) !== null && - _b !== void 0 - ? _b - : undefined - : undefined; - errorFromQS = - errorFromQS !== undefined - ? (_c = errorQSMap[errorFromQS]) !== null && _c !== void 0 - ? _c - : errorFromQS - : undefined; - var showStringFromQSRef = React.useRef(showStringFromQS); - var errorFromQSRef = React.useRef(errorFromQS); - var loginChallenge = search.get("loginChallenge"); - var forceFreshAuth = search.get("forceFreshAuth") === "true"; - var sessionContext = useSessionContext(); - var userContext = useUserContext(); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var _f = React.useState(undefined), - loadedDynamicLoginMethods = _f[0], - setLoadedDynamicLoginMethods = _f[1]; - var _g = React.useState(undefined), - oauth2ClientInfo = _g[0], - setOAuth2ClientInfo = _g[1]; - var _h = React.useState(errorFromQS), - error = _h[0], - setError = _h[1]; - var _j = React.useState(false), - sessionLoadedAndNotRedirecting = _j[0], - setSessionLoadedAndNotRedirecting = _j[1]; - var st = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow(); - var _k = React.useState(props.factors), - factorList = _k[0], - setFactorList = _k[1]; - var _l = React.useState( - (_e = (_d = props.isSignUp) !== null && _d !== void 0 ? _d : isSignUpFromQS) !== null && _e !== void 0 - ? _e - : st.defaultToSignUp - ), - isSignUp = _l[0], - setIsSignUp = _l[1]; - // We use this to signal that we need to update the components we show on screen - var _m = React.useState(0), - rebuildReqCount = _m[0], - setRebuildReqCount = _m[1]; - var lastBuild = React.useRef({ buildReq: undefined }); - React.useEffect(function () { - if (props.useSignUpStateFromQueryString && showStringFromQSRef.current !== showStringFromQS) { - var isSignUpFromQS_1 = - props.useSignUpStateFromQueryString !== true || showStringFromQS === null - ? undefined - : showStringFromQS === "signup"; - showStringFromQSRef.current = showStringFromQS; - var newIsSignUpVal = - isSignUpFromQS_1 !== null && isSignUpFromQS_1 !== void 0 ? isSignUpFromQS_1 : st.defaultToSignUp; - if (isSignUp !== newIsSignUpVal) { - setIsSignUp(newIsSignUpVal); - setRebuildReqCount(function (v) { - return v + 1; - }); - } - } - }); - React.useEffect(function () { - if (errorFromQSRef.current !== errorFromQS) { - errorFromQSRef.current = errorFromQS; - setError(errorFromQS); - } - }); - var onSignInUpSwitcherClick = React.useCallback( - function () { - if (props.useSignUpStateFromQueryString === true) { - genericComponentOverrideContext.updateQueryParam("show", isSignUp ? "signin" : "signup"); - } - setError(undefined); - setIsSignUp(!isSignUp); - setRebuildReqCount(function (v) { - return v + 1; - }); - }, - [isSignUp, setIsSignUp, setRebuildReqCount, setError, props.useSignUpStateFromQueryString] - ); - React.useEffect( - function () { - if (loadedDynamicLoginMethods) { - return; - } - genericComponentOverrideContext.Multitenancy.getInstanceOrThrow() - .getCurrentDynamicLoginMethods({ userContext: userContext }) - .then( - function (loginMethods) { - return setLoadedDynamicLoginMethods(loginMethods); - }, - function (err) { - return rethrowInRender(err); - } - ); - }, - [loadedDynamicLoginMethods, setLoadedDynamicLoginMethods] - ); - genericComponentOverrideContext.useOnMountAPICall( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var oauth2Recipe; - return genericComponentOverrideContext.__generator(this, function (_a) { - if (oauth2ClientInfo) { - return [2 /*return*/]; - } - oauth2Recipe = recipe.OAuth2Provider.getInstance(); - if (oauth2Recipe !== undefined && loginChallenge !== null) { - return [ - 2 /*return*/, - oauth2Recipe.webJSRecipe.getLoginChallengeInfo({ - loginChallenge: loginChallenge, - userContext: userContext, - }), - ]; - } - return [2 /*return*/, undefined]; - }); - }); - }, - function (info) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (info !== undefined) { - if (info.status === "OK") { - setOAuth2ClientInfo(info.info); - } else { - setError("SOMETHING_WENT_WRONG_ERROR"); - } - } - return [2 /*return*/]; - }); - }); - }, - function () { - genericComponentOverrideContext.clearQueryParams(["loginChallenge"]); - setError("SOMETHING_WENT_WRONG_ERROR"); - } - ); - React.useEffect( - function () { - if (sessionLoadedAndNotRedirecting) { - return; - } - // we want to do this just once, so we supply it with only the loading state. - // if we supply it with props, sessionContext, then once the user signs in, then this will route the - // user to the dashboard, as opposed to the sign up / sign in functions. - if (sessionContext.loading === false) { - if (sessionContext.doesSessionExist) { - if (props.onSessionAlreadyExists !== undefined) { - props.onSessionAlreadyExists(); - } else if (props.redirectOnSessionExists !== false && !forceFreshAuth) { - types.Session.getInstanceOrThrow().config.onHandleEvent({ - action: "SESSION_ALREADY_EXISTS", - }); - var oauth2Recipe_1 = recipe.OAuth2Provider.getInstance(); - if (loginChallenge !== null && oauth2Recipe_1 !== undefined) { - (function () { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var frontendRedirectTo; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - oauth2Recipe_1.webJSRecipe.getRedirectURLToContinueOAuthFlow({ - loginChallenge: loginChallenge, - userContext: userContext, - }), - ]; - case 1: - frontendRedirectTo = _a.sent().frontendRedirectTo; - return [ - 2 /*return*/, - types.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( - { - // We get here if the user was redirected to the auth screen with an already existing session - // and a loginChallenge (we check the forceFreshAuth queryparam above) - action: "SUCCESS_OAUTH2", - frontendRedirectTo: frontendRedirectTo, - // We can use these defaults, since this is not the result of a sign in/up call - createdNewUser: false, - isNewRecipeUser: false, - newSessionCreated: false, - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - recipeId: types.Session.RECIPE_ID, - }, - types.Session.RECIPE_ID, - genericComponentOverrideContext.getRedirectToPathFromURL(), - userContext, - props.navigate - ), - ]; - } - }); - }); - })().catch(rethrowInRender); - } else { - void types.Session.getInstanceOrThrow() - .validateGlobalClaimsAndHandleSuccessRedirection( - undefined, - types.Session.RECIPE_ID, - genericComponentOverrideContext.getRedirectToPathFromURL(), - userContext, - props.navigate - ) - .catch(rethrowInRender); - } - } else { - setSessionLoadedAndNotRedirecting(true); - } - } else { - setSessionLoadedAndNotRedirecting(true); - } - } - }, - [sessionContext.loading] - ); - var _o = React.useState(), - authComponentListInfo = _o[0], - setAuthComponentListInfo = _o[1]; - var showUseAnotherLink = - factorList !== undefined && - (props.factors === undefined || - props.factors.some(function (id) { - return !factorList.includes(id); - })); - var stInstance = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow(); - var privacyPolicyLink = stInstance.privacyPolicyLink; - var termsOfServiceLink = stInstance.termsOfServiceLink; - React.useEffect( - function () { - var abortCtl = new AbortController(); - if (lastBuild.current.buildReq === rebuildReqCount) { - return; - } - if ( - sessionLoadedAndNotRedirecting && - (loadedDynamicLoginMethods !== undefined || - !genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods) - ) { - void buildAndSetChildProps( - props.preBuiltUIList, - loadedDynamicLoginMethods, - userContext, - factorList, - isSignUp, - setAuthComponentListInfo, - abortCtl.signal - ).then(function () { - lastBuild.current.buildReq = rebuildReqCount; - }, rethrowInRender); - } - return function () { - abortCtl.abort(); - }; - }, - [ - sessionLoadedAndNotRedirecting, - rebuildReqCount, - setRebuildReqCount, - props.preBuiltUIList, - loadedDynamicLoginMethods, - userContext, - factorList, - isSignUp, - setAuthComponentListInfo, - rethrowInRender, - ] - ); - var onAuthSuccess = React.useCallback( - function (ctx) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var oauth2Recipe, frontendRedirectTo; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - oauth2Recipe = recipe.OAuth2Provider.getInstance(); - if (loginChallenge === null || oauth2Recipe === undefined) { - return [ - 2 /*return*/, - types.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, ctx), - { - action: "SUCCESS", - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - redirectToPath: - genericComponentOverrideContext.getRedirectToPathFromURL(), - } - ), - ctx.recipeId, - genericComponentOverrideContext.getRedirectToPathFromURL(), - userContext, - props.navigate - ), - ]; - } - return [ - 4 /*yield*/, - oauth2Recipe.webJSRecipe.getRedirectURLToContinueOAuthFlow({ - loginChallenge: loginChallenge, - userContext: userContext, - }), - ]; - case 1: - frontendRedirectTo = _a.sent().frontendRedirectTo; - return [ - 2 /*return*/, - types.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, ctx), - { - action: "SUCCESS_OAUTH2", - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - frontendRedirectTo: frontendRedirectTo, - } - ), - ctx.recipeId, - genericComponentOverrideContext.getRedirectToPathFromURL(), - userContext, - props.navigate - ), - ]; - } - }); - }); - }, - [loginChallenge] - ); - var childProps = - authComponentListInfo !== undefined && - (loginChallenge === null || oauth2ClientInfo !== undefined || recipe.OAuth2Provider.getInstance() === undefined) - ? genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, authComponentListInfo), - { - oauth2ClientInfo: oauth2ClientInfo, - onAuthSuccess: onAuthSuccess, - error: error, - onError: function (err) { - setError(err); - }, - clearError: function () { - return setError(undefined); - }, - navigate: props.navigate, - onSignInUpSwitcherClick: onSignInUpSwitcherClick, - privacyPolicyLink: privacyPolicyLink, - rebuildAuthPage: function () { - return setRebuildReqCount(function (v) { - return v + 1; - }); - }, - setFactorList: function (factorIds) { - setFactorList(factorIds); - setRebuildReqCount(function (v) { - return v + 1; - }); - }, - resetFactorList: function () { - setFactorList(props.factors); - setRebuildReqCount(function (v) { - return v + 1; - }); - }, - showBackButton: showUseAnotherLink, - termsOfServiceLink: termsOfServiceLink, - userContext: userContext, - } - ) - : undefined; - var mergedTranslations = React.useMemo( - function () { - var res = defaultTranslationsCommon; - if (authComponentListInfo !== undefined) { - for (var _i = 0, _a = props.preBuiltUIList; _i < _a.length; _i++) { - var ui = _a[_i]; - res = genericComponentOverrideContext.mergeObjects(res, ui.languageTranslations); - } - } - res = genericComponentOverrideContext.mergeObjects(res, st.languageTranslations.userTranslationStore); - return res; - }, - [st.languageTranslations.userTranslationStore, authComponentListInfo] - ); - if (childProps === undefined) { - return jsxRuntime.jsx(DynamicLoginMethodsSpinner, {}); - } else { - return jsxRuntime.jsx( - DynamicLoginMethodsProvider, - genericComponentOverrideContext.__assign( - { value: loadedDynamicLoginMethods }, - { - children: jsxRuntime.jsx( - translationContext.TranslationContextProvider, - genericComponentOverrideContext.__assign( - { - defaultLanguage: st.languageTranslations.defaultLanguage, - defaultStore: mergedTranslations, - translationControlEventSource: st.languageTranslations.translationEventSource, - userTranslationFunc: st.languageTranslations.userTranslationFunc, - }, - { - children: jsxRuntime.jsx( - WithOrWithoutShadowDom, - genericComponentOverrideContext.__assign( - { useShadowDom: st.useShadowDom }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - AuthPageThemeWrapper, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__default.default.Children.map( - props.children, - function (child) { - if (React__default.default.isValidElement(child)) { - return React__default.default.cloneElement( - child, - childProps - ); - } - return child; - } - ), - ], - }), - } - ) - ), - } - ) - ), - } - ) - ); - } -}; -function buildAndSetChildProps( - recipeRouters, - loadedDynamicLoginMethods, - userContext, - factorListState, - isSignUpState, - setComponentListInfo, - abort -) { - var _a, _b, _c, _d, _e; - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var authRecipesInited, - firstFactors, - missingPreBuiltUIs, - thirdPartyPreBuiltUI, - hasSeparateSignUpView, - isSignUp, - authComps, - _i, - recipeRouters_1, - ui, - _f, - authComps_1, - a, - preloadRes, - partialAuthComps, - selectedComponents, - availableFactors, - _g, - partialAuthComps_1, - comp, - _h, - _j, - id, - source; - return genericComponentOverrideContext.__generator(this, function (_k) { - switch (_k.label) { - case 0: - authRecipesInited = - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().recipeList.filter(function ( - recipe - ) { - return "firstFactorIds" in recipe; - }); - firstFactors = - (_c = - (_a = - factorListState !== null && factorListState !== void 0 - ? factorListState - : loadedDynamicLoginMethods === null || loadedDynamicLoginMethods === void 0 - ? void 0 - : loadedDynamicLoginMethods.firstFactors) !== null && _a !== void 0 - ? _a - : (_b = recipe$1.MultiFactorAuth.getInstance()) === null || _b === void 0 - ? void 0 - : _b.config.firstFactors) !== null && _c !== void 0 - ? _c - : authRecipesInited.reduce(function (acc, recipe) { - return genericComponentOverrideContext.__spreadArray( - genericComponentOverrideContext.__spreadArray([], acc, true), - recipe.getFirstFactorsForAuthPage(), - true - ); - }, []); - if ( - factorListState === undefined && - (loadedDynamicLoginMethods === null || loadedDynamicLoginMethods === void 0 - ? void 0 - : loadedDynamicLoginMethods.firstFactors) === undefined && - ((_d = recipe$1.MultiFactorAuth.getInstance()) === null || _d === void 0 - ? void 0 - : _d.config.firstFactors) === undefined - ) { - missingPreBuiltUIs = authRecipesInited.filter(function (recipe) { - return !recipeRouters.some(function (router) { - return router.recipeInstance.recipeID === recipe.recipeID; - }); - }); - if (missingPreBuiltUIs.length > 0) { - // In this case we'd most likely throw anyway (except in the case of EP+Pwless), but we want to provide a better error message - throw new Error( - "Factor list not set but PreBuiltUI not added for ".concat( - missingPreBuiltUIs.map(function (r) { - return r.recipeID; - }) - ) - ); - } - } - if (firstFactors.length === 0) { - throw new Error("There are no enabled factors to show"); - } - if (firstFactors.includes(types.FactorIds.THIRDPARTY)) { - thirdPartyPreBuiltUI = recipeRouters.find(function (r) { - return r.recipeInstance.recipeID === types.FactorIds.THIRDPARTY; - }); - // here we ignore if we couldn't find the necessary prebuilt UI, because we want to throw in the standard location - if (thirdPartyPreBuiltUI !== undefined) { - // We remove the thirdparty factor if: - // We have no provider defined on the client side and - // We have no provider defined for the tenant either - if ( - thirdPartyPreBuiltUI.recipeInstance.config.signInAndUpFeature.providers.length === 0 && - (!genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods || - loadedDynamicLoginMethods.thirdparty.providers.length === 0) - ) { - firstFactors = firstFactors.filter(function (f) { - return f !== types.FactorIds.THIRDPARTY; - }); - if (firstFactors.length === 0) { - throw new Error( - "The only enabled first factor is thirdparty, but no providers were defined. Please define at least one provider." - ); - } - } - } - } - hasSeparateSignUpView = recipeRouters.some(function (ui) { - return ( - ui.requiresSignUpPage && - ui.recipeInstance.firstFactorIds.some(function (id) { - return firstFactors.includes(id); - }) - ); - }); - isSignUp = hasSeparateSignUpView && isSignUpState; - authComps = []; - for (_i = 0, recipeRouters_1 = recipeRouters; _i < recipeRouters_1.length; _i++) { - ui = recipeRouters_1[_i]; - authComps.push.apply(authComps, ui.getAuthComponents()); - } - (_f = 0), (authComps_1 = authComps); - _k.label = 1; - case 1: - if (!(_f < authComps_1.length)) return [3 /*break*/, 4]; - a = authComps_1[_f]; - if (!(a.type === "FULL_PAGE")) return [3 /*break*/, 3]; - return [4 /*yield*/, a.preloadInfoAndRunChecks(firstFactors, userContext)]; - case 2: - preloadRes = _k.sent(); - // We skip setting if the auth page unmounted while we were checking - // if we should show any full page comps - if (abort.aborted) { - return [2 /*return*/]; - } - if (preloadRes.shouldDisplay) { - setComponentListInfo({ - authComponents: [], - fullPageCompWithPreloadedInfo: { - component: a.component, - preloadInfo: preloadRes.preloadInfo, - }, - isSignUp: isSignUp, - hasSeparateSignUpView: hasSeparateSignUpView, - factorIds: firstFactors, - }); - return [2 /*return*/]; - } - _k.label = 3; - case 3: - _f++; - return [3 /*break*/, 1]; - case 4: - if (abort.aborted) { - // We stop if the auth page unmounted while we were checking if we should show any full page comps - return [2 /*return*/]; - } - partialAuthComps = authComps.filter(function (c) { - return ( - c.type !== "FULL_PAGE" && - c.factorIds.every(function (id) { - return firstFactors.includes(id); - }) - ); - }); - partialAuthComps = partialAuthComps.filter( - function (c) { - return ( - c.type === "SIGN_IN_UP" || // sign in+up components show in all cases - (isSignUp ? c.type === "SIGN_UP" : c.type === "SIGN_IN") - ); - } // otherwise we check if the sign up state is appropriate - ); - // We sort the auth components by the number of factors they cover, DESC - // This helps us choose combination components (ep+pwless) first - partialAuthComps.sort(function (a, b) { - return b.factorIds.length - a.factorIds.length; - }); - selectedComponents = utils.selectComponentsToCoverAllFirstFactors(partialAuthComps, firstFactors); - if (selectedComponents === undefined) { - availableFactors = new Set(); - for (_g = 0, partialAuthComps_1 = partialAuthComps; _g < partialAuthComps_1.length; _g++) { - comp = partialAuthComps_1[_g]; - for (_h = 0, _j = comp.factorIds; _h < _j.length; _h++) { - id = _j[_h]; - availableFactors.add(id); - } - } - source = - factorListState !== undefined - ? "local state or props" - : (loadedDynamicLoginMethods === null || loadedDynamicLoginMethods === void 0 - ? void 0 - : loadedDynamicLoginMethods.firstFactors) !== undefined - ? "dynamic tenant configuration" - : ((_e = recipe$1.MultiFactorAuth.getInstance()) === null || _e === void 0 - ? void 0 - : _e.config.firstFactors) !== undefined - ? "the config passed to the MFA recipe" - : "all recipes initialized"; - throw new Error( - "Couldn't cover all first factors: " - .concat(firstFactors.join(", "), " (from ") - .concat(source, "), available components: ") - .concat(Array.from(availableFactors).join(", "), ".\n") + - "You may have missed adding a recipe into the list of prebuiltUIs passed to list of prebuiltUIs passed to getSuperTokensRoutesForReactRouterDom, canHandleRoute, handleRoute functions or the AuthPage component.\n" + - "Another common error is adding a non-existent factor id into the list, e.g.: passwordless instead of otp-email/phone" - ); - } - setComponentListInfo({ - authComponents: selectedComponents - .sort(function (a, b) { - return a.displayOrder - b.displayOrder; - }) - .map(function (w) { - return w.component; - }), - factorIds: firstFactors, - hasSeparateSignUpView: hasSeparateSignUpView, - isSignUp: isSignUp, - }); - return [2 /*return*/]; - } - }); - }); +var errorQSMap = { + signin: "SOMETHING_WENT_WRONG_ERROR", + no_email_present: "THIRD_PARTY_ERROR_NO_EMAIL", + restart_link: "ERROR_SIGN_IN_UP_LINK", +}; +var AuthPageWrapper = function (props) { + var authRecipeComponentOverrides = useContext(); + return (jsxRuntime.jsx(UserContextProvider, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(SessionAuthWrapper, logger.__assign({ requireAuth: false, doRedirection: false }, { children: jsxRuntime.jsx(ComponentOverrideContext.Provider, logger.__assign({ value: authRecipeComponentOverrides }, { children: jsxRuntime.jsx(AuthPageInner, logger.__assign({}, props)) })) })) }))); +}; +var AuthPageInner = function (props) { + var _a, _b, _c, _d, _e; + if (props.factors !== undefined && props.factors.length === 0) { + throw new Error("The factors array cannot be empty"); + } + var windowHandler$1 = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler; + var search = new URLSearchParams(windowHandler$1.location.getSearch()); + var showStringFromQS = search.get("show"); + var isSignUpFromQS = props.useSignUpStateFromQueryString !== true || showStringFromQS === null + ? undefined + : showStringFromQS === "signup"; + var errorFromQS = search.get("error") !== null ? (_b = (_a = search.get("message")) !== null && _a !== void 0 ? _a : search.get("error")) !== null && _b !== void 0 ? _b : undefined : undefined; + errorFromQS = errorFromQS !== undefined ? (_c = errorQSMap[errorFromQS]) !== null && _c !== void 0 ? _c : errorFromQS : undefined; + var showStringFromQSRef = React.useRef(showStringFromQS); + var errorFromQSRef = React.useRef(errorFromQS); + var loginChallenge = search.get("loginChallenge"); + var forceFreshAuth = search.get("forceFreshAuth") === "true"; + var sessionContext = useSessionContext(); + var userContext = useUserContext(); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var _f = React.useState(undefined), loadedDynamicLoginMethods = _f[0], setLoadedDynamicLoginMethods = _f[1]; + var _g = React.useState(undefined), oauth2ClientInfo = _g[0], setOAuth2ClientInfo = _g[1]; + var _h = React.useState(errorFromQS), error = _h[0], setError = _h[1]; + var _j = React.useState(false), sessionLoadedAndNotRedirecting = _j[0], setSessionLoadedAndNotRedirecting = _j[1]; + var st = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow(); + var _k = React.useState(props.factors), factorList = _k[0], setFactorList = _k[1]; + var _l = React.useState((_e = (_d = props.isSignUp) !== null && _d !== void 0 ? _d : isSignUpFromQS) !== null && _e !== void 0 ? _e : st.defaultToSignUp), isSignUp = _l[0], setIsSignUp = _l[1]; + // We use this to signal that we need to update the components we show on screen + var _m = React.useState(0), rebuildReqCount = _m[0], setRebuildReqCount = _m[1]; + var lastBuild = React.useRef({ buildReq: undefined }); + React.useEffect(function () { + if (props.useSignUpStateFromQueryString && showStringFromQSRef.current !== showStringFromQS) { + var isSignUpFromQS_1 = props.useSignUpStateFromQueryString !== true || showStringFromQS === null + ? undefined + : showStringFromQS === "signup"; + showStringFromQSRef.current = showStringFromQS; + var newIsSignUpVal = isSignUpFromQS_1 !== null && isSignUpFromQS_1 !== void 0 ? isSignUpFromQS_1 : st.defaultToSignUp; + if (isSignUp !== newIsSignUpVal) { + setIsSignUp(newIsSignUpVal); + setRebuildReqCount(function (v) { return v + 1; }); + } + } + }); + React.useEffect(function () { + if (errorFromQSRef.current !== errorFromQS) { + errorFromQSRef.current = errorFromQS; + setError(errorFromQS); + } + }); + var onSignInUpSwitcherClick = React.useCallback(function () { + if (props.useSignUpStateFromQueryString === true) { + genericComponentOverrideContext.updateQueryParam("show", isSignUp ? "signin" : "signup"); + } + setError(undefined); + setIsSignUp(!isSignUp); + setRebuildReqCount(function (v) { return v + 1; }); + }, [isSignUp, setIsSignUp, setRebuildReqCount, setError, props.useSignUpStateFromQueryString]); + React.useEffect(function () { + if (loadedDynamicLoginMethods) { + return; + } + genericComponentOverrideContext.Multitenancy.getInstanceOrThrow() + .getCurrentDynamicLoginMethods({ userContext: userContext }) + .then(function (loginMethods) { return setLoadedDynamicLoginMethods(loginMethods); }, function (err) { return rethrowInRender(err); }); + }, [loadedDynamicLoginMethods, setLoadedDynamicLoginMethods]); + genericComponentOverrideContext.useOnMountAPICall(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var oauth2Recipe; + return logger.__generator(this, function (_a) { + if (oauth2ClientInfo) { + return [2 /*return*/]; + } + oauth2Recipe = recipe.OAuth2Provider.getInstance(); + if (oauth2Recipe !== undefined && loginChallenge !== null) { + return [2 /*return*/, oauth2Recipe.webJSRecipe.getLoginChallengeInfo({ loginChallenge: loginChallenge, userContext: userContext })]; + } + return [2 /*return*/, undefined]; + }); + }); }, function (info) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (info !== undefined) { + if (info.status === "OK") { + setOAuth2ClientInfo(info.info); + } + else { + setError("SOMETHING_WENT_WRONG_ERROR"); + } + } + return [2 /*return*/]; + }); + }); }, function () { + genericComponentOverrideContext.clearQueryParams(["loginChallenge"]); + setError("SOMETHING_WENT_WRONG_ERROR"); + }); + React.useEffect(function () { + if (sessionLoadedAndNotRedirecting) { + return; + } + // we want to do this just once, so we supply it with only the loading state. + // if we supply it with props, sessionContext, then once the user signs in, then this will route the + // user to the dashboard, as opposed to the sign up / sign in functions. + if (sessionContext.loading === false) { + if (sessionContext.doesSessionExist) { + if (props.onSessionAlreadyExists !== undefined) { + props.onSessionAlreadyExists(); + } + else if (props.redirectOnSessionExists !== false && !forceFreshAuth) { + types.Session.getInstanceOrThrow().config.onHandleEvent({ + action: "SESSION_ALREADY_EXISTS", + }); + var oauth2Recipe_1 = recipe.OAuth2Provider.getInstance(); + if (loginChallenge !== null && oauth2Recipe_1 !== undefined) { + (function () { + return logger.__awaiter(this, void 0, void 0, function () { + var frontendRedirectTo; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, oauth2Recipe_1.webJSRecipe.getRedirectURLToContinueOAuthFlow({ + loginChallenge: loginChallenge, + userContext: userContext, + })]; + case 1: + frontendRedirectTo = (_a.sent()).frontendRedirectTo; + return [2 /*return*/, types.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection({ + // We get here if the user was redirected to the auth screen with an already existing session + // and a loginChallenge (we check the forceFreshAuth queryparam above) + action: "SUCCESS_OAUTH2", + frontendRedirectTo: frontendRedirectTo, + // We can use these defaults, since this is not the result of a sign in/up call + createdNewUser: false, + isNewRecipeUser: false, + newSessionCreated: false, + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + recipeId: types.Session.RECIPE_ID, + }, types.Session.RECIPE_ID, genericComponentOverrideContext.getRedirectToPathFromURL(), userContext, props.navigate)]; + } + }); + }); + })().catch(rethrowInRender); + } + else { + void types.Session.getInstanceOrThrow() + .validateGlobalClaimsAndHandleSuccessRedirection(undefined, types.Session.RECIPE_ID, genericComponentOverrideContext.getRedirectToPathFromURL(), userContext, props.navigate) + .catch(rethrowInRender); + } + } + else { + setSessionLoadedAndNotRedirecting(true); + } + } + else { + setSessionLoadedAndNotRedirecting(true); + } + } + }, [sessionContext.loading]); + var _o = React.useState(), authComponentListInfo = _o[0], setAuthComponentListInfo = _o[1]; + var showUseAnotherLink = factorList !== undefined && + (props.factors === undefined || props.factors.some(function (id) { return !factorList.includes(id); })); + var stInstance = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow(); + var privacyPolicyLink = stInstance.privacyPolicyLink; + var termsOfServiceLink = stInstance.termsOfServiceLink; + React.useEffect(function () { + var abortCtl = new AbortController(); + if (lastBuild.current.buildReq === rebuildReqCount) { + return; + } + if (sessionLoadedAndNotRedirecting && + (loadedDynamicLoginMethods !== undefined || !genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods)) { + void buildAndSetChildProps(props.preBuiltUIList, loadedDynamicLoginMethods, userContext, factorList, isSignUp, setAuthComponentListInfo, abortCtl.signal).then(function () { + lastBuild.current.buildReq = rebuildReqCount; + }, rethrowInRender); + } + return function () { + abortCtl.abort(); + }; + }, [ + sessionLoadedAndNotRedirecting, + rebuildReqCount, + setRebuildReqCount, + props.preBuiltUIList, + loadedDynamicLoginMethods, + userContext, + factorList, + isSignUp, + setAuthComponentListInfo, + rethrowInRender, + ]); + var onAuthSuccess = React.useCallback(function (ctx) { return logger.__awaiter(void 0, void 0, void 0, function () { + var oauth2Recipe, frontendRedirectTo; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + oauth2Recipe = recipe.OAuth2Provider.getInstance(); + if (loginChallenge === null || oauth2Recipe === undefined) { + return [2 /*return*/, types.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection(logger.__assign(logger.__assign({}, ctx), { action: "SUCCESS", tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), redirectToPath: genericComponentOverrideContext.getRedirectToPathFromURL() }), ctx.recipeId, genericComponentOverrideContext.getRedirectToPathFromURL(), userContext, props.navigate)]; + } + return [4 /*yield*/, oauth2Recipe.webJSRecipe.getRedirectURLToContinueOAuthFlow({ + loginChallenge: loginChallenge, + userContext: userContext, + })]; + case 1: + frontendRedirectTo = (_a.sent()).frontendRedirectTo; + return [2 /*return*/, types.Session.getInstanceOrThrow().validateGlobalClaimsAndHandleSuccessRedirection(logger.__assign(logger.__assign({}, ctx), { action: "SUCCESS_OAUTH2", tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), frontendRedirectTo: frontendRedirectTo }), ctx.recipeId, genericComponentOverrideContext.getRedirectToPathFromURL(), userContext, props.navigate)]; + } + }); + }); }, [loginChallenge]); + var childProps = authComponentListInfo !== undefined && + (loginChallenge === null || oauth2ClientInfo !== undefined || recipe.OAuth2Provider.getInstance() === undefined) + ? logger.__assign(logger.__assign({}, authComponentListInfo), { oauth2ClientInfo: oauth2ClientInfo, onAuthSuccess: onAuthSuccess, error: error, onError: function (err) { + setError(err); + }, clearError: function () { return setError(undefined); }, navigate: props.navigate, onSignInUpSwitcherClick: onSignInUpSwitcherClick, privacyPolicyLink: privacyPolicyLink, rebuildAuthPage: function () { return setRebuildReqCount(function (v) { return v + 1; }); }, setFactorList: function (factorIds) { + setFactorList(factorIds); + setRebuildReqCount(function (v) { return v + 1; }); + }, resetFactorList: function () { + setFactorList(props.factors); + setRebuildReqCount(function (v) { return v + 1; }); + }, showBackButton: showUseAnotherLink, termsOfServiceLink: termsOfServiceLink, userContext: userContext }) : undefined; + var mergedTranslations = React.useMemo(function () { + var res = defaultTranslationsCommon; + if (authComponentListInfo !== undefined) { + for (var _i = 0, _a = props.preBuiltUIList; _i < _a.length; _i++) { + var ui = _a[_i]; + res = genericComponentOverrideContext.mergeObjects(res, ui.languageTranslations); + } + } + res = genericComponentOverrideContext.mergeObjects(res, st.languageTranslations.userTranslationStore); + return res; + }, [st.languageTranslations.userTranslationStore, authComponentListInfo]); + if (childProps === undefined) { + return jsxRuntime.jsx(DynamicLoginMethodsSpinner, {}); + } + else { + return (jsxRuntime.jsx(DynamicLoginMethodsProvider, logger.__assign({ value: loadedDynamicLoginMethods }, { children: jsxRuntime.jsx(translationContext.TranslationContextProvider, logger.__assign({ defaultLanguage: st.languageTranslations.defaultLanguage, defaultStore: mergedTranslations, translationControlEventSource: st.languageTranslations.translationEventSource, userTranslationFunc: st.languageTranslations.userTranslationFunc }, { children: jsxRuntime.jsx(WithOrWithoutShadowDom, logger.__assign({ useShadowDom: st.useShadowDom }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(AuthPageThemeWrapper, logger.__assign({}, childProps)), props.children && + React__default.default.Children.map(props.children, function (child) { + if (React__default.default.isValidElement(child)) { + return React__default.default.cloneElement(child, childProps); + } + return child; + })] }) })) })) }))); + } +}; +function buildAndSetChildProps(recipeRouters, loadedDynamicLoginMethods, userContext, factorListState, isSignUpState, setComponentListInfo, abort) { + var _a, _b, _c, _d, _e; + return logger.__awaiter(this, void 0, void 0, function () { + var authRecipesInited, firstFactors, missingPreBuiltUIs, thirdPartyPreBuiltUI, hasSeparateSignUpView, isSignUp, authComps, _i, recipeRouters_1, ui, _f, authComps_1, a, preloadRes, partialAuthComps, selectedComponents, availableFactors, _g, partialAuthComps_1, comp, _h, _j, id, source; + return logger.__generator(this, function (_k) { + switch (_k.label) { + case 0: + authRecipesInited = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().recipeList.filter(function (recipe) { return "firstFactorIds" in recipe; }); + firstFactors = (_c = (_a = factorListState !== null && factorListState !== void 0 ? factorListState : loadedDynamicLoginMethods === null || loadedDynamicLoginMethods === void 0 ? void 0 : loadedDynamicLoginMethods.firstFactors) !== null && _a !== void 0 ? _a : (_b = recipe$1.MultiFactorAuth.getInstance()) === null || _b === void 0 ? void 0 : _b.config.firstFactors) !== null && _c !== void 0 ? _c : authRecipesInited.reduce(function (acc, recipe) { return logger.__spreadArray(logger.__spreadArray([], acc, true), recipe.getFirstFactorsForAuthPage(), true); }, []); + if (factorListState === undefined && + (loadedDynamicLoginMethods === null || loadedDynamicLoginMethods === void 0 ? void 0 : loadedDynamicLoginMethods.firstFactors) === undefined && + ((_d = recipe$1.MultiFactorAuth.getInstance()) === null || _d === void 0 ? void 0 : _d.config.firstFactors) === undefined) { + missingPreBuiltUIs = authRecipesInited.filter(function (recipe) { return !recipeRouters.some(function (router) { return router.recipeInstance.recipeID === recipe.recipeID; }); }); + if (missingPreBuiltUIs.length > 0) { + // In this case we'd most likely throw anyway (except in the case of EP+Pwless), but we want to provide a better error message + throw new Error("Factor list not set but PreBuiltUI not added for ".concat(missingPreBuiltUIs.map(function (r) { return r.recipeID; }))); + } + } + if (firstFactors.length === 0) { + throw new Error("There are no enabled factors to show"); + } + if (firstFactors.includes(types.FactorIds.THIRDPARTY)) { + thirdPartyPreBuiltUI = recipeRouters.find(function (r) { return r.recipeInstance.recipeID === types.FactorIds.THIRDPARTY; }); + // here we ignore if we couldn't find the necessary prebuilt UI, because we want to throw in the standard location + if (thirdPartyPreBuiltUI !== undefined) { + // We remove the thirdparty factor if: + // We have no provider defined on the client side and + // We have no provider defined for the tenant either + if (thirdPartyPreBuiltUI.recipeInstance.config.signInAndUpFeature.providers.length === 0 && + (!genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods || loadedDynamicLoginMethods.thirdparty.providers.length === 0)) { + firstFactors = firstFactors.filter(function (f) { return f !== types.FactorIds.THIRDPARTY; }); + if (firstFactors.length === 0) { + throw new Error("The only enabled first factor is thirdparty, but no providers were defined. Please define at least one provider."); + } + } + } + } + hasSeparateSignUpView = recipeRouters.some(function (ui) { + return ui.requiresSignUpPage && + ui.recipeInstance.firstFactorIds.some(function (id) { return firstFactors.includes(id); }); + }); + isSignUp = hasSeparateSignUpView && isSignUpState; + authComps = []; + for (_i = 0, recipeRouters_1 = recipeRouters; _i < recipeRouters_1.length; _i++) { + ui = recipeRouters_1[_i]; + authComps.push.apply(authComps, ui.getAuthComponents()); + } + _f = 0, authComps_1 = authComps; + _k.label = 1; + case 1: + if (!(_f < authComps_1.length)) return [3 /*break*/, 4]; + a = authComps_1[_f]; + if (!(a.type === "FULL_PAGE")) return [3 /*break*/, 3]; + return [4 /*yield*/, a.preloadInfoAndRunChecks(firstFactors, userContext)]; + case 2: + preloadRes = _k.sent(); + // We skip setting if the auth page unmounted while we were checking + // if we should show any full page comps + if (abort.aborted) { + return [2 /*return*/]; + } + if (preloadRes.shouldDisplay) { + setComponentListInfo({ + authComponents: [], + fullPageCompWithPreloadedInfo: { + component: a.component, + preloadInfo: preloadRes.preloadInfo, + }, + isSignUp: isSignUp, + hasSeparateSignUpView: hasSeparateSignUpView, + factorIds: firstFactors, + }); + return [2 /*return*/]; + } + _k.label = 3; + case 3: + _f++; + return [3 /*break*/, 1]; + case 4: + if (abort.aborted) { + // We stop if the auth page unmounted while we were checking if we should show any full page comps + return [2 /*return*/]; + } + partialAuthComps = authComps.filter(function (c) { return c.type !== "FULL_PAGE" && c.factorIds.every(function (id) { return firstFactors.includes(id); }); }); + partialAuthComps = partialAuthComps.filter(function (c) { + return c.type === "SIGN_IN_UP" || // sign in+up components show in all cases + (isSignUp ? c.type === "SIGN_UP" : c.type === "SIGN_IN"); + } // otherwise we check if the sign up state is appropriate + ); + // We sort the auth components by the number of factors they cover, DESC + // This helps us choose combination components (ep+pwless) first + partialAuthComps.sort(function (a, b) { return b.factorIds.length - a.factorIds.length; }); + selectedComponents = utils.selectComponentsToCoverAllFirstFactors(partialAuthComps, firstFactors); + if (selectedComponents === undefined) { + availableFactors = new Set(); + for (_g = 0, partialAuthComps_1 = partialAuthComps; _g < partialAuthComps_1.length; _g++) { + comp = partialAuthComps_1[_g]; + for (_h = 0, _j = comp.factorIds; _h < _j.length; _h++) { + id = _j[_h]; + availableFactors.add(id); + } + } + source = factorListState !== undefined + ? "local state or props" + : (loadedDynamicLoginMethods === null || loadedDynamicLoginMethods === void 0 ? void 0 : loadedDynamicLoginMethods.firstFactors) !== undefined + ? "dynamic tenant configuration" + : ((_e = recipe$1.MultiFactorAuth.getInstance()) === null || _e === void 0 ? void 0 : _e.config.firstFactors) !== undefined + ? "the config passed to the MFA recipe" + : "all recipes initialized"; + throw new Error("Couldn't cover all first factors: ".concat(firstFactors.join(", "), " (from ").concat(source, "), available components: ").concat(Array.from(availableFactors).join(", "), ".\n") + + "You may have missed adding a recipe into the list of prebuiltUIs passed to list of prebuiltUIs passed to getSuperTokensRoutesForReactRouterDom, canHandleRoute, handleRoute functions or the AuthPage component.\n" + + "Another common error is adding a non-existent factor id into the list, e.g.: passwordless instead of otp-email/phone"); + } + setComponentListInfo({ + authComponents: selectedComponents.sort(function (a, b) { return a.displayOrder - b.displayOrder; }).map(function (w) { return w.component; }), + factorIds: firstFactors, + hasSeparateSignUpView: hasSeparateSignUpView, + isSignUp: isSignUp, + }); + return [2 /*return*/]; + } + }); + }); } -// The related ADR: https://supertokens.com/docs/contribute/decisions/multitenancy/0006 -var priorityOrder = [ - { - rid: "thirdpartyemailpassword", - includes: ["thirdparty", "emailpassword"], - factorsProvided: [types.FactorIds.THIRDPARTY, types.FactorIds.EMAILPASSWORD], - }, - { - rid: "thirdpartypasswordless", - includes: ["thirdparty", "passwordless"], - factorsProvided: [ - types.FactorIds.THIRDPARTY, - types.FactorIds.OTP_PHONE, - types.FactorIds.OTP_EMAIL, - types.FactorIds.LINK_PHONE, - types.FactorIds.LINK_EMAIL, - ], - }, - { rid: "emailpassword", includes: ["emailpassword"], factorsProvided: [types.FactorIds.EMAILPASSWORD] }, - { - rid: "passwordless", - includes: ["passwordless"], - factorsProvided: [ - types.FactorIds.OTP_PHONE, - types.FactorIds.OTP_EMAIL, - types.FactorIds.LINK_PHONE, - types.FactorIds.LINK_EMAIL, - ], - }, - { rid: "thirdparty", includes: ["thirdparty"], factorsProvided: [types.FactorIds.THIRDPARTY] }, -]; -function chooseComponentBasedOnFirstFactors(firstFactors, routeComponents) { - var fallbackRid; - var fallbackComponent; - var _loop_1 = function (rid, factorsProvided) { - if ( - firstFactors.every(function (factor) { - return factorsProvided.includes(factor); - }) - ) { - var matchingComp = routeComponents.find(function (comp) { - return comp.recipeID === rid; - }); - if (matchingComp) { - fallbackRid = rid; - fallbackComponent = matchingComp; - if (firstFactors.length === factorsProvided.length) { - genericComponentOverrideContext.logDebugMessage( - "Rendering ".concat(rid, " because it matches factors: ").concat(firstFactors, " exactly") - ); - return { value: matchingComp }; - } - } - } - }; - // We first try to find an exact match, and fall back on something that covers all factors (but maybe more) - /* - Examples: - 1. firstFactors: emailpassword, route components from: thirdparty -> - - no matches found, throwing error +// The related ADR: https://supertokens.com/docs/contribute/decisions/multitenancy/0006 +var priorityOrder = [ + { + rid: "thirdpartyemailpassword", + includes: ["thirdparty", "emailpassword"], + factorsProvided: [types.FactorIds.THIRDPARTY, types.FactorIds.EMAILPASSWORD], + }, + { + rid: "thirdpartypasswordless", + includes: ["thirdparty", "passwordless"], + factorsProvided: [ + types.FactorIds.THIRDPARTY, + types.FactorIds.OTP_PHONE, + types.FactorIds.OTP_EMAIL, + types.FactorIds.LINK_PHONE, + types.FactorIds.LINK_EMAIL, + ], + }, + { rid: "emailpassword", includes: ["emailpassword"], factorsProvided: [types.FactorIds.EMAILPASSWORD] }, + { + rid: "passwordless", + includes: ["passwordless"], + factorsProvided: [types.FactorIds.OTP_PHONE, types.FactorIds.OTP_EMAIL, types.FactorIds.LINK_PHONE, types.FactorIds.LINK_EMAIL], + }, + { rid: "thirdparty", includes: ["thirdparty"], factorsProvided: [types.FactorIds.THIRDPARTY] }, +]; +function chooseComponentBasedOnFirstFactors(firstFactors, routeComponents) { + var fallbackRid; + var fallbackComponent; + var _loop_1 = function (rid, factorsProvided) { + if (firstFactors.every(function (factor) { return factorsProvided.includes(factor); })) { + var matchingComp = routeComponents.find(function (comp) { return comp.recipeID === rid; }); + if (matchingComp) { + fallbackRid = rid; + fallbackComponent = matchingComp; + if (firstFactors.length === factorsProvided.length) { + logger.logDebugMessage("Rendering ".concat(rid, " because it matches factors: ").concat(firstFactors, " exactly")); + return { value: matchingComp }; + } + } + } + }; + // We first try to find an exact match, and fall back on something that covers all factors (but maybe more) + /* + Examples: + 1. firstFactors: emailpassword, route components from: thirdparty -> + - no matches found, throwing error - 2. firstFactors: emailpassword, route components from: thirdpartyemailpassword -> - - we find thirdpartyemailpassword covers all first factors, save it as fallback - - we check all other recipes, bot nothing else has matching components - - return fallback from TPEP + 2. firstFactors: emailpassword, route components from: thirdpartyemailpassword -> + - we find thirdpartyemailpassword covers all first factors, save it as fallback + - we check all other recipes, bot nothing else has matching components + - return fallback from TPEP - 3. firstFactors: emailpassword, route components from: thirdpartyemailpassword, emailpassword -> - - we find thirdpartyemailpassword covers all first factors, save it as fallback - - we find emailpassword as an exact match and return it + 3. firstFactors: emailpassword, route components from: thirdpartyemailpassword, emailpassword -> + - we find thirdpartyemailpassword covers all first factors, save it as fallback + - we find emailpassword as an exact match and return it - 4. firstFactors: otp-phone, route components from: thirdpartypasswordless, passwordless, thirdparty -> - - we find thirdpartypasswordless covers all first factors (but more), save it as fallback - - we find passwordless that covers all factors (but more), saving it as a fallback. - Keep in mind, that the passwordless and thirdpartypasswordless recipe provides 4 factors, so this is not an exact match. - - no other recipes have matching components, so we return the fallback from passwordless + 4. firstFactors: otp-phone, route components from: thirdpartypasswordless, passwordless, thirdparty -> + - we find thirdpartypasswordless covers all first factors (but more), save it as fallback + - we find passwordless that covers all factors (but more), saving it as a fallback. + Keep in mind, that the passwordless and thirdpartypasswordless recipe provides 4 factors, so this is not an exact match. + - no other recipes have matching components, so we return the fallback from passwordless - 5. firstFactors: thirdparty, otp-phone, route components from: thirdpartypasswordless, passwordless, thirdparty -> - - we find thirdpartypasswordless covers all first factors (but more), save it as fallback - this is not an exact match, because thirdpartypasswordless provides multiple passwordless factors. - - no other recipes cover all factors, so we return the fallback from thirdpartypasswordless - */ - for (var _i = 0, priorityOrder_1 = priorityOrder; _i < priorityOrder_1.length; _i++) { - var _a = priorityOrder_1[_i], - rid = _a.rid, - factorsProvided = _a.factorsProvided; - var state_1 = _loop_1(rid, factorsProvided); - if (typeof state_1 === "object") return state_1.value; - } - if (fallbackComponent !== undefined) { - genericComponentOverrideContext.logDebugMessage( - "Rendering ".concat(fallbackRid, " to cover ").concat(firstFactors, " as a fallback") - ); - return fallbackComponent; - } - // We may get here if: - // - The backend/tenantconfig is older and didn't have the firstFactors array defined - // - There is a configuration error - // We choose not to throw in the configuration error case because: - // - we can't tell these cases apart after the firstFactors array was made a requrired prop - // - we want to maintain backwards compatbility - // Here we replicate the old logic we had before the firstFactors array - var enabledLoginMethods = []; - if (firstFactors.includes(types.FactorIds.EMAILPASSWORD)) { - enabledLoginMethods.push("emailpassword"); - } - if (firstFactors.includes(types.FactorIds.THIRDPARTY)) { - enabledLoginMethods.push("thirdparty"); - } - if ( - [ - types.FactorIds.OTP_PHONE, - types.FactorIds.OTP_EMAIL, - types.FactorIds.LINK_PHONE, - types.FactorIds.LINK_EMAIL, - ].some(function (pwlessFactorId) { - return firstFactors.includes(pwlessFactorId); - }) - ) { - enabledLoginMethods.push("passwordless"); - } - genericComponentOverrideContext.logDebugMessage( - "Choosing component using fallback logic w/ ".concat(enabledLoginMethods.join(", "), " enabled") - ); - var enabledRecipeCount = enabledLoginMethods.length; - var _loop_2 = function (rid, includes) { - if ( - enabledRecipeCount === includes.length && - includes.every(function (subRId) { - return enabledLoginMethods.includes(subRId); - }) - ) { - var matchingComp = routeComponents.find(function (comp) { - return comp.recipeID === rid; - }); - if (matchingComp) { - return { value: matchingComp }; - } - } - }; - // We try and choose which component to show based on the enabled login methods - // We first try to find an exact match (a recipe that covers all enabled login methods and nothing else) - for (var _b = 0, priorityOrder_2 = priorityOrder; _b < priorityOrder_2.length; _b++) { - var _c = priorityOrder_2[_b], - rid = _c.rid, - includes = _c.includes; - var state_2 = _loop_2(rid, includes); - if (typeof state_2 === "object") return state_2.value; - } - var _loop_3 = function (rid, includes) { - if ( - includes.some(function (subRId) { - return enabledLoginMethods.includes(subRId); - }) - ) { - var matchingComp = routeComponents.find(function (comp) { - return comp.recipeID === rid; - }); - if (matchingComp) { - return { value: matchingComp }; - } - } - }; - // We try to find a partial match (so any recipe that overlaps with the enabled login methods) - for (var _d = 0, priorityOrder_3 = priorityOrder; _d < priorityOrder_3.length; _d++) { - var _e = priorityOrder_3[_d], - rid = _e.rid, - includes = _e.includes; - var state_3 = _loop_3(rid, includes); - if (typeof state_3 === "object") return state_3.value; - } - throw new Error("No enabled recipes overlap with the requested firstFactors: " + firstFactors); -} -var RecipeRouter = /** @class */ (function () { - function RecipeRouter() { - var _this = this; - this.getPathsToFeatureComponentWithRecipeIdMap = function () { - // Memoized version of the map. - if (_this.pathsToFeatureComponentWithRecipeIdMap !== undefined) { - return _this.pathsToFeatureComponentWithRecipeIdMap; - } - var pathsToFeatureComponentWithRecipeIdMap = {}; - var features = _this.getFeatures(); - var featurePaths = Object.keys(features); - for (var j = 0; j < featurePaths.length; j++) { - // If no components yet for this route, initialize empty array. - var featurePath = featurePaths[j]; - if (pathsToFeatureComponentWithRecipeIdMap[featurePath] === undefined) { - pathsToFeatureComponentWithRecipeIdMap[featurePath] = []; - } - pathsToFeatureComponentWithRecipeIdMap[featurePath].push(features[featurePath]); - } - _this.pathsToFeatureComponentWithRecipeIdMap = pathsToFeatureComponentWithRecipeIdMap; - return _this.pathsToFeatureComponentWithRecipeIdMap; - }; - this.requiresSignUpPage = false; - } - RecipeRouter.getMatchingComponentForRouteAndRecipeIdFromPreBuiltUIList = function ( - normalisedUrl, - preBuiltUIList, - defaultToStaticList, - dynamicLoginMethods - ) { - var path = normalisedUrl.getAsStringDangerous(); - // We check if we are on the auth page to later see if we should take first factors into account. - var isAuthPage = - path === - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous(); - // We get all components that can handle the current path - var routeComponents = preBuiltUIList.reduce(function (components, c) { - var routes = c.getPathsToFeatureComponentWithRecipeIdMap(); - var _loop_4 = function (routePath, routeComps) { - if ( - routePath === path || - new RegExp("^" + routePath.replace(/:\w+/g, "[^/]+").replace(/\/\*/g, "/[^/]+") + "$").test(path) - ) { - components = components.concat( - routeComps.map(function (c) { - return { comp: c, route: routePath }; - }) - ); - } - }; - for (var _i = 0, _a = Object.entries(routes); _i < _a.length; _i++) { - var _b = _a[_i], - routePath = _b[0], - routeComps = _b[1]; - _loop_4(routePath, routeComps); - } - return components; - }, []); - // We check the query params to see if any recipe was requested by id - var componentMatchingRid = routeComponents.find(function (c) { - return c.comp.matches(); - }); - // We default to to one requested by id or the first in the list - // i.e.: the first prebuilt ui in the list the user provided that can handle this route. - var defaultComp; - if (routeComponents.length === 0) { - defaultComp = undefined; - } else if (componentMatchingRid !== undefined) { - defaultComp = componentMatchingRid.comp; - } else { - defaultComp = routeComponents[0].comp; - } - // We check if any non-auth recipe (emailverification, totp) can handle this - // There should be no overlap between the routes handled by those and the auth recipes - // so if there is a match we can return early - var matchingNonAuthComponent = routeComponents.find(function (comp) { - var ridlist = priorityOrder.map(function (a) { - return a.rid; - }); - return ( - !ridlist.includes(comp.comp.recipeID) || - comp.route !== - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous() - ); - }); - if (matchingNonAuthComponent) { - return matchingNonAuthComponent.comp; - } - // We use this option in `canHandleRoute`, because it may be called by custom UIs before - // dynamic login methods are loaded. - if (defaultToStaticList) { - return defaultComp; - } - var mfaRecipe = recipe$1.MultiFactorAuth.getInstance(); - if (genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods === false) { - // If we are not using dynamic login methods, we can use the rid requested by the app - if (componentMatchingRid) { - return componentMatchingRid.comp; - } - // if we have a static firstFactors config we take it into account on the auth page - // Other pages shouldn't care about this configuration. - // Embedded components are not affected, since this is only called by the routing component. - if (isAuthPage && mfaRecipe && mfaRecipe.config.firstFactors !== undefined) { - return chooseComponentBasedOnFirstFactors( - mfaRecipe.config.firstFactors, - routeComponents.map(function (c) { - return c.comp; - }) - ); - } else { - return defaultComp; - } - } - if (dynamicLoginMethods === undefined) { - throw new Error( - "Should never come here: dynamic login methods info has not been loaded but recipeRouter rendered" - ); - } - // If we are using dynamic login methods, we check that the requested rid belongs to an enabled recipe - if ( - componentMatchingRid && // if we find a component matching by rid - (!priorityOrder - .map(function (a) { - return a.rid; - }) - .includes(componentMatchingRid.comp.recipeID) || // from a non-auth recipe - priorityOrder.some(function (a) { - return ( - a.rid === componentMatchingRid.comp.recipeID && - a.factorsProvided.some(function (factorId) { - return dynamicLoginMethods.firstFactors.includes(factorId); - }) - ); - })) // or an enabled auth recipe - ) { - return componentMatchingRid.comp; - } - // if we have a firstFactors config for the tenant we take it into account on the auth page - // Other pages shouldn't care about this configuration. - // Embedded components are not affected, since this is only called by the routing component. - if (isAuthPage) { - return chooseComponentBasedOnFirstFactors( - dynamicLoginMethods.firstFactors, - routeComponents.map(function (c) { - return c.comp; - }) - ); - } - return undefined; - }; - return RecipeRouter; -})(); + 5. firstFactors: thirdparty, otp-phone, route components from: thirdpartypasswordless, passwordless, thirdparty -> + - we find thirdpartypasswordless covers all first factors (but more), save it as fallback + this is not an exact match, because thirdpartypasswordless provides multiple passwordless factors. + - no other recipes cover all factors, so we return the fallback from thirdpartypasswordless + */ + for (var _i = 0, priorityOrder_1 = priorityOrder; _i < priorityOrder_1.length; _i++) { + var _a = priorityOrder_1[_i], rid = _a.rid, factorsProvided = _a.factorsProvided; + var state_1 = _loop_1(rid, factorsProvided); + if (typeof state_1 === "object") + return state_1.value; + } + if (fallbackComponent !== undefined) { + logger.logDebugMessage("Rendering ".concat(fallbackRid, " to cover ").concat(firstFactors, " as a fallback")); + return fallbackComponent; + } + // We may get here if: + // - The backend/tenantconfig is older and didn't have the firstFactors array defined + // - There is a configuration error + // We choose not to throw in the configuration error case because: + // - we can't tell these cases apart after the firstFactors array was made a requrired prop + // - we want to maintain backwards compatbility + // Here we replicate the old logic we had before the firstFactors array + var enabledLoginMethods = []; + if (firstFactors.includes(types.FactorIds.EMAILPASSWORD)) { + enabledLoginMethods.push("emailpassword"); + } + if (firstFactors.includes(types.FactorIds.THIRDPARTY)) { + enabledLoginMethods.push("thirdparty"); + } + if ([types.FactorIds.OTP_PHONE, types.FactorIds.OTP_EMAIL, types.FactorIds.LINK_PHONE, types.FactorIds.LINK_EMAIL].some(function (pwlessFactorId) { + return firstFactors.includes(pwlessFactorId); + })) { + enabledLoginMethods.push("passwordless"); + } + logger.logDebugMessage("Choosing component using fallback logic w/ ".concat(enabledLoginMethods.join(", "), " enabled")); + var enabledRecipeCount = enabledLoginMethods.length; + var _loop_2 = function (rid, includes) { + if (enabledRecipeCount === includes.length && + includes.every(function (subRId) { return enabledLoginMethods.includes(subRId); })) { + var matchingComp = routeComponents.find(function (comp) { return comp.recipeID === rid; }); + if (matchingComp) { + return { value: matchingComp }; + } + } + }; + // We try and choose which component to show based on the enabled login methods + // We first try to find an exact match (a recipe that covers all enabled login methods and nothing else) + for (var _b = 0, priorityOrder_2 = priorityOrder; _b < priorityOrder_2.length; _b++) { + var _c = priorityOrder_2[_b], rid = _c.rid, includes = _c.includes; + var state_2 = _loop_2(rid, includes); + if (typeof state_2 === "object") + return state_2.value; + } + var _loop_3 = function (rid, includes) { + if (includes.some(function (subRId) { return enabledLoginMethods.includes(subRId); })) { + var matchingComp = routeComponents.find(function (comp) { return comp.recipeID === rid; }); + if (matchingComp) { + return { value: matchingComp }; + } + } + }; + // We try to find a partial match (so any recipe that overlaps with the enabled login methods) + for (var _d = 0, priorityOrder_3 = priorityOrder; _d < priorityOrder_3.length; _d++) { + var _e = priorityOrder_3[_d], rid = _e.rid, includes = _e.includes; + var state_3 = _loop_3(rid, includes); + if (typeof state_3 === "object") + return state_3.value; + } + throw new Error("No enabled recipes overlap with the requested firstFactors: " + firstFactors); +} +var RecipeRouter = /** @class */ (function () { + function RecipeRouter() { + var _this = this; + this.getPathsToFeatureComponentWithRecipeIdMap = function () { + // Memoized version of the map. + if (_this.pathsToFeatureComponentWithRecipeIdMap !== undefined) { + return _this.pathsToFeatureComponentWithRecipeIdMap; + } + var pathsToFeatureComponentWithRecipeIdMap = {}; + var features = _this.getFeatures(); + var featurePaths = Object.keys(features); + for (var j = 0; j < featurePaths.length; j++) { + // If no components yet for this route, initialize empty array. + var featurePath = featurePaths[j]; + if (pathsToFeatureComponentWithRecipeIdMap[featurePath] === undefined) { + pathsToFeatureComponentWithRecipeIdMap[featurePath] = []; + } + pathsToFeatureComponentWithRecipeIdMap[featurePath].push(features[featurePath]); + } + _this.pathsToFeatureComponentWithRecipeIdMap = pathsToFeatureComponentWithRecipeIdMap; + return _this.pathsToFeatureComponentWithRecipeIdMap; + }; + this.requiresSignUpPage = false; + } + RecipeRouter.getMatchingComponentForRouteAndRecipeIdFromPreBuiltUIList = function (normalisedUrl, preBuiltUIList, defaultToStaticList, dynamicLoginMethods) { + var path = normalisedUrl.getAsStringDangerous(); + // We check if we are on the auth page to later see if we should take first factors into account. + var isAuthPage = path === genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous(); + // We get all components that can handle the current path + var routeComponents = preBuiltUIList.reduce(function (components, c) { + var routes = c.getPathsToFeatureComponentWithRecipeIdMap(); + var _loop_4 = function (routePath, routeComps) { + if (routePath === path || + new RegExp("^" + routePath.replace(/:\w+/g, "[^/]+").replace(/\/\*/g, "/[^/]+") + "$").test(path)) { + components = components.concat(routeComps.map(function (c) { + return { comp: c, route: routePath }; + })); + } + }; + for (var _i = 0, _a = Object.entries(routes); _i < _a.length; _i++) { + var _b = _a[_i], routePath = _b[0], routeComps = _b[1]; + _loop_4(routePath, routeComps); + } + return components; + }, []); + // We check the query params to see if any recipe was requested by id + var componentMatchingRid = routeComponents.find(function (c) { return c.comp.matches(); }); + // We default to to one requested by id or the first in the list + // i.e.: the first prebuilt ui in the list the user provided that can handle this route. + var defaultComp; + if (routeComponents.length === 0) { + defaultComp = undefined; + } + else if (componentMatchingRid !== undefined) { + defaultComp = componentMatchingRid.comp; + } + else { + defaultComp = routeComponents[0].comp; + } + // We check if any non-auth recipe (emailverification, totp) can handle this + // There should be no overlap between the routes handled by those and the auth recipes + // so if there is a match we can return early + var matchingNonAuthComponent = routeComponents.find(function (comp) { + var ridlist = priorityOrder.map(function (a) { return a.rid; }); + return (!ridlist.includes(comp.comp.recipeID) || + comp.route !== genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous()); + }); + if (matchingNonAuthComponent) { + return matchingNonAuthComponent.comp; + } + // We use this option in `canHandleRoute`, because it may be called by custom UIs before + // dynamic login methods are loaded. + if (defaultToStaticList) { + return defaultComp; + } + var mfaRecipe = recipe$1.MultiFactorAuth.getInstance(); + if (genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods === false) { + // If we are not using dynamic login methods, we can use the rid requested by the app + if (componentMatchingRid) { + return componentMatchingRid.comp; + } + // if we have a static firstFactors config we take it into account on the auth page + // Other pages shouldn't care about this configuration. + // Embedded components are not affected, since this is only called by the routing component. + if (isAuthPage && mfaRecipe && mfaRecipe.config.firstFactors !== undefined) { + return chooseComponentBasedOnFirstFactors(mfaRecipe.config.firstFactors, routeComponents.map(function (c) { return c.comp; })); + } + else { + return defaultComp; + } + } + if (dynamicLoginMethods === undefined) { + throw new Error("Should never come here: dynamic login methods info has not been loaded but recipeRouter rendered"); + } + // If we are using dynamic login methods, we check that the requested rid belongs to an enabled recipe + if (componentMatchingRid && // if we find a component matching by rid + (!priorityOrder.map(function (a) { return a.rid; }).includes(componentMatchingRid.comp.recipeID) || // from a non-auth recipe + priorityOrder.some(function (a) { + return a.rid === componentMatchingRid.comp.recipeID && + a.factorsProvided.some(function (factorId) { return dynamicLoginMethods.firstFactors.includes(factorId); }); + })) // or an enabled auth recipe + ) { + return componentMatchingRid.comp; + } + // if we have a firstFactors config for the tenant we take it into account on the auth page + // Other pages shouldn't care about this configuration. + // Embedded components are not affected, since this is only called by the routing component. + if (isAuthPage) { + return chooseComponentBasedOnFirstFactors(dynamicLoginMethods.firstFactors, routeComponents.map(function (c) { return c.comp; })); + } + return undefined; + }; + return RecipeRouter; +}()); -function RoutingComponent(props) { - var _a, _b; - var userContext = useUserContext(); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var _c = React.useState(undefined), - loadedDynamicLoginMethods = _c[0], - setLoadedDynamicLoginMethods = _c[1]; - var navigate = - (_a = props.getReactRouterDomWithCustomHistory()) === null || _a === void 0 ? void 0 : _a.useHistoryCustom(); - var path = props.path; - var isAuthPage = - path === - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous(); - var location = - (_b = props.getReactRouterDomWithCustomHistory()) === null || _b === void 0 ? void 0 : _b.useLocation(); - var componentToRender = React__default.default.useMemo( - function () { - if (isAuthPage) { - return; - } - var normalizedPath = new NormalisedURLPath__default.default(path); - // During development, this runs twice so as to warn devs of if there - // are any side effects that happen here. So in tests, it will result in - // the console log twice - if ( - loadedDynamicLoginMethods !== undefined || - genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods === false - ) { - var result = RecipeRouter.getMatchingComponentForRouteAndRecipeIdFromPreBuiltUIList( - normalizedPath, - props.preBuiltUIList, - false, - loadedDynamicLoginMethods - ); - if ( - result === undefined && - genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods === true - ) { - void redirectToAuth({ navigate: navigate, redirectBack: false }); - } - return result; - } - return undefined; - // location dependency needs to be kept in order to get new component on url change - // eslint-disable-next-line react-hooks/exhaustive-deps - }, - [path, location, loadedDynamicLoginMethods, props.preBuiltUIList] - ); - React.useEffect( - function () { - if (loadedDynamicLoginMethods) { - return; - } - genericComponentOverrideContext.Multitenancy.getInstanceOrThrow() - .getCurrentDynamicLoginMethods({ userContext: userContext }) - .then( - function (loginMethods) { - return setLoadedDynamicLoginMethods(loginMethods); - }, - function (err) { - return rethrowInRender(err); - } - ); - }, - [loadedDynamicLoginMethods, setLoadedDynamicLoginMethods] - ); - if (isAuthPage) { - return jsxRuntime.jsx(AuthPageWrapper, { - preBuiltUIList: props.preBuiltUIList, - navigate: navigate, - useSignUpStateFromQueryString: true, - }); - } - if ( - genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods && - loadedDynamicLoginMethods === undefined - ) { - return jsxRuntime.jsx(DynamicLoginMethodsSpinner, {}); - } - if ( - componentToRender === undefined || - (loadedDynamicLoginMethods === undefined && genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods) - ) { - return null; - } - return jsxRuntime.jsx(componentToRender.component, { navigate: navigate }); +function RoutingComponent(props) { + var _a, _b; + var userContext = useUserContext(); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var _c = React.useState(undefined), loadedDynamicLoginMethods = _c[0], setLoadedDynamicLoginMethods = _c[1]; + var navigate = (_a = props.getReactRouterDomWithCustomHistory()) === null || _a === void 0 ? void 0 : _a.useHistoryCustom(); + var path = props.path; + var isAuthPage = path === genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous(); + var location = (_b = props.getReactRouterDomWithCustomHistory()) === null || _b === void 0 ? void 0 : _b.useLocation(); + var componentToRender = React__default.default.useMemo(function () { + if (isAuthPage) { + return; + } + var normalizedPath = new NormalisedURLPath__default.default(path); + // During development, this runs twice so as to warn devs of if there + // are any side effects that happen here. So in tests, it will result in + // the console log twice + if (loadedDynamicLoginMethods !== undefined || genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods === false) { + var result = RecipeRouter.getMatchingComponentForRouteAndRecipeIdFromPreBuiltUIList(normalizedPath, props.preBuiltUIList, false, loadedDynamicLoginMethods); + if (result === undefined && genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods === true) { + void redirectToAuth({ navigate: navigate, redirectBack: false }); + } + return result; + } + return undefined; + // location dependency needs to be kept in order to get new component on url change + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [path, location, loadedDynamicLoginMethods, props.preBuiltUIList]); + React.useEffect(function () { + if (loadedDynamicLoginMethods) { + return; + } + genericComponentOverrideContext.Multitenancy.getInstanceOrThrow() + .getCurrentDynamicLoginMethods({ userContext: userContext }) + .then(function (loginMethods) { return setLoadedDynamicLoginMethods(loginMethods); }, function (err) { return rethrowInRender(err); }); + }, [loadedDynamicLoginMethods, setLoadedDynamicLoginMethods]); + if (isAuthPage) { + return (jsxRuntime.jsx(AuthPageWrapper, { preBuiltUIList: props.preBuiltUIList, navigate: navigate, useSignUpStateFromQueryString: true })); + } + if (genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods && loadedDynamicLoginMethods === undefined) { + return jsxRuntime.jsx(DynamicLoginMethodsSpinner, {}); + } + if (componentToRender === undefined || + (loadedDynamicLoginMethods === undefined && genericComponentOverrideContext.SuperTokens.usesDynamicLoginMethods)) { + return null; + } + return jsxRuntime.jsx(componentToRender.component, { navigate: navigate }); } -/* - * Component. - */ -function getSuperTokensRoutesForReactRouterDom$1(_a) { - var getReactRouterDomWithCustomHistory = _a.getReactRouterDomWithCustomHistory, - recipeList = _a.recipeList, - basePath = _a.basePath; - var routerInfo = getReactRouterDomWithCustomHistory(); - if (routerInfo === undefined) { - return []; - } - var Route = routerInfo.router.Route; - var routes = Object.values( - recipeList.reduce(function (routes, recipe) { - var pathsToFeatureComponentWithRecipeIdMap = recipe.getPathsToFeatureComponentWithRecipeIdMap(); - Object.keys(pathsToFeatureComponentWithRecipeIdMap).forEach(function (path) { - path = path === "" ? "/" : path; - var pathForRouter = getPathForRouter$1(basePath, path); - if (!(path in routes)) { - routes[path] = jsxRuntime.jsx( - Route, - genericComponentOverrideContext.__assign( - { exact: true, path: pathForRouter }, - { - children: jsxRuntime.jsx(RoutingComponent, { - getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, - preBuiltUIList: recipeList, - path: path, - }), - } - ), - "st-".concat(path) - ); - } - }); - return routes; - }, {}) - ); - if ( - !genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().disableAuthRoute && - recipeList.some(function (ui) { - return ui.getAuthComponents().length !== 0; - }) - ) { - var path = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() - .appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default$1.default("/")) - .getAsStringDangerous(); - routes.push( - jsxRuntime.jsx( - Route, - genericComponentOverrideContext.__assign( - { exact: true, path: getPathForRouter$1(basePath, path) }, - { - children: jsxRuntime.jsx(RoutingComponent, { - getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, - preBuiltUIList: recipeList, - path: path, - }), - } - ), - "st-/auth" - ) - ); - } - return routes; -} -function getPathForRouter$1(basePath, path) { - var pathForRouter = path; - if (basePath !== undefined) { - if (pathForRouter.startsWith(basePath)) { - pathForRouter = pathForRouter.slice(basePath.length); - if (!pathForRouter.startsWith("/")) { - pathForRouter = "/" + pathForRouter; - } - } else { - throw new Error("basePath has to be a prefix of websiteBasePath passed to SuperTokens.init"); - } - } - return pathForRouter; +/* + * Component. + */ +function getSuperTokensRoutesForReactRouterDom$1(_a) { + var getReactRouterDomWithCustomHistory = _a.getReactRouterDomWithCustomHistory, recipeList = _a.recipeList, basePath = _a.basePath; + var routerInfo = getReactRouterDomWithCustomHistory(); + if (routerInfo === undefined) { + return []; + } + var Route = routerInfo.router.Route; + var routes = Object.values(recipeList.reduce(function (routes, recipe) { + var pathsToFeatureComponentWithRecipeIdMap = recipe.getPathsToFeatureComponentWithRecipeIdMap(); + Object.keys(pathsToFeatureComponentWithRecipeIdMap).forEach(function (path) { + path = path === "" ? "/" : path; + var pathForRouter = getPathForRouter$1(basePath, path); + if (!(path in routes)) { + routes[path] = (jsxRuntime.jsx(Route, logger.__assign({ exact: true, path: pathForRouter }, { children: jsxRuntime.jsx(RoutingComponent, { getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, preBuiltUIList: recipeList, path: path }) }), "st-".concat(path))); + } + }); + return routes; + }, {})); + if (!genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().disableAuthRoute && + recipeList.some(function (ui) { return ui.getAuthComponents().length !== 0; })) { + var path = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() + .appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default$1.default("/")) + .getAsStringDangerous(); + routes.push(jsxRuntime.jsx(Route, logger.__assign({ exact: true, path: getPathForRouter$1(basePath, path) }, { children: jsxRuntime.jsx(RoutingComponent, { getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, preBuiltUIList: recipeList, path: path }) }), "st-/auth")); + } + return routes; +} +function getPathForRouter$1(basePath, path) { + var pathForRouter = path; + if (basePath !== undefined) { + if (pathForRouter.startsWith(basePath)) { + pathForRouter = pathForRouter.slice(basePath.length); + if (!pathForRouter.startsWith("/")) { + pathForRouter = "/" + pathForRouter; + } + } + else { + throw new Error("basePath has to be a prefix of websiteBasePath passed to SuperTokens.init"); + } + } + return pathForRouter; } -/* - * Component. - */ -function getSuperTokensRoutesForReactRouterDomV6(_a) { - var getReactRouterDomWithCustomHistory = _a.getReactRouterDomWithCustomHistory, - recipeList = _a.recipeList, - basePath = _a.basePath; - var routerInfo = getReactRouterDomWithCustomHistory(); - if (routerInfo === undefined) { - return []; - } - var Route = routerInfo.router.Route; - var routes = Object.values( - recipeList.reduce(function (routes, recipe) { - var pathsToFeatureComponentWithRecipeIdMap = recipe.getPathsToFeatureComponentWithRecipeIdMap(); - Object.keys(pathsToFeatureComponentWithRecipeIdMap).forEach(function (path) { - path = path === "" ? "/" : path; - var pathForRouter = getPathForRouter(basePath, path); - if (!(path in routes)) { - routes[path] = jsxRuntime.jsx( - Route, - { - path: pathForRouter, - element: jsxRuntime.jsx(RoutingComponent, { - getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, - preBuiltUIList: recipeList, - path: path, - }), - }, - "st-".concat(path) - ); - } - }); - return routes; - }, {}) - ); - if ( - !genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().disableAuthRoute && - recipeList.some(function (ui) { - return ui.getAuthComponents().length !== 0; - }) - ) { - var path = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() - .appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default$1.default("/")) - .getAsStringDangerous(); - routes.push( - jsxRuntime.jsx( - Route, - { - path: getPathForRouter(basePath, path), - element: jsxRuntime.jsx(RoutingComponent, { - getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, - preBuiltUIList: recipeList, - path: path, - }), - }, - "st-/auth" - ) - ); - } - return routes; -} -function getPathForRouter(basePath, path) { - if (basePath !== undefined) { - if (path.startsWith(basePath)) { - path = path.slice(basePath.length); - if (!path.startsWith("/")) { - path = "/" + path; - } - } else { - throw new Error("basePath has to be a prefix of websiteBasePath passed to SuperTokens.init"); - } - } - return path; +/* + * Component. + */ +function getSuperTokensRoutesForReactRouterDomV6(_a) { + var getReactRouterDomWithCustomHistory = _a.getReactRouterDomWithCustomHistory, recipeList = _a.recipeList, basePath = _a.basePath; + var routerInfo = getReactRouterDomWithCustomHistory(); + if (routerInfo === undefined) { + return []; + } + var Route = routerInfo.router.Route; + var routes = Object.values(recipeList.reduce(function (routes, recipe) { + var pathsToFeatureComponentWithRecipeIdMap = recipe.getPathsToFeatureComponentWithRecipeIdMap(); + Object.keys(pathsToFeatureComponentWithRecipeIdMap).forEach(function (path) { + path = path === "" ? "/" : path; + var pathForRouter = getPathForRouter(basePath, path); + if (!(path in routes)) { + routes[path] = (jsxRuntime.jsx(Route, { path: pathForRouter, element: jsxRuntime.jsx(RoutingComponent, { getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, preBuiltUIList: recipeList, path: path }) }, "st-".concat(path))); + } + }); + return routes; + }, {})); + if (!genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().disableAuthRoute && + recipeList.some(function (ui) { return ui.getAuthComponents().length !== 0; })) { + var path = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() + .appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default$1.default("/")) + .getAsStringDangerous(); + routes.push(jsxRuntime.jsx(Route, { path: getPathForRouter(basePath, path), element: jsxRuntime.jsx(RoutingComponent, { getReactRouterDomWithCustomHistory: getReactRouterDomWithCustomHistory, preBuiltUIList: recipeList, path: path }) }, "st-/auth")); + } + return routes; +} +function getPathForRouter(basePath, path) { + if (basePath !== undefined) { + if (path.startsWith(basePath)) { + path = path.slice(basePath.length); + if (!path.startsWith("/")) { + path = "/" + path; + } + } + else { + throw new Error("basePath has to be a prefix of websiteBasePath passed to SuperTokens.init"); + } + } + return path; } -var UI = /** @class */ (function () { - function UI() {} - UI.getSuperTokensRoutesForReactRouterDom = function (reactRouterDom, preBuiltUiClassList, basePath) { - if (preBuiltUiClassList === void 0) { - preBuiltUiClassList = []; - } - if (reactRouterDom === undefined || preBuiltUiClassList.length === 0) { - throw new Error( - // eslint-disable-next-line @typescript-eslint/quotes - 'Please use getSuperTokensRoutesForReactRouterDom like getSuperTokensRoutesForReactRouterDom(require("react-router-dom"), [EmailPasswordPreBuiltUI]) in your render function' - ); - } - var recipeList = preBuiltUiClassList.map(function (r) { - return r.getInstanceOrInitAndGetInstance(); - }); - if (UI.reactRouterDomIsV6 === undefined) { - UI.reactRouterDomIsV6 = reactRouterDom.withRouter === undefined; - } - if (UI.reactRouterDomIsV6) { - if (UI.reactRouterDom === undefined) { - // this function wraps the react-router-dom v6 useNavigate function in a way - // that enforces that it runs within a useEffect. The reason we do this is - // cause of https://github.com/remix-run/react-router/issues/7460 - // which gets shown when visiting a social auth callback url like - // /auth/callback/github, without a valid code or state. This then - // doesn't navigate the user to the auth page. - var useNavigateHookForRRDV6 = function () { - var navigateHook = reactRouterDom.useNavigate(); - var _a = React__default.default.useState(undefined), - to = _a[0], - setTo = _a[1]; - React__default.default.useEffect( - function () { - if (to !== undefined) { - setTo(undefined); - navigateHook(to); - } - }, - [to, navigateHook, setTo] - ); - return setTo; - }; - UI.reactRouterDom = { - router: reactRouterDom, - useHistoryCustom: useNavigateHookForRRDV6, - useLocation: reactRouterDom.useLocation, - }; - } - return getSuperTokensRoutesForReactRouterDomV6({ - getReactRouterDomWithCustomHistory: UI.getReactRouterDomWithCustomHistory, - recipeList: recipeList, - basePath: basePath, - }); - } - if (UI.reactRouterDom === undefined) { - UI.reactRouterDom = { - router: reactRouterDom, - useHistoryCustom: reactRouterDom.useHistory, - useLocation: reactRouterDom.useLocation, - }; - } - return getSuperTokensRoutesForReactRouterDom$1({ - getReactRouterDomWithCustomHistory: UI.getReactRouterDomWithCustomHistory, - recipeList: recipeList, - basePath: basePath, - }); - }; - UI.canHandleRoute = function (preBuiltUiClassList) { - var recipeList = preBuiltUiClassList.map(function (r) { - return r.getInstanceOrInitAndGetInstance(); - }); - var path = genericComponentOverrideContext.getCurrentNormalisedUrlPath().getAsStringDangerous(); - var isAuthPage = - path === - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous(); - if (isAuthPage) { - return !genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().disableAuthRoute; - } - return ( - RecipeRouter.getMatchingComponentForRouteAndRecipeIdFromPreBuiltUIList( - genericComponentOverrideContext.getCurrentNormalisedUrlPath(), - recipeList, - true - ) !== undefined - ); - }; - UI.getRoutingComponent = function (preBuiltUiClassList) { - var recipeList = preBuiltUiClassList.map(function (r) { - return r.getInstanceOrInitAndGetInstance(); - }); - return jsxRuntime.jsx(RoutingComponent, { - getReactRouterDomWithCustomHistory: UI.getReactRouterDomWithCustomHistory, - path: genericComponentOverrideContext.getCurrentNormalisedUrlPath().getAsStringDangerous(), - preBuiltUIList: recipeList, - }); - }; - UI.getReactRouterDomWithCustomHistory = function () { - return UI.reactRouterDom; - }; - UI.AuthPage = function (props) { - return jsxRuntime.jsx( - AuthPageWrapper, - genericComponentOverrideContext.__assign({}, props, { - preBuiltUIList: props.preBuiltUIList.map(function (r) { - return r.getInstanceOrInitAndGetInstance(); - }), - }) - ); - }; - UI.AuthPageTheme = AuthPageTheme; - UI.AuthPageFooter = AuthPageFooter; - UI.AuthPageHeader = AuthPageHeader; - UI.AuthPageComponentList = AuthPageComponentList; - UI.AuthRecipeComponentsOverrideContextProvider = Provider; - return UI; -})(); -var getSuperTokensRoutesForReactRouterDom = UI.getSuperTokensRoutesForReactRouterDom; -var canHandleRoute = UI.canHandleRoute; -var getRoutingComponent = UI.getRoutingComponent; +var UI = /** @class */ (function () { + function UI() { + } + UI.getSuperTokensRoutesForReactRouterDom = function (reactRouterDom, preBuiltUiClassList, basePath) { + if (preBuiltUiClassList === void 0) { preBuiltUiClassList = []; } + if (reactRouterDom === undefined || preBuiltUiClassList.length === 0) { + throw new Error( + // eslint-disable-next-line @typescript-eslint/quotes + 'Please use getSuperTokensRoutesForReactRouterDom like getSuperTokensRoutesForReactRouterDom(require("react-router-dom"), [EmailPasswordPreBuiltUI]) in your render function'); + } + var recipeList = preBuiltUiClassList.map(function (r) { return r.getInstanceOrInitAndGetInstance(); }); + if (UI.reactRouterDomIsV6 === undefined) { + UI.reactRouterDomIsV6 = reactRouterDom.withRouter === undefined; + } + if (UI.reactRouterDomIsV6) { + if (UI.reactRouterDom === undefined) { + // this function wraps the react-router-dom v6 useNavigate function in a way + // that enforces that it runs within a useEffect. The reason we do this is + // cause of https://github.com/remix-run/react-router/issues/7460 + // which gets shown when visiting a social auth callback url like + // /auth/callback/github, without a valid code or state. This then + // doesn't navigate the user to the auth page. + var useNavigateHookForRRDV6 = function () { + var navigateHook = reactRouterDom.useNavigate(); + var _a = React__default.default.useState(undefined), to = _a[0], setTo = _a[1]; + React__default.default.useEffect(function () { + if (to !== undefined) { + setTo(undefined); + navigateHook(to); + } + }, [to, navigateHook, setTo]); + return setTo; + }; + UI.reactRouterDom = { + router: reactRouterDom, + useHistoryCustom: useNavigateHookForRRDV6, + useLocation: reactRouterDom.useLocation, + }; + } + return getSuperTokensRoutesForReactRouterDomV6({ + getReactRouterDomWithCustomHistory: UI.getReactRouterDomWithCustomHistory, + recipeList: recipeList, + basePath: basePath, + }); + } + if (UI.reactRouterDom === undefined) { + UI.reactRouterDom = { + router: reactRouterDom, + useHistoryCustom: reactRouterDom.useHistory, + useLocation: reactRouterDom.useLocation, + }; + } + return getSuperTokensRoutesForReactRouterDom$1({ + getReactRouterDomWithCustomHistory: UI.getReactRouterDomWithCustomHistory, + recipeList: recipeList, + basePath: basePath, + }); + }; + UI.canHandleRoute = function (preBuiltUiClassList) { + var recipeList = preBuiltUiClassList.map(function (r) { return r.getInstanceOrInitAndGetInstance(); }); + var path = genericComponentOverrideContext.getCurrentNormalisedUrlPath().getAsStringDangerous(); + var isAuthPage = path === genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo.websiteBasePath.getAsStringDangerous(); + if (isAuthPage) { + return !genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().disableAuthRoute; + } + return (RecipeRouter.getMatchingComponentForRouteAndRecipeIdFromPreBuiltUIList(genericComponentOverrideContext.getCurrentNormalisedUrlPath(), recipeList, true) !== undefined); + }; + UI.getRoutingComponent = function (preBuiltUiClassList) { + var recipeList = preBuiltUiClassList.map(function (r) { return r.getInstanceOrInitAndGetInstance(); }); + return (jsxRuntime.jsx(RoutingComponent, { getReactRouterDomWithCustomHistory: UI.getReactRouterDomWithCustomHistory, path: genericComponentOverrideContext.getCurrentNormalisedUrlPath().getAsStringDangerous(), preBuiltUIList: recipeList })); + }; + UI.getReactRouterDomWithCustomHistory = function () { + return UI.reactRouterDom; + }; + UI.AuthPage = function (props) { return (jsxRuntime.jsx(AuthPageWrapper, logger.__assign({}, props, { preBuiltUIList: props.preBuiltUIList.map(function (r) { return r.getInstanceOrInitAndGetInstance(); }) }))); }; + UI.AuthPageTheme = AuthPageTheme; + UI.AuthPageFooter = AuthPageFooter; + UI.AuthPageHeader = AuthPageHeader; + UI.AuthPageComponentList = AuthPageComponentList; + UI.AuthRecipeComponentsOverrideContextProvider = Provider; + return UI; +}()); +var getSuperTokensRoutesForReactRouterDom = UI.getSuperTokensRoutesForReactRouterDom; +var canHandleRoute = UI.canHandleRoute; +var getRoutingComponent = UI.getRoutingComponent; var AuthPage = UI.AuthPage; -var SessionAuth = function (_a) { - var _b; - var children = _a.children, - props = genericComponentOverrideContext.__rest(_a, ["children"]); - var requireAuth = React.useRef(props.requireAuth); - if (props.requireAuth !== requireAuth.current) { - throw new Error( - // eslint-disable-next-line @typescript-eslint/quotes - 'requireAuth prop should not change. If you are seeing this, it probably means that you are using SessionAuth in multiple routes with different values for requireAuth. To solve this, try adding the "key" prop to all uses of SessionAuth like ' - ); - } - // Reusing the parent context was removed because it caused a redirect loop in an edge case - // because it'd also reuse the invalid claims part until it loaded. - var _c = React.useState({ loading: true }), - context = _c[0], - setContext = _c[1]; - var setContextIfChanged = React.useCallback( - function (newValue) { - setContext(function (oldValue) { - // We can't do this check before re-validation because there are be validators that depend on the current time - // Since the context is constructed by the same functions the property order should be stable, meaning that - // a simple JSON string check should be sufficient. - // Plus since this is just an optimization it is fine to have false positives, - // and this method won't have false negatives (where we'd miss an update). - if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) { - return newValue; - } - return oldValue; - }); - }, - [setContext] - ); - var session = React.useRef(); - // We store this here, to prevent the list of called hooks changing even if a navigate hook is added later to SuperTokens. - var navigateHookRef = React.useRef( - (_b = UI.getReactRouterDomWithCustomHistory()) === null || _b === void 0 ? void 0 : _b.useHistoryCustom - ); - var navigate; - try { - if (navigateHookRef.current) { - navigate = navigateHookRef.current(); - } - } catch (_d) { - // We catch and ignore errors here, because this is may throw if - // the app is using react-router-dom but added a session auth outside of the router. - } - var userContext = useUserContext(); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var redirectToLogin = React.useCallback(function () { - void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - navigate: navigate, - userContext: userContext, - redirectBack: true, - }); - }, []); - var buildContext = React.useCallback(function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var sessionExists, invalidClaims, err_1, err_2; - var _a; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if (session.current === undefined) { - session.current = types.Session.getInstanceOrThrow(); - } - return [ - 4 /*yield*/, - session.current.doesSessionExist({ - userContext: userContext, - }), - ]; - case 1: - sessionExists = _b.sent(); - if (sessionExists === false) { - return [ - 2 /*return*/, - { - loading: false, - doesSessionExist: false, - accessTokenPayload: {}, - invalidClaims: [], - userId: "", - }, - ]; - } - _b.label = 2; - case 2: - _b.trys.push([2, 4, , 6]); - return [ - 4 /*yield*/, - session.current.validateClaims({ - overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, - userContext: userContext, - }), - ]; - case 3: - invalidClaims = _b.sent(); - return [3 /*break*/, 6]; - case 4: - err_1 = _b.sent(); - return [ - 4 /*yield*/, - session.current.doesSessionExist({ - userContext: userContext, - }), - ]; - case 5: - // These errors should only come from getAccessTokenPayloadSecurely inside validateClaims if refreshing a claim cleared the session - // Which means that the session was most likely cleared, meaning returning false is right. - // This might also happen if the user provides an override or a custom claim validator that throws (or if we have a bug) - // In which case the session will not be cleared so we rethrow the error - if (_b.sent()) { - throw err_1; - } - return [ - 2 /*return*/, - { - loading: false, - doesSessionExist: false, - accessTokenPayload: {}, - invalidClaims: [], - userId: "", - }, - ]; - case 6: - _b.trys.push([6, 9, , 11]); - _a = { - loading: false, - doesSessionExist: true, - invalidClaims: invalidClaims, - }; - return [ - 4 /*yield*/, - session.current.getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]; - case 7: - _a.accessTokenPayload = _b.sent(); - return [ - 4 /*yield*/, - session.current.getUserId({ - userContext: userContext, - }), - ]; - case 8: - return [2 /*return*/, ((_a.userId = _b.sent()), _a)]; - case 9: - err_2 = _b.sent(); - return [ - 4 /*yield*/, - session.current.doesSessionExist({ - userContext: userContext, - }), - ]; - case 10: - if (_b.sent()) { - throw err_2; - } - // This means that loading the access token or the userId failed - // This may happen if the server cleared the error since the validation was done which should be extremely rare - return [ - 2 /*return*/, - { - loading: false, - doesSessionExist: false, - accessTokenPayload: {}, - invalidClaims: [], - userId: "", - }, - ]; - case 11: - return [2 /*return*/]; - } - }); - }); - }, []); - var setInitialContextAndMaybeRedirect = React.useCallback( - function (toSetContext) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var failureRedirectInfo, err_3; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (context.loading === false) { - return [2 /*return*/]; - } - if (!(props.doRedirection !== false)) return [3 /*break*/, 8]; - if (!toSetContext.doesSessionExist && props.requireAuth !== false) { - redirectToLogin(); - return [2 /*return*/]; - } - if (!(toSetContext.invalidClaims.length !== 0)) return [3 /*break*/, 8]; - failureRedirectInfo = void 0; - _a.label = 1; - case 1: - _a.trys.push([1, 6, , 7]); - return [ - 4 /*yield*/, - types.getFailureRedirectionInfo({ - invalidClaims: toSetContext.invalidClaims, - overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, - userContext: userContext, - }), - ]; - case 2: - failureRedirectInfo = _a.sent(); - if (!(failureRedirectInfo.redirectPath !== undefined)) return [3 /*break*/, 5]; - if ( - !types.validateAndCompareOnFailureRedirectionURLToCurrent( - failureRedirectInfo.redirectPath - ) - ) - return [3 /*break*/, 3]; - setContextIfChanged(toSetContext); - return [2 /*return*/]; - case 3: - return [ - 4 /*yield*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl( - failureRedirectInfo.redirectPath, - navigate - ), - ]; - case 4: - return [2 /*return*/, _a.sent()]; - case 5: - return [3 /*break*/, 7]; - case 6: - err_3 = _a.sent(); - rethrowInRender(err_3); - throw err_3; - case 7: - if ( - props.accessDeniedScreen !== undefined && - failureRedirectInfo.failedClaim !== undefined - ) { - console.warn({ - message: "Showing access denied screen because a claim validator failed", - claimValidationError: failureRedirectInfo.failedClaim, - }); - return [ - 2 /*return*/, - setContextIfChanged( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, toSetContext), - { accessDeniedValidatorError: failureRedirectInfo.failedClaim } - ) - ), - ]; - } - _a.label = 8; - case 8: - setContextIfChanged(toSetContext); - return [2 /*return*/]; - } - }); - }); - }, - [ - context.loading, - props.doRedirection, - props.requireAuth, - props.overrideGlobalClaimValidators, - props.accessDeniedScreen, - redirectToLogin, - userContext, - navigate, - ] - ); - genericComponentOverrideContext.useOnMountAPICall(buildContext, setInitialContextAndMaybeRedirect); - // subscribe to events on mount - React.useEffect( - function () { - function onHandleEvent(event) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var _a, invalidClaims, failureRedirectInfo, err_4; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - _a = event.action; - switch (_a) { - case "SESSION_CREATED": - return [3 /*break*/, 1]; - case "REFRESH_SESSION": - return [3 /*break*/, 1]; - case "ACCESS_TOKEN_PAYLOAD_UPDATED": - return [3 /*break*/, 1]; - case "API_INVALID_CLAIM": - return [3 /*break*/, 1]; - case "SIGN_OUT": - return [3 /*break*/, 11]; - case "UNAUTHORISED": - return [3 /*break*/, 12]; - } - return [3 /*break*/, 13]; - case 1: - return [ - 4 /*yield*/, - session.current.validateClaims({ - overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, - userContext: userContext, - }), - ]; - case 2: - invalidClaims = _b.sent(); - if (!(props.doRedirection !== false)) return [3 /*break*/, 10]; - failureRedirectInfo = void 0; - _b.label = 3; - case 3: - _b.trys.push([3, 8, , 9]); - return [ - 4 /*yield*/, - types.getFailureRedirectionInfo({ - invalidClaims: invalidClaims, - overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, - userContext: userContext, - }), - ]; - case 4: - failureRedirectInfo = _b.sent(); - if (!failureRedirectInfo.redirectPath) return [3 /*break*/, 7]; - if ( - !types.validateAndCompareOnFailureRedirectionURLToCurrent( - failureRedirectInfo.redirectPath - ) - ) - return [3 /*break*/, 5]; - setContextIfChanged( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, event.sessionContext), - { loading: false, invalidClaims: invalidClaims } - ) - ); - return [3 /*break*/, 7]; - case 5: - return [ - 4 /*yield*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl( - failureRedirectInfo.redirectPath, - navigate - ), - ]; - case 6: - return [2 /*return*/, _b.sent()]; - case 7: - return [3 /*break*/, 9]; - case 8: - err_4 = _b.sent(); - rethrowInRender(err_4); - throw err_4; - case 9: - if ( - props.accessDeniedScreen !== undefined && - failureRedirectInfo.failedClaim !== undefined - ) { - console.warn({ - message: "Showing access denied screen because a claim validator failed", - claimValidationError: failureRedirectInfo.failedClaim, - }); - return [ - 2 /*return*/, - setContextIfChanged( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, event.sessionContext), - { - loading: false, - invalidClaims: invalidClaims, - accessDeniedValidatorError: failureRedirectInfo.failedClaim, - } - ) - ), - ]; - } - _b.label = 10; - case 10: - setContextIfChanged( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, event.sessionContext), - { loading: false, invalidClaims: invalidClaims } - ) - ); - return [2 /*return*/]; - case 11: - setContextIfChanged( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, event.sessionContext), - { loading: false, invalidClaims: [] } - ) - ); - return [2 /*return*/]; - case 12: - setContextIfChanged( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, event.sessionContext), - { loading: false, invalidClaims: [] } - ) - ); - if (props.onSessionExpired !== undefined) { - props.onSessionExpired(); - } else if (props.requireAuth !== false && props.doRedirection !== false) { - redirectToLogin(); - } - return [2 /*return*/]; - case 13: - return [2 /*return*/]; - } - }); - }); - } - if (session.current === undefined) { - session.current = types.Session.getInstanceOrThrow(); - } - if (context.loading === false) { - // we return here cause addEventListener returns a function that removes - // the listener, and this function will be called by useEffect when - // onHandleEvent changes or if the component is unmounting. - return session.current.addEventListener(onHandleEvent); - } - return undefined; - }, - [props, setContextIfChanged, context.loading, userContext, navigate, redirectToLogin] - ); - if (props.requireAuth !== false && (context.loading || !context.doesSessionExist)) { - return null; - } - if (!context.loading && context.accessDeniedValidatorError && props.accessDeniedScreen) { - return jsxRuntime.jsx(props.accessDeniedScreen, { - userContext: userContext, - navigate: navigate, - validationError: context.accessDeniedValidatorError, - }); - } - return jsxRuntime.jsx( - SessionContext.Provider, - genericComponentOverrideContext.__assign({ value: context }, { children: children }) - ); -}; -var SessionAuthWrapper = function (props) { - return jsxRuntime.jsx( - UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { children: jsxRuntime.jsx(SessionAuth, genericComponentOverrideContext.__assign({}, props)) } - ) - ); +var SessionAuth = function (_a) { + var _b; + var children = _a.children, props = logger.__rest(_a, ["children"]); + var requireAuth = React.useRef(props.requireAuth); + if (props.requireAuth !== requireAuth.current) { + throw new Error( + // eslint-disable-next-line @typescript-eslint/quotes + 'requireAuth prop should not change. If you are seeing this, it probably means that you are using SessionAuth in multiple routes with different values for requireAuth. To solve this, try adding the "key" prop to all uses of SessionAuth like '); + } + // Reusing the parent context was removed because it caused a redirect loop in an edge case + // because it'd also reuse the invalid claims part until it loaded. + var _c = React.useState({ loading: true }), context = _c[0], setContext = _c[1]; + var setContextIfChanged = React.useCallback(function (newValue) { + setContext(function (oldValue) { + // We can't do this check before re-validation because there are be validators that depend on the current time + // Since the context is constructed by the same functions the property order should be stable, meaning that + // a simple JSON string check should be sufficient. + // Plus since this is just an optimization it is fine to have false positives, + // and this method won't have false negatives (where we'd miss an update). + if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) { + return newValue; + } + return oldValue; + }); + }, [setContext]); + var session = React.useRef(); + // We store this here, to prevent the list of called hooks changing even if a navigate hook is added later to SuperTokens. + var navigateHookRef = React.useRef((_b = UI.getReactRouterDomWithCustomHistory()) === null || _b === void 0 ? void 0 : _b.useHistoryCustom); + var navigate; + try { + if (navigateHookRef.current) { + navigate = navigateHookRef.current(); + } + } + catch (_d) { + // We catch and ignore errors here, because this is may throw if + // the app is using react-router-dom but added a session auth outside of the router. + } + var userContext = useUserContext(); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var redirectToLogin = React.useCallback(function () { + void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ navigate: navigate, userContext: userContext, redirectBack: true }); + }, []); + var buildContext = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var sessionExists, invalidClaims, err_1, err_2; + var _a; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (session.current === undefined) { + session.current = types.Session.getInstanceOrThrow(); + } + return [4 /*yield*/, session.current.doesSessionExist({ + userContext: userContext, + })]; + case 1: + sessionExists = _b.sent(); + if (sessionExists === false) { + return [2 /*return*/, { + loading: false, + doesSessionExist: false, + accessTokenPayload: {}, + invalidClaims: [], + userId: "", + }]; + } + _b.label = 2; + case 2: + _b.trys.push([2, 4, , 6]); + return [4 /*yield*/, session.current.validateClaims({ + overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, + userContext: userContext, + })]; + case 3: + invalidClaims = _b.sent(); + return [3 /*break*/, 6]; + case 4: + err_1 = _b.sent(); + return [4 /*yield*/, session.current.doesSessionExist({ + userContext: userContext, + })]; + case 5: + // These errors should only come from getAccessTokenPayloadSecurely inside validateClaims if refreshing a claim cleared the session + // Which means that the session was most likely cleared, meaning returning false is right. + // This might also happen if the user provides an override or a custom claim validator that throws (or if we have a bug) + // In which case the session will not be cleared so we rethrow the error + if (_b.sent()) { + throw err_1; + } + return [2 /*return*/, { + loading: false, + doesSessionExist: false, + accessTokenPayload: {}, + invalidClaims: [], + userId: "", + }]; + case 6: + _b.trys.push([6, 9, , 11]); + _a = { + loading: false, + doesSessionExist: true, + invalidClaims: invalidClaims + }; + return [4 /*yield*/, session.current.getAccessTokenPayloadSecurely({ + userContext: userContext, + })]; + case 7: + _a.accessTokenPayload = _b.sent(); + return [4 /*yield*/, session.current.getUserId({ + userContext: userContext, + })]; + case 8: return [2 /*return*/, (_a.userId = _b.sent(), + _a)]; + case 9: + err_2 = _b.sent(); + return [4 /*yield*/, session.current.doesSessionExist({ + userContext: userContext, + })]; + case 10: + if (_b.sent()) { + throw err_2; + } + // This means that loading the access token or the userId failed + // This may happen if the server cleared the error since the validation was done which should be extremely rare + return [2 /*return*/, { + loading: false, + doesSessionExist: false, + accessTokenPayload: {}, + invalidClaims: [], + userId: "", + }]; + case 11: return [2 /*return*/]; + } + }); + }); }, []); + var setInitialContextAndMaybeRedirect = React.useCallback(function (toSetContext) { return logger.__awaiter(void 0, void 0, void 0, function () { + var failureRedirectInfo, err_3; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + if (context.loading === false) { + return [2 /*return*/]; + } + if (!(props.doRedirection !== false)) return [3 /*break*/, 8]; + if (!toSetContext.doesSessionExist && props.requireAuth !== false) { + redirectToLogin(); + return [2 /*return*/]; + } + if (!(toSetContext.invalidClaims.length !== 0)) return [3 /*break*/, 8]; + failureRedirectInfo = void 0; + _a.label = 1; + case 1: + _a.trys.push([1, 6, , 7]); + return [4 /*yield*/, types.getFailureRedirectionInfo({ + invalidClaims: toSetContext.invalidClaims, + overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, + userContext: userContext, + })]; + case 2: + failureRedirectInfo = _a.sent(); + if (!(failureRedirectInfo.redirectPath !== undefined)) return [3 /*break*/, 5]; + if (!types.validateAndCompareOnFailureRedirectionURLToCurrent(failureRedirectInfo.redirectPath)) return [3 /*break*/, 3]; + setContextIfChanged(toSetContext); + return [2 /*return*/]; + case 3: return [4 /*yield*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl(failureRedirectInfo.redirectPath, navigate)]; + case 4: return [2 /*return*/, _a.sent()]; + case 5: return [3 /*break*/, 7]; + case 6: + err_3 = _a.sent(); + rethrowInRender(err_3); + throw err_3; + case 7: + if (props.accessDeniedScreen !== undefined && failureRedirectInfo.failedClaim !== undefined) { + console.warn({ + message: "Showing access denied screen because a claim validator failed", + claimValidationError: failureRedirectInfo.failedClaim, + }); + return [2 /*return*/, setContextIfChanged(logger.__assign(logger.__assign({}, toSetContext), { accessDeniedValidatorError: failureRedirectInfo.failedClaim }))]; + } + _a.label = 8; + case 8: + setContextIfChanged(toSetContext); + return [2 /*return*/]; + } + }); + }); }, [ + context.loading, + props.doRedirection, + props.requireAuth, + props.overrideGlobalClaimValidators, + props.accessDeniedScreen, + redirectToLogin, + userContext, + navigate, + ]); + genericComponentOverrideContext.useOnMountAPICall(buildContext, setInitialContextAndMaybeRedirect); + // subscribe to events on mount + React.useEffect(function () { + function onHandleEvent(event) { + return logger.__awaiter(this, void 0, void 0, function () { + var _a, invalidClaims, failureRedirectInfo, err_4; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _a = event.action; + switch (_a) { + case "SESSION_CREATED": return [3 /*break*/, 1]; + case "REFRESH_SESSION": return [3 /*break*/, 1]; + case "ACCESS_TOKEN_PAYLOAD_UPDATED": return [3 /*break*/, 1]; + case "API_INVALID_CLAIM": return [3 /*break*/, 1]; + case "SIGN_OUT": return [3 /*break*/, 11]; + case "UNAUTHORISED": return [3 /*break*/, 12]; + } + return [3 /*break*/, 13]; + case 1: return [4 /*yield*/, session.current.validateClaims({ + overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, + userContext: userContext, + })]; + case 2: + invalidClaims = _b.sent(); + if (!(props.doRedirection !== false)) return [3 /*break*/, 10]; + failureRedirectInfo = void 0; + _b.label = 3; + case 3: + _b.trys.push([3, 8, , 9]); + return [4 /*yield*/, types.getFailureRedirectionInfo({ + invalidClaims: invalidClaims, + overrideGlobalClaimValidators: props.overrideGlobalClaimValidators, + userContext: userContext, + })]; + case 4: + failureRedirectInfo = _b.sent(); + if (!failureRedirectInfo.redirectPath) return [3 /*break*/, 7]; + if (!types.validateAndCompareOnFailureRedirectionURLToCurrent(failureRedirectInfo.redirectPath)) return [3 /*break*/, 5]; + setContextIfChanged(logger.__assign(logger.__assign({}, event.sessionContext), { loading: false, invalidClaims: invalidClaims })); + return [3 /*break*/, 7]; + case 5: return [4 /*yield*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl(failureRedirectInfo.redirectPath, navigate)]; + case 6: return [2 /*return*/, _b.sent()]; + case 7: return [3 /*break*/, 9]; + case 8: + err_4 = _b.sent(); + rethrowInRender(err_4); + throw err_4; + case 9: + if (props.accessDeniedScreen !== undefined && failureRedirectInfo.failedClaim !== undefined) { + console.warn({ + message: "Showing access denied screen because a claim validator failed", + claimValidationError: failureRedirectInfo.failedClaim, + }); + return [2 /*return*/, setContextIfChanged(logger.__assign(logger.__assign({}, event.sessionContext), { loading: false, invalidClaims: invalidClaims, accessDeniedValidatorError: failureRedirectInfo.failedClaim }))]; + } + _b.label = 10; + case 10: + setContextIfChanged(logger.__assign(logger.__assign({}, event.sessionContext), { loading: false, invalidClaims: invalidClaims })); + return [2 /*return*/]; + case 11: + setContextIfChanged(logger.__assign(logger.__assign({}, event.sessionContext), { loading: false, invalidClaims: [] })); + return [2 /*return*/]; + case 12: + setContextIfChanged(logger.__assign(logger.__assign({}, event.sessionContext), { loading: false, invalidClaims: [] })); + if (props.onSessionExpired !== undefined) { + props.onSessionExpired(); + } + else if (props.requireAuth !== false && props.doRedirection !== false) { + redirectToLogin(); + } + return [2 /*return*/]; + case 13: return [2 /*return*/]; + } + }); + }); + } + if (session.current === undefined) { + session.current = types.Session.getInstanceOrThrow(); + } + if (context.loading === false) { + // we return here cause addEventListener returns a function that removes + // the listener, and this function will be called by useEffect when + // onHandleEvent changes or if the component is unmounting. + return session.current.addEventListener(onHandleEvent); + } + return undefined; + }, [props, setContextIfChanged, context.loading, userContext, navigate, redirectToLogin]); + if (props.requireAuth !== false && (context.loading || !context.doesSessionExist)) { + return null; + } + if (!context.loading && context.accessDeniedValidatorError && props.accessDeniedScreen) { + return (jsxRuntime.jsx(props.accessDeniedScreen, { userContext: userContext, navigate: navigate, validationError: context.accessDeniedValidatorError })); + } + return jsxRuntime.jsx(SessionContext.Provider, logger.__assign({ value: context }, { children: children })); +}; +var SessionAuthWrapper = function (props) { + return (jsxRuntime.jsx(UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(SessionAuth, logger.__assign({}, props)) }))); }; -var SuperTokensWrapper = function (props) { - return jsxRuntime.jsx( - SessionAuthWrapper, - genericComponentOverrideContext.__assign({}, props, { requireAuth: false, doRedirection: false }) - ); +var SuperTokensWrapper = function (props) { + return jsxRuntime.jsx(SessionAuthWrapper, logger.__assign({}, props, { requireAuth: false, doRedirection: false })); }; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * API Wrapper exposed to user. - */ -var SuperTokensAPIWrapper = /** @class */ (function () { - function SuperTokensAPIWrapper() {} - SuperTokensAPIWrapper.init = function (config) { - genericComponentOverrideContext.SuperTokens.init(config); - }; - SuperTokensAPIWrapper.changeLanguage = function (language) { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().changeLanguage(language); - }; - SuperTokensAPIWrapper.loadTranslation = function (store) { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().loadTranslation(store); - }; - var _a; - _a = SuperTokensAPIWrapper; - SuperTokensAPIWrapper.SuperTokensWrapper = SuperTokensWrapper; - SuperTokensAPIWrapper.redirectToAuth = function (options) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var _b; - return genericComponentOverrideContext.__generator(_a, function (_c) { - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, options), - { - redirectBack: - (_b = options === null || options === void 0 ? void 0 : options.redirectBack) !== - null && _b !== void 0 - ? _b - : true, - userContext: genericComponentOverrideContext.getNormalisedUserContext( - options === null || options === void 0 ? void 0 : options.userContext - ), - } - ) - ), - ]; - }); - }); - }; - SuperTokensAPIWrapper.useTranslation = translationContext.useTranslation; - SuperTokensAPIWrapper.useUserContext = useUserContext; - return SuperTokensAPIWrapper; -})(); -var init = SuperTokensAPIWrapper.init; -var changeLanguage = SuperTokensAPIWrapper.changeLanguage; -var loadTranslation = SuperTokensAPIWrapper.loadTranslation; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * API Wrapper exposed to user. + */ +var SuperTokensAPIWrapper = /** @class */ (function () { + function SuperTokensAPIWrapper() { + } + SuperTokensAPIWrapper.init = function (config) { + genericComponentOverrideContext.SuperTokens.init(config); + }; + SuperTokensAPIWrapper.changeLanguage = function (language) { + return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().changeLanguage(language); + }; + SuperTokensAPIWrapper.loadTranslation = function (store) { + return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().loadTranslation(store); + }; + var _a; + _a = SuperTokensAPIWrapper; + SuperTokensAPIWrapper.SuperTokensWrapper = SuperTokensWrapper; + SuperTokensAPIWrapper.redirectToAuth = function (options) { return logger.__awaiter(void 0, void 0, void 0, function () { + var _b; + return logger.__generator(_a, function (_c) { + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth(logger.__assign(logger.__assign({}, options), { redirectBack: (_b = options === null || options === void 0 ? void 0 : options.redirectBack) !== null && _b !== void 0 ? _b : true, userContext: genericComponentOverrideContext.getNormalisedUserContext(options === null || options === void 0 ? void 0 : options.userContext) }))]; + }); + }); }; + SuperTokensAPIWrapper.useTranslation = translationContext.useTranslation; + SuperTokensAPIWrapper.useUserContext = useUserContext; + return SuperTokensAPIWrapper; +}()); +var init = SuperTokensAPIWrapper.init; +var changeLanguage = SuperTokensAPIWrapper.changeLanguage; +var loadTranslation = SuperTokensAPIWrapper.loadTranslation; var redirectToAuth = SuperTokensAPIWrapper.redirectToAuth; exports.AuthPage = AuthPage; diff --git a/lib/build/logger.d.ts b/lib/build/logger.d.ts index a5e767ecb..91bd657ca 100644 --- a/lib/build/logger.d.ts +++ b/lib/build/logger.d.ts @@ -1,2 +1,2 @@ -export declare function enableLogging(): void; -export declare function logDebugMessage(message: string): void; +export declare function enableLogging(): void; +export declare function logDebugMessage(message: string): void; diff --git a/lib/build/logger.js b/lib/build/logger.js new file mode 100644 index 000000000..e0de55d73 --- /dev/null +++ b/lib/build/logger.js @@ -0,0 +1,158 @@ +'use strict'; + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol, Iterator */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +exports.__assign = function() { + exports.__assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return exports.__assign.apply(this, arguments); +}; + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var package_version = "0.48.0"; + +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var SUPERTOKENS_DEBUG_NAMESPACE = "com.supertokens.auth-react"; +var __debugLogsEnabled = false; +function enableLogging() { + __debugLogsEnabled = true; +} +function logDebugMessage(message) { + if (__debugLogsEnabled) { + // eslint-disable-next-line no-console + console.log("".concat(SUPERTOKENS_DEBUG_NAMESPACE, " {t: \"").concat(new Date().toISOString(), "\", message: \"").concat(message, "\", supertokens-auth-react-ver: \"").concat(package_version, "\"}")); + } +} + +exports.__awaiter = __awaiter; +exports.__extends = __extends; +exports.__generator = __generator; +exports.__rest = __rest; +exports.__spreadArray = __spreadArray; +exports.enableLogging = enableLogging; +exports.logDebugMessage = logDebugMessage; diff --git a/lib/build/multifactorauth-shared.js b/lib/build/multifactorauth-shared.js index 7b88f6acf..45659b2bf 100644 --- a/lib/build/multifactorauth-shared.js +++ b/lib/build/multifactorauth-shared.js @@ -1,585 +1,425 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var WebJSSessionRecipe = require("supertokens-web-js/recipe/session"); -var recipe = require("./oauth2provider-shared.js"); -var index = require("./recipeModule-shared.js"); -var utils = require("supertokens-web-js/utils"); -var windowHandler = require("supertokens-web-js/utils/windowHandler"); +var logger = require('./logger.js'); +var WebJSSessionRecipe = require('supertokens-web-js/recipe/session'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var recipe = require('./oauth2provider-shared.js'); +var index = require('./recipeModule-shared.js'); +var utils = require('supertokens-web-js/utils'); +var windowHandler = require('supertokens-web-js/utils/windowHandler'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var WebJSSessionRecipe__default = /*#__PURE__*/ _interopDefault(WebJSSessionRecipe); +var WebJSSessionRecipe__default = /*#__PURE__*/_interopDefault(WebJSSessionRecipe); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function normaliseSessionConfig(config) { - var _a, _b, _c; - if (config === undefined) { - config = {}; - } - var accessDeniedScreenStyle = - (_b = (_a = config.accessDeniedScreen) === null || _a === void 0 ? void 0 : _a.style) !== null && _b !== void 0 - ? _b - : ""; - var accessDeniedScreen = { - style: accessDeniedScreenStyle, - }; - var override = genericComponentOverrideContext.__assign( - { - functions: function (originalImplementation) { - return originalImplementation; - }, - }, - config.override - ); - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - {}, - genericComponentOverrideContext.normaliseRecipeModuleConfig(config) - ), - { - // TODO: ideally we'd get the default (or normalized) value from supertokens-website - invalidClaimStatusCode: (_c = config.invalidClaimStatusCode) !== null && _c !== void 0 ? _c : 403, - accessDeniedScreen: accessDeniedScreen, - override: override, - } - ); -} -var getFailureRedirectionInfo = function (_a) { - var invalidClaims = _a.invalidClaims, - overrideGlobalClaimValidators = _a.overrideGlobalClaimValidators, - userContext = _a.userContext; - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var globalValidators, failedClaim, _loop_1, _i, globalValidators_1, validator, state_1; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - globalValidators = utils.getGlobalClaimValidators({ - overrideGlobalClaimValidators: overrideGlobalClaimValidators, - userContext: userContext, - }); - failedClaim = undefined; - _loop_1 = function (validator) { - var claim, failureCallback, redirectPath; - return genericComponentOverrideContext.__generator(this, function (_c) { - switch (_c.label) { - case 0: - claim = invalidClaims.find(function (c) { - return c.id === validator.id; - }); - if (!(claim !== undefined)) return [3 /*break*/, 2]; - failureCallback = validator.onFailureRedirection; - if (!failureCallback) return [3 /*break*/, 2]; - return [ - 4 /*yield*/, - failureCallback({ reason: claim.reason, userContext: userContext }), - ]; - case 1: - redirectPath = _c.sent(); - if (redirectPath !== undefined) { - return [ - 2 /*return*/, - { - value: { - redirectPath: redirectPath, - failedClaim: claim, - }, - }, - ]; - } - _c.label = 2; - case 2: - if (validator.showAccessDeniedOnFailure !== false && failedClaim === undefined) { - failedClaim = claim; - } - return [2 /*return*/]; - } - }); - }; - (_i = 0), (globalValidators_1 = globalValidators); - _b.label = 1; - case 1: - if (!(_i < globalValidators_1.length)) return [3 /*break*/, 4]; - validator = globalValidators_1[_i]; - return [5 /*yield**/, _loop_1(validator)]; - case 2: - state_1 = _b.sent(); - if (typeof state_1 === "object") return [2 /*return*/, state_1.value]; - _b.label = 3; - case 3: - _i++; - return [3 /*break*/, 1]; - case 4: - return [ - 2 /*return*/, - { - redirectPath: undefined, - failedClaim: failedClaim, - }, - ]; - } - }); - }); -}; -function validateAndCompareOnFailureRedirectionURLToCurrent(redirectURL) { - var currentUrl = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHref(); - var fullRedirectURL; - try { - new URL(redirectURL); - // if the url is a full, valid url, we can use that - fullRedirectURL = redirectURL; - } catch (_a) { - // If we get here, we know it's not full url - // We check if it's an absolute path - if (!redirectURL.startsWith("/")) { - throw new Error("onFailureRedirectionURL returned a relative url: ".concat(redirectURL)); - } - var appInfo = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo; - // otherwise we prepend the websiteDomain - fullRedirectURL = "".concat(appInfo.websiteDomain.getAsStringDangerous()).concat(redirectURL); - } - return currentUrl === fullRedirectURL; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function normaliseSessionConfig(config) { + var _a, _b, _c; + if (config === undefined) { + config = {}; + } + var accessDeniedScreenStyle = (_b = (_a = config.accessDeniedScreen) === null || _a === void 0 ? void 0 : _a.style) !== null && _b !== void 0 ? _b : ""; + var accessDeniedScreen = { + style: accessDeniedScreenStyle, + }; + var override = logger.__assign({ functions: function (originalImplementation) { return originalImplementation; } }, config.override); + return logger.__assign(logger.__assign({}, genericComponentOverrideContext.normaliseRecipeModuleConfig(config)), { + // TODO: ideally we'd get the default (or normalized) value from supertokens-website + invalidClaimStatusCode: (_c = config.invalidClaimStatusCode) !== null && _c !== void 0 ? _c : 403, accessDeniedScreen: accessDeniedScreen, override: override }); +} +var getFailureRedirectionInfo = function (_a) { + var invalidClaims = _a.invalidClaims, overrideGlobalClaimValidators = _a.overrideGlobalClaimValidators, userContext = _a.userContext; + return logger.__awaiter(void 0, void 0, void 0, function () { + var globalValidators, failedClaim, _loop_1, _i, globalValidators_1, validator, state_1; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + globalValidators = utils.getGlobalClaimValidators({ + overrideGlobalClaimValidators: overrideGlobalClaimValidators, + userContext: userContext, + }); + failedClaim = undefined; + _loop_1 = function (validator) { + var claim, failureCallback, redirectPath; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + claim = invalidClaims.find(function (c) { return c.id === validator.id; }); + if (!(claim !== undefined)) return [3 /*break*/, 2]; + failureCallback = validator.onFailureRedirection; + if (!failureCallback) return [3 /*break*/, 2]; + return [4 /*yield*/, failureCallback({ reason: claim.reason, userContext: userContext })]; + case 1: + redirectPath = _c.sent(); + if (redirectPath !== undefined) { + return [2 /*return*/, { value: { + redirectPath: redirectPath, + failedClaim: claim, + } }]; + } + _c.label = 2; + case 2: + if (validator.showAccessDeniedOnFailure !== false && failedClaim === undefined) { + failedClaim = claim; + } + return [2 /*return*/]; + } + }); + }; + _i = 0, globalValidators_1 = globalValidators; + _b.label = 1; + case 1: + if (!(_i < globalValidators_1.length)) return [3 /*break*/, 4]; + validator = globalValidators_1[_i]; + return [5 /*yield**/, _loop_1(validator)]; + case 2: + state_1 = _b.sent(); + if (typeof state_1 === "object") + return [2 /*return*/, state_1.value]; + _b.label = 3; + case 3: + _i++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/, { + redirectPath: undefined, + failedClaim: failedClaim, + }]; + } + }); + }); +}; +function validateAndCompareOnFailureRedirectionURLToCurrent(redirectURL) { + var currentUrl = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.location.getHref(); + var fullRedirectURL; + try { + new URL(redirectURL); + // if the url is a full, valid url, we can use that + fullRedirectURL = redirectURL; + } + catch (_a) { + // If we get here, we know it's not full url + // We check if it's an absolute path + if (!redirectURL.startsWith("/")) { + throw new Error("onFailureRedirectionURL returned a relative url: ".concat(redirectURL)); + } + var appInfo = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().appInfo; + // otherwise we prepend the websiteDomain + fullRedirectURL = "".concat(appInfo.websiteDomain.getAsStringDangerous()).concat(redirectURL); + } + return currentUrl === fullRedirectURL; } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var Session = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(Session, _super); - function Session(config, webJSRecipe) { - if (webJSRecipe === void 0) { - webJSRecipe = WebJSSessionRecipe__default.default; - } - var _this = _super.call(this, config) || this; - _this.webJSRecipe = webJSRecipe; - _this.recipeID = Session.RECIPE_ID; - _this.eventListeners = new Set(); - _this.getUserId = function (input) { - return _this.webJSRecipe.getUserId(input); - }; - _this.getAccessToken = function (input) { - return _this.webJSRecipe.getAccessToken(input); - }; - _this.getClaimValue = function (input) { - return _this.webJSRecipe.getClaimValue(input); - }; - _this.getAccessTokenPayloadSecurely = function (input) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [2 /*return*/, this.webJSRecipe.getAccessTokenPayloadSecurely(input)]; - }); - }); - }; - _this.doesSessionExist = function (input) { - return _this.webJSRecipe.doesSessionExist(input); - }; - _this.signOut = function (input) { - return _this.webJSRecipe.signOut(input); - }; - _this.attemptRefreshingSession = function () { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [2 /*return*/, this.webJSRecipe.attemptRefreshingSession()]; - }); - }); - }; - _this.validateClaims = function (input) { - return _this.webJSRecipe.validateClaims(input); - }; - _this.getInvalidClaimsFromResponse = function (input) { - return _this.webJSRecipe.getInvalidClaimsFromResponse(input); - }; - /** - * @returns Function to remove event listener - */ - _this.addEventListener = function (listener) { - _this.eventListeners.add(listener); - return function () { - return _this.eventListeners.delete(listener); - }; - }; - _this.validateGlobalClaimsAndHandleSuccessRedirection = function ( - // We redefine recipeId to be a string here, because everywhere in the SDK we treat - // it as a string (e.g.: when defining it in recipes), but we want to type it more - // strictly in the callbacks the app provides to help integrating our SDK. - // This is the "meeting point" between the two types, so we need to cast between them here. - successRedirectContext, - fallbackRecipeId, - redirectToPath, - userContext, - navigate - ) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var invalidClaims, jsonContext, failureRedirectInfo, successContextStr, storedContext; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - userContext = genericComponentOverrideContext.getNormalisedUserContext(userContext); - return [4 /*yield*/, this.doesSessionExist({ userContext: userContext })]; - case 1: - // First we check if there is an active session - if (!_a.sent()) { - // If there is none, we have no way of checking claims, so we redirect to the auth page - // This can happen e.g.: if the user clicked on the email verification link in a browser without an active session - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - navigate: navigate, - redirectBack: false, - userContext: userContext, - }), - ]; - } - return [4 /*yield*/, this.validateClaims({ userContext: userContext })]; - case 2: - invalidClaims = _a.sent(); - if (!(invalidClaims.length > 0)) return [3 /*break*/, 6]; - if (!(successRedirectContext !== undefined)) return [3 /*break*/, 4]; - jsonContext = JSON.stringify({ - successRedirectContext: successRedirectContext, - redirectToPath: redirectToPath, - }); - return [ - 4 /*yield*/, - genericComponentOverrideContext.setLocalStorage( - "supertokens-success-redirection-context", - jsonContext - ), - ]; - case 3: - _a.sent(); - _a.label = 4; - case 4: - return [ - 4 /*yield*/, - getFailureRedirectionInfo({ - invalidClaims: invalidClaims, - userContext: userContext, - }), - ]; - case 5: - failureRedirectInfo = _a.sent(); - // if redirectPath is string that means failed claim had callback that returns path, we redirect there otherwise continue - if (failureRedirectInfo.redirectPath !== undefined) { - // the validation part can throw, but this is handled in all places where this is called, - // since getFailureRedirectionInfo can also throw - if ( - validateAndCompareOnFailureRedirectionURLToCurrent(failureRedirectInfo.redirectPath) - ) { - throw new Error( - "onFailureRedirectionURL returned the current URL (".concat( - failureRedirectInfo.redirectPath, - ") during success redirection. This indicates that the user is in a stuck state." - ) - ); - } - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl( - failureRedirectInfo.redirectPath, - navigate - ), - ]; - } - _a.label = 6; - case 6: - if (!(successRedirectContext === undefined)) return [3 /*break*/, 13]; - return [ - 4 /*yield*/, - genericComponentOverrideContext.getLocalStorage( - "supertokens-success-redirection-context" - ), - ]; - case 7: - successContextStr = _a.sent(); - if (!(successContextStr !== null)) return [3 /*break*/, 12]; - _a.label = 8; - case 8: - _a.trys.push([8, , 9, 11]); - storedContext = JSON.parse(successContextStr); - successRedirectContext = storedContext.successRedirectContext; - // if we have a redirectToPath set in the queryparams that takes priority over the stored value - if (redirectToPath === undefined) { - redirectToPath = storedContext.redirectToPath; - } - return [3 /*break*/, 11]; - case 9: - return [ - 4 /*yield*/, - genericComponentOverrideContext.removeFromLocalStorage( - "supertokens-success-redirection-context" - ), - ]; - case 10: - _a.sent(); - return [7 /*endfinally*/]; - case 11: - return [3 /*break*/, 13]; - case 12: - // If there was nothing in localstorage we set a default - // this can happen if the user visited email verification screen without an auth recipe redirecting them there - // but already had the email verified and an active session - successRedirectContext = { - recipeId: fallbackRecipeId, - action: "SUCCESS", - createdNewUser: false, - isNewRecipeUser: false, - newSessionCreated: false, - tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), - }; - _a.label = 13; - case 13: - if (successRedirectContext === undefined) { - throw new Error("This should never happen: successRedirectContext undefined "); - } - if (successRedirectContext.action === "SUCCESS_OAUTH2") { - return [ - 2 /*return*/, - recipe.OAuth2Provider.getInstanceOrThrow().redirect( - successRedirectContext, - navigate, - {}, - userContext - ), - ]; - } - if (successRedirectContext.action === "SUCCESS" && redirectToPath !== undefined) { - successRedirectContext.redirectToPath = redirectToPath; - } - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirect( - successRedirectContext, - navigate, - {}, - userContext - ), - ]; - } - }); - }); - }; - /** - * This should only get called if validateGlobalClaimsAndHandleSuccessRedirection couldn't get a redirectInfo - * @returns "/" - */ - _this.getDefaultRedirectionURL = function () { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - // We do not use the util here, since we are redirecting outside of the SDK routes - return [2 /*return*/, "/"]; - }); - }); - }; - _this.notifyListeners = function (event) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var sessionContext; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, this.getSessionContext(event)]; - case 1: - sessionContext = _a.sent(); - // We copy this.eventListeners into a new array to "freeze" it for the loop - // We do this to avoid an infinite loop in case one of the listeners causes a new listener to be added (e.g.: through re-rendering) - Array.from(this.eventListeners).forEach(function (listener) { - return listener( - genericComponentOverrideContext.__assign({ sessionContext: sessionContext }, event) - ); - }); - return [2 /*return*/]; - } - }); - }); - }; - return _this; - } - Session.prototype.getSessionContext = function (_a) { - var action = _a.action, - userContext = _a.userContext; - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var _b, userId, accessTokenPayload; - return genericComponentOverrideContext.__generator(this, function (_c) { - switch (_c.label) { - case 0: - if ( - !( - action === "SESSION_CREATED" || - action === "REFRESH_SESSION" || - action === "API_INVALID_CLAIM" || - action === "ACCESS_TOKEN_PAYLOAD_UPDATED" - ) - ) - return [3 /*break*/, 2]; - return [ - 4 /*yield*/, - Promise.all([ - this.getUserId({ - userContext: userContext, - }), - this.getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]), - ]; - case 1: - (_b = _c.sent()), (userId = _b[0]), (accessTokenPayload = _b[1]); - return [ - 2 /*return*/, - { - doesSessionExist: true, - accessTokenPayload: accessTokenPayload, - userId: userId, - }, - ]; - case 2: - if (action === "SIGN_OUT" || action === "UNAUTHORISED") { - return [ - 2 /*return*/, - { - doesSessionExist: false, - accessTokenPayload: {}, - userId: "", - }, - ]; - } - throw new Error("Unhandled recipe event: ".concat(action)); - } - }); - }); - }; - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - Session.addAxiosInterceptors = function (axiosInstance, userContext) { - return WebJSSessionRecipe__default.default.addAxiosInterceptors(axiosInstance, userContext); - }; - Session.init = function (config) { - var _this = this; - var normalisedConfig = normaliseSessionConfig(config); - return { - recipeID: Session.RECIPE_ID, - authReact: function (appInfo) { - Session.instance = new Session( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { appInfo: appInfo, recipeId: Session.RECIPE_ID } - ) - ); - return Session.instance; - }, - webJS: WebJSSessionRecipe__default.default.init( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { - onHandleEvent: function (event) { - if (normalisedConfig.onHandleEvent !== undefined) { - normalisedConfig.onHandleEvent(event); - } - void Session.getInstanceOrThrow().notifyListeners(event); - }, - preAPIHook: function (context) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - response = genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, context), - { - requestInit: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, context.requestInit), - { - headers: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - {}, - context.requestInit.headers - ), - { rid: Session.RECIPE_ID } - ), - } - ), - } - ); - if (normalisedConfig.preAPIHook === undefined) { - return [2 /*return*/, response]; - } else { - return [2 /*return*/, normalisedConfig.preAPIHook(context)]; - } - }); - }); - }, - } - ) - ), - }; - }; - Session.getInstanceOrThrow = function () { - if (Session.instance === undefined) { - throw Error( - "No instance of Session found. Make sure to call the Session.init method. See https://supertokens.io/docs/emailpassword/quick-setup/frontend" - ); - } - return Session.instance; - }; - Session.getInstance = function () { - return Session.instance; - }; - Session.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - Session.instance = undefined; - return; - }; - Session.RECIPE_ID = "session"; - return Session; -})(index.RecipeModule); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var Session = /** @class */ (function (_super) { + logger.__extends(Session, _super); + function Session(config, webJSRecipe) { + if (webJSRecipe === void 0) { webJSRecipe = WebJSSessionRecipe__default.default; } + var _this = _super.call(this, config) || this; + _this.webJSRecipe = webJSRecipe; + _this.recipeID = Session.RECIPE_ID; + _this.eventListeners = new Set(); + _this.getUserId = function (input) { + return _this.webJSRecipe.getUserId(input); + }; + _this.getAccessToken = function (input) { + return _this.webJSRecipe.getAccessToken(input); + }; + _this.getClaimValue = function (input) { + return _this.webJSRecipe.getClaimValue(input); + }; + _this.getAccessTokenPayloadSecurely = function (input) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, this.webJSRecipe.getAccessTokenPayloadSecurely(input)]; + }); + }); }; + _this.doesSessionExist = function (input) { + return _this.webJSRecipe.doesSessionExist(input); + }; + _this.signOut = function (input) { + return _this.webJSRecipe.signOut(input); + }; + _this.attemptRefreshingSession = function () { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, this.webJSRecipe.attemptRefreshingSession()]; + }); + }); }; + _this.validateClaims = function (input) { + return _this.webJSRecipe.validateClaims(input); + }; + _this.getInvalidClaimsFromResponse = function (input) { + return _this.webJSRecipe.getInvalidClaimsFromResponse(input); + }; + /** + * @returns Function to remove event listener + */ + _this.addEventListener = function (listener) { + _this.eventListeners.add(listener); + return function () { return _this.eventListeners.delete(listener); }; + }; + _this.validateGlobalClaimsAndHandleSuccessRedirection = function ( + // We redefine recipeId to be a string here, because everywhere in the SDK we treat + // it as a string (e.g.: when defining it in recipes), but we want to type it more + // strictly in the callbacks the app provides to help integrating our SDK. + // This is the "meeting point" between the two types, so we need to cast between them here. + successRedirectContext, fallbackRecipeId, redirectToPath, userContext, navigate) { return logger.__awaiter(_this, void 0, void 0, function () { + var invalidClaims, jsonContext, failureRedirectInfo, successContextStr, storedContext; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + userContext = genericComponentOverrideContext.getNormalisedUserContext(userContext); + return [4 /*yield*/, this.doesSessionExist({ userContext: userContext })]; + case 1: + // First we check if there is an active session + if (!(_a.sent())) { + // If there is none, we have no way of checking claims, so we redirect to the auth page + // This can happen e.g.: if the user clicked on the email verification link in a browser without an active session + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + navigate: navigate, + redirectBack: false, + userContext: userContext, + })]; + } + return [4 /*yield*/, this.validateClaims({ userContext: userContext })]; + case 2: + invalidClaims = _a.sent(); + if (!(invalidClaims.length > 0)) return [3 /*break*/, 6]; + if (!(successRedirectContext !== undefined)) return [3 /*break*/, 4]; + jsonContext = JSON.stringify({ successRedirectContext: successRedirectContext, redirectToPath: redirectToPath }); + return [4 /*yield*/, genericComponentOverrideContext.setLocalStorage("supertokens-success-redirection-context", jsonContext)]; + case 3: + _a.sent(); + _a.label = 4; + case 4: return [4 /*yield*/, getFailureRedirectionInfo({ + invalidClaims: invalidClaims, + userContext: userContext, + })]; + case 5: + failureRedirectInfo = _a.sent(); + // if redirectPath is string that means failed claim had callback that returns path, we redirect there otherwise continue + if (failureRedirectInfo.redirectPath !== undefined) { + // the validation part can throw, but this is handled in all places where this is called, + // since getFailureRedirectionInfo can also throw + if (validateAndCompareOnFailureRedirectionURLToCurrent(failureRedirectInfo.redirectPath)) { + throw new Error("onFailureRedirectionURL returned the current URL (".concat(failureRedirectInfo.redirectPath, ") during success redirection. This indicates that the user is in a stuck state.")); + } + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl(failureRedirectInfo.redirectPath, navigate)]; + } + _a.label = 6; + case 6: + if (!(successRedirectContext === undefined)) return [3 /*break*/, 13]; + return [4 /*yield*/, genericComponentOverrideContext.getLocalStorage("supertokens-success-redirection-context")]; + case 7: + successContextStr = _a.sent(); + if (!(successContextStr !== null)) return [3 /*break*/, 12]; + _a.label = 8; + case 8: + _a.trys.push([8, , 9, 11]); + storedContext = JSON.parse(successContextStr); + successRedirectContext = storedContext.successRedirectContext; + // if we have a redirectToPath set in the queryparams that takes priority over the stored value + if (redirectToPath === undefined) { + redirectToPath = storedContext.redirectToPath; + } + return [3 /*break*/, 11]; + case 9: return [4 /*yield*/, genericComponentOverrideContext.removeFromLocalStorage("supertokens-success-redirection-context")]; + case 10: + _a.sent(); + return [7 /*endfinally*/]; + case 11: return [3 /*break*/, 13]; + case 12: + // If there was nothing in localstorage we set a default + // this can happen if the user visited email verification screen without an auth recipe redirecting them there + // but already had the email verified and an active session + successRedirectContext = { + recipeId: fallbackRecipeId, + action: "SUCCESS", + createdNewUser: false, + isNewRecipeUser: false, + newSessionCreated: false, + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + }; + _a.label = 13; + case 13: + if (successRedirectContext === undefined) { + throw new Error("This should never happen: successRedirectContext undefined "); + } + if (successRedirectContext.action === "SUCCESS_OAUTH2") { + return [2 /*return*/, recipe.OAuth2Provider.getInstanceOrThrow().redirect(successRedirectContext, navigate, {}, userContext)]; + } + if (successRedirectContext.action === "SUCCESS" && redirectToPath !== undefined) { + successRedirectContext.redirectToPath = redirectToPath; + } + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirect(successRedirectContext, navigate, {}, userContext)]; + } + }); + }); }; + /** + * This should only get called if validateGlobalClaimsAndHandleSuccessRedirection couldn't get a redirectInfo + * @returns "/" + */ + _this.getDefaultRedirectionURL = function () { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + // We do not use the util here, since we are redirecting outside of the SDK routes + return [2 /*return*/, "/"]; + }); + }); }; + _this.notifyListeners = function (event) { return logger.__awaiter(_this, void 0, void 0, function () { + var sessionContext; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getSessionContext(event)]; + case 1: + sessionContext = _a.sent(); + // We copy this.eventListeners into a new array to "freeze" it for the loop + // We do this to avoid an infinite loop in case one of the listeners causes a new listener to be added (e.g.: through re-rendering) + Array.from(this.eventListeners).forEach(function (listener) { + return listener(logger.__assign({ sessionContext: sessionContext }, event)); + }); + return [2 /*return*/]; + } + }); + }); }; + return _this; + } + Session.prototype.getSessionContext = function (_a) { + var action = _a.action, userContext = _a.userContext; + return logger.__awaiter(this, void 0, void 0, function () { + var _b, userId, accessTokenPayload; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + if (!(action === "SESSION_CREATED" || + action === "REFRESH_SESSION" || + action === "API_INVALID_CLAIM" || + action === "ACCESS_TOKEN_PAYLOAD_UPDATED")) return [3 /*break*/, 2]; + return [4 /*yield*/, Promise.all([ + this.getUserId({ + userContext: userContext, + }), + this.getAccessTokenPayloadSecurely({ + userContext: userContext, + }), + ])]; + case 1: + _b = _c.sent(), userId = _b[0], accessTokenPayload = _b[1]; + return [2 /*return*/, { + doesSessionExist: true, + accessTokenPayload: accessTokenPayload, + userId: userId, + }]; + case 2: + if (action === "SIGN_OUT" || action === "UNAUTHORISED") { + return [2 /*return*/, { + doesSessionExist: false, + accessTokenPayload: {}, + userId: "", + }]; + } + throw new Error("Unhandled recipe event: ".concat(action)); + } + }); + }); + }; + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + Session.addAxiosInterceptors = function (axiosInstance, userContext) { + return WebJSSessionRecipe__default.default.addAxiosInterceptors(axiosInstance, userContext); + }; + Session.init = function (config) { + var _this = this; + var normalisedConfig = normaliseSessionConfig(config); + return { + recipeID: Session.RECIPE_ID, + authReact: function (appInfo) { + Session.instance = new Session(logger.__assign(logger.__assign({}, normalisedConfig), { appInfo: appInfo, recipeId: Session.RECIPE_ID })); + return Session.instance; + }, + webJS: WebJSSessionRecipe__default.default.init(logger.__assign(logger.__assign({}, normalisedConfig), { onHandleEvent: function (event) { + if (normalisedConfig.onHandleEvent !== undefined) { + normalisedConfig.onHandleEvent(event); + } + void Session.getInstanceOrThrow().notifyListeners(event); + }, preAPIHook: function (context) { return logger.__awaiter(_this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + response = logger.__assign(logger.__assign({}, context), { requestInit: logger.__assign(logger.__assign({}, context.requestInit), { headers: logger.__assign(logger.__assign({}, context.requestInit.headers), { rid: Session.RECIPE_ID }) }) }); + if (normalisedConfig.preAPIHook === undefined) { + return [2 /*return*/, response]; + } + else { + return [2 /*return*/, normalisedConfig.preAPIHook(context)]; + } + }); + }); } })), + }; + }; + Session.getInstanceOrThrow = function () { + if (Session.instance === undefined) { + throw Error("No instance of Session found. Make sure to call the Session.init method. See https://supertokens.io/docs/emailpassword/quick-setup/frontend"); + } + return Session.instance; + }; + Session.getInstance = function () { + return Session.instance; + }; + Session.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + Session.instance = undefined; + return; + }; + Session.RECIPE_ID = "session"; + return Session; +}(index.RecipeModule)); -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var FactorIds = { - EMAILPASSWORD: "emailpassword", - OTP_EMAIL: "otp-email", - OTP_PHONE: "otp-phone", - LINK_EMAIL: "link-email", - LINK_PHONE: "link-phone", - THIRDPARTY: "thirdparty", - TOTP: "totp", +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var FactorIds = { + EMAILPASSWORD: "emailpassword", + OTP_EMAIL: "otp-email", + OTP_PHONE: "otp-phone", + LINK_EMAIL: "link-email", + LINK_PHONE: "link-phone", + THIRDPARTY: "thirdparty", + TOTP: "totp", }; exports.FactorIds = FactorIds; diff --git a/lib/build/multifactorauth-shared2.js b/lib/build/multifactorauth-shared2.js index d5e65825c..f95c9af30 100644 --- a/lib/build/multifactorauth-shared2.js +++ b/lib/build/multifactorauth-shared2.js @@ -1,699 +1,443 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var MultiFactorAuthWebJS = require("supertokens-web-js/recipe/multifactorauth"); -var utils = require("supertokens-web-js/utils"); -var postSuperTokensInitCallbacks = require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -var sessionClaimValidatorStore = require("supertokens-web-js/utils/sessionClaimValidatorStore"); -var windowHandler = require("supertokens-web-js/utils/windowHandler"); -var index = require("./recipeModule-shared.js"); -var types = require("./multifactorauth-shared.js"); +var logger = require('./logger.js'); +var MultiFactorAuthWebJS = require('supertokens-web-js/recipe/multifactorauth'); +var utils = require('supertokens-web-js/utils'); +var postSuperTokensInitCallbacks = require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +var sessionClaimValidatorStore = require('supertokens-web-js/utils/sessionClaimValidatorStore'); +var windowHandler = require('supertokens-web-js/utils/windowHandler'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var index = require('./recipeModule-shared.js'); +var types = require('./multifactorauth-shared.js'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var MultiFactorAuthWebJS__default = /*#__PURE__*/ _interopDefault(MultiFactorAuthWebJS); +var MultiFactorAuthWebJS__default = /*#__PURE__*/_interopDefault(MultiFactorAuthWebJS); -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var DEFAULT_FACTOR_CHOOSER_PATH = "/mfa"; +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var DEFAULT_FACTOR_CHOOSER_PATH = "/mfa"; var MFA_INFO_CACHE_KEY = "st-mfa-info-cache"; -// This is a simple in-memory lock using a promise -// We do not need anything more complex than this, since the cache we are locking is in sessionStorage anyway. -var lockProm = undefined; -var getFunctionOverrides = function ( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _onHandleEvent -) { - return function (originalImp) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, originalImp), { - resyncSessionAndFetchMFAInfo: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var stWindow, stored, parsed, unlock, stored_1, parsed, val; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - stWindow = windowHandler.WindowHandlerReference.getReferenceOrThrow(); - // If someone is refreshing from the server we wait for it to finish. - return [4 /*yield*/, lockProm]; - case 1: - // If someone is refreshing from the server we wait for it to finish. - _a.sent(); - return [4 /*yield*/, stWindow.windowHandler.sessionStorage.getItem(MFA_INFO_CACHE_KEY)]; - case 2: - stored = _a.sent(); - if (stored !== null) { - parsed = JSON.parse(stored); - if (parsed.t > Date.now() - 1000) { - return [ - 2 /*return*/, - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, parsed.v), - { - // Adding a fake response is not great, but we do want to add something and this way it's detectable by the app - // so they could even add specific handling for it if they preferred. - fetchResponse: new Response(null, { status: 304 }), - } - ), - ]; - } - } - _a.label = 3; - case 3: - if (!(lockProm !== undefined)) return [3 /*break*/, 5]; - return [4 /*yield*/, lockProm]; - case 4: - _a.sent(); - return [3 /*break*/, 3]; - case 5: - lockProm = new Promise(function (res) { - return (unlock = res); - }); - _a.label = 6; - case 6: - _a.trys.push([6, , 11, 12]); - return [4 /*yield*/, stWindow.windowHandler.sessionStorage.getItem(MFA_INFO_CACHE_KEY)]; - case 7: - stored_1 = _a.sent(); - if (stored_1 !== null) { - parsed = JSON.parse(stored_1); - if (parsed.t > Date.now() - 1000) { - return [ - 2 /*return*/, - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, parsed.v), - { - // Adding a fake response is not great, but we do want to add something and this way it's detectable by the app - // so they could even add specific handling for it if they preferred. - fetchResponse: new Response(null, { status: 304 }), - } - ), - ]; - } - } - return [4 /*yield*/, originalImp.resyncSessionAndFetchMFAInfo(input)]; - case 8: - val = _a.sent(); - if (!(val.status === "OK")) return [3 /*break*/, 10]; - // We are not storing the fetchResponse - return [ - 4 /*yield*/, - stWindow.windowHandler.sessionStorage.setItem( - MFA_INFO_CACHE_KEY, - JSON.stringify({ - t: Date.now(), - v: { - emails: val.emails, - phoneNumbers: val.phoneNumbers, - factors: val.factors, - status: val.status, - }, - }) - ), - ]; - case 9: - // We are not storing the fetchResponse - _a.sent(); - _a.label = 10; - case 10: - return [2 /*return*/, val]; - case 11: - // Release the lock - lockProm = undefined; - unlock(); - return [7 /*endfinally*/]; - case 12: - return [2 /*return*/]; - } - }); - }); - }, - }); - }; +// This is a simple in-memory lock using a promise +// We do not need anything more complex than this, since the cache we are locking is in sessionStorage anyway. +var lockProm = undefined; +var getFunctionOverrides = function ( +// eslint-disable-next-line @typescript-eslint/no-unused-vars +_onHandleEvent) { + return function (originalImp) { return (logger.__assign(logger.__assign({}, originalImp), { resyncSessionAndFetchMFAInfo: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var stWindow, stored, parsed, unlock, stored_1, parsed, val; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + stWindow = windowHandler.WindowHandlerReference.getReferenceOrThrow(); + // If someone is refreshing from the server we wait for it to finish. + return [4 /*yield*/, lockProm]; + case 1: + // If someone is refreshing from the server we wait for it to finish. + _a.sent(); + return [4 /*yield*/, stWindow.windowHandler.sessionStorage.getItem(MFA_INFO_CACHE_KEY)]; + case 2: + stored = _a.sent(); + if (stored !== null) { + parsed = JSON.parse(stored); + if (parsed.t > Date.now() - 1000) { + return [2 /*return*/, logger.__assign(logger.__assign({}, parsed.v), { + // Adding a fake response is not great, but we do want to add something and this way it's detectable by the app + // so they could even add specific handling for it if they preferred. + fetchResponse: new Response(null, { status: 304 }) })]; + } + } + _a.label = 3; + case 3: + if (!(lockProm !== undefined)) return [3 /*break*/, 5]; + return [4 /*yield*/, lockProm]; + case 4: + _a.sent(); + return [3 /*break*/, 3]; + case 5: + lockProm = new Promise(function (res) { return (unlock = res); }); + _a.label = 6; + case 6: + _a.trys.push([6, , 11, 12]); + return [4 /*yield*/, stWindow.windowHandler.sessionStorage.getItem(MFA_INFO_CACHE_KEY)]; + case 7: + stored_1 = _a.sent(); + if (stored_1 !== null) { + parsed = JSON.parse(stored_1); + if (parsed.t > Date.now() - 1000) { + return [2 /*return*/, logger.__assign(logger.__assign({}, parsed.v), { + // Adding a fake response is not great, but we do want to add something and this way it's detectable by the app + // so they could even add specific handling for it if they preferred. + fetchResponse: new Response(null, { status: 304 }) })]; + } + } + return [4 /*yield*/, originalImp.resyncSessionAndFetchMFAInfo(input)]; + case 8: + val = _a.sent(); + if (!(val.status === "OK")) return [3 /*break*/, 10]; + // We are not storing the fetchResponse + return [4 /*yield*/, stWindow.windowHandler.sessionStorage.setItem(MFA_INFO_CACHE_KEY, JSON.stringify({ + t: Date.now(), + v: { + emails: val.emails, + phoneNumbers: val.phoneNumbers, + factors: val.factors, + status: val.status, + }, + }))]; + case 9: + // We are not storing the fetchResponse + _a.sent(); + _a.label = 10; + case 10: return [2 /*return*/, val]; + case 11: + // Release the lock + lockProm = undefined; + unlock(); + return [7 /*endfinally*/]; + case 12: return [2 /*return*/]; + } + }); + }); + } })); }; }; -var MultiFactorAuthClaimClass = /** @class */ (function () { - function MultiFactorAuthClaimClass(getRecipe, getRedirectURL, onFailureRedirection) { - var _this = this; - this.webJSClaim = new MultiFactorAuthWebJS.MultiFactorAuthClaimClass(function () { - return getRecipe().webJSRecipe; - }); - this.refresh = this.webJSClaim.refresh; - this.getLastFetchedTime = this.webJSClaim.getLastFetchedTime; - this.getValueFromPayload = this.webJSClaim.getValueFromPayload; - this.id = this.webJSClaim.id; - var defaultOnFailureRedirection = function (_a) { - var reason = _a.reason, - userContext = _a.userContext; - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var recipe, nextFactorOptions, availableFactors, mfaInfo_1, availableFactors; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - recipe = getRecipe(); - nextFactorOptions = - reason.oneOf || - reason.allOfInAnyOrder || - (reason.factorId !== undefined ? [reason.factorId] : undefined); - if (!(nextFactorOptions !== undefined)) return [3 /*break*/, 1]; - genericComponentOverrideContext.logDebugMessage( - "Redirecting to MFA on next array from validation failure: " + - nextFactorOptions.join(", ") - ); - availableFactors = recipe - .getSecondaryFactors(userContext) - .filter(function (v) { - return nextFactorOptions.factors.next.includes(v.id); - }) - .map(function (v) { - return v.id; - }); - // In this case we got here from a validator that defined the list of validators - if (availableFactors.length === 1) { - return [ - 2 /*return*/, - getRedirectURL( - { action: "GO_TO_FACTOR", factorId: availableFactors[0] }, - userContext - ), - ]; - } else { - return [ - 2 /*return*/, - getRedirectURL( - { action: "FACTOR_CHOOSER", nextFactorOptions: nextFactorOptions }, - userContext - ), - ]; - } - case 1: - return [ - 4 /*yield*/, - recipe.webJSRecipe.resyncSessionAndFetchMFAInfo({ userContext: userContext }), - ]; - case 2: - mfaInfo_1 = _b.sent(); - availableFactors = recipe - .getSecondaryFactors(userContext) - .filter(function (v) { - return mfaInfo_1.factors.next.includes(v.id); - }) - .map(function (v) { - return v.id; - }); - genericComponentOverrideContext.logDebugMessage( - "Redirecting to MFA on next array from backend: " + availableFactors.join(", ") - ); - if (availableFactors.length === 1) { - return [ - 2 /*return*/, - getRedirectURL( - { action: "GO_TO_FACTOR", factorId: availableFactors[0] }, - userContext - ), - ]; - } else { - return [2 /*return*/, getRedirectURL({ action: "FACTOR_CHOOSER" }, userContext)]; - } - case 3: - // If this happens the user can't complete sign-in (the claim validator fails, but there is no valid next factor for us) - // Returning undefined here will make SessionAuth render an access denied screen. - return [2 /*return*/, undefined]; - } - }); - }); - }; - this.validators = genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, this.webJSClaim.validators), - { - hasCompletedMFARequirementsForAuth: function (doRedirection, showAccessDeniedOnFailure) { - if (doRedirection === void 0) { - doRedirection = true; - } - if (showAccessDeniedOnFailure === void 0) { - showAccessDeniedOnFailure = true; - } - var orig = _this.webJSClaim.validators.hasCompletedMFARequirementsForAuth(); - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, orig), - { - showAccessDeniedOnFailure: showAccessDeniedOnFailure, - onFailureRedirection: - onFailureRedirection !== null && onFailureRedirection !== void 0 - ? onFailureRedirection - : function (_a) { - var reason = _a.reason, - userContext = _a.userContext; - return doRedirection - ? defaultOnFailureRedirection({ - reason: reason, - userContext: userContext, - }) - : undefined; - }, - } - ); - }, - hasCompletedFactors: function (requirements, doRedirection, showAccessDeniedOnFailure) { - if (doRedirection === void 0) { - doRedirection = true; - } - if (showAccessDeniedOnFailure === void 0) { - showAccessDeniedOnFailure = true; - } - var orig = _this.webJSClaim.validators.hasCompletedFactors(requirements); - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, orig), - { - showAccessDeniedOnFailure: showAccessDeniedOnFailure, - onFailureRedirection: - onFailureRedirection !== null && onFailureRedirection !== void 0 - ? onFailureRedirection - : function (_a) { - var reason = _a.reason, - userContext = _a.userContext; - return doRedirection - ? defaultOnFailureRedirection({ - reason: reason, - userContext: userContext, - }) - : undefined; - }, - } - ); - }, - } - ); - } - return MultiFactorAuthClaimClass; -})(); +var MultiFactorAuthClaimClass = /** @class */ (function () { + function MultiFactorAuthClaimClass(getRecipe, getRedirectURL, onFailureRedirection) { + var _this = this; + this.webJSClaim = new MultiFactorAuthWebJS.MultiFactorAuthClaimClass(function () { return getRecipe().webJSRecipe; }); + this.refresh = this.webJSClaim.refresh; + this.getLastFetchedTime = this.webJSClaim.getLastFetchedTime; + this.getValueFromPayload = this.webJSClaim.getValueFromPayload; + this.id = this.webJSClaim.id; + var defaultOnFailureRedirection = function (_a) { + var reason = _a.reason, userContext = _a.userContext; + return logger.__awaiter(_this, void 0, void 0, function () { + var recipe, nextFactorOptions, availableFactors, mfaInfo_1, availableFactors; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + recipe = getRecipe(); + nextFactorOptions = reason.oneOf || + reason.allOfInAnyOrder || + (reason.factorId !== undefined ? [reason.factorId] : undefined); + if (!(nextFactorOptions !== undefined)) return [3 /*break*/, 1]; + logger.logDebugMessage("Redirecting to MFA on next array from validation failure: " + nextFactorOptions.join(", ")); + availableFactors = recipe + .getSecondaryFactors(userContext) + .filter(function (v) { return nextFactorOptions.factors.next.includes(v.id); }) + .map(function (v) { return v.id; }); + // In this case we got here from a validator that defined the list of validators + if (availableFactors.length === 1) { + return [2 /*return*/, getRedirectURL({ action: "GO_TO_FACTOR", factorId: availableFactors[0] }, userContext)]; + } + else { + return [2 /*return*/, getRedirectURL({ action: "FACTOR_CHOOSER", nextFactorOptions: nextFactorOptions }, userContext)]; + } + case 1: return [4 /*yield*/, recipe.webJSRecipe.resyncSessionAndFetchMFAInfo({ userContext: userContext })]; + case 2: + mfaInfo_1 = _b.sent(); + availableFactors = recipe + .getSecondaryFactors(userContext) + .filter(function (v) { return mfaInfo_1.factors.next.includes(v.id); }) + .map(function (v) { return v.id; }); + logger.logDebugMessage("Redirecting to MFA on next array from backend: " + availableFactors.join(", ")); + if (availableFactors.length === 1) { + return [2 /*return*/, getRedirectURL({ action: "GO_TO_FACTOR", factorId: availableFactors[0] }, userContext)]; + } + else { + return [2 /*return*/, getRedirectURL({ action: "FACTOR_CHOOSER" }, userContext)]; + } + case 3: + // If this happens the user can't complete sign-in (the claim validator fails, but there is no valid next factor for us) + // Returning undefined here will make SessionAuth render an access denied screen. + return [2 /*return*/, undefined]; + } + }); + }); + }; + this.validators = logger.__assign(logger.__assign({}, this.webJSClaim.validators), { hasCompletedMFARequirementsForAuth: function (doRedirection, showAccessDeniedOnFailure) { + if (doRedirection === void 0) { doRedirection = true; } + if (showAccessDeniedOnFailure === void 0) { showAccessDeniedOnFailure = true; } + var orig = _this.webJSClaim.validators.hasCompletedMFARequirementsForAuth(); + return logger.__assign(logger.__assign({}, orig), { showAccessDeniedOnFailure: showAccessDeniedOnFailure, onFailureRedirection: onFailureRedirection !== null && onFailureRedirection !== void 0 ? onFailureRedirection : (function (_a) { + var reason = _a.reason, userContext = _a.userContext; + return doRedirection ? defaultOnFailureRedirection({ reason: reason, userContext: userContext }) : undefined; + }) }); + }, hasCompletedFactors: function (requirements, doRedirection, showAccessDeniedOnFailure) { + if (doRedirection === void 0) { doRedirection = true; } + if (showAccessDeniedOnFailure === void 0) { showAccessDeniedOnFailure = true; } + var orig = _this.webJSClaim.validators.hasCompletedFactors(requirements); + return logger.__assign(logger.__assign({}, orig), { showAccessDeniedOnFailure: showAccessDeniedOnFailure, onFailureRedirection: onFailureRedirection !== null && onFailureRedirection !== void 0 ? onFailureRedirection : (function (_a) { + var reason = _a.reason, userContext = _a.userContext; + return doRedirection ? defaultOnFailureRedirection({ reason: reason, userContext: userContext }) : undefined; + }) }); + } }); + } + return MultiFactorAuthClaimClass; +}()); -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function normaliseMultiFactorAuthFeature(config) { - var _a; - if (config === undefined) { - config = {}; - } - var disableDefaultUI = config.disableDefaultUI === true; - var override = genericComponentOverrideContext.__assign( - { - functions: function (originalImplementation) { - return originalImplementation; - }, - }, - config.override - ); - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - {}, - genericComponentOverrideContext.normaliseRecipeModuleConfig(config) - ), - { - disableDefaultUI: disableDefaultUI, - firstFactors: config === null || config === void 0 ? void 0 : config.firstFactors, - getSecondaryFactorInfo: function (orig) { - return orig; - }, - factorChooserScreen: (_a = config.factorChooserScreen) !== null && _a !== void 0 ? _a : {}, - override: override, - } - ); -} -function getAvailableFactors(factors, nextArrayQueryParam, recipe, userContext) { - genericComponentOverrideContext.logDebugMessage( - "getAvailableFactors: allowed to setup: ".concat(factors.allowedToSetup) - ); - genericComponentOverrideContext.logDebugMessage( - "getAvailableFactors: already setup: ".concat(factors.alreadySetup) - ); - genericComponentOverrideContext.logDebugMessage("getAvailableFactors: next from factorInfo: ".concat(factors.next)); - genericComponentOverrideContext.logDebugMessage( - "getAvailableFactors: nextArrayQueryParam: ".concat(nextArrayQueryParam) - ); - genericComponentOverrideContext.logDebugMessage( - "getAvailableFactors: secondary factors: ".concat( - recipe.getSecondaryFactors(userContext).map(function (f) { - return f.id; - }) - ) - ); - // There are 3 cases here: - // 1. The app provided an array of factors to show (nextArrayQueryParam) -> we show whatever is in the array - // 2. no app provided list and validator passed -> we show all factors available to set up or complete - // 3. no app provided list and validator failing -> we show whatever the BE tells us to (this is already filtered by allowedToSetup&alreadySetup on the BE) - var nextArr = nextArrayQueryParam !== undefined ? nextArrayQueryParam.split(",") : factors.next; - var availableFactors = recipe.getSecondaryFactors(userContext).filter(function (_a) { - var id = _a.id; - return nextArr.length === 0 - ? factors.allowedToSetup.includes(id) || factors.alreadySetup.includes(id) - : nextArr.includes(id); - }); - return availableFactors; +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function normaliseMultiFactorAuthFeature(config) { + var _a; + if (config === undefined) { + config = {}; + } + var disableDefaultUI = config.disableDefaultUI === true; + var override = logger.__assign({ functions: function (originalImplementation) { return originalImplementation; } }, config.override); + return logger.__assign(logger.__assign({}, genericComponentOverrideContext.normaliseRecipeModuleConfig(config)), { disableDefaultUI: disableDefaultUI, firstFactors: config === null || config === void 0 ? void 0 : config.firstFactors, getSecondaryFactorInfo: function (orig) { return orig; }, factorChooserScreen: (_a = config.factorChooserScreen) !== null && _a !== void 0 ? _a : {}, override: override }); +} +function getAvailableFactors(factors, nextArrayQueryParam, recipe, userContext) { + logger.logDebugMessage("getAvailableFactors: allowed to setup: ".concat(factors.allowedToSetup)); + logger.logDebugMessage("getAvailableFactors: already setup: ".concat(factors.alreadySetup)); + logger.logDebugMessage("getAvailableFactors: next from factorInfo: ".concat(factors.next)); + logger.logDebugMessage("getAvailableFactors: nextArrayQueryParam: ".concat(nextArrayQueryParam)); + logger.logDebugMessage("getAvailableFactors: secondary factors: ".concat(recipe.getSecondaryFactors(userContext).map(function (f) { return f.id; }))); + // There are 3 cases here: + // 1. The app provided an array of factors to show (nextArrayQueryParam) -> we show whatever is in the array + // 2. no app provided list and validator passed -> we show all factors available to set up or complete + // 3. no app provided list and validator failing -> we show whatever the BE tells us to (this is already filtered by allowedToSetup&alreadySetup on the BE) + var nextArr = nextArrayQueryParam !== undefined ? nextArrayQueryParam.split(",") : factors.next; + var availableFactors = recipe + .getSecondaryFactors(userContext) + .filter(function (_a) { + var id = _a.id; + return nextArr.length === 0 + ? factors.allowedToSetup.includes(id) || factors.alreadySetup.includes(id) + : nextArr.includes(id); + }); + return availableFactors; } -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var MultiFactorAuth = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(MultiFactorAuth, _super); - function MultiFactorAuth(config, webJSRecipe) { - if (webJSRecipe === void 0) { - webJSRecipe = MultiFactorAuthWebJS__default.default; - } - var _this = _super.call(this, config) || this; - _this.webJSRecipe = webJSRecipe; - _this.recipeID = MultiFactorAuth.RECIPE_ID; - _this.secondaryFactors = []; - _this.getDefaultRedirectionURL = function (context, userContext) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var nParam, redirectInfo; - return genericComponentOverrideContext.__generator(this, function (_b) { - if (context.action === "FACTOR_CHOOSER") { - nParam = - context.nextFactorOptions && context.nextFactorOptions.length > 0 - ? context.nextFactorOptions.join(",") - : undefined; - return [ - 2 /*return*/, - genericComponentOverrideContext.getDefaultRedirectionURLForPath( - this.config, - DEFAULT_FACTOR_CHOOSER_PATH, - context, - { - n: nParam, - stepUp: context.stepUp ? "true" : undefined, - } - ), - ]; - } else if (context.action === "GO_TO_FACTOR") { - redirectInfo = this.getSecondaryFactors(userContext).find(function (f) { - return f.id === context.factorId; - }); - if (redirectInfo !== undefined) { - return [ - 2 /*return*/, - genericComponentOverrideContext.getDefaultRedirectionURLForPath( - this.config, - redirectInfo.path, - context, - { - setup: context.forceSetup ? "true" : undefined, - stepUp: context.stepUp ? "true" : undefined, - } - ), - ]; - } - throw new Error("Requested redirect to unknown factor id: " + context.factorId); - } else { - return [2 /*return*/, "/"]; - } - }); - }); - }; - postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.addPostInitCallback(function () { - var defaultFactorsValidator = - MultiFactorAuth.MultiFactorAuthClaim.validators.hasCompletedMFARequirementsForAuth(); - sessionClaimValidatorStore.SessionClaimValidatorStore.addClaimValidatorFromOtherRecipe( - defaultFactorsValidator - ); - types.Session.getInstanceOrThrow().addEventListener(function () { - // We clear the cache if the session updated, since that may mean that the MFA info has changed - var stWindow = windowHandler.WindowHandlerReference.getReferenceOrThrow(); - stWindow.windowHandler.sessionStorage.removeItemSync(MFA_INFO_CACHE_KEY); - }); - }); - return _this; - } - MultiFactorAuth.init = function (config) { - var normalisedConfig = normaliseMultiFactorAuthFeature(config); - return { - recipeID: MultiFactorAuth.RECIPE_ID, - authReact: function (appInfo) { - MultiFactorAuth.instance = new MultiFactorAuth( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { appInfo: appInfo, recipeId: MultiFactorAuth.RECIPE_ID } - ) - ); - return MultiFactorAuth.instance; - }, - webJS: MultiFactorAuthWebJS__default.default.init( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { - override: { - functions: function (originalImpl, builder) { - var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; - }, - }, - } - ) - ), - }; - }; - MultiFactorAuth.getInstance = function () { - return MultiFactorAuth.instance; - }; - MultiFactorAuth.getInstanceOrThrow = function () { - if (MultiFactorAuth.instance === undefined) { - var error = "No instance of MultiFactorAuth found. Make sure to call the MultiFactorAuth.init method."; - // eslint-disable-next-line supertokens-auth-react/no-direct-window-object - if (typeof window === "undefined") { - error = error + genericComponentOverrideContext.SSR_ERROR; - } - throw Error(error); - } - return MultiFactorAuth.instance; - }; - MultiFactorAuth.prototype.addMFAFactors = function (secondaryFactors) { - this.secondaryFactors = genericComponentOverrideContext.__spreadArray( - genericComponentOverrideContext.__spreadArray( - [], - this.secondaryFactors.filter(function (factor) { - return secondaryFactors.every(function (newFactor) { - return factor.id !== newFactor.id; - }); - }), - true - ), - secondaryFactors, - true - ); - }; - MultiFactorAuth.prototype.isFirstFactorEnabledOnClient = function (factorId) { - return this.config.firstFactors === undefined || this.config.firstFactors.includes(factorId); - }; - MultiFactorAuth.prototype.getSecondaryFactors = function (userContext) { - return this.config.getSecondaryFactorInfo(this.secondaryFactors, userContext); - }; - MultiFactorAuth.prototype.redirectToFactor = function (_b) { - var factorId = _b.factorId, - forceSetup = _b.forceSetup, - stepUp = _b.stepUp, - redirectBack = _b.redirectBack, - navigate = _b.navigate, - userContext = _b.userContext; - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var url, redirectUrl, redirectUrl; - return genericComponentOverrideContext.__generator(this, function (_c) { - switch (_c.label) { - case 0: - return [ - 4 /*yield*/, - this.getRedirectUrl( - { - action: "GO_TO_FACTOR", - forceSetup: forceSetup, - stepUp: stepUp, - factorId: factorId, - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - utils.getNormalisedUserContext(userContext) - ), - ]; - case 1: - url = _c.sent(); - if (url === null) { - return [2 /*return*/]; - } - // If redirectBack was set to true we always set redirectToPath to that value - // otherwise we try and get it from the query params, finally falling back to not setting it. - // Example: - // 1. If the app calls this on pathX and with redirectBack=false, we redirect to /auth/mfa/factor-id - // 2. If the app calls this on pathX and with redirectBack=true, we redirect to /auth/mfa/factor-id?redirectToPath=pathX - // 3. If: - // - the app redirects to the factor chooser with redirectBack=true from path=X, they end up on /auth/mfa?redirectToPath=pathX - // - the factor chooser screen then calls this with redirectBack=false, then they end up on /auth/mfa/factor-id?redirectToPath=pathX - // 4. In the unlikely case that the app itself uses a `redirectToPath` query param internally - // and is on a custom path that has a redirectToPath set to pathX when calling this function, - // then we keep that in the query params if redirectBack is set to false. - if (redirectBack) { - redirectUrl = - genericComponentOverrideContext.getCurrentNormalisedUrlPathWithQueryParamsAndFragments(); - url = genericComponentOverrideContext.appendQueryParamsToURL(url, { - redirectToPath: redirectUrl, - }); - } else { - redirectUrl = genericComponentOverrideContext.getRedirectToPathFromURL(); - if (redirectUrl) { - url = genericComponentOverrideContext.appendQueryParamsToURL(url, { - redirectToPath: redirectUrl, - }); - } - } - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl( - url, - navigate - ), - ]; - } - }); - }); - }; - MultiFactorAuth.prototype.redirectToFactorChooser = function (_b) { - var _c = _b.redirectBack, - redirectBack = _c === void 0 ? false : _c, - _d = _b.nextFactorOptions, - nextFactorOptions = _d === void 0 ? [] : _d, - stepUp = _b.stepUp, - navigate = _b.navigate, - userContext = _b.userContext; - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var url, redirectUrl, redirectUrl; - return genericComponentOverrideContext.__generator(this, function (_e) { - switch (_e.label) { - case 0: - return [ - 4 /*yield*/, - this.getRedirectUrl( - { - action: "FACTOR_CHOOSER", - nextFactorOptions: nextFactorOptions, - stepUp: stepUp, - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - utils.getNormalisedUserContext(userContext) - ), - ]; - case 1: - url = _e.sent(); - if (url === null) { - return [2 /*return*/]; - } - if (redirectBack) { - redirectUrl = - genericComponentOverrideContext.getCurrentNormalisedUrlPathWithQueryParamsAndFragments(); - url = genericComponentOverrideContext.appendQueryParamsToURL(url, { - redirectToPath: redirectUrl, - }); - } else { - redirectUrl = genericComponentOverrideContext.getRedirectToPathFromURL(); - if (redirectUrl) { - url = genericComponentOverrideContext.appendQueryParamsToURL(url, { - redirectToPath: redirectUrl, - }); - } - } - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl( - url, - navigate - ), - ]; - } - }); - }); - }; - /* - * Tests methods. - */ - MultiFactorAuth.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - MultiFactorAuth.instance = undefined; - return; - }; - var _a; - _a = MultiFactorAuth; - MultiFactorAuth.RECIPE_ID = "multifactorauth"; - MultiFactorAuth.MultiFactorAuthClaim = new MultiFactorAuthClaimClass( - function () { - return MultiFactorAuth.getInstanceOrThrow(); - }, - function (context, userContext) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(_a, function (_b) { - switch (_b.label) { - case 0: - return [ - 4 /*yield*/, - this.getInstanceOrThrow().getRedirectUrl( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, context), - { - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - } - ), - userContext - ), - ]; - case 1: - return [2 /*return*/, _b.sent() || undefined]; - } - }); - }); - } - ); - return MultiFactorAuth; -})(index.RecipeModule); +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var MultiFactorAuth = /** @class */ (function (_super) { + logger.__extends(MultiFactorAuth, _super); + function MultiFactorAuth(config, webJSRecipe) { + if (webJSRecipe === void 0) { webJSRecipe = MultiFactorAuthWebJS__default.default; } + var _this = _super.call(this, config) || this; + _this.webJSRecipe = webJSRecipe; + _this.recipeID = MultiFactorAuth.RECIPE_ID; + _this.secondaryFactors = []; + _this.getDefaultRedirectionURL = function (context, userContext) { return logger.__awaiter(_this, void 0, void 0, function () { + var nParam, redirectInfo; + return logger.__generator(this, function (_b) { + if (context.action === "FACTOR_CHOOSER") { + nParam = context.nextFactorOptions && context.nextFactorOptions.length > 0 + ? context.nextFactorOptions.join(",") + : undefined; + return [2 /*return*/, genericComponentOverrideContext.getDefaultRedirectionURLForPath(this.config, DEFAULT_FACTOR_CHOOSER_PATH, context, { + n: nParam, + stepUp: context.stepUp ? "true" : undefined, + })]; + } + else if (context.action === "GO_TO_FACTOR") { + redirectInfo = this.getSecondaryFactors(userContext).find(function (f) { return f.id === context.factorId; }); + if (redirectInfo !== undefined) { + return [2 /*return*/, genericComponentOverrideContext.getDefaultRedirectionURLForPath(this.config, redirectInfo.path, context, { + setup: context.forceSetup ? "true" : undefined, + stepUp: context.stepUp ? "true" : undefined, + })]; + } + throw new Error("Requested redirect to unknown factor id: " + context.factorId); + } + else { + return [2 /*return*/, "/"]; + } + }); + }); }; + postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.addPostInitCallback(function () { + var defaultFactorsValidator = MultiFactorAuth.MultiFactorAuthClaim.validators.hasCompletedMFARequirementsForAuth(); + sessionClaimValidatorStore.SessionClaimValidatorStore.addClaimValidatorFromOtherRecipe(defaultFactorsValidator); + types.Session.getInstanceOrThrow().addEventListener(function () { + // We clear the cache if the session updated, since that may mean that the MFA info has changed + var stWindow = windowHandler.WindowHandlerReference.getReferenceOrThrow(); + stWindow.windowHandler.sessionStorage.removeItemSync(MFA_INFO_CACHE_KEY); + }); + }); + return _this; + } + MultiFactorAuth.init = function (config) { + var normalisedConfig = normaliseMultiFactorAuthFeature(config); + return { + recipeID: MultiFactorAuth.RECIPE_ID, + authReact: function (appInfo) { + MultiFactorAuth.instance = new MultiFactorAuth(logger.__assign(logger.__assign({}, normalisedConfig), { appInfo: appInfo, recipeId: MultiFactorAuth.RECIPE_ID })); + return MultiFactorAuth.instance; + }, + webJS: MultiFactorAuthWebJS__default.default.init(logger.__assign(logger.__assign({}, normalisedConfig), { override: { + functions: function (originalImpl, builder) { + var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, + } })), + }; + }; + MultiFactorAuth.getInstance = function () { + return MultiFactorAuth.instance; + }; + MultiFactorAuth.getInstanceOrThrow = function () { + if (MultiFactorAuth.instance === undefined) { + var error = "No instance of MultiFactorAuth found. Make sure to call the MultiFactorAuth.init method."; + // eslint-disable-next-line supertokens-auth-react/no-direct-window-object + if (typeof window === "undefined") { + error = error + genericComponentOverrideContext.SSR_ERROR; + } + throw Error(error); + } + return MultiFactorAuth.instance; + }; + MultiFactorAuth.prototype.addMFAFactors = function (secondaryFactors) { + this.secondaryFactors = logger.__spreadArray(logger.__spreadArray([], this.secondaryFactors.filter(function (factor) { + return secondaryFactors.every(function (newFactor) { return factor.id !== newFactor.id; }); + }), true), secondaryFactors, true); + }; + MultiFactorAuth.prototype.isFirstFactorEnabledOnClient = function (factorId) { + return this.config.firstFactors === undefined || this.config.firstFactors.includes(factorId); + }; + MultiFactorAuth.prototype.getSecondaryFactors = function (userContext) { + return this.config.getSecondaryFactorInfo(this.secondaryFactors, userContext); + }; + MultiFactorAuth.prototype.redirectToFactor = function (_b) { + var factorId = _b.factorId, forceSetup = _b.forceSetup, stepUp = _b.stepUp, redirectBack = _b.redirectBack, navigate = _b.navigate, userContext = _b.userContext; + return logger.__awaiter(this, void 0, void 0, function () { + var url, redirectUrl, redirectUrl; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: return [4 /*yield*/, this.getRedirectUrl({ + action: "GO_TO_FACTOR", + forceSetup: forceSetup, + stepUp: stepUp, + factorId: factorId, + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + }, utils.getNormalisedUserContext(userContext))]; + case 1: + url = _c.sent(); + if (url === null) { + return [2 /*return*/]; + } + // If redirectBack was set to true we always set redirectToPath to that value + // otherwise we try and get it from the query params, finally falling back to not setting it. + // Example: + // 1. If the app calls this on pathX and with redirectBack=false, we redirect to /auth/mfa/factor-id + // 2. If the app calls this on pathX and with redirectBack=true, we redirect to /auth/mfa/factor-id?redirectToPath=pathX + // 3. If: + // - the app redirects to the factor chooser with redirectBack=true from path=X, they end up on /auth/mfa?redirectToPath=pathX + // - the factor chooser screen then calls this with redirectBack=false, then they end up on /auth/mfa/factor-id?redirectToPath=pathX + // 4. In the unlikely case that the app itself uses a `redirectToPath` query param internally + // and is on a custom path that has a redirectToPath set to pathX when calling this function, + // then we keep that in the query params if redirectBack is set to false. + if (redirectBack) { + redirectUrl = genericComponentOverrideContext.getCurrentNormalisedUrlPathWithQueryParamsAndFragments(); + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + } + else { + redirectUrl = genericComponentOverrideContext.getRedirectToPathFromURL(); + if (redirectUrl) { + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + } + } + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl(url, navigate)]; + } + }); + }); + }; + MultiFactorAuth.prototype.redirectToFactorChooser = function (_b) { + var _c = _b.redirectBack, redirectBack = _c === void 0 ? false : _c, _d = _b.nextFactorOptions, nextFactorOptions = _d === void 0 ? [] : _d, stepUp = _b.stepUp, navigate = _b.navigate, userContext = _b.userContext; + return logger.__awaiter(this, void 0, void 0, function () { + var url, redirectUrl, redirectUrl; + return logger.__generator(this, function (_e) { + switch (_e.label) { + case 0: return [4 /*yield*/, this.getRedirectUrl({ + action: "FACTOR_CHOOSER", + nextFactorOptions: nextFactorOptions, + stepUp: stepUp, + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + }, utils.getNormalisedUserContext(userContext))]; + case 1: + url = _e.sent(); + if (url === null) { + return [2 /*return*/]; + } + if (redirectBack) { + redirectUrl = genericComponentOverrideContext.getCurrentNormalisedUrlPathWithQueryParamsAndFragments(); + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + } + else { + redirectUrl = genericComponentOverrideContext.getRedirectToPathFromURL(); + if (redirectUrl) { + url = genericComponentOverrideContext.appendQueryParamsToURL(url, { redirectToPath: redirectUrl }); + } + } + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToUrl(url, navigate)]; + } + }); + }); + }; + /* + * Tests methods. + */ + MultiFactorAuth.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + MultiFactorAuth.instance = undefined; + return; + }; + var _a; + _a = MultiFactorAuth; + MultiFactorAuth.RECIPE_ID = "multifactorauth"; + MultiFactorAuth.MultiFactorAuthClaim = new MultiFactorAuthClaimClass(function () { return MultiFactorAuth.getInstanceOrThrow(); }, function (context, userContext) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(_a, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, this.getInstanceOrThrow().getRedirectUrl(logger.__assign(logger.__assign({}, context), { tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams() }), userContext)]; + case 1: return [2 /*return*/, (_b.sent()) || undefined]; + } + }); + }); }); + return MultiFactorAuth; +}(index.RecipeModule)); exports.DEFAULT_FACTOR_CHOOSER_PATH = DEFAULT_FACTOR_CHOOSER_PATH; exports.MultiFactorAuth = MultiFactorAuth; diff --git a/lib/build/multifactorauth-shared3.js b/lib/build/multifactorauth-shared3.js index bd3b554b5..7d16271fd 100644 --- a/lib/build/multifactorauth-shared3.js +++ b/lib/build/multifactorauth-shared3.js @@ -1,10 +1,8 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); -var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), - useContext = _a[0], - Provider = _a[1]; +var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), useContext = _a[0], Provider = _a[1]; exports.Provider = Provider; exports.useContext = useContext; diff --git a/lib/build/multifactorauth.js b/lib/build/multifactorauth.js index c837953b2..8085151c4 100644 --- a/lib/build/multifactorauth.js +++ b/lib/build/multifactorauth.js @@ -1,87 +1,83 @@ -"use strict"; +'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, '__esModule', { value: true }); -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var componentOverrideContext = require("./multifactorauth-shared3.js"); -var recipe = require("./multifactorauth-shared2.js"); -var types = require("./multifactorauth-shared.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("react"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("supertokens-web-js/utils/normalisedURLPath"); -require("react/jsx-runtime"); -require("supertokens-web-js/recipe/multifactorauth"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("./recipeModule-shared.js"); -require("supertokens-web-js/recipe/session"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); +var logger = require('./logger.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var componentOverrideContext = require('./multifactorauth-shared3.js'); +var recipe = require('./multifactorauth-shared2.js'); +var types = require('./multifactorauth-shared.js'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/windowHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils'); +require('react'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/utils/normalisedURLPath'); +require('react/jsx-runtime'); +require('supertokens-web-js/recipe/multifactorauth'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('./recipeModule-shared.js'); +require('supertokens-web-js/recipe/session'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var Wrapper = /** @class */ (function () { - function Wrapper() {} - Wrapper.init = function (config) { - return recipe.MultiFactorAuth.init(config); - }; - Wrapper.resyncSessionAndFetchMFAInfo = function (input) { - return recipe.MultiFactorAuth.getInstanceOrThrow().webJSRecipe.resyncSessionAndFetchMFAInfo( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ); - }; - Wrapper.redirectToFactor = function (input) { - var _a, _b, _c; - return recipe.MultiFactorAuth.getInstanceOrThrow().redirectToFactor({ - factorId: input.factorId, - forceSetup: (_a = input.forceSetup) !== null && _a !== void 0 ? _a : false, - redirectBack: (_b = input.redirectBack) !== null && _b !== void 0 ? _b : true, - stepUp: (_c = input.stepUp) !== null && _c !== void 0 ? _c : false, - navigate: input.navigate, - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }); - }; - Wrapper.redirectToFactorChooser = function (input) { - var _a, _b, _c; - return recipe.MultiFactorAuth.getInstanceOrThrow().redirectToFactorChooser({ - nextFactorOptions: (_a = input.nextFactorOptions) !== null && _a !== void 0 ? _a : [], - redirectBack: (_b = input.redirectBack) !== null && _b !== void 0 ? _b : true, - stepUp: (_c = input.stepUp) !== null && _c !== void 0 ? _c : false, - navigate: input.navigate, - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }); - }; - Wrapper.MultiFactorAuthClaim = recipe.MultiFactorAuth.MultiFactorAuthClaim; - Wrapper.FactorIds = types.FactorIds; - Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; - return Wrapper; -})(); -var init = Wrapper.init; -var resyncSessionAndFetchMFAInfo = Wrapper.resyncSessionAndFetchMFAInfo; -var redirectToFactor = Wrapper.redirectToFactor; -var redirectToFactorChooser = Wrapper.redirectToFactorChooser; -var MultiFactorAuthComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var Wrapper = /** @class */ (function () { + function Wrapper() { + } + Wrapper.init = function (config) { + return recipe.MultiFactorAuth.init(config); + }; + Wrapper.resyncSessionAndFetchMFAInfo = function (input) { + return recipe.MultiFactorAuth.getInstanceOrThrow().webJSRecipe.resyncSessionAndFetchMFAInfo(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) })); + }; + Wrapper.redirectToFactor = function (input) { + var _a, _b, _c; + return recipe.MultiFactorAuth.getInstanceOrThrow().redirectToFactor({ + factorId: input.factorId, + forceSetup: (_a = input.forceSetup) !== null && _a !== void 0 ? _a : false, + redirectBack: (_b = input.redirectBack) !== null && _b !== void 0 ? _b : true, + stepUp: (_c = input.stepUp) !== null && _c !== void 0 ? _c : false, + navigate: input.navigate, + userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), + }); + }; + Wrapper.redirectToFactorChooser = function (input) { + var _a, _b, _c; + return recipe.MultiFactorAuth.getInstanceOrThrow().redirectToFactorChooser({ + nextFactorOptions: (_a = input.nextFactorOptions) !== null && _a !== void 0 ? _a : [], + redirectBack: (_b = input.redirectBack) !== null && _b !== void 0 ? _b : true, + stepUp: (_c = input.stepUp) !== null && _c !== void 0 ? _c : false, + navigate: input.navigate, + userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), + }); + }; + Wrapper.MultiFactorAuthClaim = recipe.MultiFactorAuth.MultiFactorAuthClaim; + Wrapper.FactorIds = types.FactorIds; + Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; + return Wrapper; +}()); +var init = Wrapper.init; +var resyncSessionAndFetchMFAInfo = Wrapper.resyncSessionAndFetchMFAInfo; +var redirectToFactor = Wrapper.redirectToFactor; +var redirectToFactorChooser = Wrapper.redirectToFactorChooser; +var MultiFactorAuthComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; var MultiFactorAuthClaim = recipe.MultiFactorAuth.MultiFactorAuthClaim; exports.FactorIds = types.FactorIds; diff --git a/lib/build/multifactorauthprebuiltui.js b/lib/build/multifactorauthprebuiltui.js index 7685444ea..bfe8a1c13 100644 --- a/lib/build/multifactorauthprebuiltui.js +++ b/lib/build/multifactorauthprebuiltui.js @@ -1,59 +1,50 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var uiEntry = require("./index2.js"); -var session = require("./session.js"); -var componentOverrideContext = require("./multifactorauth-shared3.js"); -var React = require("react"); -var windowHandler = require("supertokens-web-js/utils/windowHandler"); -var types = require("./multifactorauth-shared.js"); -var recipe = require("./multifactorauth-shared2.js"); -var translationContext = require("./translationContext.js"); -var sessionprebuiltui = require("./sessionprebuiltui.js"); -var arrowLeftIcon = require("./arrowLeftIcon.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("react-dom"); -require("./multitenancy-shared.js"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./recipeModule-shared.js"); -require("./authRecipe-shared.js"); -require("supertokens-web-js/lib/build/normalisedURLPath"); -require("supertokens-web-js/recipe/session"); -require("./session-shared.js"); -require("supertokens-web-js/recipe/multifactorauth"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +var NormalisedURLPath = require('supertokens-web-js/utils/normalisedURLPath'); +var uiEntry = require('./index2.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var session = require('./session.js'); +var componentOverrideContext = require('./multifactorauth-shared3.js'); +var React = require('react'); +var windowHandler = require('supertokens-web-js/utils/windowHandler'); +var types = require('./multifactorauth-shared.js'); +var recipe = require('./multifactorauth-shared2.js'); +var translationContext = require('./translationContext.js'); +var sessionprebuiltui = require('./sessionprebuiltui.js'); +var arrowLeftIcon = require('./arrowLeftIcon.js'); +require('react-dom'); +require('./multitenancy-shared.js'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./recipeModule-shared.js'); +require('./authRecipe-shared.js'); +require('supertokens-web-js/lib/build/normalisedURLPath'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/recipe/session'); +require('./session-shared.js'); +require('supertokens-web-js/recipe/multifactorauth'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { - if (k !== "default") { + if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty( - n, - k, - d.get - ? d - : { - enumerable: true, - get: function () { - return e[k]; - }, - } - ); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); } }); } @@ -61,557 +52,237 @@ function _interopNamespace(e) { return Object.freeze(n); } -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var React__namespace = /*#__PURE__*/ _interopNamespace(React); +var NormalisedURLPath__default = /*#__PURE__*/_interopDefault(NormalisedURLPath); +var React__namespace = /*#__PURE__*/_interopNamespace(React); -var styles = - '[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n/*\n * Default styles.\n */\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~="container"] {\n font-family: "Arial", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="secondaryText"] strong {\n font-weight: 600;\n}\n[data-supertokens~="divider"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~="linkButton"] {\n font-family: "Arial", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~="button"] {\n font-family: "Arial", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n[data-supertokens~="delayedRender"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~="footerLinkGroupVert"] > div {\n cursor: pointer;\n margin: 0;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n[data-supertokens~="withBackButton"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~="dividerWithOr"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~="dividerText"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n[data-supertokens~="formLabelWithLinkWrapper"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~="formLabelLinkBtn"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n[data-supertokens~="formLabelLinkBtn"]:hover {\n text-decoration: underline;\n}\n[data-supertokens~="formLabelLinkBtn"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n[data-supertokens~="authComponentList"] {\n padding-bottom: 20px;\n}\n[data-supertokens~="authPageTitleOAuthClient"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n[data-supertokens~="authPageTitleOAuthClientUrl"] {\n text-decoration: none;\n}\n[data-supertokens~="authPageTitleOAuthClientLogo"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n[data-supertokens~="authPageTitleOAuthClient"] [data-supertokens~="authPageTitleOAuthClientName"] {\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~="buttonWithArrow"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n[data-supertokens~="buttonWithArrow"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryText"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithRightArrow"] ~ svg {\n position: relative;\n left: 2px;\n}\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n position: relative;\n left: -2px;\n}\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n display: flex;\n align-items: center;\n}\n[data-supertokens~="mfa"][data-supertokens~="container"] {\n padding-top: 34px;\n}\n[data-supertokens~="mfa"] [data-supertokens~="row"] {\n padding-top: 6px;\n padding-bottom: 6px;\n}\n[data-supertokens~="mfa"] [data-supertokens~="headerTitle"] {\n font-size: var(--font-size-3);\n font-weight: 600;\n line-height: 30px;\n}\n[data-supertokens~="mfa"] [data-supertokens~="factorChooserList"] {\n margin-bottom: 12px;\n}\n[data-supertokens~="factorChooserOption"] {\n display: flex;\n flex-direction: row;\n border-radius: 6px;\n border: 1px solid rgb(var(--palette-inputBorder));\n padding: 20px 16px;\n cursor: pointer;\n margin-top: 12px;\n}\n[data-supertokens~="factorChooserOption"]:hover {\n border: 1px solid rgba(var(--palette-primary), 0.6);\n}\n[data-supertokens~="factorOptionText"] {\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: start;\n text-align: left;\n}\n[data-supertokens~="factorLogo"] {\n flex-grow: 0;\n min-width: 30px;\n text-align: left;\n margin-top: 6px;\n}\n[data-supertokens~="totp"] [data-supertokens~="factorLogo"] {\n margin-top: 3px;\n margin-left: -1px;\n}\n[data-supertokens~="factorName"] {\n color: rgb(var(--palette-primary));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 4px;\n}\n[data-supertokens~="factorDescription"] {\n color: rgb(var(--palette-textPrimary));\n font-size: var(--font-size-0);\n margin: 4px;\n}\n[data-supertokens~="mfa"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n margin-bottom: 26px;\n text-align: right;\n}\n'; +var styles = "[data-supertokens~=\"container\"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n/*\n * Default styles.\n */\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n[data-supertokens~=\"container\"] {\n font-family: \"Arial\", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n@media (max-width: 440px) {\n [data-supertokens~=\"container\"] {\n width: 95vw;\n }\n}\n[data-supertokens~=\"row\"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n[data-supertokens~=\"superTokensBranding\"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n[data-supertokens~=\"generalError\"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n[data-supertokens~=\"headerTitle\"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~=\"headerSubtitle\"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n[data-supertokens~=\"headerSubtitle\"][data-supertokens~=\"secondaryText\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] {\n max-width: 300px;\n margin-top: 10px;\n}\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] a {\n line-height: 21px;\n}\n/* TODO: split the link style into separate things*/\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n[data-supertokens~=\"link\"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n[data-supertokens~=\"primaryText\"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n[data-supertokens~=\"secondaryText\"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~=\"secondaryText\"] strong {\n font-weight: 600;\n}\n[data-supertokens~=\"divider\"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n[data-supertokens~=\"headerTinyTitle\"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n[data-supertokens~=\"secondaryLinkWithArrow\"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n[data-supertokens~=\"generalSuccess\"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n[data-supertokens~=\"spinner\"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n[data-supertokens~=\"error\"] {\n color: rgb(var(--palette-error));\n}\n[data-supertokens~=\"linkButton\"] {\n font-family: \"Arial\", sans-serif;\n background-color: transparent;\n border: 0;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n margin-right: 0.3em;\n}\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"]:hover svg {\n position: relative;\n left: -4px;\n}\n[data-supertokens~=\"button\"] {\n font-family: \"Arial\", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n[data-supertokens~=\"button\"]:disabled {\n border: none;\n cursor: no-drop;\n}\n[data-supertokens~=\"button\"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n[data-supertokens~=\"button\"]:focus {\n outline: none;\n}\n[data-supertokens~=\"backButtonCommon\"] {\n width: 16px;\n height: 13px;\n}\n[data-supertokens~=\"backButton\"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n[data-supertokens~=\"backButtonPlaceholder\"] {\n display: block;\n}\n[data-supertokens~=\"delayedRender\"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n[data-supertokens~=\"footerLinkGroupVert\"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] > div {\n cursor: pointer;\n margin: 0;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 400;\n}\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n@media (max-width: 360px) {\n [data-supertokens~=\"footerLinkGroupVert\"] {\n flex-direction: column;\n }\n [data-supertokens~=\"footerLinkGroupVert\"] > div {\n margin: 0 auto;\n }\n}\n[data-supertokens~=\"footerLinkGroupVert\"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n[data-supertokens~=\"withBackButton\"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~=\"dividerWithOr\"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n[data-supertokens~=\"dividerText\"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n[data-supertokens~=\"formLabelWithLinkWrapper\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n[data-supertokens~=\"formLabelLinkBtn\"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n[data-supertokens~=\"formLabelLinkBtn\"]:hover {\n text-decoration: underline;\n}\n[data-supertokens~=\"formLabelLinkBtn\"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n[data-supertokens~=\"authComponentList\"] {\n padding-bottom: 20px;\n}\n[data-supertokens~=\"authPageTitleOAuthClient\"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n[data-supertokens~=\"authPageTitleOAuthClientUrl\"] {\n text-decoration: none;\n}\n[data-supertokens~=\"authPageTitleOAuthClientLogo\"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n[data-supertokens~=\"authPageTitleOAuthClient\"] [data-supertokens~=\"authPageTitleOAuthClientName\"] {\n color: rgb(var(--palette-textTitle));\n}\n[data-supertokens~=\"buttonWithArrow\"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithRightArrow\"] ~ svg {\n position: relative;\n left: 2px;\n}\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n position: relative;\n left: -2px;\n}\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n display: flex;\n align-items: center;\n}\n[data-supertokens~=\"mfa\"][data-supertokens~=\"container\"] {\n padding-top: 34px;\n}\n[data-supertokens~=\"mfa\"] [data-supertokens~=\"row\"] {\n padding-top: 6px;\n padding-bottom: 6px;\n}\n[data-supertokens~=\"mfa\"] [data-supertokens~=\"headerTitle\"] {\n font-size: var(--font-size-3);\n font-weight: 600;\n line-height: 30px;\n}\n[data-supertokens~=\"mfa\"] [data-supertokens~=\"factorChooserList\"] {\n margin-bottom: 12px;\n}\n[data-supertokens~=\"factorChooserOption\"] {\n display: flex;\n flex-direction: row;\n border-radius: 6px;\n border: 1px solid rgb(var(--palette-inputBorder));\n padding: 20px 16px;\n cursor: pointer;\n margin-top: 12px;\n}\n[data-supertokens~=\"factorChooserOption\"]:hover {\n border: 1px solid rgba(var(--palette-primary), 0.6);\n}\n[data-supertokens~=\"factorOptionText\"] {\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: start;\n text-align: left;\n}\n[data-supertokens~=\"factorLogo\"] {\n flex-grow: 0;\n min-width: 30px;\n text-align: left;\n margin-top: 6px;\n}\n[data-supertokens~=\"totp\"] [data-supertokens~=\"factorLogo\"] {\n margin-top: 3px;\n margin-left: -1px;\n}\n[data-supertokens~=\"factorName\"] {\n color: rgb(var(--palette-primary));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 4px;\n}\n[data-supertokens~=\"factorDescription\"] {\n color: rgb(var(--palette-textPrimary));\n font-size: var(--font-size-0);\n margin: 4px;\n}\n[data-supertokens~=\"mfa\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n margin-bottom: 26px;\n text-align: right;\n}\n"; -var ThemeBase = function (_a) { - var children = _a.children, - userStyles = _a.userStyles; - return jsxRuntime.jsxs(React.Fragment, { - children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })], - }); +var ThemeBase = function (_a) { + var children = _a.children, userStyles = _a.userStyles; + return (jsxRuntime.jsxs(React.Fragment, { children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })] })); }; -var FactorChooserFooter = uiEntry.withOverride("MFAFactorChooserFooter", function MFAChooserFooter(_a) { - var logout = _a.logout; - var t = translationContext.useTranslation(); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row factorChooserFooter" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText secondaryLinkWithLeftArrow", onClick: logout }, - { - children: [ - jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { - color: "rgb(var(--palette-textPrimary))", - }), - t("MULTI_FACTOR_AUTH_LOGOUT"), - ], - } - ) - ), - } - ) - ); +var FactorChooserFooter = uiEntry.withOverride("MFAFactorChooserFooter", function MFAChooserFooter(_a) { + var logout = _a.logout; + var t = translationContext.useTranslation(); + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "row factorChooserFooter" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "secondaryText secondaryLinkWithLeftArrow", onClick: logout }, { children: [jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { color: "rgb(var(--palette-textPrimary))" }), t("MULTI_FACTOR_AUTH_LOGOUT")] })) }))); }); -var FactorChooserHeader = uiEntry.withOverride("MFAFactorChooserHeader", function MFAFactorChooserHeader(props) { - var t = translationContext.useTranslation(); - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row factorChooserHeader" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle withBackButton" }, - { - children: [ - props.showBackButton - ? jsxRuntime.jsx(uiEntry.BackButton, { onClick: props.onBackButtonClicked }) - : jsxRuntime.jsx("span", { - "data-supertokens": "backButtonPlaceholder backButtonCommon", - }), - t("MULTI_FACTOR_CHOOSER_HEADER_TITLE"), - jsxRuntime.jsx("span", { - "data-supertokens": "backButtonPlaceholder backButtonCommon", - }), - ], - } - ) - ), - } - ) - ); +var FactorChooserHeader = uiEntry.withOverride("MFAFactorChooserHeader", function MFAFactorChooserHeader(props) { + var t = translationContext.useTranslation(); + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "row factorChooserHeader" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "headerTitle withBackButton" }, { children: [props.showBackButton ? (jsxRuntime.jsx(uiEntry.BackButton, { onClick: props.onBackButtonClicked })) : (jsxRuntime.jsx("span", { "data-supertokens": "backButtonPlaceholder backButtonCommon" })), t("MULTI_FACTOR_CHOOSER_HEADER_TITLE"), jsxRuntime.jsx("span", { "data-supertokens": "backButtonPlaceholder backButtonCommon" })] })) }))); }); -var FactorOption = uiEntry.withOverride("MFAFactorOption", function MFAFactorOption(_a) { - var onClick = _a.onClick, - id = _a.id, - name = _a.name, - description = _a.description, - logo = _a.logo; - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs( - "a", - genericComponentOverrideContext.__assign( - { "data-supertokens": "factorChooserOption ".concat(id), onClick: onClick }, - { - children: [ - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "factorLogo" }, - { children: [" ", logo({})] } - ) - ), - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "factorOptionText" }, - { - children: [ - jsxRuntime.jsx( - "h6", - genericComponentOverrideContext.__assign( - { "data-supertokens": "factorName" }, - { children: t(name) } - ) - ), - jsxRuntime.jsx( - "p", - genericComponentOverrideContext.__assign( - { "data-supertokens": "factorDescription" }, - { children: t(description) } - ) - ), - ], - } - ) - ), - ], - } - ) - ); +var FactorOption = uiEntry.withOverride("MFAFactorOption", function MFAFactorOption(_a) { + var onClick = _a.onClick, id = _a.id, name = _a.name, description = _a.description, logo = _a.logo; + var t = translationContext.useTranslation(); + return (jsxRuntime.jsxs("a", logger.__assign({ "data-supertokens": "factorChooserOption ".concat(id), onClick: onClick }, { children: [jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "factorLogo" }, { children: [" ", logo({})] })), jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "factorOptionText" }, { children: [jsxRuntime.jsx("h6", logger.__assign({ "data-supertokens": "factorName" }, { children: t(name) })), jsxRuntime.jsx("p", logger.__assign({ "data-supertokens": "factorDescription" }, { children: t(description) }))] }))] }))); }); -var FactorList = uiEntry.withOverride("MFAFactorList", function MFAFactorList(_a) { - var availableFactors = _a.availableFactors, - navigateToFactor = _a.navigateToFactor; - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row factorChooserList" }, - { - children: availableFactors.map(function (factor) { - return jsxRuntime.jsx( - FactorOption, - { - id: factor.id, - name: factor.name, - description: factor.description, - logo: factor.logo, - onClick: function () { - return navigateToFactor(factor.id); - }, - }, - factor.id - ); - }), - } - ) - ); +var FactorList = uiEntry.withOverride("MFAFactorList", function MFAFactorList(_a) { + var availableFactors = _a.availableFactors, navigateToFactor = _a.navigateToFactor; + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "row factorChooserList" }, { children: availableFactors.map(function (factor) { return (jsxRuntime.jsx(FactorOption, { id: factor.id, name: factor.name, description: factor.description, logo: factor.logo, onClick: function () { return navigateToFactor(factor.id); } }, factor.id)); }) }))); }); -function FactorChooserTheme(props) { - var t = translationContext.useTranslation(); - if (props.availableFactors.length === 0) { - return jsxRuntime.jsx(sessionprebuiltui.AccessDeniedScreen, { - useShadowDom: false /* We set this to false, because we are already inside a shadowDom (if required) */, - error: props.showBackButton ? t("MFA_NO_AVAILABLE_OPTIONS") : t("MFA_NO_AVAILABLE_OPTIONS_LOGIN"), - }); - } - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container mfa" }, - { - children: [ - jsxRuntime.jsx(FactorChooserHeader, { - onBackButtonClicked: props.onBackButtonClicked, - showBackButton: props.showBackButton, - }), - jsxRuntime.jsx(FactorList, { - availableFactors: props.availableFactors, - navigateToFactor: props.navigateToFactor, - }), - jsxRuntime.jsx(FactorChooserFooter, { logout: props.onLogoutClicked }), - jsxRuntime.jsx(uiEntry.SuperTokensBranding, {}), - ], - } - ) - ); -} -function FactorChooserThemeWrapper(props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - ThemeBase, - genericComponentOverrideContext.__assign( - { - userStyles: [ - rootStyle, - props.config.recipeRootStyle, - props.config.factorChooserScreen.style, - ], - }, - { - children: jsxRuntime.jsx( - FactorChooserTheme, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ), - } - ) - ); +function FactorChooserTheme(props) { + var t = translationContext.useTranslation(); + if (props.availableFactors.length === 0) { + return (jsxRuntime.jsx(sessionprebuiltui.AccessDeniedScreen, { useShadowDom: false /* We set this to false, because we are already inside a shadowDom (if required) */, error: props.showBackButton ? t("MFA_NO_AVAILABLE_OPTIONS") : t("MFA_NO_AVAILABLE_OPTIONS_LOGIN") })); + } + return (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "container mfa" }, { children: [jsxRuntime.jsx(FactorChooserHeader, { onBackButtonClicked: props.onBackButtonClicked, showBackButton: props.showBackButton }), jsxRuntime.jsx(FactorList, { availableFactors: props.availableFactors, navigateToFactor: props.navigateToFactor }), jsxRuntime.jsx(FactorChooserFooter, { logout: props.onLogoutClicked }), jsxRuntime.jsx(uiEntry.SuperTokensBranding, {})] }))); +} +function FactorChooserThemeWrapper(props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle, props.config.factorChooserScreen.style] }, { children: jsxRuntime.jsx(FactorChooserTheme, logger.__assign({}, props)) })) }))); } -var defaultTranslationsMultiFactorAuth = { - en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), - { - MULTI_FACTOR_CHOOSER_HEADER_TITLE: "Please select a factor", - MULTI_FACTOR_AUTH_LOGOUT: "Log out", - PWLESS_MFA_OTP_PHONE_NAME: "SMS based OTP", - PWLESS_MFA_OTP_PHONE_DESCRIPTION: "Get an OTP code on your phone to complete the authentication request", - PWLESS_MFA_OTP_EMAIL_NAME: "Email based OTP", - PWLESS_MFA_OTP_EMAIL_DESCRIPTION: - "Get an OTP code on your email address to complete the authentication request", - TOTP_MFA_NAME: "TOTP", - TOTP_MFA_DESCRIPTION: "Use an authenticator app to complete the authentication request", - MFA_NO_AVAILABLE_OPTIONS: "You have no available secondary factors.", - MFA_NO_AVAILABLE_OPTIONS_LOGIN: - "You have no available secondary factors and cannot complete the sign-in process. Please contact support.", - } - ), +var defaultTranslationsMultiFactorAuth = { + en: logger.__assign(logger.__assign({}, uiEntry.defaultTranslationsCommon.en), { MULTI_FACTOR_CHOOSER_HEADER_TITLE: "Please select a factor", MULTI_FACTOR_AUTH_LOGOUT: "Log out", PWLESS_MFA_OTP_PHONE_NAME: "SMS based OTP", PWLESS_MFA_OTP_PHONE_DESCRIPTION: "Get an OTP code on your phone to complete the authentication request", PWLESS_MFA_OTP_EMAIL_NAME: "Email based OTP", PWLESS_MFA_OTP_EMAIL_DESCRIPTION: "Get an OTP code on your email address to complete the authentication request", TOTP_MFA_NAME: "TOTP", TOTP_MFA_DESCRIPTION: "Use an authenticator app to complete the authentication request", MFA_NO_AVAILABLE_OPTIONS: "You have no available secondary factors.", MFA_NO_AVAILABLE_OPTIONS_LOGIN: "You have no available secondary factors and cannot complete the sign-in process. Please contact support." }), }; -var FactorChooser$1 = function (props) { - var _a; - var sessionContext = React.useContext(uiEntry.SessionContext); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var _b = React.useState(undefined), - mfaInfo = _b[0], - setMFAInfo = _b[1]; - var userContext = uiEntry.useUserContext(); - if (props.userContext !== undefined) { - userContext = props.userContext; - } - var recipeComponentOverrides = props.useComponentOverrides(); - var nextQueryParam = - (_a = genericComponentOverrideContext.getQueryParams("n")) !== null && _a !== void 0 ? _a : undefined; - var stepUpQueryParam = genericComponentOverrideContext.getQueryParams("stepUp"); - var redirectToAuthWithHistory = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - uiEntry.redirectToAuth({ redirectBack: false, navigate: props.navigate }), - ]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); - }, - [props.navigate] - ); - var fetchMFAInfo = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - props.recipe.webJSRecipe.resyncSessionAndFetchMFAInfo({ userContext: userContext }), - ]; - }); - }); - }, - [props.recipe, userContext] - ); - var checkMFAInfo = React.useCallback( - function (mfaInfo) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (mfaInfo.factors.next.length === 0 && stepUpQueryParam !== "true") { - void types.Session.getInstanceOrThrow() - .validateGlobalClaimsAndHandleSuccessRedirection( - undefined, - recipe.MultiFactorAuth.RECIPE_ID, - genericComponentOverrideContext.getRedirectToPathFromURL(), - userContext, - props.navigate - ) - .catch(rethrowInRender); - } else { - setMFAInfo({ - factors: mfaInfo.factors, - phoneNumbers: mfaInfo.phoneNumbers, - emails: mfaInfo.emails, - }); - } - return [2 /*return*/]; - }); - }); - }, - [setMFAInfo, nextQueryParam, userContext] - ); - var handleError = React.useCallback( - function (err) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().doesSessionExist({ userContext: userContext }), - ]; - case 1: - if (!_a.sent()) return [3 /*break*/, 2]; - throw err; - case 2: - return [4 /*yield*/, redirectToAuthWithHistory()]; - case 3: - _a.sent(); - _a.label = 4; - case 4: - return [2 /*return*/]; - } - }); - }); - }, - [redirectToAuthWithHistory] - ); - genericComponentOverrideContext.useOnMountAPICall( - fetchMFAInfo, - checkMFAInfo, - handleError, - sessionContext.loading === false - ); - var navigateToFactor = React.useCallback( - function (factorId) { - props.recipe.config.onHandleEvent({ - action: "FACTOR_CHOOSEN", - factorId: factorId, - }); - return props.recipe.redirectToFactor({ - factorId: factorId, - forceSetup: false, - stepUp: stepUpQueryParam === "true", - redirectBack: false, - navigate: props.navigate, - userContext: props.userContext, - }); - }, - [props.recipe] - ); - var signOut = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var session; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - session = types.Session.getInstanceOrThrow(); - return [4 /*yield*/, session.signOut({ userContext: userContext })]; - case 1: - _a.sent(); - return [2 /*return*/, redirectToAuthWithHistory()]; - } - }); - }); - }, - [props.recipe, redirectToAuthWithHistory] - ); - var onBackButtonClicked = React.useCallback( - function () { - // If we don't have navigate available this would mean we are not using react-router-dom, so we use window's history - if (props.navigate === undefined) { - return windowHandler.WindowHandlerReference.getReferenceOrThrow() - .windowHandler.getWindowUnsafe() - .history.back(); - } - // If we do have navigate and goBack function on it this means we are using react-router-dom v5 or lower - if ("goBack" in props.navigate) { - return props.navigate.goBack(); - } - // If we reach this code this means we are using react-router-dom v6 - return props.navigate(-1); - }, - [props.navigate] - ); - if (mfaInfo === undefined) { - return null; - } - var availableFactors = recipe.getAvailableFactors(mfaInfo.factors, nextQueryParam, props.recipe, userContext); - var childProps = { - config: props.recipe.config, - onBackButtonClicked: onBackButtonClicked, - // if the next array is empty, it means the user has logged in fully and has come here (from a settings page for example). - // So we show the back button. In case the next array is not empty, it means we are still signing in, and - // there is no where to go back to, other than logout, which is a different button in the UI. - showBackButton: mfaInfo.factors.next.length === 0, - mfaInfo: mfaInfo, - availableFactors: availableFactors, - onLogoutClicked: signOut, - navigateToFactor: navigateToFactor, - }; - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, - defaultStore: defaultTranslationsMultiFactorAuth, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - FactorChooserThemeWrapper, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ), - } - ) - ); +var FactorChooser$1 = function (props) { + var _a; + var sessionContext = React.useContext(uiEntry.SessionContext); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var _b = React.useState(undefined), mfaInfo = _b[0], setMFAInfo = _b[1]; + var userContext = uiEntry.useUserContext(); + if (props.userContext !== undefined) { + userContext = props.userContext; + } + var recipeComponentOverrides = props.useComponentOverrides(); + var nextQueryParam = (_a = genericComponentOverrideContext.getQueryParams("n")) !== null && _a !== void 0 ? _a : undefined; + var stepUpQueryParam = genericComponentOverrideContext.getQueryParams("stepUp"); + var redirectToAuthWithHistory = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, uiEntry.redirectToAuth({ redirectBack: false, navigate: props.navigate })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }, [props.navigate]); + var fetchMFAInfo = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { return logger.__generator(this, function (_a) { + return [2 /*return*/, props.recipe.webJSRecipe.resyncSessionAndFetchMFAInfo({ userContext: userContext })]; + }); }); }, [props.recipe, userContext]); + var checkMFAInfo = React.useCallback(function (mfaInfo) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (mfaInfo.factors.next.length === 0 && stepUpQueryParam !== "true") { + void types.Session.getInstanceOrThrow() + .validateGlobalClaimsAndHandleSuccessRedirection(undefined, recipe.MultiFactorAuth.RECIPE_ID, genericComponentOverrideContext.getRedirectToPathFromURL(), userContext, props.navigate) + .catch(rethrowInRender); + } + else { + setMFAInfo({ + factors: mfaInfo.factors, + phoneNumbers: mfaInfo.phoneNumbers, + emails: mfaInfo.emails, + }); + } + return [2 /*return*/]; + }); + }); }, [setMFAInfo, nextQueryParam, userContext]); + var handleError = React.useCallback(function (err) { return logger.__awaiter(void 0, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, types.Session.getInstanceOrThrow().doesSessionExist({ userContext: userContext })]; + case 1: + if (!_a.sent()) return [3 /*break*/, 2]; + throw err; + case 2: return [4 /*yield*/, redirectToAuthWithHistory()]; + case 3: + _a.sent(); + _a.label = 4; + case 4: return [2 /*return*/]; + } + }); + }); }, [redirectToAuthWithHistory]); + genericComponentOverrideContext.useOnMountAPICall(fetchMFAInfo, checkMFAInfo, handleError, sessionContext.loading === false); + var navigateToFactor = React.useCallback(function (factorId) { + props.recipe.config.onHandleEvent({ + action: "FACTOR_CHOOSEN", + factorId: factorId, + }); + return props.recipe.redirectToFactor({ + factorId: factorId, + forceSetup: false, + stepUp: stepUpQueryParam === "true", + redirectBack: false, + navigate: props.navigate, + userContext: props.userContext, + }); + }, [props.recipe]); + var signOut = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var session; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + session = types.Session.getInstanceOrThrow(); + return [4 /*yield*/, session.signOut({ userContext: userContext })]; + case 1: + _a.sent(); + return [2 /*return*/, redirectToAuthWithHistory()]; + } + }); + }); }, [props.recipe, redirectToAuthWithHistory]); + var onBackButtonClicked = React.useCallback(function () { + // If we don't have navigate available this would mean we are not using react-router-dom, so we use window's history + if (props.navigate === undefined) { + return windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.getWindowUnsafe().history.back(); + } + // If we do have navigate and goBack function on it this means we are using react-router-dom v5 or lower + if ("goBack" in props.navigate) { + return props.navigate.goBack(); + } + // If we reach this code this means we are using react-router-dom v6 + return props.navigate(-1); + }, [props.navigate]); + if (mfaInfo === undefined) { + return null; + } + var availableFactors = recipe.getAvailableFactors(mfaInfo.factors, nextQueryParam, props.recipe, userContext); + var childProps = { + config: props.recipe.config, + onBackButtonClicked: onBackButtonClicked, + // if the next array is empty, it means the user has logged in fully and has come here (from a settings page for example). + // So we show the back button. In case the next array is not empty, it means we are still signing in, and + // there is no where to go back to, other than logout, which is a different button in the UI. + showBackButton: mfaInfo.factors.next.length === 0, + mfaInfo: mfaInfo, + availableFactors: availableFactors, + onLogoutClicked: signOut, + navigateToFactor: navigateToFactor, + }; + return (jsxRuntime.jsx(uiEntry.ComponentOverrideContext.Provider, logger.__assign({ value: recipeComponentOverrides }, { children: jsxRuntime.jsx(uiEntry.FeatureWrapper, logger.__assign({ useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, defaultStore: defaultTranslationsMultiFactorAuth }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(FactorChooserThemeWrapper, logger.__assign({}, childProps)), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, childProps); + } + return child; + })] }) })) }))); }; -var MultiFactorAuthPreBuiltUI = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(MultiFactorAuthPreBuiltUI, _super); - function MultiFactorAuthPreBuiltUI(recipeInstance) { - var _this = _super.call(this) || this; - _this.recipeInstance = recipeInstance; - _this.languageTranslations = defaultTranslationsMultiFactorAuth; - // Instance methods - _this.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - var features = {}; - if (_this.recipeInstance.config.disableDefaultUI !== true) { - var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( - new NormalisedURLPath__default.default(recipe.DEFAULT_FACTOR_CHOOSER_PATH) - ); - features[normalisedFullPath.getAsStringDangerous()] = { - matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( - _this.recipeInstance.config.recipeId - ), - component: function (props) { - return _this.getFeatureComponent("factorchooser", props, useComponentOverrides); - }, - recipeID: recipe.MultiFactorAuth.RECIPE_ID, - }; - } - return features; - }; - _this.getFeatureComponent = function ( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _, - props, - useComponentOverrides - ) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - session.SessionAuth, - genericComponentOverrideContext.__assign( - { - overrideGlobalClaimValidators: function () { - return []; - }, - }, - { - children: jsxRuntime.jsx( - FactorChooser$1, - genericComponentOverrideContext.__assign( - { - recipe: _this.recipeInstance, - useComponentOverrides: useComponentOverrides, - }, - props - ) - ), - } - ) - ), - } - ) - ); - }; - return _this; - } - // Static methods - MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance = function () { - if (MultiFactorAuthPreBuiltUI.instance === undefined) { - var recipeInstance = recipe.MultiFactorAuth.getInstanceOrThrow(); - MultiFactorAuthPreBuiltUI.instance = new MultiFactorAuthPreBuiltUI(recipeInstance); - } - return MultiFactorAuthPreBuiltUI.instance; - }; - MultiFactorAuthPreBuiltUI.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); - }; - MultiFactorAuthPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - componentName, - props, - useComponentOverrides - ); - }; - MultiFactorAuthPreBuiltUI.prototype.getAuthComponents = function () { - return []; - }; - // For tests - MultiFactorAuthPreBuiltUI.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - MultiFactorAuthPreBuiltUI.instance = undefined; - return; - }; - MultiFactorAuthPreBuiltUI.FactorChooser = function (props) { - return MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("factorchooser", props); - }; - MultiFactorAuthPreBuiltUI.FactorChooserTheme = FactorChooserThemeWrapper; - return MultiFactorAuthPreBuiltUI; -})(uiEntry.RecipeRouter); +var MultiFactorAuthPreBuiltUI = /** @class */ (function (_super) { + logger.__extends(MultiFactorAuthPreBuiltUI, _super); + function MultiFactorAuthPreBuiltUI(recipeInstance) { + var _this = _super.call(this) || this; + _this.recipeInstance = recipeInstance; + _this.languageTranslations = defaultTranslationsMultiFactorAuth; + // Instance methods + _this.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + var features = {}; + if (_this.recipeInstance.config.disableDefaultUI !== true) { + var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default.default(recipe.DEFAULT_FACTOR_CHOOSER_PATH)); + features[normalisedFullPath.getAsStringDangerous()] = { + matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams(_this.recipeInstance.config.recipeId), + component: function (props) { return _this.getFeatureComponent("factorchooser", props, useComponentOverrides); }, + recipeID: recipe.MultiFactorAuth.RECIPE_ID, + }; + } + return features; + }; + _this.getFeatureComponent = function ( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(session.SessionAuth, logger.__assign({ overrideGlobalClaimValidators: function () { return []; } }, { children: jsxRuntime.jsx(FactorChooser$1, logger.__assign({ recipe: _this.recipeInstance, useComponentOverrides: useComponentOverrides }, props)) })) }))); + }; + return _this; + } + // Static methods + MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance = function () { + if (MultiFactorAuthPreBuiltUI.instance === undefined) { + var recipeInstance = recipe.MultiFactorAuth.getInstanceOrThrow(); + MultiFactorAuthPreBuiltUI.instance = new MultiFactorAuthPreBuiltUI(recipeInstance); + } + return MultiFactorAuthPreBuiltUI.instance; + }; + MultiFactorAuthPreBuiltUI.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + return MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); + }; + MultiFactorAuthPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + return MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent(componentName, props, useComponentOverrides); + }; + MultiFactorAuthPreBuiltUI.prototype.getAuthComponents = function () { + return []; + }; + // For tests + MultiFactorAuthPreBuiltUI.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + MultiFactorAuthPreBuiltUI.instance = undefined; + return; + }; + MultiFactorAuthPreBuiltUI.FactorChooser = function (props) { + return MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("factorchooser", props); + }; + MultiFactorAuthPreBuiltUI.FactorChooserTheme = FactorChooserThemeWrapper; + return MultiFactorAuthPreBuiltUI; +}(uiEntry.RecipeRouter)); var FactorChooser = MultiFactorAuthPreBuiltUI.FactorChooser; exports.FactorChooser = FactorChooser; diff --git a/lib/build/multitenancy-shared.js b/lib/build/multitenancy-shared.js index bd3b554b5..7d16271fd 100644 --- a/lib/build/multitenancy-shared.js +++ b/lib/build/multitenancy-shared.js @@ -1,10 +1,8 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); -var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), - useContext = _a[0], - Provider = _a[1]; +var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), useContext = _a[0], Provider = _a[1]; exports.Provider = Provider; exports.useContext = useContext; diff --git a/lib/build/multitenancy.js b/lib/build/multitenancy.js index 05284f52e..0df6ce383 100644 --- a/lib/build/multitenancy.js +++ b/lib/build/multitenancy.js @@ -1,51 +1,51 @@ -"use strict"; +'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, '__esModule', { value: true }); -var MultitenancyWebJS = require("supertokens-web-js/recipe/multitenancy"); -var componentOverrideContext = require("./multitenancy-shared.js"); -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/utils"); -require("react"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("supertokens-web-js/utils/normalisedURLPath"); -require("react/jsx-runtime"); +var MultitenancyWebJS = require('supertokens-web-js/recipe/multitenancy'); +var componentOverrideContext = require('./multitenancy-shared.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +require('./logger.js'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/windowHandler'); +require('supertokens-web-js/utils'); +require('react'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/utils/normalisedURLPath'); +require('react/jsx-runtime'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var Wrapper = /** @class */ (function () { - function Wrapper() {} - Wrapper.init = function (config) { - return genericComponentOverrideContext.Multitenancy.init(config); - }; - Wrapper.AllowedDomainsClaim = MultitenancyWebJS.AllowedDomainsClaim; - Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; - return Wrapper; -})(); -var init = Wrapper.init; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var Wrapper = /** @class */ (function () { + function Wrapper() { + } + Wrapper.init = function (config) { + return genericComponentOverrideContext.Multitenancy.init(config); + }; + Wrapper.AllowedDomainsClaim = MultitenancyWebJS.AllowedDomainsClaim; + Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; + return Wrapper; +}()); +var init = Wrapper.init; var MultitenancyComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; -Object.defineProperty(exports, "AllowedDomainsClaim", { +Object.defineProperty(exports, 'AllowedDomainsClaim', { enumerable: true, - get: function () { - return MultitenancyWebJS.AllowedDomainsClaim; - }, + get: function () { return MultitenancyWebJS.AllowedDomainsClaim; } }); exports.MultitenancyComponentsOverrideProvider = MultitenancyComponentsOverrideProvider; exports.default = Wrapper; diff --git a/lib/build/nextjs/constants.d.ts b/lib/build/nextjs/constants.d.ts new file mode 100644 index 000000000..baa42fdda --- /dev/null +++ b/lib/build/nextjs/constants.d.ts @@ -0,0 +1,13 @@ +export declare const ACCESS_TOKEN_COOKIE_NAME = "sAccessToken"; +export declare const ACCESS_TOKEN_HEADER_NAME = "st-access-token"; +export declare const FRONT_TOKEN_COOKIE_NAME = "sFrontToken"; +export declare const FRONT_TOKEN_HEADER_NAME = "front-token"; +export declare const REFRESH_TOKEN_COOKIE_NAME = "sRefreshToken"; +export declare const REFRESH_TOKEN_HEADER_NAME = "st-refresh-token"; +export declare const ANTI_CSRF_TOKEN_COOKIE_NAME = "sAntiCsrf"; +export declare const ANTI_CSRF_TOKEN_HEADER_NAME = "anti-csrf"; +export declare const REDIRECT_ATTEMPT_MAX_COUNT = 5; +export declare const REDIRECT_ATTEMPT_COUNT_COOKIE_NAME = "sSsrSessionRefreshAttempt"; +export declare const CURRENT_PATH_COOKIE_NAME = "sCurrentPath"; +export declare const FORCE_LOGOUT_PATH_PARAM_NAME = "forceLogout"; +export declare const REDIRECT_PATH_PARAM_NAME = "stRedirectTo"; diff --git a/lib/build/nextjs/middleware.d.ts b/lib/build/nextjs/middleware.d.ts new file mode 100644 index 000000000..2d710337c --- /dev/null +++ b/lib/build/nextjs/middleware.d.ts @@ -0,0 +1,4 @@ +import type { SuperTokensNextjsConfig, WithSession } from "./types"; +export declare function superTokensMiddleware(config: SuperTokensNextjsConfig, withSession: WithSession): (request: Request) => Promise; +export declare function refreshSession(config: SuperTokensNextjsConfig, request: Request): Promise; +export declare function revokeSession(config: SuperTokensNextjsConfig, request: Request): Promise; diff --git a/lib/build/nextjs/ssr.d.ts b/lib/build/nextjs/ssr.d.ts new file mode 100644 index 000000000..b4561f2d3 --- /dev/null +++ b/lib/build/nextjs/ssr.d.ts @@ -0,0 +1,32 @@ +import * as jose from "jose"; +import type { CookiesObject, CookiesStore, GetServerSidePropsReturnValue, SuperTokensNextjsConfig } from "./types"; +import type { LoadedSessionContext } from "../recipe/session/types"; +declare type JWKSet = ReturnType; +export default class SuperTokensNextjsSSRAPIWrapper { + static config: SuperTokensNextjsConfig; + static jwks: JWKSet; + static init(config: SuperTokensNextjsConfig): void; + static getConfigOrThrow(): SuperTokensNextjsConfig; + static getJWKS(): JWKSet; + /** + * Get the session state during SSR or redirect + * The function is meant to be used inside Next.js components that make use of SSR. + * @param cookies - The cookies store exposed by next/headers (await cookies()) + * @param redirect - The redirect function exposed by next/navigation + * @returns The session context value or directly redirects the user to either the login page or the refresh API + **/ + static getSSRSession(cookies: CookiesStore, redirect: (url: string) => never): Promise; + /** + * Get the session state inside props or redirect + * The function is meant to be used inside getServerSideProps. + * @param request - The request object available inside getServerSideProps ctx (ctx.req) + * @returns The session context value or a redirects path to send the user to the refresh API or the login page + **/ + static getServerSidePropsSession(request: Request & { + cookies: CookiesObject; + }): Promise; +} +export declare const init: typeof SuperTokensNextjsSSRAPIWrapper.init; +export declare const getSSRSession: typeof SuperTokensNextjsSSRAPIWrapper.getSSRSession; +export declare const getServerSidePropsSession: typeof SuperTokensNextjsSSRAPIWrapper.getServerSidePropsSession; +export {}; diff --git a/lib/build/nextjs/types.d.ts b/lib/build/nextjs/types.d.ts new file mode 100644 index 000000000..664a79a9f --- /dev/null +++ b/lib/build/nextjs/types.d.ts @@ -0,0 +1,62 @@ +import type { LoadedSessionContext } from "../recipe/session/types"; +import type { AppInfoUserInput } from "../types"; +export declare type CookiesStore = { + get: (name: string) => { + value: string; + }; + set: (name: string, value: string) => void; +}; +export declare type HeadersStore = { + get: (name: string) => string | null; + set: (name: string, value: string) => void; + getSetCookie: () => string[]; +}; +export declare type CookiesObject = Record; +export declare type HeadersObject = Record; +export declare type GetServerSidePropsRedirect = { + redirect: { + destination: string; + permanent: boolean; + }; +}; +export declare type GetServerSidePropsReturnValue = { + props: { + session: LoadedSessionContext; + }; +} | GetServerSidePropsRedirect; +export declare function isCookiesStore(obj: unknown): obj is CookiesStore; +export declare type SuperTokensNextjsConfig = { + appInfo: AppInfoUserInput; + enableDebugLogs?: boolean; +}; +export declare type SuperTokensRequestToken = { + header: string | null; + cookie: string | null; +}; +export declare type AccessTokenPayload = { + uid: string; + ate: number; + up: { + iat: number; + exp: number; + sub: string; + tId: string; + rsub: string; + sessionHandle: string; + refrehTokenHash1: string; + parentRefereshTokenHash1: string | null; + antiCsrfToken: string | null; + iss: string; + "st-role": { + v: string; + t: number[]; + }; + "st-perm": { + v: string[]; + t: number; + }; + }; +}; +export declare type WithSession = (req: Request, handler: (error: Error | undefined, session: (Record & { + getUserId: () => string; +}) | undefined) => Promise, options?: unknown, userContext?: Record) => Promise; diff --git a/lib/build/nextjsmiddleware.js b/lib/build/nextjsmiddleware.js new file mode 100644 index 000000000..957bbf67c --- /dev/null +++ b/lib/build/nextjsmiddleware.js @@ -0,0 +1,273 @@ +'use strict'; + +var logger = require('./logger.js'); +var constants = require('./constants.js'); + +var AppInfo; +var DEFAULT_API_BASE_PATH = "/api/auth"; +// Open questions: +// - Do we need the x-user-id header? +// - Do we want to enforce API route validation from the middleware +// or do we explain how to do this at the API function level +// - How do we pass withSession and ValidateSessionOptions together +// - If we use withSession in the middleware, do we add some ability to choose which routes will be protected? +function superTokensMiddleware(config, withSession) { + var _this = this; + var usesTheNextjsApiAsTheAuthenticationServer = config.appInfo.apiDomain === config.appInfo.websiteDomain; + return function (request) { return logger.__awaiter(_this, void 0, void 0, function () { + var requestUrl, response; + var _this = this; + return logger.__generator(this, function (_a) { + requestUrl = new URL(request.url); + if (requestUrl.pathname.startsWith("/api/auth/session/refresh") && request.method === "GET") { + return [2 /*return*/, refreshSession(config, request)]; + } + if (requestUrl.pathname.startsWith("/api") && usesTheNextjsApiAsTheAuthenticationServer) { + if (request.headers.has("x-user-id")) { + console.warn("The FE tried to pass x-user-id, which is only supposed to be a backend internal header. Ignoring."); + request.headers.delete("x-user-id"); + } + if (requestUrl.pathname.startsWith(config.appInfo.apiBasePath || DEFAULT_API_BASE_PATH)) { + // this hits our pages/api/auth/* endpoints + return [2 /*return*/, next()]; + } + return [2 /*return*/, withSession(request, function (err, session) { return logger.__awaiter(_this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + if (err) { + return [2 /*return*/, new Response(JSON.stringify(err), { + status: 500, + headers: { "Content-Type": "application/json" }, + })]; + } + response = next(); + if (session !== undefined) { + response.headers.append("x-user-id", session.getUserId()); + } + return [2 /*return*/, response]; + }); + }); })]; + } + if (requestUrl.pathname.startsWith("/auth") && + requestUrl.searchParams.get(constants.FORCE_LOGOUT_PATH_PARAM_NAME) === "true") { + return [2 /*return*/, revokeSession(config, request)]; + } + response = next(); + response.headers.append("set-cookie", "".concat(constants.CURRENT_PATH_COOKIE_NAME, "=").concat(requestUrl.pathname, "; Path=/; HttpOnly; SameSite=Strict")); + return [2 /*return*/, response]; + }); + }); }; +} +function refreshSession(config, request) { + return logger.__awaiter(this, void 0, void 0, function () { + var redirectAttemptNumber, requestUrl, redirectTo, tokens, hasRequiredCookies, redirectUrl, finalResponse, err_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + AppInfo = config.appInfo; + if (config.enableDebugLogs) { + logger.enableLogging(); + } + redirectAttemptNumber = getRedirectAttemptNumber(request); + if (redirectAttemptNumber > constants.REDIRECT_ATTEMPT_MAX_COUNT) { + return [2 /*return*/, redirectToAuthPage(request)]; + } + if (!getCookie(request, constants.REFRESH_TOKEN_COOKIE_NAME) && !request.headers.get(constants.REFRESH_TOKEN_HEADER_NAME)) { + logger.logDebugMessage("Refresh token not found"); + return [2 /*return*/, redirectToAuthPage(request)]; + } + requestUrl = new URL(request.url); + redirectTo = requestUrl.searchParams.get(constants.REDIRECT_PATH_PARAM_NAME) || "/"; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, fetchNewTokens(request)]; + case 2: + tokens = _a.sent(); + hasRequiredCookies = tokens.accessToken && tokens.refreshToken && tokens.frontToken; + if (!hasRequiredCookies) { + logger.logDebugMessage("Missing tokens from refresh response"); + return [2 /*return*/, redirectToAuthPage(request)]; + } + redirectUrl = new URL(redirectTo, request.url); + finalResponse = redirect(redirectUrl.toString()); + finalResponse.headers.append("set-cookie", tokens.accessToken); + finalResponse.headers.append("set-cookie", tokens.refreshToken); + finalResponse.headers.append("set-cookie", tokens.frontToken); + if (tokens.antiCsrfToken) { + finalResponse.headers.append("set-cookie", tokens.antiCsrfToken); + } + finalResponse.headers.append("set-cookie", "".concat(constants.REDIRECT_ATTEMPT_COUNT_COOKIE_NAME, "=").concat(redirectAttemptNumber + 1, "; Path=/; Max-Age=10; HttpOnly; SameSite=Strict")); + logger.logDebugMessage("Attached new tokens to response"); + return [2 /*return*/, finalResponse]; + case 3: + err_1 = _a.sent(); + logger.logDebugMessage("Error refreshing session"); + logger.logDebugMessage(err_1); + return [2 /*return*/, redirectToAuthPage(request)]; + case 4: return [2 /*return*/]; + } + }); + }); +} +function revokeSession(config, request) { + return logger.__awaiter(this, void 0, void 0, function () { + var response, accessToken, signOutURL, err_2; + var _a; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + AppInfo = config.appInfo; + if (config.enableDebugLogs) { + logger.enableLogging(); + } + response = new Response(null, {}); + _b.label = 1; + case 1: + _b.trys.push([1, 3, , 4]); + accessToken = getCookie(request, constants.ACCESS_TOKEN_COOKIE_NAME) || request.headers.get(constants.ACCESS_TOKEN_HEADER_NAME); + if (!accessToken) { + throw new Error("No access token found in the request"); + } + signOutURL = new URL("".concat(AppInfo.apiBasePath, "/signout"), AppInfo.apiDomain); + return [4 /*yield*/, fetch(signOutURL, { + method: "POST", + headers: (_a = { + "Content-Type": "application/json" + }, + _a[constants.ACCESS_TOKEN_HEADER_NAME] = accessToken, + _a.Cookie = "".concat(constants.ACCESS_TOKEN_COOKIE_NAME, "=").concat(accessToken), + _a), + credentials: "include", + })]; + case 2: + _b.sent(); + return [3 /*break*/, 4]; + case 3: + err_2 = _b.sent(); + logger.logDebugMessage("Error during the sign out attempt"); + logger.logDebugMessage(err_2); + return [3 /*break*/, 4]; + case 4: + response.headers.set("x-middleware-next", "1"); + response.headers.delete("set-cookie"); + response.headers.delete(constants.ACCESS_TOKEN_HEADER_NAME); + response.headers.delete(constants.REFRESH_TOKEN_HEADER_NAME); + response.headers.delete(constants.FRONT_TOKEN_HEADER_NAME); + response.headers.delete(constants.ANTI_CSRF_TOKEN_HEADER_NAME); + return [2 /*return*/, response]; + } + }); + }); +} +function redirectToAuthPage(request) { + var authPagePath = AppInfo.websiteBasePath || "/auth"; + var redirectUrl = new URL(authPagePath, request.url); + redirectUrl.searchParams.set(constants.FORCE_LOGOUT_PATH_PARAM_NAME, "true"); + return redirect(redirectUrl.toString()); +} +function redirect(location) { + logger.logDebugMessage("Redirecting to: ".concat(location)); + return new Response(null, { + status: 302, + headers: { + Location: location, + }, + }); +} +function next() { + var response = new Response(null, {}); + response.headers.set("x-middleware-next", "1"); + return response; +} +var MAX_REFRESH_ATTEMPTS = 3; +function fetchNewTokens(request, attemptNumber) { + if (attemptNumber === void 0) { attemptNumber = 1; } + return logger.__awaiter(this, void 0, void 0, function () { + var refreshApiURL, cookieRefreshToken, headerRefreshToken, refreshRequestHeaders, refreshResponse, frontTokenHeaderValue, cookieTokens, setCookieHeaders, _i, setCookieHeaders_1, header, accessTokenHeaderValue, refreshTokenHeaderValue, antiCsrfTokenHeaderValue; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + refreshApiURL = new URL("".concat(AppInfo.apiBasePath, "/session/refresh"), AppInfo.apiDomain); + cookieRefreshToken = getCookie(request, constants.REFRESH_TOKEN_COOKIE_NAME); + headerRefreshToken = request.headers.get(constants.REFRESH_TOKEN_HEADER_NAME); + refreshRequestHeaders = { + "Content-Type": "application/json", + }; + if (cookieRefreshToken) { + refreshRequestHeaders.Cookie = "".concat(constants.REFRESH_TOKEN_COOKIE_NAME, "=").concat(cookieRefreshToken); + } + else if (headerRefreshToken) { + refreshRequestHeaders[constants.REFRESH_TOKEN_HEADER_NAME] = headerRefreshToken; + } + return [4 /*yield*/, fetch(refreshApiURL, { + method: "POST", + headers: refreshRequestHeaders, + credentials: "include", + })]; + case 1: + refreshResponse = _a.sent(); + if (refreshResponse.status === 401 && attemptNumber <= MAX_REFRESH_ATTEMPTS) { + logger.logDebugMessage("Retrying the refresh request because of a 401 response. Attempt number ".concat(attemptNumber)); + return [2 /*return*/, fetchNewTokens(request, attemptNumber + 1)]; + } + if (refreshResponse.status !== 200) { + logger.logDebugMessage("Refresh request returned an invalid status code: ".concat(refreshResponse.status)); + return [2 /*return*/, { accessToken: "", refreshToken: "", frontToken: "", antiCsrfToken: "" }]; + } + logger.logDebugMessage("Session refresh request completed"); + frontTokenHeaderValue = refreshResponse.headers.get(constants.FRONT_TOKEN_HEADER_NAME); + cookieTokens = { + accessToken: "", + refreshToken: "", + frontToken: "".concat(constants.FRONT_TOKEN_COOKIE_NAME, "=").concat(frontTokenHeaderValue, "; Path=/"), + antiCsrfToken: "", + }; + setCookieHeaders = refreshResponse.headers.getSetCookie(); + for (_i = 0, setCookieHeaders_1 = setCookieHeaders; _i < setCookieHeaders_1.length; _i++) { + header = setCookieHeaders_1[_i]; + if (header.includes(constants.ACCESS_TOKEN_COOKIE_NAME)) { + cookieTokens.accessToken = header; + } + if (header.includes(constants.REFRESH_TOKEN_COOKIE_NAME)) { + cookieTokens.refreshToken = header; + } + if (header.includes(constants.ANTI_CSRF_TOKEN_COOKIE_NAME)) { + cookieTokens.antiCsrfToken = header; + } + } + accessTokenHeaderValue = refreshResponse.headers.get(constants.ACCESS_TOKEN_HEADER_NAME); + refreshTokenHeaderValue = refreshResponse.headers.get(constants.REFRESH_TOKEN_HEADER_NAME); + antiCsrfTokenHeaderValue = refreshResponse.headers.get(constants.ANTI_CSRF_TOKEN_HEADER_NAME); + if (!cookieTokens.accessToken) { + cookieTokens.accessToken = "".concat(constants.ACCESS_TOKEN_COOKIE_NAME, "=").concat(accessTokenHeaderValue, "; Path=/; HttpOnly; SameSite=Lax"); + } + if (!cookieTokens.refreshToken) { + cookieTokens.refreshToken = "".concat(constants.REFRESH_TOKEN_COOKIE_NAME, "=").concat(refreshTokenHeaderValue, "; Path=/api/auth/session/refresh; HttpOnly; SameSite=Lax"); + } + if (!cookieTokens.antiCsrfToken && antiCsrfTokenHeaderValue) { + cookieTokens.antiCsrfToken = "".concat(constants.ANTI_CSRF_TOKEN_COOKIE_NAME, "=").concat(antiCsrfTokenHeaderValue, "; Path=/; HttpOnly; SameSite=Lax"); + } + return [2 /*return*/, cookieTokens]; + } + }); + }); +} +function getCookie(request, name) { + var _a, _b; + return (_b = (_a = request.headers + .get("cookie")) === null || _a === void 0 ? void 0 : _a.split("; ").find(function (row) { return row.startsWith("".concat(name, "=")); })) === null || _b === void 0 ? void 0 : _b.split("=")[1]; +} +function getRedirectAttemptNumber(request) { + var cookieValue = getCookie(request, constants.REDIRECT_ATTEMPT_COUNT_COOKIE_NAME) || "1"; + try { + return parseInt(cookieValue); + } + catch (err) { + return 1; + } +} + +exports.refreshSession = refreshSession; +exports.revokeSession = revokeSession; +exports.superTokensMiddleware = superTokensMiddleware; diff --git a/lib/build/nextjsssr.js b/lib/build/nextjsssr.js new file mode 100644 index 000000000..ce7230835 --- /dev/null +++ b/lib/build/nextjsssr.js @@ -0,0 +1,1638 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var logger = require('./logger.js'); +var constants = require('./constants.js'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +function concat(...buffers) { + const size = buffers.reduce((acc, { length }) => acc + length, 0); + const buf = new Uint8Array(size); + let i = 0; + for (const buffer of buffers) { + buf.set(buffer, i); + i += buffer.length; + } + return buf; +} + +function decodeBase64(encoded) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(encoded); + } + const binary = atob(encoded); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; +} + +function decode(input) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(typeof input === 'string' ? input : decoder.decode(input), { + alphabet: 'base64url', + }); + } + let encoded = input; + if (encoded instanceof Uint8Array) { + encoded = decoder.decode(encoded); + } + encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\s/g, ''); + try { + return decodeBase64(encoded); + } + catch { + throw new TypeError('The input to be decoded is not correctly encoded.'); + } +} + +class JOSEError extends Error { + static code = 'ERR_JOSE_GENERIC'; + code = 'ERR_JOSE_GENERIC'; + constructor(message, options) { + super(message, options); + this.name = this.constructor.name; + Error.captureStackTrace?.(this, this.constructor); + } +} +class JWTClaimValidationFailed extends JOSEError { + static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED'; + code = 'ERR_JWT_CLAIM_VALIDATION_FAILED'; + claim; + reason; + payload; + constructor(message, payload, claim = 'unspecified', reason = 'unspecified') { + super(message, { cause: { claim, reason, payload } }); + this.claim = claim; + this.reason = reason; + this.payload = payload; + } +} +class JWTExpired extends JOSEError { + static code = 'ERR_JWT_EXPIRED'; + code = 'ERR_JWT_EXPIRED'; + claim; + reason; + payload; + constructor(message, payload, claim = 'unspecified', reason = 'unspecified') { + super(message, { cause: { claim, reason, payload } }); + this.claim = claim; + this.reason = reason; + this.payload = payload; + } +} +class JOSEAlgNotAllowed extends JOSEError { + static code = 'ERR_JOSE_ALG_NOT_ALLOWED'; + code = 'ERR_JOSE_ALG_NOT_ALLOWED'; +} +class JOSENotSupported extends JOSEError { + static code = 'ERR_JOSE_NOT_SUPPORTED'; + code = 'ERR_JOSE_NOT_SUPPORTED'; +} +class JWSInvalid extends JOSEError { + static code = 'ERR_JWS_INVALID'; + code = 'ERR_JWS_INVALID'; +} +class JWTInvalid extends JOSEError { + static code = 'ERR_JWT_INVALID'; + code = 'ERR_JWT_INVALID'; +} +class JWKSInvalid extends JOSEError { + static code = 'ERR_JWKS_INVALID'; + code = 'ERR_JWKS_INVALID'; +} +class JWKSNoMatchingKey extends JOSEError { + static code = 'ERR_JWKS_NO_MATCHING_KEY'; + code = 'ERR_JWKS_NO_MATCHING_KEY'; + constructor(message = 'no applicable key found in the JSON Web Key Set', options) { + super(message, options); + } +} +class JWKSMultipleMatchingKeys extends JOSEError { + [Symbol.asyncIterator]; + static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS'; + code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS'; + constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) { + super(message, options); + } +} +class JWKSTimeout extends JOSEError { + static code = 'ERR_JWKS_TIMEOUT'; + code = 'ERR_JWKS_TIMEOUT'; + constructor(message = 'request timed out', options) { + super(message, options); + } +} +class JWSSignatureVerificationFailed extends JOSEError { + static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED'; + code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED'; + constructor(message = 'signature verification failed', options) { + super(message, options); + } +} + +function unusable(name, prop = 'algorithm.name') { + return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`); +} +function isAlgorithm(algorithm, name) { + return algorithm.name === name; +} +function getHashLength(hash) { + return parseInt(hash.name.slice(4), 10); +} +function getNamedCurve(alg) { + switch (alg) { + case 'ES256': + return 'P-256'; + case 'ES384': + return 'P-384'; + case 'ES512': + return 'P-521'; + default: + throw new Error('unreachable'); + } +} +function checkUsage(key, usage) { + if (usage && !key.usages.includes(usage)) { + throw new TypeError(`CryptoKey does not support this operation, its usages must include ${usage}.`); + } +} +function checkSigCryptoKey(key, alg, usage) { + switch (alg) { + case 'HS256': + case 'HS384': + case 'HS512': { + if (!isAlgorithm(key.algorithm, 'HMAC')) + throw unusable('HMAC'); + const expected = parseInt(alg.slice(2), 10); + const actual = getHashLength(key.algorithm.hash); + if (actual !== expected) + throw unusable(`SHA-${expected}`, 'algorithm.hash'); + break; + } + case 'RS256': + case 'RS384': + case 'RS512': { + if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5')) + throw unusable('RSASSA-PKCS1-v1_5'); + const expected = parseInt(alg.slice(2), 10); + const actual = getHashLength(key.algorithm.hash); + if (actual !== expected) + throw unusable(`SHA-${expected}`, 'algorithm.hash'); + break; + } + case 'PS256': + case 'PS384': + case 'PS512': { + if (!isAlgorithm(key.algorithm, 'RSA-PSS')) + throw unusable('RSA-PSS'); + const expected = parseInt(alg.slice(2), 10); + const actual = getHashLength(key.algorithm.hash); + if (actual !== expected) + throw unusable(`SHA-${expected}`, 'algorithm.hash'); + break; + } + case 'Ed25519': + case 'EdDSA': { + if (!isAlgorithm(key.algorithm, 'Ed25519')) + throw unusable('Ed25519'); + break; + } + case 'ES256': + case 'ES384': + case 'ES512': { + if (!isAlgorithm(key.algorithm, 'ECDSA')) + throw unusable('ECDSA'); + const expected = getNamedCurve(alg); + const actual = key.algorithm.namedCurve; + if (actual !== expected) + throw unusable(expected, 'algorithm.namedCurve'); + break; + } + default: + throw new TypeError('CryptoKey does not support this operation'); + } + checkUsage(key, usage); +} + +function message(msg, actual, ...types) { + types = types.filter(Boolean); + if (types.length > 2) { + const last = types.pop(); + msg += `one of type ${types.join(', ')}, or ${last}.`; + } + else if (types.length === 2) { + msg += `one of type ${types[0]} or ${types[1]}.`; + } + else { + msg += `of type ${types[0]}.`; + } + if (actual == null) { + msg += ` Received ${actual}`; + } + else if (typeof actual === 'function' && actual.name) { + msg += ` Received function ${actual.name}`; + } + else if (typeof actual === 'object' && actual != null) { + if (actual.constructor?.name) { + msg += ` Received an instance of ${actual.constructor.name}`; + } + } + return msg; +} +var invalidKeyInput = (actual, ...types) => { + return message('Key must be ', actual, ...types); +}; +function withAlg(alg, actual, ...types) { + return message(`Key for the ${alg} algorithm must be `, actual, ...types); +} + +function isCryptoKey(key) { + return key?.[Symbol.toStringTag] === 'CryptoKey'; +} +function isKeyObject(key) { + return key?.[Symbol.toStringTag] === 'KeyObject'; +} +var isKeyLike = (key) => { + return isCryptoKey(key) || isKeyObject(key); +}; + +var isDisjoint = (...headers) => { + const sources = headers.filter(Boolean); + if (sources.length === 0 || sources.length === 1) { + return true; + } + let acc; + for (const header of sources) { + const parameters = Object.keys(header); + if (!acc || acc.size === 0) { + acc = new Set(parameters); + continue; + } + for (const parameter of parameters) { + if (acc.has(parameter)) { + return false; + } + acc.add(parameter); + } + } + return true; +}; + +function isObjectLike(value) { + return typeof value === 'object' && value !== null; +} +var isObject = (input) => { + if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') { + return false; + } + if (Object.getPrototypeOf(input) === null) { + return true; + } + let proto = input; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + return Object.getPrototypeOf(input) === proto; +}; + +var checkKeyLength = (alg, key) => { + if (alg.startsWith('RS') || alg.startsWith('PS')) { + const { modulusLength } = key.algorithm; + if (typeof modulusLength !== 'number' || modulusLength < 2048) { + throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`); + } + } +}; + +function subtleMapping(jwk) { + let algorithm; + let keyUsages; + switch (jwk.kty) { + case 'RSA': { + switch (jwk.alg) { + case 'PS256': + case 'PS384': + case 'PS512': + algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` }; + keyUsages = jwk.d ? ['sign'] : ['verify']; + break; + case 'RS256': + case 'RS384': + case 'RS512': + algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` }; + keyUsages = jwk.d ? ['sign'] : ['verify']; + break; + case 'RSA-OAEP': + case 'RSA-OAEP-256': + case 'RSA-OAEP-384': + case 'RSA-OAEP-512': + algorithm = { + name: 'RSA-OAEP', + hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`, + }; + keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey']; + break; + default: + throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value'); + } + break; + } + case 'EC': { + switch (jwk.alg) { + case 'ES256': + algorithm = { name: 'ECDSA', namedCurve: 'P-256' }; + keyUsages = jwk.d ? ['sign'] : ['verify']; + break; + case 'ES384': + algorithm = { name: 'ECDSA', namedCurve: 'P-384' }; + keyUsages = jwk.d ? ['sign'] : ['verify']; + break; + case 'ES512': + algorithm = { name: 'ECDSA', namedCurve: 'P-521' }; + keyUsages = jwk.d ? ['sign'] : ['verify']; + break; + case 'ECDH-ES': + case 'ECDH-ES+A128KW': + case 'ECDH-ES+A192KW': + case 'ECDH-ES+A256KW': + algorithm = { name: 'ECDH', namedCurve: jwk.crv }; + keyUsages = jwk.d ? ['deriveBits'] : []; + break; + default: + throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value'); + } + break; + } + case 'OKP': { + switch (jwk.alg) { + case 'Ed25519': + case 'EdDSA': + algorithm = { name: 'Ed25519' }; + keyUsages = jwk.d ? ['sign'] : ['verify']; + break; + case 'ECDH-ES': + case 'ECDH-ES+A128KW': + case 'ECDH-ES+A192KW': + case 'ECDH-ES+A256KW': + algorithm = { name: jwk.crv }; + keyUsages = jwk.d ? ['deriveBits'] : []; + break; + default: + throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value'); + } + break; + } + default: + throw new JOSENotSupported('Invalid or unsupported JWK "kty" (Key Type) Parameter value'); + } + return { algorithm, keyUsages }; +} +var importJWK$1 = async (jwk) => { + if (!jwk.alg) { + throw new TypeError('"alg" argument is required when "jwk.alg" is not present'); + } + const { algorithm, keyUsages } = subtleMapping(jwk); + const keyData = { ...jwk }; + delete keyData.alg; + delete keyData.use; + return crypto.subtle.importKey('jwk', keyData, algorithm, jwk.ext ?? (jwk.d ? false : true), jwk.key_ops ?? keyUsages); +}; + +async function importJWK(jwk, alg, options) { + if (!isObject(jwk)) { + throw new TypeError('JWK must be an object'); + } + let ext; + alg ??= jwk.alg; + ext ??= options?.extractable ?? jwk.ext; + switch (jwk.kty) { + case 'oct': + if (typeof jwk.k !== 'string' || !jwk.k) { + throw new TypeError('missing "k" (Key Value) Parameter value'); + } + return decode(jwk.k); + case 'RSA': + if ('oth' in jwk && jwk.oth !== undefined) { + throw new JOSENotSupported('RSA JWK "oth" (Other Primes Info) Parameter value is not supported'); + } + case 'EC': + case 'OKP': + return importJWK$1({ ...jwk, alg, ext }); + default: + throw new JOSENotSupported('Unsupported "kty" (Key Type) Parameter value'); + } +} + +var validateCrit = (Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) => { + if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) { + throw new Err('"crit" (Critical) Header Parameter MUST be integrity protected'); + } + if (!protectedHeader || protectedHeader.crit === undefined) { + return new Set(); + } + if (!Array.isArray(protectedHeader.crit) || + protectedHeader.crit.length === 0 || + protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) { + throw new Err('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present'); + } + let recognized; + if (recognizedOption !== undefined) { + recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]); + } + else { + recognized = recognizedDefault; + } + for (const parameter of protectedHeader.crit) { + if (!recognized.has(parameter)) { + throw new JOSENotSupported(`Extension Header Parameter "${parameter}" is not recognized`); + } + if (joseHeader[parameter] === undefined) { + throw new Err(`Extension Header Parameter "${parameter}" is missing`); + } + if (recognized.get(parameter) && protectedHeader[parameter] === undefined) { + throw new Err(`Extension Header Parameter "${parameter}" MUST be integrity protected`); + } + } + return new Set(protectedHeader.crit); +}; + +var validateAlgorithms = (option, algorithms) => { + if (algorithms !== undefined && + (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) { + throw new TypeError(`"${option}" option must be an array of strings`); + } + if (!algorithms) { + return undefined; + } + return new Set(algorithms); +}; + +function isJWK(key) { + return isObject(key) && typeof key.kty === 'string'; +} +function isPrivateJWK(key) { + return key.kty !== 'oct' && typeof key.d === 'string'; +} +function isPublicJWK(key) { + return key.kty !== 'oct' && typeof key.d === 'undefined'; +} +function isSecretJWK(key) { + return key.kty === 'oct' && typeof key.k === 'string'; +} + +let cache; +const handleJWK = async (key, jwk, alg, freeze = false) => { + cache ||= new WeakMap(); + let cached = cache.get(key); + if (cached?.[alg]) { + return cached[alg]; + } + const cryptoKey = await importJWK$1({ ...jwk, alg }); + if (freeze) + Object.freeze(key); + if (!cached) { + cache.set(key, { [alg]: cryptoKey }); + } + else { + cached[alg] = cryptoKey; + } + return cryptoKey; +}; +const handleKeyObject = (keyObject, alg) => { + cache ||= new WeakMap(); + let cached = cache.get(keyObject); + if (cached?.[alg]) { + return cached[alg]; + } + const isPublic = keyObject.type === 'public'; + const extractable = isPublic ? true : false; + let cryptoKey; + if (keyObject.asymmetricKeyType === 'x25519') { + switch (alg) { + case 'ECDH-ES': + case 'ECDH-ES+A128KW': + case 'ECDH-ES+A192KW': + case 'ECDH-ES+A256KW': + break; + default: + throw new TypeError('given KeyObject instance cannot be used for this algorithm'); + } + cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ['deriveBits']); + } + if (keyObject.asymmetricKeyType === 'ed25519') { + if (alg !== 'EdDSA' && alg !== 'Ed25519') { + throw new TypeError('given KeyObject instance cannot be used for this algorithm'); + } + cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [ + isPublic ? 'verify' : 'sign', + ]); + } + if (keyObject.asymmetricKeyType === 'rsa') { + let hash; + switch (alg) { + case 'RSA-OAEP': + hash = 'SHA-1'; + break; + case 'RS256': + case 'PS256': + case 'RSA-OAEP-256': + hash = 'SHA-256'; + break; + case 'RS384': + case 'PS384': + case 'RSA-OAEP-384': + hash = 'SHA-384'; + break; + case 'RS512': + case 'PS512': + case 'RSA-OAEP-512': + hash = 'SHA-512'; + break; + default: + throw new TypeError('given KeyObject instance cannot be used for this algorithm'); + } + if (alg.startsWith('RSA-OAEP')) { + return keyObject.toCryptoKey({ + name: 'RSA-OAEP', + hash, + }, extractable, isPublic ? ['encrypt'] : ['decrypt']); + } + cryptoKey = keyObject.toCryptoKey({ + name: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5', + hash, + }, extractable, [isPublic ? 'verify' : 'sign']); + } + if (keyObject.asymmetricKeyType === 'ec') { + const nist = new Map([ + ['prime256v1', 'P-256'], + ['secp384r1', 'P-384'], + ['secp521r1', 'P-521'], + ]); + const namedCurve = nist.get(keyObject.asymmetricKeyDetails?.namedCurve); + if (!namedCurve) { + throw new TypeError('given KeyObject instance cannot be used for this algorithm'); + } + if (alg === 'ES256' && namedCurve === 'P-256') { + cryptoKey = keyObject.toCryptoKey({ + name: 'ECDSA', + namedCurve, + }, extractable, [isPublic ? 'verify' : 'sign']); + } + if (alg === 'ES384' && namedCurve === 'P-384') { + cryptoKey = keyObject.toCryptoKey({ + name: 'ECDSA', + namedCurve, + }, extractable, [isPublic ? 'verify' : 'sign']); + } + if (alg === 'ES512' && namedCurve === 'P-521') { + cryptoKey = keyObject.toCryptoKey({ + name: 'ECDSA', + namedCurve, + }, extractable, [isPublic ? 'verify' : 'sign']); + } + if (alg.startsWith('ECDH-ES')) { + cryptoKey = keyObject.toCryptoKey({ + name: 'ECDH', + namedCurve, + }, extractable, isPublic ? [] : ['deriveBits']); + } + } + if (!cryptoKey) { + throw new TypeError('given KeyObject instance cannot be used for this algorithm'); + } + if (!cached) { + cache.set(keyObject, { [alg]: cryptoKey }); + } + else { + cached[alg] = cryptoKey; + } + return cryptoKey; +}; +var normalizeKey = async (key, alg) => { + if (key instanceof Uint8Array) { + return key; + } + if (isCryptoKey(key)) { + return key; + } + if (isKeyObject(key)) { + if (key.type === 'secret') { + return key.export(); + } + if ('toCryptoKey' in key && typeof key.toCryptoKey === 'function') { + try { + return handleKeyObject(key, alg); + } + catch (err) { + if (err instanceof TypeError) { + throw err; + } + } + } + let jwk = key.export({ format: 'jwk' }); + return handleJWK(key, jwk, alg); + } + if (isJWK(key)) { + if (key.k) { + return decode(key.k); + } + return handleJWK(key, key, alg, true); + } + throw new Error('unreachable'); +}; + +const tag = (key) => key?.[Symbol.toStringTag]; +const jwkMatchesOp = (alg, key, usage) => { + if (key.use !== undefined) { + let expected; + switch (usage) { + case 'sign': + case 'verify': + expected = 'sig'; + break; + case 'encrypt': + case 'decrypt': + expected = 'enc'; + break; + } + if (key.use !== expected) { + throw new TypeError(`Invalid key for this operation, its "use" must be "${expected}" when present`); + } + } + if (key.alg !== undefined && key.alg !== alg) { + throw new TypeError(`Invalid key for this operation, its "alg" must be "${alg}" when present`); + } + if (Array.isArray(key.key_ops)) { + let expectedKeyOp; + switch (true) { + case usage === 'sign' || usage === 'verify': + case alg === 'dir': + case alg.includes('CBC-HS'): + expectedKeyOp = usage; + break; + case alg.startsWith('PBES2'): + expectedKeyOp = 'deriveBits'; + break; + case /^A\d{3}(?:GCM)?(?:KW)?$/.test(alg): + if (!alg.includes('GCM') && alg.endsWith('KW')) { + expectedKeyOp = usage === 'encrypt' ? 'wrapKey' : 'unwrapKey'; + } + else { + expectedKeyOp = usage; + } + break; + case usage === 'encrypt' && alg.startsWith('RSA'): + expectedKeyOp = 'wrapKey'; + break; + case usage === 'decrypt': + expectedKeyOp = alg.startsWith('RSA') ? 'unwrapKey' : 'deriveBits'; + break; + } + if (expectedKeyOp && key.key_ops?.includes?.(expectedKeyOp) === false) { + throw new TypeError(`Invalid key for this operation, its "key_ops" must include "${expectedKeyOp}" when present`); + } + } + return true; +}; +const symmetricTypeCheck = (alg, key, usage) => { + if (key instanceof Uint8Array) + return; + if (isJWK(key)) { + if (isSecretJWK(key) && jwkMatchesOp(alg, key, usage)) + return; + throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK "kty" (Key Type) equal to "oct" and the JWK "k" (Key Value) present`); + } + if (!isKeyLike(key)) { + throw new TypeError(withAlg(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key', 'Uint8Array')); + } + if (key.type !== 'secret') { + throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type "secret"`); + } +}; +const asymmetricTypeCheck = (alg, key, usage) => { + if (isJWK(key)) { + switch (usage) { + case 'decrypt': + case 'sign': + if (isPrivateJWK(key) && jwkMatchesOp(alg, key, usage)) + return; + throw new TypeError(`JSON Web Key for this operation be a private JWK`); + case 'encrypt': + case 'verify': + if (isPublicJWK(key) && jwkMatchesOp(alg, key, usage)) + return; + throw new TypeError(`JSON Web Key for this operation be a public JWK`); + } + } + if (!isKeyLike(key)) { + throw new TypeError(withAlg(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key')); + } + if (key.type === 'secret') { + throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type "secret"`); + } + if (key.type === 'public') { + switch (usage) { + case 'sign': + throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type "private"`); + case 'decrypt': + throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type "private"`); + } + } + if (key.type === 'private') { + switch (usage) { + case 'verify': + throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type "public"`); + case 'encrypt': + throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type "public"`); + } + } +}; +var checkKeyType = (alg, key, usage) => { + const symmetric = alg.startsWith('HS') || + alg === 'dir' || + alg.startsWith('PBES2') || + /^A(?:128|192|256)(?:GCM)?(?:KW)?$/.test(alg) || + /^A(?:128|192|256)CBC-HS(?:256|384|512)$/.test(alg); + if (symmetric) { + symmetricTypeCheck(alg, key, usage); + } + else { + asymmetricTypeCheck(alg, key, usage); + } +}; + +var subtleAlgorithm = (alg, algorithm) => { + const hash = `SHA-${alg.slice(-3)}`; + switch (alg) { + case 'HS256': + case 'HS384': + case 'HS512': + return { hash, name: 'HMAC' }; + case 'PS256': + case 'PS384': + case 'PS512': + return { hash, name: 'RSA-PSS', saltLength: parseInt(alg.slice(-3), 10) >> 3 }; + case 'RS256': + case 'RS384': + case 'RS512': + return { hash, name: 'RSASSA-PKCS1-v1_5' }; + case 'ES256': + case 'ES384': + case 'ES512': + return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve }; + case 'Ed25519': + case 'EdDSA': + return { name: 'Ed25519' }; + default: + throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`); + } +}; + +var getSignKey = async (alg, key, usage) => { + if (key instanceof Uint8Array) { + if (!alg.startsWith('HS')) { + throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key')); + } + return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]); + } + checkSigCryptoKey(key, alg, usage); + return key; +}; + +var verify = async (alg, key, signature, data) => { + const cryptoKey = await getSignKey(alg, key, 'verify'); + checkKeyLength(alg, cryptoKey); + const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm); + try { + return await crypto.subtle.verify(algorithm, cryptoKey, signature, data); + } + catch { + return false; + } +}; + +async function flattenedVerify(jws, key, options) { + if (!isObject(jws)) { + throw new JWSInvalid('Flattened JWS must be an object'); + } + if (jws.protected === undefined && jws.header === undefined) { + throw new JWSInvalid('Flattened JWS must have either of the "protected" or "header" members'); + } + if (jws.protected !== undefined && typeof jws.protected !== 'string') { + throw new JWSInvalid('JWS Protected Header incorrect type'); + } + if (jws.payload === undefined) { + throw new JWSInvalid('JWS Payload missing'); + } + if (typeof jws.signature !== 'string') { + throw new JWSInvalid('JWS Signature missing or incorrect type'); + } + if (jws.header !== undefined && !isObject(jws.header)) { + throw new JWSInvalid('JWS Unprotected Header incorrect type'); + } + let parsedProt = {}; + if (jws.protected) { + try { + const protectedHeader = decode(jws.protected); + parsedProt = JSON.parse(decoder.decode(protectedHeader)); + } + catch { + throw new JWSInvalid('JWS Protected Header is invalid'); + } + } + if (!isDisjoint(parsedProt, jws.header)) { + throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint'); + } + const joseHeader = { + ...parsedProt, + ...jws.header, + }; + const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader); + let b64 = true; + if (extensions.has('b64')) { + b64 = parsedProt.b64; + if (typeof b64 !== 'boolean') { + throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean'); + } + } + const { alg } = joseHeader; + if (typeof alg !== 'string' || !alg) { + throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid'); + } + const algorithms = options && validateAlgorithms('algorithms', options.algorithms); + if (algorithms && !algorithms.has(alg)) { + throw new JOSEAlgNotAllowed('"alg" (Algorithm) Header Parameter value not allowed'); + } + if (b64) { + if (typeof jws.payload !== 'string') { + throw new JWSInvalid('JWS Payload must be a string'); + } + } + else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) { + throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance'); + } + let resolvedKey = false; + if (typeof key === 'function') { + key = await key(parsedProt, jws); + resolvedKey = true; + } + checkKeyType(alg, key, 'verify'); + const data = concat(encoder.encode(jws.protected ?? ''), encoder.encode('.'), typeof jws.payload === 'string' ? encoder.encode(jws.payload) : jws.payload); + let signature; + try { + signature = decode(jws.signature); + } + catch { + throw new JWSInvalid('Failed to base64url decode the signature'); + } + const k = await normalizeKey(key, alg); + const verified = await verify(alg, k, signature, data); + if (!verified) { + throw new JWSSignatureVerificationFailed(); + } + let payload; + if (b64) { + try { + payload = decode(jws.payload); + } + catch { + throw new JWSInvalid('Failed to base64url decode the payload'); + } + } + else if (typeof jws.payload === 'string') { + payload = encoder.encode(jws.payload); + } + else { + payload = jws.payload; + } + const result = { payload }; + if (jws.protected !== undefined) { + result.protectedHeader = parsedProt; + } + if (jws.header !== undefined) { + result.unprotectedHeader = jws.header; + } + if (resolvedKey) { + return { ...result, key: k }; + } + return result; +} + +async function compactVerify(jws, key, options) { + if (jws instanceof Uint8Array) { + jws = decoder.decode(jws); + } + if (typeof jws !== 'string') { + throw new JWSInvalid('Compact JWS must be a string or Uint8Array'); + } + const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.'); + if (length !== 3) { + throw new JWSInvalid('Invalid Compact JWS'); + } + const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options); + const result = { payload: verified.payload, protectedHeader: verified.protectedHeader }; + if (typeof key === 'function') { + return { ...result, key: verified.key }; + } + return result; +} + +var epoch = (date) => Math.floor(date.getTime() / 1000); + +const minute = 60; +const hour = minute * 60; +const day = hour * 24; +const week = day * 7; +const year = day * 365.25; +const REGEX = /^(\+|\-)? ?(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i; +var secs = (str) => { + const matched = REGEX.exec(str); + if (!matched || (matched[4] && matched[1])) { + throw new TypeError('Invalid time period format'); + } + const value = parseFloat(matched[2]); + const unit = matched[3].toLowerCase(); + let numericDate; + switch (unit) { + case 'sec': + case 'secs': + case 'second': + case 'seconds': + case 's': + numericDate = Math.round(value); + break; + case 'minute': + case 'minutes': + case 'min': + case 'mins': + case 'm': + numericDate = Math.round(value * minute); + break; + case 'hour': + case 'hours': + case 'hr': + case 'hrs': + case 'h': + numericDate = Math.round(value * hour); + break; + case 'day': + case 'days': + case 'd': + numericDate = Math.round(value * day); + break; + case 'week': + case 'weeks': + case 'w': + numericDate = Math.round(value * week); + break; + default: + numericDate = Math.round(value * year); + break; + } + if (matched[1] === '-' || matched[4] === 'ago') { + return -numericDate; + } + return numericDate; +}; + +const normalizeTyp = (value) => value.toLowerCase().replace(/^application\//, ''); +const checkAudiencePresence = (audPayload, audOption) => { + if (typeof audPayload === 'string') { + return audOption.includes(audPayload); + } + if (Array.isArray(audPayload)) { + return audOption.some(Set.prototype.has.bind(new Set(audPayload))); + } + return false; +}; +var jwtPayload = (protectedHeader, encodedPayload, options = {}) => { + let payload; + try { + payload = JSON.parse(decoder.decode(encodedPayload)); + } + catch { + } + if (!isObject(payload)) { + throw new JWTInvalid('JWT Claims Set must be a top-level JSON object'); + } + const { typ } = options; + if (typ && + (typeof protectedHeader.typ !== 'string' || + normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) { + throw new JWTClaimValidationFailed('unexpected "typ" JWT header value', payload, 'typ', 'check_failed'); + } + const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options; + const presenceCheck = [...requiredClaims]; + if (maxTokenAge !== undefined) + presenceCheck.push('iat'); + if (audience !== undefined) + presenceCheck.push('aud'); + if (subject !== undefined) + presenceCheck.push('sub'); + if (issuer !== undefined) + presenceCheck.push('iss'); + for (const claim of new Set(presenceCheck.reverse())) { + if (!(claim in payload)) { + throw new JWTClaimValidationFailed(`missing required "${claim}" claim`, payload, claim, 'missing'); + } + } + if (issuer && + !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) { + throw new JWTClaimValidationFailed('unexpected "iss" claim value', payload, 'iss', 'check_failed'); + } + if (subject && payload.sub !== subject) { + throw new JWTClaimValidationFailed('unexpected "sub" claim value', payload, 'sub', 'check_failed'); + } + if (audience && + !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) { + throw new JWTClaimValidationFailed('unexpected "aud" claim value', payload, 'aud', 'check_failed'); + } + let tolerance; + switch (typeof options.clockTolerance) { + case 'string': + tolerance = secs(options.clockTolerance); + break; + case 'number': + tolerance = options.clockTolerance; + break; + case 'undefined': + tolerance = 0; + break; + default: + throw new TypeError('Invalid clockTolerance option type'); + } + const { currentDate } = options; + const now = epoch(currentDate || new Date()); + if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') { + throw new JWTClaimValidationFailed('"iat" claim must be a number', payload, 'iat', 'invalid'); + } + if (payload.nbf !== undefined) { + if (typeof payload.nbf !== 'number') { + throw new JWTClaimValidationFailed('"nbf" claim must be a number', payload, 'nbf', 'invalid'); + } + if (payload.nbf > now + tolerance) { + throw new JWTClaimValidationFailed('"nbf" claim timestamp check failed', payload, 'nbf', 'check_failed'); + } + } + if (payload.exp !== undefined) { + if (typeof payload.exp !== 'number') { + throw new JWTClaimValidationFailed('"exp" claim must be a number', payload, 'exp', 'invalid'); + } + if (payload.exp <= now - tolerance) { + throw new JWTExpired('"exp" claim timestamp check failed', payload, 'exp', 'check_failed'); + } + } + if (maxTokenAge) { + const age = now - payload.iat; + const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge); + if (age - tolerance > max) { + throw new JWTExpired('"iat" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed'); + } + if (age < 0 - tolerance) { + throw new JWTClaimValidationFailed('"iat" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed'); + } + } + return payload; +}; + +async function jwtVerify(jwt, key, options) { + const verified = await compactVerify(jwt, key, options); + if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) { + throw new JWTInvalid('JWTs MUST NOT use unencoded payload'); + } + const payload = jwtPayload(verified.protectedHeader, verified.payload, options); + const result = { payload, protectedHeader: verified.protectedHeader }; + if (typeof key === 'function') { + return { ...result, key: verified.key }; + } + return result; +} + +function getKtyFromAlg(alg) { + switch (typeof alg === 'string' && alg.slice(0, 2)) { + case 'RS': + case 'PS': + return 'RSA'; + case 'ES': + return 'EC'; + case 'Ed': + return 'OKP'; + default: + throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set'); + } +} +function isJWKSLike(jwks) { + return (jwks && + typeof jwks === 'object' && + Array.isArray(jwks.keys) && + jwks.keys.every(isJWKLike)); +} +function isJWKLike(key) { + return isObject(key); +} +function clone(obj) { + if (typeof structuredClone === 'function') { + return structuredClone(obj); + } + return JSON.parse(JSON.stringify(obj)); +} +class LocalJWKSet { + _jwks; + _cached = new WeakMap(); + constructor(jwks) { + if (!isJWKSLike(jwks)) { + throw new JWKSInvalid('JSON Web Key Set malformed'); + } + this._jwks = clone(jwks); + } + async getKey(protectedHeader, token) { + const { alg, kid } = { ...protectedHeader, ...token?.header }; + const kty = getKtyFromAlg(alg); + const candidates = this._jwks.keys.filter((jwk) => { + let candidate = kty === jwk.kty; + if (candidate && typeof kid === 'string') { + candidate = kid === jwk.kid; + } + if (candidate && typeof jwk.alg === 'string') { + candidate = alg === jwk.alg; + } + if (candidate && typeof jwk.use === 'string') { + candidate = jwk.use === 'sig'; + } + if (candidate && Array.isArray(jwk.key_ops)) { + candidate = jwk.key_ops.includes('verify'); + } + if (candidate) { + switch (alg) { + case 'ES256': + candidate = jwk.crv === 'P-256'; + break; + case 'ES384': + candidate = jwk.crv === 'P-384'; + break; + case 'ES512': + candidate = jwk.crv === 'P-521'; + break; + case 'Ed25519': + case 'EdDSA': + candidate = jwk.crv === 'Ed25519'; + break; + } + } + return candidate; + }); + const { 0: jwk, length } = candidates; + if (length === 0) { + throw new JWKSNoMatchingKey(); + } + if (length !== 1) { + const error = new JWKSMultipleMatchingKeys(); + const { _cached } = this; + error[Symbol.asyncIterator] = async function* () { + for (const jwk of candidates) { + try { + yield await importWithAlgCache(_cached, jwk, alg); + } + catch { } + } + }; + throw error; + } + return importWithAlgCache(this._cached, jwk, alg); + } +} +async function importWithAlgCache(cache, jwk, alg) { + const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk); + if (cached[alg] === undefined) { + const key = await importJWK({ ...jwk, ext: true }, alg); + if (key instanceof Uint8Array || key.type !== 'public') { + throw new JWKSInvalid('JSON Web Key Set members must be public keys'); + } + cached[alg] = key; + } + return cached[alg]; +} +function createLocalJWKSet(jwks) { + const set = new LocalJWKSet(jwks); + const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token); + Object.defineProperties(localJWKSet, { + jwks: { + value: () => clone(set._jwks), + enumerable: true, + configurable: false, + writable: false, + }, + }); + return localJWKSet; +} + +function isCloudflareWorkers() { + return (typeof WebSocketPair !== 'undefined' || + (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') || + (typeof EdgeRuntime !== 'undefined' && EdgeRuntime === 'vercel')); +} +let USER_AGENT; +if (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) { + const NAME = 'jose'; + const VERSION = 'v6.0.8'; + USER_AGENT = `${NAME}/${VERSION}`; +} +const customFetch = Symbol(); +async function fetchJwks(url, headers, signal, fetchImpl = fetch) { + const response = await fetchImpl(url, { + method: 'GET', + signal, + redirect: 'manual', + headers, + }).catch((err) => { + if (err.name === 'TimeoutError') { + throw new JWKSTimeout(); + } + throw err; + }); + if (response.status !== 200) { + throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response'); + } + try { + return await response.json(); + } + catch { + throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON'); + } +} +const jwksCache = Symbol(); +function isFreshJwksCache(input, cacheMaxAge) { + if (typeof input !== 'object' || input === null) { + return false; + } + if (!('uat' in input) || typeof input.uat !== 'number' || Date.now() - input.uat >= cacheMaxAge) { + return false; + } + if (!('jwks' in input) || + !isObject(input.jwks) || + !Array.isArray(input.jwks.keys) || + !Array.prototype.every.call(input.jwks.keys, isObject)) { + return false; + } + return true; +} +class RemoteJWKSet { + _url; + _timeoutDuration; + _cooldownDuration; + _cacheMaxAge; + _jwksTimestamp; + _pendingFetch; + _headers; + [customFetch]; + _local; + _cache; + constructor(url, options) { + if (!(url instanceof URL)) { + throw new TypeError('url must be an instance of URL'); + } + this._url = new URL(url.href); + this._timeoutDuration = + typeof options?.timeoutDuration === 'number' ? options?.timeoutDuration : 5000; + this._cooldownDuration = + typeof options?.cooldownDuration === 'number' ? options?.cooldownDuration : 30000; + this._cacheMaxAge = typeof options?.cacheMaxAge === 'number' ? options?.cacheMaxAge : 600000; + this._headers = new Headers(options?.headers); + if (USER_AGENT && !this._headers.has('User-Agent')) { + this._headers.set('User-Agent', USER_AGENT); + } + if (!this._headers.has('accept')) { + this._headers.set('accept', 'application/json'); + this._headers.append('accept', 'application/jwk-set+json'); + } + this[customFetch] = options?.[customFetch]; + if (options?.[jwksCache] !== undefined) { + this._cache = options?.[jwksCache]; + if (isFreshJwksCache(options?.[jwksCache], this._cacheMaxAge)) { + this._jwksTimestamp = this._cache.uat; + this._local = createLocalJWKSet(this._cache.jwks); + } + } + } + coolingDown() { + return typeof this._jwksTimestamp === 'number' + ? Date.now() < this._jwksTimestamp + this._cooldownDuration + : false; + } + fresh() { + return typeof this._jwksTimestamp === 'number' + ? Date.now() < this._jwksTimestamp + this._cacheMaxAge + : false; + } + async getKey(protectedHeader, token) { + if (!this._local || !this.fresh()) { + await this.reload(); + } + try { + return await this._local(protectedHeader, token); + } + catch (err) { + if (err instanceof JWKSNoMatchingKey) { + if (this.coolingDown() === false) { + await this.reload(); + return this._local(protectedHeader, token); + } + } + throw err; + } + } + async reload() { + if (this._pendingFetch && isCloudflareWorkers()) { + this._pendingFetch = undefined; + } + this._pendingFetch ||= fetchJwks(this._url.href, this._headers, AbortSignal.timeout(this._timeoutDuration), this[customFetch]) + .then((json) => { + this._local = createLocalJWKSet(json); + if (this._cache) { + this._cache.uat = Date.now(); + this._cache.jwks = json; + } + this._jwksTimestamp = Date.now(); + this._pendingFetch = undefined; + }) + .catch((err) => { + this._pendingFetch = undefined; + throw err; + }); + await this._pendingFetch; + } +} +function createRemoteJWKSet(url, options) { + const set = new RemoteJWKSet(url, options); + const remoteJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token); + Object.defineProperties(remoteJWKSet, { + coolingDown: { + get: () => set.coolingDown(), + enumerable: true, + configurable: false, + }, + fresh: { + get: () => set.fresh(), + enumerable: true, + configurable: false, + }, + reload: { + value: () => set.reload(), + enumerable: true, + configurable: false, + writable: false, + }, + reloading: { + get: () => !!set._pendingFetch, + enumerable: true, + configurable: false, + }, + jwks: { + value: () => set._local?.jwks(), + enumerable: true, + configurable: false, + writable: false, + }, + }); + return remoteJWKSet; +} + +function isCookiesStore(obj) { + return typeof obj === "object" && obj !== null && "get" in obj && typeof obj.get === "function"; +} + +var SuperTokensNextjsSSRAPIWrapper = /** @class */ (function () { + function SuperTokensNextjsSSRAPIWrapper() { + } + SuperTokensNextjsSSRAPIWrapper.init = function (config) { + if (config.enableDebugLogs) { + logger.enableLogging(); + } + SuperTokensNextjsSSRAPIWrapper.config = config; + }; + SuperTokensNextjsSSRAPIWrapper.getConfigOrThrow = function () { + if (!SuperTokensNextjsSSRAPIWrapper.config) { + throw new Error("SuperTokens must be initialized before calling this method."); + } + return SuperTokensNextjsSSRAPIWrapper.config; + }; + SuperTokensNextjsSSRAPIWrapper.getJWKS = function () { + if (SuperTokensNextjsSSRAPIWrapper.jwks) { + return SuperTokensNextjsSSRAPIWrapper.jwks; + } + var appInfo = SuperTokensNextjsSSRAPIWrapper.getConfigOrThrow().appInfo; + var jwksPath = "".concat(appInfo.apiBasePath, "/jwt/jwks.json"); + if (!jwksPath.startsWith("/")) { + jwksPath = "/".concat(jwksPath); + } + jwksPath = jwksPath.replace("//", "/"); + var jwksUrl = new URL(jwksPath, appInfo.apiDomain); + logger.logDebugMessage("Fetching JWKS data from: ".concat(jwksUrl.toString())); + SuperTokensNextjsSSRAPIWrapper.jwks = createRemoteJWKSet(jwksUrl); + return SuperTokensNextjsSSRAPIWrapper.jwks; + }; + /** + * Get the session state during SSR or redirect + * The function is meant to be used inside Next.js components that make use of SSR. + * @param cookies - The cookies store exposed by next/headers (await cookies()) + * @param redirect - The redirect function exposed by next/navigation + * @returns The session context value or directly redirects the user to either the login page or the refresh API + **/ + SuperTokensNextjsSSRAPIWrapper.getSSRSession = function (cookies, redirect) { + var _a; + return logger.__awaiter(this, void 0, void 0, function () { + var redirectPath, authPagePath, refreshLocation, _b, state, session; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + redirectPath = ((_a = cookies.get(constants.CURRENT_PATH_COOKIE_NAME)) === null || _a === void 0 ? void 0 : _a.value) || "/"; + authPagePath = getAuthPagePath(redirectPath); + refreshLocation = getRefreshLocation(redirectPath); + return [4 /*yield*/, getSSRSessionState(cookies)]; + case 1: + _b = _c.sent(), state = _b.state, session = _b.session; + logger.logDebugMessage("SSR Session State: ".concat(state)); + switch (state) { + case "front-token-not-found": + case "front-token-invalid": + case "access-token-invalid": + logger.logDebugMessage("Redirecting to Auth Page: ".concat(authPagePath)); + return [2 /*return*/, redirect(authPagePath)]; + case "front-token-expired": + case "access-token-not-found": + case "tokens-do-not-match": + logger.logDebugMessage("Redirecting to refresh API: ".concat(refreshLocation)); + return [2 /*return*/, redirect(refreshLocation)]; + case "tokens-match": + logger.logDebugMessage("Returning session object"); + return [2 /*return*/, session]; + default: + // This is here just to prevent typescript from complaining + // about the function not returning a value + throw new Error("Unknown state: ".concat(state)); + } + return [2 /*return*/]; + } + }); + }); + }; + /** + * Get the session state inside props or redirect + * The function is meant to be used inside getServerSideProps. + * @param request - The request object available inside getServerSideProps ctx (ctx.req) + * @returns The session context value or a redirects path to send the user to the refresh API or the login page + **/ + SuperTokensNextjsSSRAPIWrapper.getServerSidePropsSession = function (request) { + return logger.__awaiter(this, void 0, void 0, function () { + var appInfo, requestUrl, redirectPath, authPagePath, refreshLocation, _a, state, session; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + appInfo = SuperTokensNextjsSSRAPIWrapper.getConfigOrThrow().appInfo; + requestUrl = new URL(request.url, appInfo.websiteDomain); + redirectPath = requestUrl.pathname; + authPagePath = getAuthPagePath(redirectPath); + refreshLocation = getRefreshLocation(redirectPath); + return [4 /*yield*/, getSSRSessionState(request.cookies)]; + case 1: + _a = _b.sent(), state = _a.state, session = _a.session; + logger.logDebugMessage("SSR Session State: ".concat(state)); + switch (state) { + case "front-token-not-found": + case "front-token-invalid": + case "access-token-invalid": + logger.logDebugMessage("Redirecting to Auth Page: ".concat(authPagePath)); + return [2 /*return*/, { redirect: { destination: authPagePath, permanent: false } }]; + case "front-token-expired": + case "access-token-not-found": + case "tokens-do-not-match": + logger.logDebugMessage("Redirecting to refresh API: ".concat(refreshLocation)); + return [2 /*return*/, { redirect: { destination: refreshLocation, permanent: false } }]; + case "tokens-match": + logger.logDebugMessage("Returning session object"); + return [2 /*return*/, { props: { session: session } }]; + default: + // This is here just to prevent typescript from complaining + // about the function not returning a value + throw new Error("Unknown state: ".concat(state)); + } + return [2 /*return*/]; + } + }); + }); + }; + return SuperTokensNextjsSSRAPIWrapper; +}()); +var init = SuperTokensNextjsSSRAPIWrapper.init; +var getSSRSession = SuperTokensNextjsSSRAPIWrapper.getSSRSession; +var getServerSidePropsSession = SuperTokensNextjsSSRAPIWrapper.getServerSidePropsSession; +function getAuthPagePath(redirectPath) { + var authPagePath = SuperTokensNextjsSSRAPIWrapper.getConfigOrThrow().appInfo.websiteBasePath || "/auth"; + return "".concat(authPagePath, "?").concat(constants.FORCE_LOGOUT_PATH_PARAM_NAME, "=true&").concat(constants.REDIRECT_PATH_PARAM_NAME, "=").concat(redirectPath); +} +function getRefreshLocation(redirectPath) { + // The backend api routes defined in appInfo might be different from what we use here. + // This refresh route will be made available only by including the node handler in the next.js middleware + // If someone uses nextjs with SSR, and a separate backend api server, the app info data will be invalid here. + return "/api/auth/session/refresh?".concat(constants.REDIRECT_PATH_PARAM_NAME, "=").concat(redirectPath); +} +function getSSRSessionState(cookies) { + return logger.__awaiter(this, void 0, void 0, function () { + var frontToken, parsedFrontToken, accessToken, parsedAccessToken; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + frontToken = getCookieValue(cookies, constants.FRONT_TOKEN_COOKIE_NAME) || getCookieValue(cookies, constants.FRONT_TOKEN_HEADER_NAME); + if (!frontToken) { + return [2 /*return*/, { state: "front-token-not-found" }]; + } + parsedFrontToken = parseFrontToken(frontToken); + if (!parsedFrontToken.isValid) { + return [2 /*return*/, { state: "front-token-invalid" }]; + } + logger.logDebugMessage("Front token expires at: ".concat(new Date(parsedFrontToken.ate))); + if (parsedFrontToken.ate < Date.now()) { + return [2 /*return*/, { state: "front-token-expired" }]; + } + accessToken = getCookieValue(cookies, constants.ACCESS_TOKEN_COOKIE_NAME) || getCookieValue(cookies, constants.ACCESS_TOKEN_HEADER_NAME); + if (!accessToken) { + return [2 /*return*/, { state: "access-token-not-found" }]; + } + return [4 /*yield*/, parseAccessToken(accessToken)]; + case 1: + parsedAccessToken = _a.sent(); + if (!parsedAccessToken.isValid) { + return [2 /*return*/, { state: "access-token-invalid" }]; + } + if (!compareTokenPayloads(parsedFrontToken.payload, parsedAccessToken.payload)) { + return [2 /*return*/, { state: "tokens-do-not-match" }]; + } + return [2 /*return*/, { + state: "tokens-match", + session: { + userId: parsedAccessToken.payload.sub, + accessTokenPayload: parsedAccessToken, + doesSessionExist: true, + loading: false, + invalidClaims: [], + }, + }]; + } + }); + }); +} +function parseFrontToken(frontToken) { + try { + var parsedToken = JSON.parse(decodeURIComponent(escape(atob(frontToken)))); + if (!parsedToken.uid || !parsedToken.ate || !parsedToken.up) { + return { isValid: false }; + } + return { payload: parsedToken.up, ate: parsedToken.ate, isValid: true }; + } + catch (err) { + logger.logDebugMessage("Error while parsing front token: ".concat(err)); + return { isValid: false }; + } +} +function parseAccessToken(token) { + return logger.__awaiter(this, void 0, void 0, function () { + var payload, err_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 2, , 3]); + return [4 /*yield*/, jwtVerify(token, SuperTokensNextjsSSRAPIWrapper.getJWKS())]; + case 1: + payload = (_a.sent()).payload; + if (!payload.sub || !payload.exp) { + return [2 /*return*/, { isValid: false }]; + } + return [2 /*return*/, { isValid: true, payload: payload }]; + case 2: + err_1 = _a.sent(); + logger.logDebugMessage("Error while parsing access token: ".concat(err_1)); + return [2 /*return*/, { isValid: false }]; + case 3: return [2 /*return*/]; + } + }); + }); +} +function compareTokenPayloads(payload1, payload2) { + return JSON.stringify(payload1) === JSON.stringify(payload2); +} +function getCookieValue(cookie, name) { + var _a; + if (isCookiesStore(cookie)) { + return (_a = cookie.get(name)) === null || _a === void 0 ? void 0 : _a.value; + } + return cookie[name]; +} + +exports.default = SuperTokensNextjsSSRAPIWrapper; +exports.getSSRSession = getSSRSession; +exports.getServerSidePropsSession = getServerSidePropsSession; +exports.init = init; diff --git a/lib/build/oauth2provider-shared.js b/lib/build/oauth2provider-shared.js index 27f1e02ea..dbbd686cc 100644 --- a/lib/build/oauth2provider-shared.js +++ b/lib/build/oauth2provider-shared.js @@ -1,197 +1,144 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var OAuth2WebJS = require("supertokens-web-js/recipe/oauth2provider"); -var index = require("./recipeModule-shared.js"); +var logger = require('./logger.js'); +var OAuth2WebJS = require('supertokens-web-js/recipe/oauth2provider'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var index = require('./recipeModule-shared.js'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var OAuth2WebJS__default = /*#__PURE__*/ _interopDefault(OAuth2WebJS); +var OAuth2WebJS__default = /*#__PURE__*/_interopDefault(OAuth2WebJS); -var getFunctionOverrides = function (onHandleEvent) { - return function (originalImp) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, originalImp), { - getLoginChallengeInfo: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImp.getLoginChallengeInfo(input)]; - case 1: - response = _a.sent(); - onHandleEvent({ - action: "LOADED_LOGIN_CHALLENGE", - loginChallenge: input.loginChallenge, - loginInfo: response.info, - userContext: input.userContext, - }); - return [2 /*return*/, response]; - } - }); - }); - }, - logOut: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImp.logOut(input)]; - case 1: - response = _a.sent(); - onHandleEvent({ - action: "OAUTH2_LOGOUT_SUCCESS", - frontendRedirectTo: response.frontendRedirectTo, - userContext: input.userContext, - }); - return [2 /*return*/, response]; - } - }); - }); - }, - }); - }; +var getFunctionOverrides = function (onHandleEvent) { + return function (originalImp) { return (logger.__assign(logger.__assign({}, originalImp), { getLoginChallengeInfo: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.getLoginChallengeInfo(input)]; + case 1: + response = _a.sent(); + onHandleEvent({ + action: "LOADED_LOGIN_CHALLENGE", + loginChallenge: input.loginChallenge, + loginInfo: response.info, + userContext: input.userContext, + }); + return [2 /*return*/, response]; + } + }); + }); + }, logOut: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.logOut(input)]; + case 1: + response = _a.sent(); + onHandleEvent({ + action: "OAUTH2_LOGOUT_SUCCESS", + frontendRedirectTo: response.frontendRedirectTo, + userContext: input.userContext, + }); + return [2 /*return*/, response]; + } + }); + }); + } })); }; }; -function normaliseOAuth2Config(config) { - var _a; - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign( - {}, - genericComponentOverrideContext.normaliseRecipeModuleConfig(config) - ), - { - disableDefaultUI: - (_a = config === null || config === void 0 ? void 0 : config.disableDefaultUI) !== null && _a !== void 0 - ? _a - : false, - tryRefreshPage: genericComponentOverrideContext.__assign( - { disableDefaultUI: false }, - config === null || config === void 0 ? void 0 : config.tryRefreshPage - ), - oauth2LogoutScreen: genericComponentOverrideContext.__assign( - { disableDefaultUI: false, style: "" }, - config === null || config === void 0 ? void 0 : config.oauth2LogoutScreen - ), - override: genericComponentOverrideContext.__assign( - { - functions: function (originalImplementation) { - return originalImplementation; - }, - }, - config === null || config === void 0 ? void 0 : config.override - ), - } - ); +function normaliseOAuth2Config(config) { + var _a; + return logger.__assign(logger.__assign({}, genericComponentOverrideContext.normaliseRecipeModuleConfig(config)), { disableDefaultUI: (_a = config === null || config === void 0 ? void 0 : config.disableDefaultUI) !== null && _a !== void 0 ? _a : false, tryRefreshPage: logger.__assign({ disableDefaultUI: false }, config === null || config === void 0 ? void 0 : config.tryRefreshPage), oauth2LogoutScreen: logger.__assign({ disableDefaultUI: false, style: "" }, config === null || config === void 0 ? void 0 : config.oauth2LogoutScreen), override: logger.__assign({ functions: function (originalImplementation) { return originalImplementation; } }, config === null || config === void 0 ? void 0 : config.override) }); } -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Class. - */ -var OAuth2Provider = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(OAuth2Provider, _super); - function OAuth2Provider(config, webJSRecipe) { - if (webJSRecipe === void 0) { - webJSRecipe = OAuth2WebJS__default.default; - } - var _this = _super.call(this, config) || this; - _this.webJSRecipe = webJSRecipe; - _this.recipeID = OAuth2Provider.RECIPE_ID; - return _this; - } - OAuth2Provider.init = function (config) { - var normalisedConfig = normaliseOAuth2Config(config); - return { - recipeID: OAuth2Provider.RECIPE_ID, - authReact: function (appInfo) { - OAuth2Provider.instance = new OAuth2Provider( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { appInfo: appInfo, recipeId: OAuth2Provider.RECIPE_ID } - ) - ); - return OAuth2Provider.instance; - }, - webJS: OAuth2WebJS__default.default.init( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { - override: { - functions: function (originalImpl, builder) { - var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; - }, - }, - } - ) - ), - }; - }; - OAuth2Provider.getInstanceOrThrow = function () { - if (OAuth2Provider.instance === undefined) { - var error = - "No instance of OAuth2Provider found. Make sure to call the OAuth2Provider.init method." + - "See https://supertokens.io/docs/oauth2/quick-setup/frontend"; - // eslint-disable-next-line supertokens-auth-react/no-direct-window-object - if (typeof window === "undefined") { - error = error + genericComponentOverrideContext.SSR_ERROR; - } - throw Error(error); - } - return OAuth2Provider.instance; - }; - OAuth2Provider.getInstance = function () { - return OAuth2Provider.instance; - }; - OAuth2Provider.prototype.getDefaultRedirectionURL = function (ctx) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - // We do not use the util here, because we are likely redirecting across domains here. - if ( - ctx.action === "SUCCESS_OAUTH2" || - ctx.action === "CONTINUE_OAUTH2_AFTER_REFRESH" || - ctx.action === "POST_OAUTH2_LOGOUT_REDIRECT" - ) { - return [2 /*return*/, ctx.frontendRedirectTo]; - } else { - throw new Error( - "Should never come here: unknown action in OAuth2Provider.getDefaultRedirectionURL" - ); - } - }); - }); - }; - /* - * Tests methods. - */ - OAuth2Provider.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - OAuth2Provider.instance = undefined; - return; - }; - OAuth2Provider.RECIPE_ID = "oauth2provider"; - return OAuth2Provider; -})(index.RecipeModule); +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Class. + */ +var OAuth2Provider = /** @class */ (function (_super) { + logger.__extends(OAuth2Provider, _super); + function OAuth2Provider(config, webJSRecipe) { + if (webJSRecipe === void 0) { webJSRecipe = OAuth2WebJS__default.default; } + var _this = _super.call(this, config) || this; + _this.webJSRecipe = webJSRecipe; + _this.recipeID = OAuth2Provider.RECIPE_ID; + return _this; + } + OAuth2Provider.init = function (config) { + var normalisedConfig = normaliseOAuth2Config(config); + return { + recipeID: OAuth2Provider.RECIPE_ID, + authReact: function (appInfo) { + OAuth2Provider.instance = new OAuth2Provider(logger.__assign(logger.__assign({}, normalisedConfig), { appInfo: appInfo, recipeId: OAuth2Provider.RECIPE_ID })); + return OAuth2Provider.instance; + }, + webJS: OAuth2WebJS__default.default.init(logger.__assign(logger.__assign({}, normalisedConfig), { override: { + functions: function (originalImpl, builder) { + var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, + } })), + }; + }; + OAuth2Provider.getInstanceOrThrow = function () { + if (OAuth2Provider.instance === undefined) { + var error = "No instance of OAuth2Provider found. Make sure to call the OAuth2Provider.init method." + + "See https://supertokens.io/docs/oauth2/quick-setup/frontend"; + // eslint-disable-next-line supertokens-auth-react/no-direct-window-object + if (typeof window === "undefined") { + error = error + genericComponentOverrideContext.SSR_ERROR; + } + throw Error(error); + } + return OAuth2Provider.instance; + }; + OAuth2Provider.getInstance = function () { + return OAuth2Provider.instance; + }; + OAuth2Provider.prototype.getDefaultRedirectionURL = function (ctx) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + // We do not use the util here, because we are likely redirecting across domains here. + if (ctx.action === "SUCCESS_OAUTH2" || + ctx.action === "CONTINUE_OAUTH2_AFTER_REFRESH" || + ctx.action === "POST_OAUTH2_LOGOUT_REDIRECT") { + return [2 /*return*/, ctx.frontendRedirectTo]; + } + else { + throw new Error("Should never come here: unknown action in OAuth2Provider.getDefaultRedirectionURL"); + } + }); + }); + }; + /* + * Tests methods. + */ + OAuth2Provider.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + OAuth2Provider.instance = undefined; + return; + }; + OAuth2Provider.RECIPE_ID = "oauth2provider"; + return OAuth2Provider; +}(index.RecipeModule)); exports.OAuth2Provider = OAuth2Provider; diff --git a/lib/build/oauth2provider-shared2.js b/lib/build/oauth2provider-shared2.js index bd3b554b5..7d16271fd 100644 --- a/lib/build/oauth2provider-shared2.js +++ b/lib/build/oauth2provider-shared2.js @@ -1,10 +1,8 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); -var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), - useContext = _a[0], - Provider = _a[1]; +var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), useContext = _a[0], Provider = _a[1]; exports.Provider = Provider; exports.useContext = useContext; diff --git a/lib/build/oauth2provider.js b/lib/build/oauth2provider.js index aee148ac4..d6607cbb7 100644 --- a/lib/build/oauth2provider.js +++ b/lib/build/oauth2provider.js @@ -1,95 +1,97 @@ -"use strict"; +'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, '__esModule', { value: true }); -var componentOverrideContext = require("./oauth2provider-shared2.js"); -var recipe = require("./oauth2provider-shared.js"); -require("./genericComponentOverrideContext.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("react"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("supertokens-web-js/utils/normalisedURLPath"); -require("react/jsx-runtime"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./recipeModule-shared.js"); +var componentOverrideContext = require('./oauth2provider-shared2.js'); +var recipe = require('./oauth2provider-shared.js'); +require('./genericComponentOverrideContext.js'); +require('./logger.js'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/windowHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils'); +require('react'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/utils/normalisedURLPath'); +require('react/jsx-runtime'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./recipeModule-shared.js'); -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var Wrapper = /** @class */ (function () { - function Wrapper() {} - Wrapper.init = function (config) { - return recipe.OAuth2Provider.init(config); - }; - /** - * Returns information about an OAuth login in progress - * - * @param loginChallenge The login challenge from the url - * - * @param userContext (OPTIONAL) Refer to {@link https://supertokens.com/docs/emailpassword/advanced-customizations/user-context the documentation} - * - * @param options (OPTIONAL) Use this to configure additional properties (for example pre api hooks) - * - * @returns `{status: "OK", info: LoginInfo}` - * - * @throws STGeneralError if the API exposed by the backend SDKs returns `status: "GENERAL_ERROR"` - */ - Wrapper.getLoginChallengeInfo = function (input) { - return recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.getLoginChallengeInfo(input); - }; - /** - * Accepts the OAuth2 Login request and returns the redirect URL to continue the OAuth flow. - * - * @param loginChallenge The login challenge from the url - * - * @param userContext (OPTIONAL) Refer to {@link https://supertokens.com/docs/emailpassword/advanced-customizations/user-context the documentation} - * - * @param options (OPTIONAL) Use this to configure additional properties (for example pre api hooks) - * - * @returns `{status: "OK", frontendRedirectTo: string}` - * - * @throws STGeneralError if the API exposed by the backend SDKs returns `status: "GENERAL_ERROR"` - */ - Wrapper.getRedirectURLToContinueOAuthFlow = function (input) { - return recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.getRedirectURLToContinueOAuthFlow(input); - }; - /** - * Accepts the OAuth2 Logout request, clears the SuperTokens session and returns post logout redirect URL. - * - * @param logoutChallenge The logout challenge from the url - * - * @param userContext (OPTIONAL) Refer to {@link https://supertokens.com/docs/emailpassword/advanced-customizations/user-context the documentation} - * - * @param options (OPTIONAL) Use this to configure additional properties (for example pre api hooks) - * - * @returns `{status: "OK", frontendRedirectTo: string}` - * - * @throws STGeneralError if the API exposed by the backend SDKs returns `status: "GENERAL_ERROR"` - */ - Wrapper.logOut = function (input) { - return recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.logOut(input); - }; - Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; - return Wrapper; -})(); -var init = Wrapper.init; -var getLoginChallengeInfo = Wrapper.getLoginChallengeInfo; +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var Wrapper = /** @class */ (function () { + function Wrapper() { + } + Wrapper.init = function (config) { + return recipe.OAuth2Provider.init(config); + }; + /** + * Returns information about an OAuth login in progress + * + * @param loginChallenge The login challenge from the url + * + * @param userContext (OPTIONAL) Refer to {@link https://supertokens.com/docs/emailpassword/advanced-customizations/user-context the documentation} + * + * @param options (OPTIONAL) Use this to configure additional properties (for example pre api hooks) + * + * @returns `{status: "OK", info: LoginInfo}` + * + * @throws STGeneralError if the API exposed by the backend SDKs returns `status: "GENERAL_ERROR"` + */ + Wrapper.getLoginChallengeInfo = function (input) { + return recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.getLoginChallengeInfo(input); + }; + /** + * Accepts the OAuth2 Login request and returns the redirect URL to continue the OAuth flow. + * + * @param loginChallenge The login challenge from the url + * + * @param userContext (OPTIONAL) Refer to {@link https://supertokens.com/docs/emailpassword/advanced-customizations/user-context the documentation} + * + * @param options (OPTIONAL) Use this to configure additional properties (for example pre api hooks) + * + * @returns `{status: "OK", frontendRedirectTo: string}` + * + * @throws STGeneralError if the API exposed by the backend SDKs returns `status: "GENERAL_ERROR"` + */ + Wrapper.getRedirectURLToContinueOAuthFlow = function (input) { + return recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.getRedirectURLToContinueOAuthFlow(input); + }; + /** + * Accepts the OAuth2 Logout request, clears the SuperTokens session and returns post logout redirect URL. + * + * @param logoutChallenge The logout challenge from the url + * + * @param userContext (OPTIONAL) Refer to {@link https://supertokens.com/docs/emailpassword/advanced-customizations/user-context the documentation} + * + * @param options (OPTIONAL) Use this to configure additional properties (for example pre api hooks) + * + * @returns `{status: "OK", frontendRedirectTo: string}` + * + * @throws STGeneralError if the API exposed by the backend SDKs returns `status: "GENERAL_ERROR"` + */ + Wrapper.logOut = function (input) { + return recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.logOut(input); + }; + Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; + return Wrapper; +}()); +var init = Wrapper.init; +var getLoginChallengeInfo = Wrapper.getLoginChallengeInfo; var logOut = Wrapper.logOut; exports.RecipeComponentsOverrideContextProvider = componentOverrideContext.Provider; diff --git a/lib/build/oauth2providerprebuiltui.js b/lib/build/oauth2providerprebuiltui.js index 7f7a99de6..721d30989 100644 --- a/lib/build/oauth2providerprebuiltui.js +++ b/lib/build/oauth2providerprebuiltui.js @@ -1,58 +1,49 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var jsxRuntime = require("react/jsx-runtime"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var uiEntry = require("./index2.js"); -var session = require("./session.js"); -var componentOverrideContext = require("./oauth2provider-shared2.js"); -var React = require("react"); -var recipe = require("./oauth2provider-shared.js"); -var translationContext = require("./translationContext.js"); -var button = require("./emailpassword-shared.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("react-dom"); -require("./multitenancy-shared.js"); -require("./multifactorauth-shared2.js"); -require("supertokens-web-js/recipe/multifactorauth"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("./recipeModule-shared.js"); -require("./multifactorauth-shared.js"); -require("supertokens-web-js/recipe/session"); -require("./authRecipe-shared.js"); -require("supertokens-web-js/lib/build/normalisedURLPath"); -require("./session-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); +var logger = require('./logger.js'); +var jsxRuntime = require('react/jsx-runtime'); +var NormalisedURLPath = require('supertokens-web-js/utils/normalisedURLPath'); +var uiEntry = require('./index2.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var session = require('./session.js'); +var componentOverrideContext = require('./oauth2provider-shared2.js'); +var React = require('react'); +var recipe = require('./oauth2provider-shared.js'); +var translationContext = require('./translationContext.js'); +var button = require('./emailpassword-shared.js'); +require('supertokens-web-js/utils/windowHandler'); +require('react-dom'); +require('./multitenancy-shared.js'); +require('./multifactorauth-shared2.js'); +require('supertokens-web-js/recipe/multifactorauth'); +require('supertokens-web-js/utils'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('./recipeModule-shared.js'); +require('./multifactorauth-shared.js'); +require('supertokens-web-js/recipe/session'); +require('./authRecipe-shared.js'); +require('supertokens-web-js/lib/build/normalisedURLPath'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('./session-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { - if (k !== "default") { + if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty( - n, - k, - d.get - ? d - : { - enumerable: true, - get: function () { - return e[k]; - }, - } - ); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); } }); } @@ -60,567 +51,306 @@ function _interopNamespace(e) { return Object.freeze(n); } -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var React__namespace = /*#__PURE__*/ _interopNamespace(React); +var NormalisedURLPath__default = /*#__PURE__*/_interopDefault(NormalisedURLPath); +var React__namespace = /*#__PURE__*/_interopNamespace(React); -var styles = - '/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * "License") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n\n/*\n * Default styles.\n */\n\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n\n[data-supertokens~="container"] {\n font-family: "Arial", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n\n/* TODO: split the link style into separate things*/\n\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="secondaryText"] strong {\n font-weight: 600;\n}\n\n[data-supertokens~="divider"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n\n[data-supertokens~="linkButton"] {\n font-family: "Arial", sans-serif;\n background-color: transparent;\n border: 0;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n\n[data-supertokens~="button"] {\n font-family: "Arial", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n\n[data-supertokens~="delayedRender"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n\n[data-supertokens~="footerLinkGroupVert"] > div {\n cursor: pointer;\n margin: 0;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n\n[data-supertokens~="withBackButton"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="dividerWithOr"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="dividerText"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n\n[data-supertokens~="formLabelWithLinkWrapper"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="formLabelLinkBtn"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n\n[data-supertokens~="formLabelLinkBtn"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~="formLabelLinkBtn"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n\n[data-supertokens~="authComponentList"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~="authPageTitleOAuthClient"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n\n[data-supertokens~="authPageTitleOAuthClientUrl"] {\n text-decoration: none;\n}\n\n[data-supertokens~="authPageTitleOAuthClientLogo"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n\n[data-supertokens~="authPageTitleOAuthClient"] [data-supertokens~="authPageTitleOAuthClientName"] {\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~="buttonWithArrow"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryText"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithRightArrow"] ~ svg {\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n position: relative;\n left: -2px;\n}\n\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~="logoutIcon"] {\n padding: 18px 20px 18px 24px;\n background-color: rgba(var(--palette-textGray), 0.1);\n border-radius: 12px;\n}\n\n[data-supertokens~="oauth2Logout"] [data-supertokens~="headerTitle"] {\n margin-top: 24px;\n margin-bottom: 24px;\n}\n\n[data-supertokens~="oauth2Logout"] [data-supertokens~="button"] {\n margin-bottom: 24px;\n}\n'; +var styles = "/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * \"License\") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~=\"container\"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n\n/*\n * Default styles.\n */\n\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n\n[data-supertokens~=\"container\"] {\n font-family: \"Arial\", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n\n@media (max-width: 440px) {\n [data-supertokens~=\"container\"] {\n width: 95vw;\n }\n}\n\n[data-supertokens~=\"row\"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n\n[data-supertokens~=\"superTokensBranding\"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n\n[data-supertokens~=\"generalError\"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n\n[data-supertokens~=\"headerTitle\"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~=\"headerSubtitle\"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n\n[data-supertokens~=\"headerSubtitle\"][data-supertokens~=\"secondaryText\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] {\n max-width: 300px;\n margin-top: 10px;\n}\n\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] a {\n line-height: 21px;\n}\n\n/* TODO: split the link style into separate things*/\n\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n\n[data-supertokens~=\"link\"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n\n[data-supertokens~=\"primaryText\"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~=\"secondaryText\"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"secondaryText\"] strong {\n font-weight: 600;\n}\n\n[data-supertokens~=\"divider\"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n\n[data-supertokens~=\"headerTinyTitle\"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~=\"generalSuccess\"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n\n[data-supertokens~=\"spinner\"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n\n[data-supertokens~=\"error\"] {\n color: rgb(var(--palette-error));\n}\n\n[data-supertokens~=\"linkButton\"] {\n font-family: \"Arial\", sans-serif;\n background-color: transparent;\n border: 0;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n margin-right: 0.3em;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"]:hover svg {\n position: relative;\n left: -4px;\n}\n\n[data-supertokens~=\"button\"] {\n font-family: \"Arial\", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n\n[data-supertokens~=\"button\"]:disabled {\n border: none;\n cursor: no-drop;\n}\n\n[data-supertokens~=\"button\"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n\n[data-supertokens~=\"button\"]:focus {\n outline: none;\n}\n\n[data-supertokens~=\"backButtonCommon\"] {\n width: 16px;\n height: 13px;\n}\n\n[data-supertokens~=\"backButton\"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n\n[data-supertokens~=\"backButtonPlaceholder\"] {\n display: block;\n}\n\n[data-supertokens~=\"delayedRender\"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] > div {\n cursor: pointer;\n margin: 0;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 400;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n\n@media (max-width: 360px) {\n [data-supertokens~=\"footerLinkGroupVert\"] {\n flex-direction: column;\n }\n [data-supertokens~=\"footerLinkGroupVert\"] > div {\n margin: 0 auto;\n }\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n\n[data-supertokens~=\"withBackButton\"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~=\"dividerWithOr\"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"dividerText\"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n\n[data-supertokens~=\"formLabelWithLinkWrapper\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n\n[data-supertokens~=\"authComponentList\"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClient\"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClientUrl\"] {\n text-decoration: none;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClientLogo\"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClient\"] [data-supertokens~=\"authPageTitleOAuthClientName\"] {\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~=\"buttonWithArrow\"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithRightArrow\"] ~ svg {\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n position: relative;\n left: -2px;\n}\n\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~=\"logoutIcon\"] {\n padding: 18px 20px 18px 24px;\n background-color: rgba(var(--palette-textGray), 0.1);\n border-radius: 12px;\n}\n\n[data-supertokens~=\"oauth2Logout\"] [data-supertokens~=\"headerTitle\"] {\n margin-top: 24px;\n margin-bottom: 24px;\n}\n\n[data-supertokens~=\"oauth2Logout\"] [data-supertokens~=\"button\"] {\n margin-bottom: 24px;\n}\n"; -var ThemeBase = function (_a) { - var children = _a.children, - userStyles = _a.userStyles; - return jsxRuntime.jsxs(React.Fragment, { - children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })], - }); +var ThemeBase = function (_a) { + var children = _a.children, userStyles = _a.userStyles; + return (jsxRuntime.jsxs(React.Fragment, { children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })] })); }; -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function LogoutIcon() { - return jsxRuntime.jsx( - "svg", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "logoutIcon", - xmlns: "http://www.w3.org/2000/svg", - width: "40", - height: "38", - fill: "none", - }, - { - children: jsxRuntime.jsx("path", { - fill: "rgb(var(--palette-textGray))", - fillRule: "evenodd", - d: "M2.972.022a.874.874 0 0 1-.23.062c-.234.042-.926.362-1.148.53a4.638 4.638 0 0 0-.656.63c-.178.228-.415.681-.495.948l-.116.378C.272 2.742.27 32.075.326 32.251l.111.37c.165.559.636 1.207 1.133 1.558a3.9 3.9 0 0 1 .195.145c.048.046.368.206.588.292l.196.08c.036.016.183.063.326.105.144.042.295.093.337.113.041.02.11.037.154.037s.098.015.12.034c.023.019.218.087.434.15.215.065.43.133.478.153.048.019.254.085.457.146.204.06.404.128.446.148.041.021.11.038.154.038s.098.015.12.034c.023.02.16.069.303.11.144.041.295.092.337.112.041.02.11.037.154.037s.098.015.12.034c.023.018.218.086.434.15.215.065.43.133.478.152.048.02.254.086.457.148.204.062.404.129.446.148a.45.45 0 0 0 .163.037c.048 0 .088.018.088.041 0 .023.034.043.076.043.042 0 .213.048.38.104.168.057.34.104.381.104.042 0 .076.02.076.042 0 .023.04.042.088.042.048 0 .122.017.163.038.042.02.193.07.337.11.274.076.366.106.544.176.06.024.285.096.5.16.216.064.41.132.433.15a.224.224 0 0 0 .12.035.4.4 0 0 1 .155.04c.042.02.193.07.337.108.144.038.3.084.348.103.178.07.613.125.954.122.365-.004.908-.078.965-.133a.16.16 0 0 1 .096-.031c.08 0 .707-.291.784-.364.032-.03.073-.054.09-.054.053 0 .632-.55.748-.71.195-.27.432-.71.432-.803 0-.04.02-.083.044-.097.024-.014.043-.077.043-.14 0-.063.023-.137.05-.163.034-.033.059-.404.077-1.148l.026-1.1 2.894-.023c2.31-.02 2.939-.037 3.119-.084.123-.033.24-.074.257-.091.018-.017.077-.031.132-.031.054 0 .11-.02.125-.042.015-.023.055-.042.089-.042.19 0 1.14-.54 1.493-.849.456-.398.898-.926 1.095-1.304a.916.916 0 0 1 .088-.147c.02-.018.06-.104.219-.48.02-.047.059-.16.088-.252.029-.091.069-.214.09-.271.125-.356.146-.97.146-4.265 0-3.563-.003-3.626-.205-3.987-.204-.364-.756-.78-1.036-.78-.045 0-.093-.019-.108-.042-.035-.054-.661-.054-.696 0-.015.023-.066.042-.113.042-.256 0-.85.449-1.002.757-.253.514-.256.568-.256 4.24v3.287l-.11.222c-.06.123-.186.306-.28.408-.171.188-.551.41-.7.41-.044 0-.092.02-.107.042-.018.027-.943.042-2.635.042h-2.608l-.011-12.165c-.01-9.665-.023-12.176-.066-12.218a.236.236 0 0 1-.055-.149.426.426 0 0 0-.039-.169 4.357 4.357 0 0 1-.118-.26c-.201-.477-.692-1.057-1.127-1.332a2.216 2.216 0 0 1-.196-.134c-.054-.058-.664-.307-.848-.346-.048-.01 1.66-.021 3.795-.024 2.546-.003 3.89.01 3.908.037.015.023.064.042.11.042.19 0 .646.313.82.561.274.39.267.31.267 3.032 0 2.402.02 2.851.14 3.139.245.59.71.966 1.318 1.068.33.055.642.012.979-.134.242-.105.696-.489.696-.588 0-.03.015-.054.033-.054.042 0 .166-.305.213-.522.058-.272.046-5.251-.015-5.666a4.778 4.778 0 0 0-.27-1.066 9.014 9.014 0 0 0-.397-.773 2.902 2.902 0 0 1-.161-.23 3.223 3.223 0 0 0-.298-.377 7.831 7.831 0 0 1-.23-.25c-.149-.175-.564-.502-.91-.717a5.197 5.197 0 0 0-.38-.224c-.011 0-.133-.05-.271-.11a4.346 4.346 0 0 0-.98-.319C22.442.018 3.025-.029 2.973.022Zm28.17 7.903c-.364.092-.514.172-.764.407-.225.21-.38.445-.487.737-.04.11-.054.77-.055 2.645v2.498h-3.457c-2.258 0-3.467.015-3.485.042-.014.023-.063.042-.107.042-.138 0-.449.18-.655.379-.194.187-.38.497-.474.794-.06.187-.062.653-.004.687.024.015.044.06.044.102 0 .17.198.495.443.724.141.132.285.24.32.24.035 0 .063.02.063.042 0 .023.036.042.08.042.044 0 .094.014.111.03.125.12.504.134 3.78.136l3.34.001.014 2.52c.015 2.39.032 2.79.122 2.79.021 0 .039.038.039.084 0 .046.02.084.043.084.024 0 .044.026.044.058 0 .073.476.527.552.527.032 0 .057.016.057.036 0 .02.108.069.24.109.35.106 1.009.076 1.305-.059.175-.08.895-.75 3.656-3.406 1.89-1.82 3.487-3.373 3.548-3.454.278-.37.388-.944.256-1.342-.15-.456-.165-.47-3.737-3.915-1.915-1.846-3.511-3.356-3.547-3.356-.037 0-.067-.014-.067-.031 0-.074-.636-.261-.87-.256-.06.001-.217.03-.349.063Z", - clipRule: "evenodd", - }), - } - ) - ); +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function LogoutIcon() { + return (jsxRuntime.jsx("svg", logger.__assign({ "data-supertokens": "logoutIcon", xmlns: "http://www.w3.org/2000/svg", width: "40", height: "38", fill: "none" }, { children: jsxRuntime.jsx("path", { fill: "rgb(var(--palette-textGray))", fillRule: "evenodd", d: "M2.972.022a.874.874 0 0 1-.23.062c-.234.042-.926.362-1.148.53a4.638 4.638 0 0 0-.656.63c-.178.228-.415.681-.495.948l-.116.378C.272 2.742.27 32.075.326 32.251l.111.37c.165.559.636 1.207 1.133 1.558a3.9 3.9 0 0 1 .195.145c.048.046.368.206.588.292l.196.08c.036.016.183.063.326.105.144.042.295.093.337.113.041.02.11.037.154.037s.098.015.12.034c.023.019.218.087.434.15.215.065.43.133.478.153.048.019.254.085.457.146.204.06.404.128.446.148.041.021.11.038.154.038s.098.015.12.034c.023.02.16.069.303.11.144.041.295.092.337.112.041.02.11.037.154.037s.098.015.12.034c.023.018.218.086.434.15.215.065.43.133.478.152.048.02.254.086.457.148.204.062.404.129.446.148a.45.45 0 0 0 .163.037c.048 0 .088.018.088.041 0 .023.034.043.076.043.042 0 .213.048.38.104.168.057.34.104.381.104.042 0 .076.02.076.042 0 .023.04.042.088.042.048 0 .122.017.163.038.042.02.193.07.337.11.274.076.366.106.544.176.06.024.285.096.5.16.216.064.41.132.433.15a.224.224 0 0 0 .12.035.4.4 0 0 1 .155.04c.042.02.193.07.337.108.144.038.3.084.348.103.178.07.613.125.954.122.365-.004.908-.078.965-.133a.16.16 0 0 1 .096-.031c.08 0 .707-.291.784-.364.032-.03.073-.054.09-.054.053 0 .632-.55.748-.71.195-.27.432-.71.432-.803 0-.04.02-.083.044-.097.024-.014.043-.077.043-.14 0-.063.023-.137.05-.163.034-.033.059-.404.077-1.148l.026-1.1 2.894-.023c2.31-.02 2.939-.037 3.119-.084.123-.033.24-.074.257-.091.018-.017.077-.031.132-.031.054 0 .11-.02.125-.042.015-.023.055-.042.089-.042.19 0 1.14-.54 1.493-.849.456-.398.898-.926 1.095-1.304a.916.916 0 0 1 .088-.147c.02-.018.06-.104.219-.48.02-.047.059-.16.088-.252.029-.091.069-.214.09-.271.125-.356.146-.97.146-4.265 0-3.563-.003-3.626-.205-3.987-.204-.364-.756-.78-1.036-.78-.045 0-.093-.019-.108-.042-.035-.054-.661-.054-.696 0-.015.023-.066.042-.113.042-.256 0-.85.449-1.002.757-.253.514-.256.568-.256 4.24v3.287l-.11.222c-.06.123-.186.306-.28.408-.171.188-.551.41-.7.41-.044 0-.092.02-.107.042-.018.027-.943.042-2.635.042h-2.608l-.011-12.165c-.01-9.665-.023-12.176-.066-12.218a.236.236 0 0 1-.055-.149.426.426 0 0 0-.039-.169 4.357 4.357 0 0 1-.118-.26c-.201-.477-.692-1.057-1.127-1.332a2.216 2.216 0 0 1-.196-.134c-.054-.058-.664-.307-.848-.346-.048-.01 1.66-.021 3.795-.024 2.546-.003 3.89.01 3.908.037.015.023.064.042.11.042.19 0 .646.313.82.561.274.39.267.31.267 3.032 0 2.402.02 2.851.14 3.139.245.59.71.966 1.318 1.068.33.055.642.012.979-.134.242-.105.696-.489.696-.588 0-.03.015-.054.033-.054.042 0 .166-.305.213-.522.058-.272.046-5.251-.015-5.666a4.778 4.778 0 0 0-.27-1.066 9.014 9.014 0 0 0-.397-.773 2.902 2.902 0 0 1-.161-.23 3.223 3.223 0 0 0-.298-.377 7.831 7.831 0 0 1-.23-.25c-.149-.175-.564-.502-.91-.717a5.197 5.197 0 0 0-.38-.224c-.011 0-.133-.05-.271-.11a4.346 4.346 0 0 0-.98-.319C22.442.018 3.025-.029 2.973.022Zm28.17 7.903c-.364.092-.514.172-.764.407-.225.21-.38.445-.487.737-.04.11-.054.77-.055 2.645v2.498h-3.457c-2.258 0-3.467.015-3.485.042-.014.023-.063.042-.107.042-.138 0-.449.18-.655.379-.194.187-.38.497-.474.794-.06.187-.062.653-.004.687.024.015.044.06.044.102 0 .17.198.495.443.724.141.132.285.24.32.24.035 0 .063.02.063.042 0 .023.036.042.08.042.044 0 .094.014.111.03.125.12.504.134 3.78.136l3.34.001.014 2.52c.015 2.39.032 2.79.122 2.79.021 0 .039.038.039.084 0 .046.02.084.043.084.024 0 .044.026.044.058 0 .073.476.527.552.527.032 0 .057.016.057.036 0 .02.108.069.24.109.35.106 1.009.076 1.305-.059.175-.08.895-.75 3.656-3.406 1.89-1.82 3.487-3.373 3.548-3.454.278-.37.388-.944.256-1.342-.15-.456-.165-.47-3.737-3.915-1.915-1.846-3.511-3.356-3.547-3.356-.037 0-.067-.014-.067-.031 0-.074-.636-.261-.87-.256-.06.001-.217.03-.349.063Z", clipRule: "evenodd" }) }))); } -var OAuth2LogoutScreenInner = uiEntry.withOverride("OAuth2LogoutScreenInner", function OAuth2LogoutScreenInner(props) { - var t = translationContext.useTranslation(); - return jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [ - jsxRuntime.jsx(LogoutIcon, {}), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("LOGGING_OUT") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle" }, - { children: t("LOGOUT_CONFIRMATION") } - ) - ), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - jsxRuntime.jsx(button.Button, { - disabled: props.isLoggingOut, - isLoading: props.isLoggingOut, - type: "button", - label: t("LOGOUT"), - onClick: props.onLogoutClicked, - }), - ], - }); +var OAuth2LogoutScreenInner = uiEntry.withOverride("OAuth2LogoutScreenInner", function OAuth2LogoutScreenInner(props) { + var t = translationContext.useTranslation(); + return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(LogoutIcon, {}), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle" }, { children: t("LOGGING_OUT") })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerSubtitle" }, { children: t("LOGOUT_CONFIRMATION") })), jsxRuntime.jsx("div", { "data-supertokens": "divider" }), jsxRuntime.jsx(button.Button, { disabled: props.isLoggingOut, isLoading: props.isLoggingOut, type: "button", label: t("LOGOUT"), onClick: props.onLogoutClicked })] })); }); -var OAuth2LogoutScreen$1 = function (props) { - if (props.showSpinner) { - return jsxRuntime.jsx(uiEntry.DynamicLoginMethodsSpinner, {}); - } - return jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "oauth2Logout container" }, - { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: jsxRuntime.jsx(OAuth2LogoutScreenInner, { - isLoggingOut: props.isLoggingOut, - onLogoutClicked: props.onLogoutClicked, - }), - } - ) - ), - jsxRuntime.jsx(uiEntry.SuperTokensBranding, {}), - ], - } - ) - ); -}; -var OAuth2LogoutScreenTheme = function (props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - return jsxRuntime.jsx( - ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle, props.config.oauth2LogoutScreen.style] }, - { children: jsxRuntime.jsx(OAuth2LogoutScreen$1, genericComponentOverrideContext.__assign({}, props)) } - ) - ); +var OAuth2LogoutScreen$1 = function (props) { + if (props.showSpinner) { + return jsxRuntime.jsx(uiEntry.DynamicLoginMethodsSpinner, {}); + } + return (jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "oauth2Logout container" }, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "row" }, { children: jsxRuntime.jsx(OAuth2LogoutScreenInner, { isLoggingOut: props.isLoggingOut, onLogoutClicked: props.onLogoutClicked }) })), jsxRuntime.jsx(uiEntry.SuperTokensBranding, {})] }))); +}; +var OAuth2LogoutScreenTheme = function (props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + return (jsxRuntime.jsx(ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle, props.config.oauth2LogoutScreen.style] }, { children: jsxRuntime.jsx(OAuth2LogoutScreen$1, logger.__assign({}, props)) }))); }; -var defaultTranslationsOAuth2Provider = { - en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), - { LOGGING_OUT: "Logging Out", LOGOUT_CONFIRMATION: "Are you sure you want to log out?", LOGOUT: "LOG OUT" } - ), +var defaultTranslationsOAuth2Provider = { + en: logger.__assign(logger.__assign({}, uiEntry.defaultTranslationsCommon.en), { LOGGING_OUT: "Logging Out", LOGOUT_CONFIRMATION: "Are you sure you want to log out?", LOGOUT: "LOG OUT" }), }; -var OAuth2LogoutScreen = function (props) { - var _a, _b, _c; - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var sessionContext = React__namespace.useContext(uiEntry.SessionContext); - var _d = React__namespace.useState(false), - isLoggingOut = _d[0], - setIsLoggingOut = _d[1]; - var recipeComponentOverrides = props.useComponentOverrides(); - var userContext = uiEntry.useUserContext(); - if (props.userContext !== undefined) { - userContext = props.userContext; - } - var logoutChallenge = - (_a = genericComponentOverrideContext.getQueryParams("logoutChallenge")) !== null && _a !== void 0 - ? _a - : undefined; - var navigate = - (_b = props.navigate) !== null && _b !== void 0 - ? _b - : (_c = uiEntry.UI.getReactRouterDomWithCustomHistory()) === null || _c === void 0 - ? void 0 - : _c.useHistoryCustom(); - var onLogout = React__namespace.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var frontendRedirectTo, err_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (logoutChallenge === undefined) { - return [2 /*return*/]; - } - setIsLoggingOut(true); - _a.label = 1; - case 1: - _a.trys.push([1, 4, , 6]); - return [ - 4 /*yield*/, - recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.logOut({ - logoutChallenge: logoutChallenge, - userContext: userContext, - }), - ]; - case 2: - frontendRedirectTo = _a.sent().frontendRedirectTo; - return [ - 4 /*yield*/, - props.recipe.redirect( - { - recipeId: "oauth2provider", - action: "POST_OAUTH2_LOGOUT_REDIRECT", - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - frontendRedirectTo: frontendRedirectTo, - }, - navigate, - {}, - userContext - ), - ]; - case 3: - _a.sent(); - return [3 /*break*/, 6]; - case 4: - err_1 = _a.sent(); - return [4 /*yield*/, session.doesSessionExist(userContext)]; - case 5: - if (!_a.sent()) { - void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() - .redirectToAuth({ - userContext: userContext, - redirectBack: false, - }) - .catch(rethrowInRender); - } else { - rethrowInRender(err_1); - } - return [3 /*break*/, 6]; - case 6: - return [2 /*return*/]; - } - }); - }); - }, - [logoutChallenge, navigate, props.recipe, userContext, rethrowInRender] - ); - React__namespace.useEffect( - function () { - // We wait for session loading to finish - if (sessionContext.loading === false) { - // Redirect to the auth page if there is no logoutChallenge - if (logoutChallenge === undefined) { - void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() - .redirectToAuth({ - userContext: userContext, - redirectBack: false, - }) - .catch(rethrowInRender); - } else { - // Call logOut directly if there is no session - if (sessionContext.doesSessionExist === false) { - void onLogout(); - } - } - } - }, - [userContext, logoutChallenge, sessionContext, onLogout] - ); - var childProps = { - config: props.recipe.config, - showSpinner: sessionContext.loading || sessionContext.doesSessionExist === false, - onLogoutClicked: onLogout, - isLoggingOut: isLoggingOut, - }; - if (logoutChallenge === undefined) { - return null; - } - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, - defaultStore: defaultTranslationsOAuth2Provider, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - OAuth2LogoutScreenTheme, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ), - } - ) - ); +var OAuth2LogoutScreen = function (props) { + var _a, _b, _c; + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var sessionContext = React__namespace.useContext(uiEntry.SessionContext); + var _d = React__namespace.useState(false), isLoggingOut = _d[0], setIsLoggingOut = _d[1]; + var recipeComponentOverrides = props.useComponentOverrides(); + var userContext = uiEntry.useUserContext(); + if (props.userContext !== undefined) { + userContext = props.userContext; + } + var logoutChallenge = (_a = genericComponentOverrideContext.getQueryParams("logoutChallenge")) !== null && _a !== void 0 ? _a : undefined; + var navigate = (_b = props.navigate) !== null && _b !== void 0 ? _b : (_c = uiEntry.UI.getReactRouterDomWithCustomHistory()) === null || _c === void 0 ? void 0 : _c.useHistoryCustom(); + var onLogout = React__namespace.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var frontendRedirectTo, err_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + if (logoutChallenge === undefined) { + return [2 /*return*/]; + } + setIsLoggingOut(true); + _a.label = 1; + case 1: + _a.trys.push([1, 4, , 6]); + return [4 /*yield*/, recipe.OAuth2Provider.getInstanceOrThrow().webJSRecipe.logOut({ + logoutChallenge: logoutChallenge, + userContext: userContext, + })]; + case 2: + frontendRedirectTo = (_a.sent()).frontendRedirectTo; + return [4 /*yield*/, props.recipe.redirect({ + recipeId: "oauth2provider", + action: "POST_OAUTH2_LOGOUT_REDIRECT", + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + frontendRedirectTo: frontendRedirectTo, + }, navigate, {}, userContext)]; + case 3: + _a.sent(); + return [3 /*break*/, 6]; + case 4: + err_1 = _a.sent(); + return [4 /*yield*/, session.doesSessionExist(userContext)]; + case 5: + if (!(_a.sent())) { + void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() + .redirectToAuth({ + userContext: userContext, + redirectBack: false, + }) + .catch(rethrowInRender); + } + else { + rethrowInRender(err_1); + } + return [3 /*break*/, 6]; + case 6: return [2 /*return*/]; + } + }); + }); }, [logoutChallenge, navigate, props.recipe, userContext, rethrowInRender]); + React__namespace.useEffect(function () { + // We wait for session loading to finish + if (sessionContext.loading === false) { + // Redirect to the auth page if there is no logoutChallenge + if (logoutChallenge === undefined) { + void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() + .redirectToAuth({ + userContext: userContext, + redirectBack: false, + }) + .catch(rethrowInRender); + } + else { + // Call logOut directly if there is no session + if (sessionContext.doesSessionExist === false) { + void onLogout(); + } + } + } + }, [userContext, logoutChallenge, sessionContext, onLogout]); + var childProps = { + config: props.recipe.config, + showSpinner: sessionContext.loading || sessionContext.doesSessionExist === false, + onLogoutClicked: onLogout, + isLoggingOut: isLoggingOut, + }; + if (logoutChallenge === undefined) { + return null; + } + return (jsxRuntime.jsx(uiEntry.ComponentOverrideContext.Provider, logger.__assign({ value: recipeComponentOverrides }, { children: jsxRuntime.jsx(uiEntry.FeatureWrapper, logger.__assign({ useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, defaultStore: defaultTranslationsOAuth2Provider }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(OAuth2LogoutScreenTheme, logger.__assign({}, childProps)), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, childProps); + } + return child; + })] }) })) }))); }; -var TryRefreshPage$1 = function (props) { - var _a; - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var sessionContext = React.useContext(uiEntry.SessionContext); - var loginChallenge = - (_a = genericComponentOverrideContext.getQueryParams("loginChallenge")) !== null && _a !== void 0 - ? _a - : undefined; - var userContext = uiEntry.useUserContext(); - if (props.userContext !== undefined) { - userContext = props.userContext; - } - React__namespace.useEffect( - function () { - if (sessionContext.loading === false) { - if (loginChallenge) { - (function () { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var frontendRedirectTo; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.getRedirectURLToContinueOAuthFlow({ - loginChallenge: loginChallenge, - userContext: userContext, - }), - ]; - case 1: - frontendRedirectTo = _a.sent().frontendRedirectTo; - return [ - 2 /*return*/, - props.recipe.redirect( - { - action: "CONTINUE_OAUTH2_AFTER_REFRESH", - frontendRedirectTo: frontendRedirectTo, - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - recipeId: "oauth2provider", - }, - props.navigate, - {}, - userContext - ), - ]; - } - }); - }); - })().catch(rethrowInRender); - } else { - void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() - .redirectToAuth({ - userContext: userContext, - redirectBack: false, - }) - .catch(rethrowInRender); - } - } - }, - [loginChallenge, props.recipe, props.navigate, userContext, sessionContext] - ); - var childProps = { - config: props.recipe.config, - }; - return jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, - defaultStore: defaultTranslationsOAuth2Provider, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && jsxRuntime.jsx(uiEntry.DynamicLoginMethodsSpinner, {}), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ); +var TryRefreshPage$1 = function (props) { + var _a; + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var sessionContext = React.useContext(uiEntry.SessionContext); + var loginChallenge = (_a = genericComponentOverrideContext.getQueryParams("loginChallenge")) !== null && _a !== void 0 ? _a : undefined; + var userContext = uiEntry.useUserContext(); + if (props.userContext !== undefined) { + userContext = props.userContext; + } + React__namespace.useEffect(function () { + if (sessionContext.loading === false) { + if (loginChallenge) { + (function () { + return logger.__awaiter(this, void 0, void 0, function () { + var frontendRedirectTo; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, props.recipe.webJSRecipe.getRedirectURLToContinueOAuthFlow({ + loginChallenge: loginChallenge, + userContext: userContext, + })]; + case 1: + frontendRedirectTo = (_a.sent()).frontendRedirectTo; + return [2 /*return*/, props.recipe.redirect({ + action: "CONTINUE_OAUTH2_AFTER_REFRESH", + frontendRedirectTo: frontendRedirectTo, + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + recipeId: "oauth2provider", + }, props.navigate, {}, userContext)]; + } + }); + }); + })().catch(rethrowInRender); + } + else { + void genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() + .redirectToAuth({ + userContext: userContext, + redirectBack: false, + }) + .catch(rethrowInRender); + } + } + }, [loginChallenge, props.recipe, props.navigate, userContext, sessionContext]); + var childProps = { + config: props.recipe.config, + }; + return (jsxRuntime.jsx(uiEntry.FeatureWrapper, logger.__assign({ useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, defaultStore: defaultTranslationsOAuth2Provider }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(uiEntry.DynamicLoginMethodsSpinner, {}), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, childProps); + } + return child; + })] }) }))); }; -/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var DEFAULT_TRY_REFRESH_PATH = "/try-refresh"; +/* Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var DEFAULT_TRY_REFRESH_PATH = "/try-refresh"; var DEFAULT_OAUTH2_LOGOUT_PATH = "/oauth/logout"; -var OAuth2ProviderPreBuiltUI = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(OAuth2ProviderPreBuiltUI, _super); - function OAuth2ProviderPreBuiltUI(recipeInstance) { - var _this = _super.call(this) || this; - _this.recipeInstance = recipeInstance; - _this.languageTranslations = defaultTranslationsOAuth2Provider; - // Instance methods - _this.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - if (_this.recipeInstance.config.disableDefaultUI) { - return {}; - } - var features = {}; - if (_this.recipeInstance.config.tryRefreshPage.disableDefaultUI !== true) { - var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( - new NormalisedURLPath__default.default(DEFAULT_TRY_REFRESH_PATH) - ); - features[normalisedFullPath.getAsStringDangerous()] = { - matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( - _this.recipeInstance.config.recipeId - ), - component: function (props) { - return _this.getFeatureComponent("try-refresh-page", props, useComponentOverrides); - }, - recipeID: recipe.OAuth2Provider.RECIPE_ID, - }; - } - if (_this.recipeInstance.config.oauth2LogoutScreen.disableDefaultUI !== true) { - var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath( - new NormalisedURLPath__default.default(DEFAULT_OAUTH2_LOGOUT_PATH) - ); - features[normalisedFullPath.getAsStringDangerous()] = { - matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams( - _this.recipeInstance.config.recipeId - ), - component: function (props) { - return _this.getFeatureComponent("oauth2-logout-screen", props, useComponentOverrides); - }, - recipeID: recipe.OAuth2Provider.RECIPE_ID, - }; - } - return features; - }; - _this.getFeatureComponent = function ( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - componentName, - props, - useComponentOverrides - ) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - if (componentName === "try-refresh-page") { - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - session.SessionAuth, - genericComponentOverrideContext.__assign( - { - requireAuth: false, - overrideGlobalClaimValidators: function () { - return []; - }, - }, - { - children: jsxRuntime.jsx( - TryRefreshPage$1, - genericComponentOverrideContext.__assign( - { - recipe: _this.recipeInstance, - useComponentOverrides: useComponentOverrides, - }, - props - ) - ), - } - ) - ), - } - ) - ); - } else if (componentName === "oauth2-logout-screen") { - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - session.SessionAuth, - genericComponentOverrideContext.__assign( - { - requireAuth: false, - overrideGlobalClaimValidators: function () { - return []; - }, - }, - { - children: jsxRuntime.jsx( - OAuth2LogoutScreen, - genericComponentOverrideContext.__assign( - { - recipe: _this.recipeInstance, - useComponentOverrides: useComponentOverrides, - }, - props - ) - ), - } - ) - ), - } - ) - ); - } - throw new Error("Should never come here."); - }; - return _this; - } - // Static methods - OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance = function () { - if (OAuth2ProviderPreBuiltUI.instance === undefined) { - var recipeInstance = recipe.OAuth2Provider.getInstanceOrThrow(); - OAuth2ProviderPreBuiltUI.instance = new OAuth2ProviderPreBuiltUI(recipeInstance); - } - return OAuth2ProviderPreBuiltUI.instance; - }; - OAuth2ProviderPreBuiltUI.getFeatures = function (useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); - }; - OAuth2ProviderPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { - if (useComponentOverrides === void 0) { - useComponentOverrides = componentOverrideContext.useContext; - } - return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - componentName, - props, - useComponentOverrides - ); - }; - OAuth2ProviderPreBuiltUI.prototype.getAuthComponents = function () { - return []; - }; - // For tests - OAuth2ProviderPreBuiltUI.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - OAuth2ProviderPreBuiltUI.instance = undefined; - return; - }; - OAuth2ProviderPreBuiltUI.TryRefreshPage = function (props) { - return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - "try-refresh-page", - props - ); - }; - OAuth2ProviderPreBuiltUI.OAuth2LogoutScreen = function (props) { - return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( - "oauth2-logout-screen", - props - ); - }; - return OAuth2ProviderPreBuiltUI; -})(uiEntry.RecipeRouter); +var OAuth2ProviderPreBuiltUI = /** @class */ (function (_super) { + logger.__extends(OAuth2ProviderPreBuiltUI, _super); + function OAuth2ProviderPreBuiltUI(recipeInstance) { + var _this = _super.call(this) || this; + _this.recipeInstance = recipeInstance; + _this.languageTranslations = defaultTranslationsOAuth2Provider; + // Instance methods + _this.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + if (_this.recipeInstance.config.disableDefaultUI) { + return {}; + } + var features = {}; + if (_this.recipeInstance.config.tryRefreshPage.disableDefaultUI !== true) { + var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default.default(DEFAULT_TRY_REFRESH_PATH)); + features[normalisedFullPath.getAsStringDangerous()] = { + matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams(_this.recipeInstance.config.recipeId), + component: function (props) { return _this.getFeatureComponent("try-refresh-page", props, useComponentOverrides); }, + recipeID: recipe.OAuth2Provider.RECIPE_ID, + }; + } + if (_this.recipeInstance.config.oauth2LogoutScreen.disableDefaultUI !== true) { + var normalisedFullPath = _this.recipeInstance.config.appInfo.websiteBasePath.appendPath(new NormalisedURLPath__default.default(DEFAULT_OAUTH2_LOGOUT_PATH)); + features[normalisedFullPath.getAsStringDangerous()] = { + matches: genericComponentOverrideContext.matchRecipeIdUsingQueryParams(_this.recipeInstance.config.recipeId), + component: function (props) { + return _this.getFeatureComponent("oauth2-logout-screen", props, useComponentOverrides); + }, + recipeID: recipe.OAuth2Provider.RECIPE_ID, + }; + } + return features; + }; + _this.getFeatureComponent = function ( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + if (componentName === "try-refresh-page") { + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(session.SessionAuth, logger.__assign({ requireAuth: false, overrideGlobalClaimValidators: function () { return []; } }, { children: jsxRuntime.jsx(TryRefreshPage$1, logger.__assign({ recipe: _this.recipeInstance, useComponentOverrides: useComponentOverrides }, props)) })) }))); + } + else if (componentName === "oauth2-logout-screen") { + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(session.SessionAuth, logger.__assign({ requireAuth: false, overrideGlobalClaimValidators: function () { return []; } }, { children: jsxRuntime.jsx(OAuth2LogoutScreen, logger.__assign({ recipe: _this.recipeInstance, useComponentOverrides: useComponentOverrides }, props)) })) }))); + } + throw new Error("Should never come here."); + }; + return _this; + } + // Static methods + OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance = function () { + if (OAuth2ProviderPreBuiltUI.instance === undefined) { + var recipeInstance = recipe.OAuth2Provider.getInstanceOrThrow(); + OAuth2ProviderPreBuiltUI.instance = new OAuth2ProviderPreBuiltUI(recipeInstance); + } + return OAuth2ProviderPreBuiltUI.instance; + }; + OAuth2ProviderPreBuiltUI.getFeatures = function (useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatures(useComponentOverrides); + }; + OAuth2ProviderPreBuiltUI.getFeatureComponent = function (componentName, props, useComponentOverrides) { + if (useComponentOverrides === void 0) { useComponentOverrides = componentOverrideContext.useContext; } + return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent(componentName, props, useComponentOverrides); + }; + OAuth2ProviderPreBuiltUI.prototype.getAuthComponents = function () { + return []; + }; + // For tests + OAuth2ProviderPreBuiltUI.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + OAuth2ProviderPreBuiltUI.instance = undefined; + return; + }; + OAuth2ProviderPreBuiltUI.TryRefreshPage = function (props) { + return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("try-refresh-page", props); + }; + OAuth2ProviderPreBuiltUI.OAuth2LogoutScreen = function (props) { + return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("oauth2-logout-screen", props); + }; + return OAuth2ProviderPreBuiltUI; +}(uiEntry.RecipeRouter)); var TryRefreshPage = OAuth2ProviderPreBuiltUI.TryRefreshPage; exports.OAuth2ProviderPreBuiltUI = OAuth2ProviderPreBuiltUI; diff --git a/lib/build/passwordless-shared.js b/lib/build/passwordless-shared.js index 099cb859c..6ab6fd601 100644 --- a/lib/build/passwordless-shared.js +++ b/lib/build/passwordless-shared.js @@ -1,544 +1,355 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var PasswordlessWebJS = require("supertokens-web-js/recipe/passwordless"); -var postSuperTokensInitCallbacks = require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -var jsxRuntime = require("react/jsx-runtime"); -var index = require("./authRecipe-shared2.js"); -var recipe = require("./multifactorauth-shared2.js"); -var types = require("./multifactorauth-shared.js"); -var utils = require("./authRecipe-shared.js"); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var logger = require('./logger.js'); +var PasswordlessWebJS = require('supertokens-web-js/recipe/passwordless'); +var postSuperTokensInitCallbacks = require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +var jsxRuntime = require('react/jsx-runtime'); +var index = require('./authRecipe-shared2.js'); +var recipe = require('./multifactorauth-shared2.js'); +var types = require('./multifactorauth-shared.js'); +var utils = require('./authRecipe-shared.js'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } -var PasswordlessWebJS__default = /*#__PURE__*/ _interopDefault(PasswordlessWebJS); +var PasswordlessWebJS__default = /*#__PURE__*/_interopDefault(PasswordlessWebJS); -var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), - useContext = _a[0], - Provider = _a[1]; +var _a = genericComponentOverrideContext.createGenericComponentsOverrideContext(), useContext = _a[0], Provider = _a[1]; -var OTPEmailIcon = function () { - return jsxRuntime.jsxs( - "svg", - genericComponentOverrideContext.__assign( - { width: "17", height: "15", viewBox: "0 0 17 15", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, - { - children: [ - jsxRuntime.jsx("path", { - id: "image 414 (Traced)", - fillRule: "evenodd", - clipRule: "evenodd", - d: "M2.01513 0.0546421C1.19571 0.195435 0.393224 0.877322 0.143564 1.64496C0.0564841 1.9127 -0.00197242 1.84636 0.659082 2.22993C0.91105 2.37612 1.64082 2.80042 2.28084 3.17276C2.92086 3.54514 3.96809 4.1544 4.60811 4.52674C5.24813 4.89905 6.37321 5.55428 7.10833 5.98278C7.84346 6.41131 8.46401 6.7689 8.48736 6.77743C8.52111 6.78982 10.4367 5.69077 12.6253 4.40341C12.7865 4.30852 13.8173 3.70613 14.9159 3.06475L16.9133 1.89856L16.903 1.78079C16.8974 1.71603 16.8178 1.51568 16.7262 1.3356C16.3776 0.650318 15.6775 0.156143 14.8905 0.039982C14.4716 -0.0218423 2.38016 -0.00809191 2.01513 0.0546421ZM6.60933e-06 6.62054C0.000739608 10.251 -0.00834948 10.1158 0.27063 10.655C0.659815 11.4073 1.39721 11.8833 2.30408 11.9675C2.77169 12.0109 14.2345 12.0108 14.7024 11.9673C15.3604 11.9062 15.8152 11.7008 16.2911 11.2498C16.5236 11.0295 16.619 10.9066 16.7395 10.6725C17.0173 10.133 17.0065 10.3025 16.996 6.65494L16.9866 3.40211L15.8322 4.07294C15.1972 4.44186 13.9767 5.15156 13.1201 5.65004C11.2459 6.74049 10.2603 7.31342 9.46206 7.77628C8.76656 8.17962 8.59368 8.23389 8.2745 8.14908C8.14446 8.11454 7.64668 7.84559 6.81451 7.36034C4.15032 5.80665 0.097862 3.44588 0.0268711 3.40617C0.0117346 3.39774 -0.00032324 4.84419 6.60933e-06 6.62054Z", - fill: "url(#paint0_linear_4445_310)", - }), - jsxRuntime.jsx("defs", { - children: jsxRuntime.jsxs( - "linearGradient", - genericComponentOverrideContext.__assign( - { - id: "paint0_linear_4445_310", - x1: "8.5", - y1: "0", - x2: "8.5", - y2: "12", - gradientUnits: "userSpaceOnUse", - }, - { - children: [ - jsxRuntime.jsx("stop", { stopColor: "#1C222A" }), - jsxRuntime.jsx("stop", { offset: "1", stopColor: "#1C222A" }), - ], - } - ) - ), - }), - ], - } - ) - ); -}; +var OTPEmailIcon = function () { return (jsxRuntime.jsxs("svg", logger.__assign({ width: "17", height: "15", viewBox: "0 0 17 15", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: [jsxRuntime.jsx("path", { id: "image 414 (Traced)", fillRule: "evenodd", clipRule: "evenodd", d: "M2.01513 0.0546421C1.19571 0.195435 0.393224 0.877322 0.143564 1.64496C0.0564841 1.9127 -0.00197242 1.84636 0.659082 2.22993C0.91105 2.37612 1.64082 2.80042 2.28084 3.17276C2.92086 3.54514 3.96809 4.1544 4.60811 4.52674C5.24813 4.89905 6.37321 5.55428 7.10833 5.98278C7.84346 6.41131 8.46401 6.7689 8.48736 6.77743C8.52111 6.78982 10.4367 5.69077 12.6253 4.40341C12.7865 4.30852 13.8173 3.70613 14.9159 3.06475L16.9133 1.89856L16.903 1.78079C16.8974 1.71603 16.8178 1.51568 16.7262 1.3356C16.3776 0.650318 15.6775 0.156143 14.8905 0.039982C14.4716 -0.0218423 2.38016 -0.00809191 2.01513 0.0546421ZM6.60933e-06 6.62054C0.000739608 10.251 -0.00834948 10.1158 0.27063 10.655C0.659815 11.4073 1.39721 11.8833 2.30408 11.9675C2.77169 12.0109 14.2345 12.0108 14.7024 11.9673C15.3604 11.9062 15.8152 11.7008 16.2911 11.2498C16.5236 11.0295 16.619 10.9066 16.7395 10.6725C17.0173 10.133 17.0065 10.3025 16.996 6.65494L16.9866 3.40211L15.8322 4.07294C15.1972 4.44186 13.9767 5.15156 13.1201 5.65004C11.2459 6.74049 10.2603 7.31342 9.46206 7.77628C8.76656 8.17962 8.59368 8.23389 8.2745 8.14908C8.14446 8.11454 7.64668 7.84559 6.81451 7.36034C4.15032 5.80665 0.097862 3.44588 0.0268711 3.40617C0.0117346 3.39774 -0.00032324 4.84419 6.60933e-06 6.62054Z", fill: "url(#paint0_linear_4445_310)" }), jsxRuntime.jsx("defs", { children: jsxRuntime.jsxs("linearGradient", logger.__assign({ id: "paint0_linear_4445_310", x1: "8.5", y1: "0", x2: "8.5", y2: "12", gradientUnits: "userSpaceOnUse" }, { children: [jsxRuntime.jsx("stop", { stopColor: "#1C222A" }), jsxRuntime.jsx("stop", { offset: "1", stopColor: "#1C222A" })] })) })] }))); }; -var OTPSMSIcon = function () { - return jsxRuntime.jsxs( - "svg", - genericComponentOverrideContext.__assign( - { width: "17", height: "15", viewBox: "0 0 17 15", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, - { - children: [ - jsxRuntime.jsx("path", { - id: "image 412 (Traced)", - fillRule: "evenodd", - clipRule: "evenodd", - d: "M2.23143 0.0484105C1.11677 0.26606 0.230705 1.14148 0.0548812 2.19882C0.0207171 2.40417 -0.000319148 3.89779 3.66265e-06 6.09367C0.000595481 10.0175 0.00446909 10.0713 0.330507 10.706C0.544477 11.1223 1.03692 11.597 1.49058 11.8243C1.9253 12.042 2.4213 12.1389 3.10571 12.14L3.65718 12.1409L3.65739 13.3581C3.65755 14.4585 3.66729 14.5903 3.75859 14.733C3.88347 14.9281 4.1338 15.0332 4.37209 14.9906C4.50192 14.9674 5.03536 14.5737 6.32332 13.5507L8.09582 12.1427L11.2701 12.1409C14.8062 12.1389 14.8922 12.1322 15.5441 11.8059C15.9514 11.602 16.4058 11.1868 16.6406 10.8041C16.7198 10.6748 16.8331 10.3886 16.8923 10.1681C16.9951 9.78536 17 9.6 17 6.0949C17 3.67866 16.98 2.31864 16.9417 2.11857C16.7993 1.37604 16.1965 0.620747 15.4792 0.286303C15.2652 0.186472 14.9464 0.0801328 14.7708 0.049999C14.3886 -0.0156495 2.5671 -0.0171356 2.23143 0.0484105ZM5.24433 4.97226C5.37743 5.00736 5.55471 5.1197 5.70901 5.26668C6.20818 5.74216 6.20834 6.40218 5.70933 6.86336C5.19445 7.3393 4.53167 7.33945 4.03228 6.86382C3.54451 6.3992 3.53069 5.75907 3.99822 5.28943C4.33561 4.95053 4.75602 4.84352 5.24433 4.97226ZM8.87594 4.96544C9.55686 5.14589 9.9071 5.95945 9.57246 6.58313C9.13161 7.40469 7.91806 7.41591 7.45342 6.60271C7.32215 6.37302 7.3066 6.29861 7.32494 5.98907C7.34211 5.69977 7.37455 5.59794 7.50653 5.41904C7.804 5.01592 8.36509 4.83005 8.87594 4.96544ZM12.7023 5.05815C13.4409 5.4257 13.5612 6.36097 12.94 6.90635C12.6706 7.14291 12.3468 7.24567 12.0095 7.20164C11.0115 7.07132 10.59 5.99614 11.2623 5.29563C11.6485 4.89313 12.1909 4.80365 12.7023 5.05815Z", - fill: "url(#paint0_linear_4445_316)", - }), - jsxRuntime.jsx("defs", { - children: jsxRuntime.jsxs( - "linearGradient", - genericComponentOverrideContext.__assign( - { - id: "paint0_linear_4445_316", - x1: "8.5", - y1: "0", - x2: "8.5", - y2: "15", - gradientUnits: "userSpaceOnUse", - }, - { - children: [ - jsxRuntime.jsx("stop", { stopColor: "#1C222A" }), - jsxRuntime.jsx("stop", { offset: "1", stopColor: "#1C222A" }), - ], - } - ) - ), - }), - ], - } - ) - ); -}; +var OTPSMSIcon = function () { return (jsxRuntime.jsxs("svg", logger.__assign({ width: "17", height: "15", viewBox: "0 0 17 15", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: [jsxRuntime.jsx("path", { id: "image 412 (Traced)", fillRule: "evenodd", clipRule: "evenodd", d: "M2.23143 0.0484105C1.11677 0.26606 0.230705 1.14148 0.0548812 2.19882C0.0207171 2.40417 -0.000319148 3.89779 3.66265e-06 6.09367C0.000595481 10.0175 0.00446909 10.0713 0.330507 10.706C0.544477 11.1223 1.03692 11.597 1.49058 11.8243C1.9253 12.042 2.4213 12.1389 3.10571 12.14L3.65718 12.1409L3.65739 13.3581C3.65755 14.4585 3.66729 14.5903 3.75859 14.733C3.88347 14.9281 4.1338 15.0332 4.37209 14.9906C4.50192 14.9674 5.03536 14.5737 6.32332 13.5507L8.09582 12.1427L11.2701 12.1409C14.8062 12.1389 14.8922 12.1322 15.5441 11.8059C15.9514 11.602 16.4058 11.1868 16.6406 10.8041C16.7198 10.6748 16.8331 10.3886 16.8923 10.1681C16.9951 9.78536 17 9.6 17 6.0949C17 3.67866 16.98 2.31864 16.9417 2.11857C16.7993 1.37604 16.1965 0.620747 15.4792 0.286303C15.2652 0.186472 14.9464 0.0801328 14.7708 0.049999C14.3886 -0.0156495 2.5671 -0.0171356 2.23143 0.0484105ZM5.24433 4.97226C5.37743 5.00736 5.55471 5.1197 5.70901 5.26668C6.20818 5.74216 6.20834 6.40218 5.70933 6.86336C5.19445 7.3393 4.53167 7.33945 4.03228 6.86382C3.54451 6.3992 3.53069 5.75907 3.99822 5.28943C4.33561 4.95053 4.75602 4.84352 5.24433 4.97226ZM8.87594 4.96544C9.55686 5.14589 9.9071 5.95945 9.57246 6.58313C9.13161 7.40469 7.91806 7.41591 7.45342 6.60271C7.32215 6.37302 7.3066 6.29861 7.32494 5.98907C7.34211 5.69977 7.37455 5.59794 7.50653 5.41904C7.804 5.01592 8.36509 4.83005 8.87594 4.96544ZM12.7023 5.05815C13.4409 5.4257 13.5612 6.36097 12.94 6.90635C12.6706 7.14291 12.3468 7.24567 12.0095 7.20164C11.0115 7.07132 10.59 5.99614 11.2623 5.29563C11.6485 4.89313 12.1909 4.80365 12.7023 5.05815Z", fill: "url(#paint0_linear_4445_316)" }), jsxRuntime.jsx("defs", { children: jsxRuntime.jsxs("linearGradient", logger.__assign({ id: "paint0_linear_4445_316", x1: "8.5", y1: "0", x2: "8.5", y2: "15", gradientUnits: "userSpaceOnUse" }, { children: [jsxRuntime.jsx("stop", { stopColor: "#1C222A" }), jsxRuntime.jsx("stop", { offset: "1", stopColor: "#1C222A" })] })) })] }))); }; -var getFunctionOverrides = function (onHandleEvent) { - return function (originalImp) { - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, originalImp), { - createCode: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImp.createCode(input)]; - case 1: - response = _a.sent(); - if (response.status === "OK") { - onHandleEvent({ - action: "PASSWORDLESS_CODE_SENT", - isResend: false, - }); - } - return [2 /*return*/, response]; - } - }); - }); - }, - resendCode: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var response; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImp.resendCode(input)]; - case 1: - response = _a.sent(); - if (response.status === "RESTART_FLOW_ERROR") { - onHandleEvent({ - action: "PASSWORDLESS_RESTART_FLOW", - }); - } else if (response.status === "OK") { - onHandleEvent({ - action: "PASSWORDLESS_CODE_SENT", - isResend: true, - }); - } - return [2 /*return*/, response]; - } - }); - }); - }, - consumeCode: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var payloadBeforeCall, response, payloadAfterCall; - return genericComponentOverrideContext.__generator(this, function (_c) { - switch (_c.label) { - case 0: - _c.trys.push([0, 2, , 3]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: input.userContext, - }), - ]; - case 1: - payloadBeforeCall = _c.sent(); - return [3 /*break*/, 3]; - case 2: - _c.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadBeforeCall = undefined; - return [3 /*break*/, 3]; - case 3: - return [4 /*yield*/, originalImp.consumeCode(input)]; - case 4: - response = _c.sent(); - if (!(response.status === "RESTART_FLOW_ERROR")) return [3 /*break*/, 5]; - onHandleEvent({ - action: "PASSWORDLESS_RESTART_FLOW", - }); - return [3 /*break*/, 10]; - case 5: - if (!(response.status === "OK")) return [3 /*break*/, 10]; - payloadAfterCall = void 0; - _c.label = 6; - case 6: - _c.trys.push([6, 8, , 9]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: input.userContext, - }), - ]; - case 7: - payloadAfterCall = _c.sent(); - return [3 /*break*/, 9]; - case 8: - _c.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadAfterCall = undefined; - return [3 /*break*/, 9]; - case 9: - onHandleEvent({ - action: "SUCCESS", - isNewRecipeUser: response.createdNewRecipeUser, - user: response.user, - createdNewSession: - payloadAfterCall !== undefined && - (payloadBeforeCall === undefined || - payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), - }); - _c.label = 10; - case 10: - return [2 /*return*/, response]; - } - }); - }); - }, - setLoginAttemptInfo: function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - originalImp.setLoginAttemptInfo( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, input), - { - attemptInfo: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, input.attemptInfo), - input.userContext.additionalAttemptInfo - ), - } - ) - ), - ]; - }); - }); - }, - }); - }; +var getFunctionOverrides = function (onHandleEvent) { + return function (originalImp) { return (logger.__assign(logger.__assign({}, originalImp), { createCode: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.createCode(input)]; + case 1: + response = _a.sent(); + if (response.status === "OK") { + onHandleEvent({ + action: "PASSWORDLESS_CODE_SENT", + isResend: false, + }); + } + return [2 /*return*/, response]; + } + }); + }); + }, resendCode: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var response; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImp.resendCode(input)]; + case 1: + response = _a.sent(); + if (response.status === "RESTART_FLOW_ERROR") { + onHandleEvent({ + action: "PASSWORDLESS_RESTART_FLOW", + }); + } + else if (response.status === "OK") { + onHandleEvent({ + action: "PASSWORDLESS_CODE_SENT", + isResend: true, + }); + } + return [2 /*return*/, response]; + } + }); + }); + }, consumeCode: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + var payloadBeforeCall, response, payloadAfterCall; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + _c.trys.push([0, 2, , 3]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: input.userContext, + })]; + case 1: + payloadBeforeCall = _c.sent(); + return [3 /*break*/, 3]; + case 2: + _c.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadBeforeCall = undefined; + return [3 /*break*/, 3]; + case 3: return [4 /*yield*/, originalImp.consumeCode(input)]; + case 4: + response = _c.sent(); + if (!(response.status === "RESTART_FLOW_ERROR")) return [3 /*break*/, 5]; + onHandleEvent({ + action: "PASSWORDLESS_RESTART_FLOW", + }); + return [3 /*break*/, 10]; + case 5: + if (!(response.status === "OK")) return [3 /*break*/, 10]; + payloadAfterCall = void 0; + _c.label = 6; + case 6: + _c.trys.push([6, 8, , 9]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: input.userContext, + })]; + case 7: + payloadAfterCall = _c.sent(); + return [3 /*break*/, 9]; + case 8: + _c.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadAfterCall = undefined; + return [3 /*break*/, 9]; + case 9: + onHandleEvent({ + action: "SUCCESS", + isNewRecipeUser: response.createdNewRecipeUser, + user: response.user, + createdNewSession: payloadAfterCall !== undefined && + (payloadBeforeCall === undefined || + payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), + }); + _c.label = 10; + case 10: return [2 /*return*/, response]; + } + }); + }); + }, setLoginAttemptInfo: function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, originalImp.setLoginAttemptInfo(logger.__assign(logger.__assign({}, input), { attemptInfo: logger.__assign(logger.__assign({}, input.attemptInfo), input.userContext.additionalAttemptInfo) }))]; + }); + }); + } })); }; }; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function defaultEmailValidator(value) { - if (typeof value !== "string") { - return "GENERAL_ERROR_EMAIL_NON_STRING"; - } - value = value.trim(); - var defaultEmailValidatorRegexp = - // eslint-disable-next-line no-useless-escape - /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - // We check if the email syntax is correct - // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 - // Regex from https://stackoverflow.com/a/46181/3867175 - if (value.match(defaultEmailValidatorRegexp) === null) { - return "GENERAL_ERROR_EMAIL_INVALID"; - } - return undefined; -} -function userInputCodeValidate(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - if (typeof value !== "string") { - return [2 /*return*/, "GENERAL_ERROR_OTP_NON_STRING"]; - } - if (value.length === 0) { - return [2 /*return*/, "GENERAL_ERROR_OTP_EMPTY"]; - } - return [2 /*return*/, undefined]; - }); - }); -} -/* - * defaultValidate - */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function defaultValidate(_) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [2 /*return*/, undefined]; - }); - }); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function defaultEmailValidator(value) { + if (typeof value !== "string") { + return "GENERAL_ERROR_EMAIL_NON_STRING"; + } + value = value.trim(); + var defaultEmailValidatorRegexp = + // eslint-disable-next-line no-useless-escape + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + // We check if the email syntax is correct + // As per https://github.com/supertokens/supertokens-auth-react/issues/5#issuecomment-709512438 + // Regex from https://stackoverflow.com/a/46181/3867175 + if (value.match(defaultEmailValidatorRegexp) === null) { + return "GENERAL_ERROR_EMAIL_INVALID"; + } + return undefined; +} +function userInputCodeValidate(value) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + if (typeof value !== "string") { + return [2 /*return*/, "GENERAL_ERROR_OTP_NON_STRING"]; + } + if (value.length === 0) { + return [2 /*return*/, "GENERAL_ERROR_OTP_EMPTY"]; + } + return [2 /*return*/, undefined]; + }); + }); +} +/* + * defaultValidate + */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +function defaultValidate(_) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, undefined]; + }); + }); } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -function normalisePasswordlessConfig(config) { - if (config === undefined) { - throw new Error("Passwordless config should not be empty"); - } - if (!["EMAIL", "PHONE", "EMAIL_OR_PHONE"].includes(config.contactMethod)) { - throw new Error("Please pass one of 'PHONE', 'EMAIL' or 'EMAIL_OR_PHONE' as the contactMethod"); - } - var signInUpFeature = normalizeSignInUpFeatureConfig(config.signInUpFeature, config); - var override = genericComponentOverrideContext.__assign( - { - functions: function (originalImplementation) { - return originalImplementation; - }, - }, - config.override - ); - var validateEmailAddress = defaultEmailValidator; - if ( - (config.contactMethod === "EMAIL" || config.contactMethod === "EMAIL_OR_PHONE") && - config.validateEmailAddress !== undefined - ) { - validateEmailAddress = config.validateEmailAddress; - } - var validatePhoneNumber = undefined; - if ( - (config.contactMethod === "PHONE" || config.contactMethod === "EMAIL_OR_PHONE") && - config.validatePhoneNumber !== undefined - ) { - validatePhoneNumber = config.validatePhoneNumber; - } - return genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, utils.normaliseAuthRecipe(config)), - { - validateEmailAddress: validateEmailAddress, - validatePhoneNumber: validatePhoneNumber, - signInUpFeature: signInUpFeature, - linkClickedScreenFeature: normalisePasswordlessBaseConfig(config.linkClickedScreenFeature), - mfaFeature: normalisePasswordlessBaseConfig(config.mfaFeature), - contactMethod: config.contactMethod, - override: override, - } - ); -} -function normalizeSignInUpFeatureConfig(signInUpInput, config) { - if ( - (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.resendEmailOrSMSGapInSeconds) !== - undefined && - signInUpInput.resendEmailOrSMSGapInSeconds <= 0 - ) { - throw new Error("Please pass a positive number as resendEmailOrSMSGapInSeconds"); - } - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, signInUpInput), { - resendEmailOrSMSGapInSeconds: - (signInUpInput === null || signInUpInput === void 0 - ? void 0 - : signInUpInput.resendEmailOrSMSGapInSeconds) === undefined - ? 15 - : signInUpInput.resendEmailOrSMSGapInSeconds, - emailOrPhoneFormStyle: - (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.emailOrPhoneFormStyle) !== - undefined - ? signInUpInput.emailOrPhoneFormStyle - : "", - linkSentScreenStyle: - (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.linkSentScreenStyle) !== - undefined - ? signInUpInput.linkSentScreenStyle - : "", - userInputCodeFormStyle: - (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.userInputCodeFormStyle) !== - undefined - ? signInUpInput.userInputCodeFormStyle - : "", - defaultCountry: - ["PHONE", "EMAIL_OR_PHONE"].includes(config.contactMethod) && - signInUpInput !== undefined && - "defaultCountry" in signInUpInput - ? signInUpInput.defaultCountry - : undefined, - defaultToEmail: - signInUpInput !== undefined && - "defaultToEmail" in signInUpInput && - signInUpInput.defaultToEmail !== undefined - ? signInUpInput.defaultToEmail - : true, - }); -} -function normalisePasswordlessBaseConfig(config) { - var style = config && config.style !== undefined ? config.style : ""; - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, config), { - style: style, - }); -} -function checkAdditionalLoginAttemptInfoProperties(loginAttemptInfo) { - if ( - loginAttemptInfo.contactInfo === undefined || - loginAttemptInfo.contactMethod === undefined || - loginAttemptInfo.lastResend === undefined - ) { - return false; - } - return true; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +function normalisePasswordlessConfig(config) { + if (config === undefined) { + throw new Error("Passwordless config should not be empty"); + } + if (!["EMAIL", "PHONE", "EMAIL_OR_PHONE"].includes(config.contactMethod)) { + throw new Error("Please pass one of 'PHONE', 'EMAIL' or 'EMAIL_OR_PHONE' as the contactMethod"); + } + var signInUpFeature = normalizeSignInUpFeatureConfig(config.signInUpFeature, config); + var override = logger.__assign({ functions: function (originalImplementation) { return originalImplementation; } }, config.override); + var validateEmailAddress = defaultEmailValidator; + if ((config.contactMethod === "EMAIL" || config.contactMethod === "EMAIL_OR_PHONE") && + config.validateEmailAddress !== undefined) { + validateEmailAddress = config.validateEmailAddress; + } + var validatePhoneNumber = undefined; + if ((config.contactMethod === "PHONE" || config.contactMethod === "EMAIL_OR_PHONE") && + config.validatePhoneNumber !== undefined) { + validatePhoneNumber = config.validatePhoneNumber; + } + return logger.__assign(logger.__assign({}, utils.normaliseAuthRecipe(config)), { validateEmailAddress: validateEmailAddress, validatePhoneNumber: validatePhoneNumber, signInUpFeature: signInUpFeature, linkClickedScreenFeature: normalisePasswordlessBaseConfig(config.linkClickedScreenFeature), mfaFeature: normalisePasswordlessBaseConfig(config.mfaFeature), contactMethod: config.contactMethod, override: override }); +} +function normalizeSignInUpFeatureConfig(signInUpInput, config) { + if ((signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.resendEmailOrSMSGapInSeconds) !== undefined && signInUpInput.resendEmailOrSMSGapInSeconds <= 0) { + throw new Error("Please pass a positive number as resendEmailOrSMSGapInSeconds"); + } + return logger.__assign(logger.__assign({}, signInUpInput), { resendEmailOrSMSGapInSeconds: (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.resendEmailOrSMSGapInSeconds) === undefined ? 15 : signInUpInput.resendEmailOrSMSGapInSeconds, emailOrPhoneFormStyle: (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.emailOrPhoneFormStyle) !== undefined ? signInUpInput.emailOrPhoneFormStyle : "", linkSentScreenStyle: (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.linkSentScreenStyle) !== undefined ? signInUpInput.linkSentScreenStyle : "", userInputCodeFormStyle: (signInUpInput === null || signInUpInput === void 0 ? void 0 : signInUpInput.userInputCodeFormStyle) !== undefined ? signInUpInput.userInputCodeFormStyle : "", defaultCountry: ["PHONE", "EMAIL_OR_PHONE"].includes(config.contactMethod) && + signInUpInput !== undefined && + "defaultCountry" in signInUpInput + ? signInUpInput.defaultCountry + : undefined, defaultToEmail: signInUpInput !== undefined && + "defaultToEmail" in signInUpInput && + signInUpInput.defaultToEmail !== undefined + ? signInUpInput.defaultToEmail + : true }); +} +function normalisePasswordlessBaseConfig(config) { + var style = config && config.style !== undefined ? config.style : ""; + return logger.__assign(logger.__assign({}, config), { style: style }); +} +function checkAdditionalLoginAttemptInfoProperties(loginAttemptInfo) { + if (loginAttemptInfo.contactInfo === undefined || + loginAttemptInfo.contactMethod === undefined || + loginAttemptInfo.lastResend === undefined) { + return false; + } + return true; } -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var otpPhoneFactor = { - id: types.FactorIds.OTP_PHONE, - name: "PWLESS_MFA_OTP_PHONE_NAME", - description: "PWLESS_MFA_OTP_PHONE_DESCRIPTION", - path: "/mfa/otp-phone", - logo: OTPSMSIcon, -}; -var otpEmailFactor = { - id: types.FactorIds.OTP_EMAIL, - name: "PWLESS_MFA_OTP_EMAIL_NAME", - description: "PWLESS_MFA_OTP_EMAIL_DESCRIPTION", - path: "/mfa/otp-email", - logo: OTPEmailIcon, -}; -/* - * Class. - */ -var Passwordless = /** @class */ (function (_super) { - genericComponentOverrideContext.__extends(Passwordless, _super); - function Passwordless(config, webJSRecipe) { - if (webJSRecipe === void 0) { - webJSRecipe = PasswordlessWebJS__default.default; - } - var _this = _super.call(this, config) || this; - _this.webJSRecipe = webJSRecipe; - _this.recipeID = Passwordless.RECIPE_ID; - _this.firstFactorIds = [ - types.FactorIds.OTP_EMAIL, - types.FactorIds.OTP_PHONE, - types.FactorIds.LINK_EMAIL, - types.FactorIds.LINK_PHONE, - ]; - _this.getDefaultRedirectionURL = function (context) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [2 /*return*/, this.getAuthRecipeDefaultRedirectionURL(context)]; - }); - }); - }; - _this.recipeID = config.recipeId; - postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.addPostInitCallback(function () { - var mfa = recipe.MultiFactorAuth.getInstance(); - if (mfa !== undefined) { - mfa.addMFAFactors([otpPhoneFactor, otpEmailFactor]); - } - }); - return _this; - } - Passwordless.prototype.getFirstFactorsForAuthPage = function () { - if (this.config.contactMethod === "EMAIL") { - return [types.FactorIds.OTP_EMAIL, types.FactorIds.LINK_EMAIL]; - } - if (this.config.contactMethod === "PHONE") { - return [types.FactorIds.OTP_PHONE, types.FactorIds.LINK_PHONE]; - } - return this.firstFactorIds; - }; - Passwordless.init = function (config) { - var normalisedConfig = normalisePasswordlessConfig(config); - return { - recipeID: Passwordless.RECIPE_ID, - authReact: function (appInfo) { - Passwordless.instance = new Passwordless( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { appInfo: appInfo, recipeId: Passwordless.RECIPE_ID } - ) - ); - return Passwordless.instance; - }, - webJS: PasswordlessWebJS__default.default.init( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { - override: { - functions: function (originalImpl, builder) { - var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; - }, - }, - } - ) - ), - }; - }; - Passwordless.getInstanceOrThrow = function () { - if (Passwordless.instance === undefined) { - var error = - "No instance of Passwordless found. Make sure to call the Passwordless.init method." + - "See https://supertokens.io/docs/passwordless/quick-setup/frontend"; - // eslint-disable-next-line supertokens-auth-react/no-direct-window-object - if (typeof window === "undefined") { - error = error + genericComponentOverrideContext.SSR_ERROR; - } - throw Error(error); - } - return Passwordless.instance; - }; - /* - * Tests methods. - */ - Passwordless.reset = function () { - if (!genericComponentOverrideContext.isTest()) { - return; - } - Passwordless.instance = undefined; - return; - }; - Passwordless.RECIPE_ID = "passwordless"; - return Passwordless; -})(index.AuthRecipe); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var otpPhoneFactor = { + id: types.FactorIds.OTP_PHONE, + name: "PWLESS_MFA_OTP_PHONE_NAME", + description: "PWLESS_MFA_OTP_PHONE_DESCRIPTION", + path: "/mfa/otp-phone", + logo: OTPSMSIcon, +}; +var otpEmailFactor = { + id: types.FactorIds.OTP_EMAIL, + name: "PWLESS_MFA_OTP_EMAIL_NAME", + description: "PWLESS_MFA_OTP_EMAIL_DESCRIPTION", + path: "/mfa/otp-email", + logo: OTPEmailIcon, +}; +/* + * Class. + */ +var Passwordless = /** @class */ (function (_super) { + logger.__extends(Passwordless, _super); + function Passwordless(config, webJSRecipe) { + if (webJSRecipe === void 0) { webJSRecipe = PasswordlessWebJS__default.default; } + var _this = _super.call(this, config) || this; + _this.webJSRecipe = webJSRecipe; + _this.recipeID = Passwordless.RECIPE_ID; + _this.firstFactorIds = [types.FactorIds.OTP_EMAIL, types.FactorIds.OTP_PHONE, types.FactorIds.LINK_EMAIL, types.FactorIds.LINK_PHONE]; + _this.getDefaultRedirectionURL = function (context) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, this.getAuthRecipeDefaultRedirectionURL(context)]; + }); + }); }; + _this.recipeID = config.recipeId; + postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.addPostInitCallback(function () { + var mfa = recipe.MultiFactorAuth.getInstance(); + if (mfa !== undefined) { + mfa.addMFAFactors([otpPhoneFactor, otpEmailFactor]); + } + }); + return _this; + } + Passwordless.prototype.getFirstFactorsForAuthPage = function () { + if (this.config.contactMethod === "EMAIL") { + return [types.FactorIds.OTP_EMAIL, types.FactorIds.LINK_EMAIL]; + } + if (this.config.contactMethod === "PHONE") { + return [types.FactorIds.OTP_PHONE, types.FactorIds.LINK_PHONE]; + } + return this.firstFactorIds; + }; + Passwordless.init = function (config) { + var normalisedConfig = normalisePasswordlessConfig(config); + return { + recipeID: Passwordless.RECIPE_ID, + authReact: function (appInfo) { + Passwordless.instance = new Passwordless(logger.__assign(logger.__assign({}, normalisedConfig), { appInfo: appInfo, recipeId: Passwordless.RECIPE_ID })); + return Passwordless.instance; + }, + webJS: PasswordlessWebJS__default.default.init(logger.__assign(logger.__assign({}, normalisedConfig), { override: { + functions: function (originalImpl, builder) { + var functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, + } })), + }; + }; + Passwordless.getInstanceOrThrow = function () { + if (Passwordless.instance === undefined) { + var error = "No instance of Passwordless found. Make sure to call the Passwordless.init method." + + "See https://supertokens.io/docs/passwordless/quick-setup/frontend"; + // eslint-disable-next-line supertokens-auth-react/no-direct-window-object + if (typeof window === "undefined") { + error = error + genericComponentOverrideContext.SSR_ERROR; + } + throw Error(error); + } + return Passwordless.instance; + }; + /* + * Tests methods. + */ + Passwordless.reset = function () { + if (!genericComponentOverrideContext.isTest()) { + return; + } + Passwordless.instance = undefined; + return; + }; + Passwordless.RECIPE_ID = "passwordless"; + return Passwordless; +}(index.AuthRecipe)); exports.Passwordless = Passwordless; exports.Provider = Provider; diff --git a/lib/build/passwordless.js b/lib/build/passwordless.js index 1b2c514be..066a6416b 100644 --- a/lib/build/passwordless.js +++ b/lib/build/passwordless.js @@ -1,219 +1,138 @@ -"use strict"; +'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); +Object.defineProperty(exports, '__esModule', { value: true }); -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var recipe = require("./passwordless-shared.js"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/utils/windowHandler"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("react"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("supertokens-web-js/utils/normalisedURLPath"); -require("react/jsx-runtime"); -require("supertokens-web-js/recipe/passwordless"); -require("./authRecipe-shared2.js"); -require("./recipeModule-shared.js"); -require("./multifactorauth-shared.js"); -require("supertokens-web-js/recipe/session"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./multifactorauth-shared2.js"); -require("supertokens-web-js/recipe/multifactorauth"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("./authRecipe-shared.js"); +var logger = require('./logger.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var recipe = require('./passwordless-shared.js'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/utils/windowHandler'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils'); +require('react'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/utils/normalisedURLPath'); +require('react/jsx-runtime'); +require('supertokens-web-js/recipe/passwordless'); +require('./authRecipe-shared2.js'); +require('./recipeModule-shared.js'); +require('./multifactorauth-shared.js'); +require('supertokens-web-js/recipe/session'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./multifactorauth-shared2.js'); +require('supertokens-web-js/recipe/multifactorauth'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('./authRecipe-shared.js'); -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -var Wrapper = /** @class */ (function () { - function Wrapper() {} - Wrapper.init = function (config) { - return recipe.Passwordless.init(config); - }; - Wrapper.signOut = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().signOut({ - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }), - ]; - }); - }); - }; - Wrapper.createCode = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.createCode( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.resendCode = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.resendCode( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.consumeCode = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.consumeCode( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.getLinkCodeFromURL = function (input) { - return recipe.Passwordless.getInstanceOrThrow().webJSRecipe.getLinkCodeFromURL( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ); - }; - Wrapper.getPreAuthSessionIdFromURL = function (input) { - return recipe.Passwordless.getInstanceOrThrow().webJSRecipe.getPreAuthSessionIdFromURL( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ); - }; - Wrapper.doesEmailExist = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.doesEmailExist( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.doesPhoneNumberExist = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.doesPhoneNumberExist( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.getLoginAttemptInfo = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.getLoginAttemptInfo( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.setLoginAttemptInfo = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.setLoginAttemptInfo( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), - }) - ), - ]; - }); - }); - }; - Wrapper.clearLoginAttemptInfo = function (input) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - return [ - 2 /*return*/, - recipe.Passwordless.getInstanceOrThrow().webJSRecipe.clearLoginAttemptInfo( - genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, input), { - userContext: genericComponentOverrideContext.getNormalisedUserContext( - input === null || input === void 0 ? void 0 : input.userContext - ), - }) - ), - ]; - }); - }); - }; - Wrapper.ComponentsOverrideProvider = recipe.Provider; - return Wrapper; -})(); -var init = Wrapper.init; -var createCode = Wrapper.createCode; -var resendCode = Wrapper.resendCode; -var consumeCode = Wrapper.consumeCode; -var getLinkCodeFromURL = Wrapper.getLinkCodeFromURL; -var getPreAuthSessionIdFromURL = Wrapper.getPreAuthSessionIdFromURL; -var doesEmailExist = Wrapper.doesEmailExist; -var doesPhoneNumberExist = Wrapper.doesPhoneNumberExist; -var getLoginAttemptInfo = Wrapper.getLoginAttemptInfo; -var setLoginAttemptInfo = Wrapper.setLoginAttemptInfo; -var clearLoginAttemptInfo = Wrapper.clearLoginAttemptInfo; -var signOut = Wrapper.signOut; +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +var Wrapper = /** @class */ (function () { + function Wrapper() { + } + Wrapper.init = function (config) { + return recipe.Passwordless.init(config); + }; + Wrapper.signOut = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().signOut({ + userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext), + })]; + }); + }); + }; + Wrapper.createCode = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.createCode(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.resendCode = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.resendCode(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.consumeCode = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.consumeCode(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.getLinkCodeFromURL = function (input) { + return recipe.Passwordless.getInstanceOrThrow().webJSRecipe.getLinkCodeFromURL(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) })); + }; + Wrapper.getPreAuthSessionIdFromURL = function (input) { + return recipe.Passwordless.getInstanceOrThrow().webJSRecipe.getPreAuthSessionIdFromURL(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) })); + }; + Wrapper.doesEmailExist = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.doesEmailExist(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.doesPhoneNumberExist = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.doesPhoneNumberExist(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.getLoginAttemptInfo = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.getLoginAttemptInfo(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.setLoginAttemptInfo = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.setLoginAttemptInfo(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext) }))]; + }); + }); + }; + Wrapper.clearLoginAttemptInfo = function (input) { + return logger.__awaiter(this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + return [2 /*return*/, recipe.Passwordless.getInstanceOrThrow().webJSRecipe.clearLoginAttemptInfo(logger.__assign(logger.__assign({}, input), { userContext: genericComponentOverrideContext.getNormalisedUserContext(input === null || input === void 0 ? void 0 : input.userContext) }))]; + }); + }); + }; + Wrapper.ComponentsOverrideProvider = recipe.Provider; + return Wrapper; +}()); +var init = Wrapper.init; +var createCode = Wrapper.createCode; +var resendCode = Wrapper.resendCode; +var consumeCode = Wrapper.consumeCode; +var getLinkCodeFromURL = Wrapper.getLinkCodeFromURL; +var getPreAuthSessionIdFromURL = Wrapper.getPreAuthSessionIdFromURL; +var doesEmailExist = Wrapper.doesEmailExist; +var doesPhoneNumberExist = Wrapper.doesPhoneNumberExist; +var getLoginAttemptInfo = Wrapper.getLoginAttemptInfo; +var setLoginAttemptInfo = Wrapper.setLoginAttemptInfo; +var clearLoginAttemptInfo = Wrapper.clearLoginAttemptInfo; +var signOut = Wrapper.signOut; var PasswordlessComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; exports.PasswordlessComponentsOverrideProvider = PasswordlessComponentsOverrideProvider; diff --git a/lib/build/passwordlessprebuiltui.js b/lib/build/passwordlessprebuiltui.js index cc39350dc..3ea896115 100644 --- a/lib/build/passwordlessprebuiltui.js +++ b/lib/build/passwordlessprebuiltui.js @@ -1,75 +1,66 @@ -"use strict"; +'use strict'; -var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); -var React = require("react"); -var jsxRuntime = require("react/jsx-runtime"); -var NormalisedURLPath = require("supertokens-web-js/utils/normalisedURLPath"); -var uiEntry = require("./index2.js"); -var recipe$1 = require("./emailpassword-shared3.js"); -require("./multifactorauth.js"); -var session = require("./session.js"); -var recipe$2 = require("./passwordless-shared.js"); -var authCompWrapper = require("./authCompWrapper.js"); -var button = require("./emailpassword-shared.js"); -var translationContext = require("./translationContext.js"); -var STGeneralError = require("supertokens-web-js/utils/error"); -var types = require("./multifactorauth-shared.js"); -var emailverification = require("./emailverification.js"); -var recipe = require("./emailverification-shared.js"); -var arrowLeftIcon = require("./arrowLeftIcon.js"); -var emailLargeIcon = require("./emailLargeIcon.js"); -var windowHandler = require("supertokens-web-js/utils/windowHandler"); -var recipe$3 = require("./multifactorauth-shared2.js"); -var sessionprebuiltui = require("./sessionprebuiltui.js"); -var formBase = require("./emailpassword-shared5.js"); -var STGeneralError$1 = require("supertokens-web-js/lib/build/error"); -require("supertokens-web-js"); -require("supertokens-web-js/utils/cookieHandler"); -require("supertokens-web-js/utils/postSuperTokensInitCallbacks"); -require("supertokens-web-js/recipe/multitenancy"); -require("supertokens-web-js/utils"); -require("supertokens-web-js/utils/normalisedURLDomain"); -require("react-dom"); -require("./multitenancy-shared.js"); -require("./oauth2provider-shared.js"); -require("supertokens-web-js/recipe/oauth2provider"); -require("./recipeModule-shared.js"); -require("./authRecipe-shared.js"); -require("supertokens-web-js/lib/build/normalisedURLPath"); -require("supertokens-web-js/recipe/emailpassword"); -require("./authRecipe-shared2.js"); -require("./emailpassword-shared4.js"); -require("./multifactorauth-shared3.js"); -require("supertokens-web-js/recipe/session"); -require("./session-shared.js"); -require("supertokens-web-js/recipe/passwordless"); -require("supertokens-web-js/recipe/emailverification"); -require("supertokens-web-js/utils/sessionClaimValidatorStore"); -require("supertokens-web-js/recipe/multifactorauth"); +var logger = require('./logger.js'); +var React = require('react'); +var jsxRuntime = require('react/jsx-runtime'); +var NormalisedURLPath = require('supertokens-web-js/utils/normalisedURLPath'); +var uiEntry = require('./index2.js'); +var genericComponentOverrideContext = require('./genericComponentOverrideContext.js'); +var recipe$1 = require('./emailpassword-shared3.js'); +require('./multifactorauth.js'); +var session = require('./session.js'); +var recipe$2 = require('./passwordless-shared.js'); +var authCompWrapper = require('./authCompWrapper.js'); +var button = require('./emailpassword-shared.js'); +var translationContext = require('./translationContext.js'); +var STGeneralError = require('supertokens-web-js/utils/error'); +var types = require('./multifactorauth-shared.js'); +var emailverification = require('./emailverification.js'); +var recipe = require('./emailverification-shared.js'); +var arrowLeftIcon = require('./arrowLeftIcon.js'); +var emailLargeIcon = require('./emailLargeIcon.js'); +var windowHandler = require('supertokens-web-js/utils/windowHandler'); +var recipe$3 = require('./multifactorauth-shared2.js'); +var sessionprebuiltui = require('./sessionprebuiltui.js'); +var formBase = require('./emailpassword-shared5.js'); +var STGeneralError$1 = require('supertokens-web-js/lib/build/error'); +require('react-dom'); +require('./multitenancy-shared.js'); +require('./oauth2provider-shared.js'); +require('supertokens-web-js/recipe/oauth2provider'); +require('./recipeModule-shared.js'); +require('./authRecipe-shared.js'); +require('supertokens-web-js/lib/build/normalisedURLPath'); +require('supertokens-web-js'); +require('supertokens-web-js/utils/cookieHandler'); +require('supertokens-web-js/utils/postSuperTokensInitCallbacks'); +require('supertokens-web-js/recipe/multitenancy'); +require('supertokens-web-js/utils'); +require('supertokens-web-js/utils/normalisedURLDomain'); +require('supertokens-web-js/recipe/emailpassword'); +require('./authRecipe-shared2.js'); +require('./emailpassword-shared4.js'); +require('./multifactorauth-shared3.js'); +require('supertokens-web-js/recipe/session'); +require('./session-shared.js'); +require('supertokens-web-js/recipe/passwordless'); +require('supertokens-web-js/recipe/emailverification'); +require('supertokens-web-js/utils/sessionClaimValidatorStore'); +require('supertokens-web-js/recipe/multifactorauth'); -function _interopDefault(e) { - return e && e.__esModule ? e : { default: e }; -} +function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { - if (k !== "default") { + if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty( - n, - k, - d.get - ? d - : { - enumerable: true, - get: function () { - return e[k]; - }, - } - ); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); } }); } @@ -77,1342 +68,698 @@ function _interopNamespace(e) { return Object.freeze(n); } -var React__namespace = /*#__PURE__*/ _interopNamespace(React); -var NormalisedURLPath__default = /*#__PURE__*/ _interopDefault(NormalisedURLPath); -var STGeneralError__default = /*#__PURE__*/ _interopDefault(STGeneralError); -var STGeneralError__default$1 = /*#__PURE__*/ _interopDefault(STGeneralError$1); +var React__namespace = /*#__PURE__*/_interopNamespace(React); +var NormalisedURLPath__default = /*#__PURE__*/_interopDefault(NormalisedURLPath); +var STGeneralError__default = /*#__PURE__*/_interopDefault(STGeneralError); +var STGeneralError__default$1 = /*#__PURE__*/_interopDefault(STGeneralError$1); -var styles = - '/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * "License") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~="container"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n\n/*\n * Default styles.\n */\n\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n\n[data-supertokens~="container"] {\n font-family: "Arial", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n\n@media (max-width: 440px) {\n [data-supertokens~="container"] {\n width: 95vw;\n }\n}\n\n[data-supertokens~="row"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n\n[data-supertokens~="superTokensBranding"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n\n[data-supertokens~="generalError"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n\n[data-supertokens~="headerTitle"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~="headerSubtitle"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n\n[data-supertokens~="headerSubtitle"][data-supertokens~="secondaryText"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] {\n max-width: 300px;\n margin-top: 10px;\n}\n\n[data-supertokens~="privacyPolicyAndTermsAndConditions"] a {\n line-height: 21px;\n}\n\n/* TODO: split the link style into separate things*/\n\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n\n[data-supertokens~="link"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n\n[data-supertokens~="primaryText"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~="secondaryText"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="secondaryText"] strong {\n font-weight: 600;\n}\n\n[data-supertokens~="divider"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n\n[data-supertokens~="headerTinyTitle"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithArrow"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~="generalSuccess"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n\n[data-supertokens~="spinner"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n\n[data-supertokens~="error"] {\n color: rgb(var(--palette-error));\n}\n\n[data-supertokens~="linkButton"] {\n font-family: "Arial", sans-serif;\n background-color: transparent;\n border: 0;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n margin-right: 0.3em;\n}\n\n[data-supertokens~="secondaryLinkWithLeftArrow"]:hover svg {\n position: relative;\n left: -4px;\n}\n\n[data-supertokens~="button"] {\n font-family: "Arial", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n\n[data-supertokens~="button"]:disabled {\n border: none;\n cursor: no-drop;\n}\n\n[data-supertokens~="button"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n\n[data-supertokens~="button"]:focus {\n outline: none;\n}\n\n[data-supertokens~="backButtonCommon"] {\n width: 16px;\n height: 13px;\n}\n\n[data-supertokens~="backButton"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n\n[data-supertokens~="backButtonPlaceholder"] {\n display: block;\n}\n\n[data-supertokens~="delayedRender"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n\n[data-supertokens~="footerLinkGroupVert"] > div {\n cursor: pointer;\n margin: 0;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryText"] {\n font-weight: 400;\n}\n\n[data-supertokens~="footerLinkGroupVert"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n\n@media (max-width: 360px) {\n [data-supertokens~="footerLinkGroupVert"] {\n flex-direction: column;\n }\n [data-supertokens~="footerLinkGroupVert"] > div {\n margin: 0 auto;\n }\n}\n\n[data-supertokens~="footerLinkGroupVert"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n\n[data-supertokens~="withBackButton"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="dividerWithOr"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="dividerText"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n\n[data-supertokens~="formLabelWithLinkWrapper"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~="formLabelLinkBtn"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n\n[data-supertokens~="formLabelLinkBtn"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~="formLabelLinkBtn"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n\n[data-supertokens~="authComponentList"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~="authPageTitleOAuthClient"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n\n[data-supertokens~="authPageTitleOAuthClientUrl"] {\n text-decoration: none;\n}\n\n[data-supertokens~="authPageTitleOAuthClientLogo"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n\n[data-supertokens~="authPageTitleOAuthClient"] [data-supertokens~="authPageTitleOAuthClientName"] {\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~="buttonWithArrow"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryText"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithRightArrow"] ~ svg {\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~="buttonWithArrow"]:hover [data-supertokens~="secondaryLinkWithLeftArrow"] svg {\n position: relative;\n left: -2px;\n}\n\n[data-supertokens~="buttonWithArrow"] [data-supertokens~="secondaryLinkWithLeftArrow"] {\n display: flex;\n align-items: center;\n}\n\n/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * "License") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~="inputContainer"] {\n margin-top: 6px;\n}\n\n[data-supertokens~="inputWrapper"] {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n align-items: center;\n background-color: rgb(var(--palette-inputBackground));\n height: 34px;\n border-radius: 6px;\n border: 1px solid rgb(var(--palette-inputBorder));\n}\n\n[data-supertokens~="inputWrapper"][focus-within] {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputWrapper"]:focus-within {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"][focus-within] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="inputError"]:focus-within {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~="input"] {\n box-sizing: border-box;\n padding-left: 15px;\n filter: none;\n color: rgb(var(--palette-textInput));\n background-color: transparent;\n border-radius: 6px;\n font-size: var(--font-size-1);\n border: none;\n padding-right: 25px;\n letter-spacing: 1.2px;\n flex: 9 1 75%;\n width: 75%;\n height: 32px;\n}\n\n[data-supertokens~="input"]:focus {\n border: none;\n outline: none;\n}\n\n[data-supertokens~="input"]:-webkit-autofill,\n[data-supertokens~="input"]:-webkit-autofill:hover,\n[data-supertokens~="input"]:-webkit-autofill:focus,\n[data-supertokens~="input"]:-webkit-autofill:active {\n -webkit-text-fill-color: rgb(var(--palette-textInput));\n box-shadow: 0 0 0 30px rgb(var(--palette-inputBackground)) inset;\n}\n\n[data-supertokens~="inputAdornment"] {\n justify-content: center;\n margin-right: 5px;\n}\n\n[data-supertokens~="showPassword"] {\n cursor: pointer;\n}\n\n[data-supertokens~="enterEmailSuccessMessage"] {\n margin-top: 15px;\n margin-bottom: 15px;\n word-break: break-word;\n}\n\n[data-supertokens~="submitNewPasswordSuccessMessage"] {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n\n[data-supertokens~="inputErrorMessage"] {\n padding-top: 5px;\n padding-bottom: 5px;\n color: rgb(var(--palette-error));\n line-height: 24px;\n font-weight: 400;\n font-size: var(--font-size-1);\n text-align: left;\n animation: slideTop 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;\n max-width: 330px;\n}\n\n@media (max-width: 440px) {\n [data-supertokens~="inputErrorMessage"] {\n max-width: 250px;\n }\n}\n\n[data-supertokens~="inputErrorSymbol"] {\n margin-right: 5px;\n top: 1px;\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~="label"] {\n text-align: left;\n font-weight: 700;\n font-size: var(--font-size-0);\n line-height: 24px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~="formRow"] {\n display: flex;\n flex-direction: column;\n padding-top: 0px;\n padding-bottom: 20px;\n}\n\n[data-supertokens~="formRow"][data-supertokens~="hasError"] {\n padding-bottom: 0;\n}\n\n[data-supertokens~="formRow"]:last-child {\n padding-bottom: 0;\n}\n\n[data-supertokens~="sendVerifyEmailIcon"] {\n margin-top: 11px;\n}\n\n[data-supertokens~="primaryText"][data-supertokens~="sendVerifyEmailText"] {\n text-align: center;\n letter-spacing: 0.8px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="secondaryLinkWithArrow"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n font-weight: 700;\n}\n\n[data-supertokens~="sendVerifyEmailResend"] {\n margin-top: 13px;\n font-weight: 400;\n}\n\n[data-supertokens~="sendVerifyEmailResend"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~="noFormRow"] {\n padding-bottom: 25px;\n}\n\n[data-supertokens~="emailVerificationButtonWrapper"] {\n padding-top: 25px;\n max-width: 96px;\n margin: 0 auto;\n}\n\n[data-supertokens~="resendEmailLink"] {\n display: inline-block;\n}\n\n[data-supertokens~="resetPasswordEmailForm"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~="resetPasswordPasswordForm"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~="generalSuccess"] {\n margin-bottom: 20px;\n animation: swingIn 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) alternate 2 both;\n}\n\n[data-supertokens~="headerSubtitle"] strong {\n max-width: 100%;\n display: inline-block;\n vertical-align: bottom;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[data-supertokens~="primaryText"][data-supertokens~="sendCodeText"] {\n margin-top: 15px;\n margin-bottom: 20px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~="sendCodeText"] strong {\n max-width: 100%;\n display: inline-block;\n vertical-align: bottom;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[data-supertokens~="phoneInputLibRoot"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~="phoneInputWrapper"] {\n display: flex;\n align-items: center;\n}\n\ninput[type="tel"][data-supertokens~="input-phoneNumber"] {\n padding-left: 15px;\n}\n\n[data-supertokens~="phoneInputWrapper"] .iti {\n flex: 1 1;\n min-width: 0;\n width: 100%;\n background: transparent;\n border: none;\n color: inherit;\n outline: none;\n}\n\n[data-supertokens~="continueButtonWrapper"] {\n margin-top: 10px;\n margin-bottom: 30px;\n}\n\n.iti__country-list {\n border: 0;\n top: 40px;\n width: min(72.2vw, 320px);\n border-radius: 6;\n box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.16);\n}\n\n.iti__country {\n display: flex;\n align-items: center;\n height: 34px;\n cursor: pointer;\n\n padding: 0 8px;\n}\n\n.iti__country-name {\n color: var(--palette-textLabel);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: "0 16px";\n}\n\n[data-supertokens~="continueWithPasswordlessButtonWrapper"] {\n margin: 9px 0;\n}\n\n[data-supertokens~="continueWithPasswordlessLink"] {\n margin-top: 9px;\n}\n'; +var styles = "/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * \"License\") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~=\"container\"] {\n --palette-background: 255, 255, 255;\n --palette-inputBackground: 250, 250, 250;\n --palette-inputBorder: 224, 224, 224;\n --palette-primary: 28, 34, 42;\n --palette-primaryBorder: 45, 54, 68;\n --palette-success: 65, 167, 0;\n --palette-successBackground: 217, 255, 191;\n --palette-error: 255, 23, 23;\n --palette-errorBackground: 255, 241, 235;\n --palette-textTitle: 0, 0, 0;\n --palette-textLabel: 0, 0, 0;\n --palette-textInput: 0, 0, 0;\n --palette-textPrimary: 128, 128, 128;\n --palette-textLink: 0, 122, 255;\n --palette-buttonText: 255, 255, 255;\n --palette-textGray: 54, 54, 54;\n --palette-superTokensBrandingBackground: 242, 245, 246;\n --palette-superTokensBrandingText: 173, 189, 196;\n\n --font-size-0: 12px;\n --font-size-1: 14px;\n --font-size-2: 16px;\n --font-size-3: 19px;\n --font-size-4: 24px;\n --font-size-5: 28px;\n}\n\n/*\n * Default styles.\n */\n\n@keyframes slideTop {\n 0% {\n transform: translateY(-5px);\n }\n 100% {\n transform: translateY(0px);\n }\n}\n\n@keyframes swing-in-top-fwd {\n 0% {\n transform: rotateX(-100deg);\n transform-origin: top;\n opacity: 0;\n }\n 100% {\n transform: rotateX(0deg);\n transform-origin: top;\n opacity: 1;\n }\n}\n\n[data-supertokens~=\"container\"] {\n font-family: \"Arial\", sans-serif;\n margin: 12px auto;\n margin-top: 26px;\n margin-bottom: 26px;\n width: 420px;\n text-align: center;\n border-radius: 8px;\n box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.16);\n background-color: rgb(var(--palette-background));\n}\n\n@media (max-width: 440px) {\n [data-supertokens~=\"container\"] {\n width: 95vw;\n }\n}\n\n[data-supertokens~=\"row\"] {\n margin: 0 auto;\n width: 76%;\n padding-top: 30px;\n padding-bottom: 10px;\n}\n\n[data-supertokens~=\"superTokensBranding\"] {\n display: block;\n margin: 10px auto 0;\n background: rgb(var(--palette-superTokensBrandingBackground));\n color: rgb(var(--palette-superTokensBrandingText));\n text-decoration: none;\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n border-radius: 6px 6px 0 0;\n padding: 4px 9px;\n font-weight: 400;\n font-size: var(--font-size-0);\n letter-spacing: 0.4px;\n}\n\n[data-supertokens~=\"generalError\"] {\n background: rgb(var(--palette-errorBackground));\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 10px;\n margin-top: 24px;\n padding-left: 18px;\n padding-right: 18px;\n letter-spacing: 0.2px;\n font-size: var(--font-size-1);\n border-radius: 8px;\n color: rgb(var(--palette-error));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n word-wrap: break-word;\n}\n\n[data-supertokens~=\"headerTitle\"] {\n font-size: var(--font-size-4);\n line-height: 27.6px;\n letter-spacing: 0.58px;\n font-weight: 700;\n margin-bottom: 20px;\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~=\"headerSubtitle\"] {\n font-weight: 400;\n color: rgb(var(--palette-textGray));\n margin-bottom: 21px;\n}\n\n[data-supertokens~=\"headerSubtitle\"][data-supertokens~=\"secondaryText\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n}\n\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] {\n max-width: 300px;\n margin-top: 10px;\n}\n\n[data-supertokens~=\"privacyPolicyAndTermsAndConditions\"] a {\n line-height: 21px;\n}\n\n/* TODO: split the link style into separate things*/\n\n/* We add this before primary and secondary text, because if they are applied to the same element the other ones take priority */\n\n[data-supertokens~=\"link\"] {\n padding-left: 3px;\n padding-right: 3px;\n color: rgb(var(--palette-textLink));\n font-size: var(--font-size-1);\n cursor: pointer;\n letter-spacing: 0.16px;\n line-height: 26px;\n}\n\n[data-supertokens~=\"primaryText\"] {\n font-size: var(--font-size-2);\n font-weight: 400;\n letter-spacing: 0.4px;\n line-height: 21px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~=\"secondaryText\"] {\n font-size: var(--font-size-1);\n font-weight: 400;\n letter-spacing: 0.4px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"secondaryText\"] strong {\n font-weight: 600;\n}\n\n[data-supertokens~=\"divider\"] {\n margin-top: 1.5em;\n margin-bottom: 1.5em;\n border-bottom: 0.3px solid #dddddd;\n align-items: center;\n padding-bottom: 5px;\n flex: 3 3;\n}\n\n[data-supertokens~=\"headerTinyTitle\"] {\n margin-top: 24px;\n font-size: var(--font-size-5);\n letter-spacing: 1.1px;\n font-weight: 700;\n line-height: 28px;\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"]:hover {\n position: relative;\n left: 2px;\n word-spacing: 4px;\n}\n\n[data-supertokens~=\"generalSuccess\"] {\n color: rgb(var(--palette-success));\n font-size: var(--font-size-1);\n background: rgb(var(--palette-successBackground));\n animation: swing-in-top-fwd 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n padding: 9px 15px 9px 15px;\n border-radius: 6px;\n display: inline-block;\n}\n\n[data-supertokens~=\"spinner\"] {\n width: 80px;\n height: auto;\n padding-top: 20px;\n padding-bottom: 40px;\n margin: 0 auto;\n}\n\n[data-supertokens~=\"error\"] {\n color: rgb(var(--palette-error));\n}\n\n[data-supertokens~=\"linkButton\"] {\n font-family: \"Arial\", sans-serif;\n background-color: transparent;\n border: 0;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n color: rgb(var(--palette-textGray));\n font-weight: 400;\n margin-top: 10px;\n margin-bottom: 40px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n margin-right: 0.3em;\n}\n\n[data-supertokens~=\"secondaryLinkWithLeftArrow\"]:hover svg {\n position: relative;\n left: -4px;\n}\n\n[data-supertokens~=\"button\"] {\n font-family: \"Arial\", sans-serif;\n background-color: rgb(var(--palette-primary));\n color: rgb(var(--palette-buttonText));\n width: 100%;\n height: 34px;\n font-weight: 600;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n border-color: rgb(var(--palette-primaryBorder));\n background-position: center;\n transition: all 0.4s;\n background-size: 12000%;\n cursor: pointer;\n}\n\n[data-supertokens~=\"button\"]:disabled {\n border: none;\n cursor: no-drop;\n}\n\n[data-supertokens~=\"button\"]:active {\n outline: none;\n transition: all 0s;\n background-size: 100%;\n filter: brightness(0.85);\n}\n\n[data-supertokens~=\"button\"]:focus {\n outline: none;\n}\n\n[data-supertokens~=\"backButtonCommon\"] {\n width: 16px;\n height: 13px;\n}\n\n[data-supertokens~=\"backButton\"] {\n cursor: pointer;\n border: none;\n background-color: transparent;\n padding: 0px;\n}\n\n[data-supertokens~=\"backButtonPlaceholder\"] {\n display: block;\n}\n\n[data-supertokens~=\"delayedRender\"] {\n animation-duration: 0.1s;\n animation-name: animate-fade;\n animation-delay: 0.2s;\n animation-fill-mode: backwards;\n}\n\n@keyframes animate-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] {\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n gap: 24px;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] > div {\n cursor: pointer;\n margin: 0;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 400;\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n font-weight: 400;\n position: relative;\n left: -6px; /* half the width of the left arrow */\n}\n\n@media (max-width: 360px) {\n [data-supertokens~=\"footerLinkGroupVert\"] {\n flex-direction: column;\n }\n [data-supertokens~=\"footerLinkGroupVert\"] > div {\n margin: 0 auto;\n }\n}\n\n[data-supertokens~=\"footerLinkGroupVert\"] div:only-child {\n margin-left: auto;\n margin-right: auto;\n margin-top: 14px;\n}\n\n[data-supertokens~=\"withBackButton\"] {\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~=\"dividerWithOr\"] {\n padding-top: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"dividerText\"] {\n flex: 1 1;\n font-weight: 400;\n font-size: var(--font-size-1);\n}\n\n[data-supertokens~=\"formLabelWithLinkWrapper\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"] {\n width: auto;\n margin-top: 0;\n line-height: 24px;\n font-size: var(--font-size-0);\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~=\"formLabelLinkBtn\"]:disabled {\n color: rgb(var(--palette-textPrimary));\n cursor: default;\n text-decoration: none;\n}\n\n[data-supertokens~=\"authComponentList\"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClient\"] {\n color: rgb(var(--palette-textGray));\n font-size: var(--font-size-1);\n font-weight: 400;\n margin: 10px 0 25px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClientUrl\"] {\n text-decoration: none;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClientLogo\"] {\n width: 44px;\n height: 44px;\n margin-bottom: 10px;\n}\n\n[data-supertokens~=\"authPageTitleOAuthClient\"] [data-supertokens~=\"authPageTitleOAuthClientName\"] {\n color: rgb(var(--palette-textTitle));\n}\n\n[data-supertokens~=\"buttonWithArrow\"] {\n border-radius: 6px;\n border: 1px solid #d0d5dd;\n width: 100%;\n color: rgb(var(--palette-textGray));\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n margin: 24px 0;\n min-height: 48px;\n cursor: pointer;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover {\n background-color: rgb(var(--palette-inputBackground));\n}\n\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryText\"] {\n font-weight: 700;\n font-size: var(--font-size-2);\n color: rgb(var(--palette-textGray));\n margin: 0;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithRightArrow\"] ~ svg {\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~=\"buttonWithArrow\"]:hover [data-supertokens~=\"secondaryLinkWithLeftArrow\"] svg {\n position: relative;\n left: -2px;\n}\n\n[data-supertokens~=\"buttonWithArrow\"] [data-supertokens~=\"secondaryLinkWithLeftArrow\"] {\n display: flex;\n align-items: center;\n}\n\n/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.\n *\n * This software is licensed under the Apache License, Version 2.0 (the\n * \"License\") as published by the Apache Software Foundation.\n *\n * You may not use this file except in compliance with the License. You may\n * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n */\n\n[data-supertokens~=\"inputContainer\"] {\n margin-top: 6px;\n}\n\n[data-supertokens~=\"inputWrapper\"] {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n align-items: center;\n background-color: rgb(var(--palette-inputBackground));\n height: 34px;\n border-radius: 6px;\n border: 1px solid rgb(var(--palette-inputBorder));\n}\n\n[data-supertokens~=\"inputWrapper\"][focus-within] {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputWrapper\"]:focus-within {\n background-color: rgba(var(--palette-inputBackground), 0.25);\n border: 1px solid rgb(var(--palette-primary));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-primary), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputError\"] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputError\"][focus-within] {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"inputError\"]:focus-within {\n border: 1px solid rgb(var(--palette-error));\n box-shadow: 0 0 0 0.2rem rgba(var(--palette-error), 0.25);\n outline: none;\n}\n\n[data-supertokens~=\"input\"] {\n box-sizing: border-box;\n padding-left: 15px;\n filter: none;\n color: rgb(var(--palette-textInput));\n background-color: transparent;\n border-radius: 6px;\n font-size: var(--font-size-1);\n border: none;\n padding-right: 25px;\n letter-spacing: 1.2px;\n flex: 9 1 75%;\n width: 75%;\n height: 32px;\n}\n\n[data-supertokens~=\"input\"]:focus {\n border: none;\n outline: none;\n}\n\n[data-supertokens~=\"input\"]:-webkit-autofill,\n[data-supertokens~=\"input\"]:-webkit-autofill:hover,\n[data-supertokens~=\"input\"]:-webkit-autofill:focus,\n[data-supertokens~=\"input\"]:-webkit-autofill:active {\n -webkit-text-fill-color: rgb(var(--palette-textInput));\n box-shadow: 0 0 0 30px rgb(var(--palette-inputBackground)) inset;\n}\n\n[data-supertokens~=\"inputAdornment\"] {\n justify-content: center;\n margin-right: 5px;\n}\n\n[data-supertokens~=\"showPassword\"] {\n cursor: pointer;\n}\n\n[data-supertokens~=\"enterEmailSuccessMessage\"] {\n margin-top: 15px;\n margin-bottom: 15px;\n word-break: break-word;\n}\n\n[data-supertokens~=\"submitNewPasswordSuccessMessage\"] {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n\n[data-supertokens~=\"inputErrorMessage\"] {\n padding-top: 5px;\n padding-bottom: 5px;\n color: rgb(var(--palette-error));\n line-height: 24px;\n font-weight: 400;\n font-size: var(--font-size-1);\n text-align: left;\n animation: slideTop 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;\n max-width: 330px;\n}\n\n@media (max-width: 440px) {\n [data-supertokens~=\"inputErrorMessage\"] {\n max-width: 250px;\n }\n}\n\n[data-supertokens~=\"inputErrorSymbol\"] {\n margin-right: 5px;\n top: 1px;\n position: relative;\n left: 2px;\n}\n\n[data-supertokens~=\"label\"] {\n text-align: left;\n font-weight: 700;\n font-size: var(--font-size-0);\n line-height: 24px;\n color: rgb(var(--palette-textLabel));\n}\n\n[data-supertokens~=\"formRow\"] {\n display: flex;\n flex-direction: column;\n padding-top: 0px;\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"formRow\"][data-supertokens~=\"hasError\"] {\n padding-bottom: 0;\n}\n\n[data-supertokens~=\"formRow\"]:last-child {\n padding-bottom: 0;\n}\n\n[data-supertokens~=\"sendVerifyEmailIcon\"] {\n margin-top: 11px;\n}\n\n[data-supertokens~=\"primaryText\"][data-supertokens~=\"sendVerifyEmailText\"] {\n text-align: center;\n letter-spacing: 0.8px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"secondaryLinkWithArrow\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n cursor: pointer;\n font-weight: 700;\n}\n\n[data-supertokens~=\"sendVerifyEmailResend\"] {\n margin-top: 13px;\n font-weight: 400;\n}\n\n[data-supertokens~=\"sendVerifyEmailResend\"]:hover {\n text-decoration: underline;\n}\n\n[data-supertokens~=\"noFormRow\"] {\n padding-bottom: 25px;\n}\n\n[data-supertokens~=\"emailVerificationButtonWrapper\"] {\n padding-top: 25px;\n max-width: 96px;\n margin: 0 auto;\n}\n\n[data-supertokens~=\"resendEmailLink\"] {\n display: inline-block;\n}\n\n[data-supertokens~=\"resetPasswordEmailForm\"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"resetPasswordPasswordForm\"] {\n padding-bottom: 20px;\n}\n\n[data-supertokens~=\"generalSuccess\"] {\n margin-bottom: 20px;\n animation: swingIn 1s cubic-bezier(0.175, 0.885, 0.32, 1.275) alternate 2 both;\n}\n\n[data-supertokens~=\"headerSubtitle\"] strong {\n max-width: 100%;\n display: inline-block;\n vertical-align: bottom;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[data-supertokens~=\"primaryText\"][data-supertokens~=\"sendCodeText\"] {\n margin-top: 15px;\n margin-bottom: 20px;\n color: rgb(var(--palette-textPrimary));\n}\n\n[data-supertokens~=\"sendCodeText\"] strong {\n max-width: 100%;\n display: inline-block;\n vertical-align: bottom;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n[data-supertokens~=\"phoneInputLibRoot\"] {\n display: flex;\n align-items: center;\n}\n\n[data-supertokens~=\"phoneInputWrapper\"] {\n display: flex;\n align-items: center;\n}\n\ninput[type=\"tel\"][data-supertokens~=\"input-phoneNumber\"] {\n padding-left: 15px;\n}\n\n[data-supertokens~=\"phoneInputWrapper\"] .iti {\n flex: 1 1;\n min-width: 0;\n width: 100%;\n background: transparent;\n border: none;\n color: inherit;\n outline: none;\n}\n\n[data-supertokens~=\"continueButtonWrapper\"] {\n margin-top: 10px;\n margin-bottom: 30px;\n}\n\n.iti__country-list {\n border: 0;\n top: 40px;\n width: min(72.2vw, 320px);\n border-radius: 6;\n box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.16);\n}\n\n.iti__country {\n display: flex;\n align-items: center;\n height: 34px;\n cursor: pointer;\n\n padding: 0 8px;\n}\n\n.iti__country-name {\n color: var(--palette-textLabel);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: \"0 16px\";\n}\n\n[data-supertokens~=\"continueWithPasswordlessButtonWrapper\"] {\n margin: 9px 0;\n}\n\n[data-supertokens~=\"continueWithPasswordlessLink\"] {\n margin-top: 9px;\n}\n"; -var ThemeBase = function (_a) { - var children = _a.children, - userStyles = _a.userStyles; - return jsxRuntime.jsxs(React.Fragment, { - children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })], - }); +var ThemeBase = function (_a) { + var children = _a.children, userStyles = _a.userStyles; + return (jsxRuntime.jsxs(React.Fragment, { children: [children, jsxRuntime.jsxs("style", { children: [styles, userStyles.join("\n")] })] })); }; -var ContinueWithPasswordless = function (props) { - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "continueWithPasswordlessButtonWrapper" }, - { - children: jsxRuntime.jsx(button.Button, { - isLoading: false, - onClick: function () { - props.continueWithPasswordlessClicked(); - }, - type: "button", - label: "PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_BUTTON", - }), - } - ) - ); -}; -var ContinueWithPasswordlessWithOverride = uiEntry.withOverride( - "PasswordlessContinueWithPasswordless", - ContinueWithPasswordless -); -var ContinueWithPasswordlessTheme = function (props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - return jsxRuntime.jsx( - ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle] }, - { - children: jsxRuntime.jsx( - ContinueWithPasswordlessWithOverride, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ); +var ContinueWithPasswordless = function (props) { + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "continueWithPasswordlessButtonWrapper" }, { children: jsxRuntime.jsx(button.Button, { isLoading: false, onClick: function () { + props.continueWithPasswordlessClicked(); + }, type: "button", label: "PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_BUTTON" }) }))); +}; +var ContinueWithPasswordlessWithOverride = uiEntry.withOverride("PasswordlessContinueWithPasswordless", ContinueWithPasswordless); +var ContinueWithPasswordlessTheme = function (props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + return (jsxRuntime.jsx(ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle] }, { children: jsxRuntime.jsx(ContinueWithPasswordlessWithOverride, logger.__assign({}, props)) }))); }; -var ContinueWithPasswordlessFeature = function (props) { - var recipeComponentOverrides = props.useComponentOverrides(); - return jsxRuntime.jsx( - authCompWrapper.AuthComponentWrapper, - genericComponentOverrideContext.__assign( - { recipeComponentOverrides: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - ContinueWithPasswordlessTheme, - genericComponentOverrideContext.__assign({}, props, { - continueWithPasswordlessClicked: function () { - return props.setFactorList(props.factorIds); - }, - config: props.recipe.config, - }) - ), - } - ) - ); +var ContinueWithPasswordlessFeature = function (props) { + var recipeComponentOverrides = props.useComponentOverrides(); + return (jsxRuntime.jsx(authCompWrapper.AuthComponentWrapper, logger.__assign({ recipeComponentOverrides: recipeComponentOverrides }, { children: jsxRuntime.jsx(ContinueWithPasswordlessTheme, logger.__assign({}, props, { continueWithPasswordlessClicked: function () { return props.setFactorList(props.factorIds); }, config: props.recipe.config })) }))); }; -var PasswordlessLinkClickedScreen = function (props) { - var t = translationContext.useTranslation(); - var _a = React.useState(false), - loading = _a[0], - setLoading = _a[1]; - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: - props.requireUserInteraction === true - ? jsxRuntime.jsxs(React__namespace.default.Fragment, { - children: [ - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle" }, - { children: t("PWLESS_LINK_CLICKED_CONTINUE_HEADER") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerSubtitle secondaryText" }, - { children: t("PWLESS_LINK_CLICKED_CONTINUE_DESC") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "continueButtonWrapper" }, - { - children: jsxRuntime.jsx(button.Button, { - isLoading: loading, - onClick: function () { - setLoading(true); - props.consumeCode(); - }, - type: "button", - label: "PWLESS_LINK_CLICKED_CONTINUE_BUTTON", - }), - } - ) - ), - ], - }) - : jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "spinner" }, - { children: jsxRuntime.jsx(uiEntry.SpinnerIcon, {}) } - ) - ), - } - ) - ), - } - ) - ); -}; -var LinkClickedScreenWithOverride = uiEntry.withOverride( - "PasswordlessLinkClickedScreen", - PasswordlessLinkClickedScreen -); -var LinkClickedScreen$1 = function (props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - return jsxRuntime.jsx( - ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle, props.config.linkClickedScreenFeature.style] }, - { - children: jsxRuntime.jsx( - LinkClickedScreenWithOverride, - genericComponentOverrideContext.__assign({}, props) - ), - } - ) - ); +var PasswordlessLinkClickedScreen = function (props) { + var t = translationContext.useTranslation(); + var _a = React.useState(false), loading = _a[0], setLoading = _a[1]; + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "row" }, { children: props.requireUserInteraction === true ? (jsxRuntime.jsxs(React__namespace.default.Fragment, { children: [jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle" }, { children: t("PWLESS_LINK_CLICKED_CONTINUE_HEADER") })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerSubtitle secondaryText" }, { children: t("PWLESS_LINK_CLICKED_CONTINUE_DESC") })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "continueButtonWrapper" }, { children: jsxRuntime.jsx(button.Button, { isLoading: loading, onClick: function () { + setLoading(true); + props.consumeCode(); + }, type: "button", label: "PWLESS_LINK_CLICKED_CONTINUE_BUTTON" }) }))] })) : (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "spinner" }, { children: jsxRuntime.jsx(uiEntry.SpinnerIcon, {}) }))) })) }))); +}; +var LinkClickedScreenWithOverride = uiEntry.withOverride("PasswordlessLinkClickedScreen", PasswordlessLinkClickedScreen); +var LinkClickedScreen$1 = function (props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + return (jsxRuntime.jsx(ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle, props.config.linkClickedScreenFeature.style] }, { children: jsxRuntime.jsx(LinkClickedScreenWithOverride, logger.__assign({}, props)) }))); }; -var defaultTranslationsPasswordless = { - en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), - { - GENERAL_ERROR_EMAIL_UNDEFINED: "Please set your email", - GENERAL_ERROR_EMAIL_NON_STRING: "Email must be of type string", - GENERAL_ERROR_EMAIL_INVALID: "Email is invalid", - GENERAL_ERROR_PHONE_UNDEFINED: "Please set your phone number", - GENERAL_ERROR_PHONE_NON_STRING: "Phone number must be of type string", - GENERAL_ERROR_PHONE_INVALID: "Phone number is invalid", - GENERAL_ERROR_OTP_UNDEFINED: "Please fill your OTP", - GENERAL_ERROR_OTP_INVALID: "Invalid OTP", - GENERAL_ERROR_OTP_EXPIRED: "Expired OTP.", - GENERAL_ERROR_OTP_NON_STRING: "OTP must be of type string", - GENERAL_ERROR_OTP_EMPTY: "OTP cannot be empty", - ERROR_SIGN_IN_UP_LINK: "Invalid magic link. Please try again.", - ERROR_SIGN_IN_UP_RESEND_RESTART_FLOW: "Login timed out. Please try again.", - ERROR_SIGN_IN_UP_CODE_CONSUME_RESTART_FLOW: "Login unsuccessful. Please try again.", - PWLESS_SIGN_IN_UP_EMAIL_LABEL: "Email", - PWLESS_SIGN_IN_UP_PHONE_LABEL: "Phone Number", - PWLESS_SIGN_IN_UP_SWITCH_TO_PHONE: "Use a Phone number", - PWLESS_SIGN_IN_UP_SWITCH_TO_EMAIL: "Use an Email", - PWLESS_SIGN_IN_UP_CONTINUE_BUTTON: "CONTINUE", - PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_LINK: "Continue with passwordless", - PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_BUTTON: "CONTINUE WITH PASSWORDLESS", - PWLESS_COMBO_PASSWORD_LABEL: "Password", - PWLESS_COMBO_FORGOT_PW_LINK: "Forgot password?", - PWLESS_LINK_SENT_RESEND_SUCCESS: "Link resent", - PWLESS_LINK_SENT_RESEND_TITLE: "Link sent!", - PWLESS_LINK_SENT_RESEND_DESC_START_EMAIL: "We sent a link to ", - PWLESS_LINK_SENT_RESEND_DESC_START_PHONE: "We sent a link to your phone number ", - PWLESS_LINK_SENT_RESEND_DESC_END_EMAIL: ". Click the link to login or sign up", - PWLESS_LINK_SENT_RESEND_DESC_END_PHONE: "", - PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_EMAIL: "Change email", - PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_PHONE: "Change phone number", - PWLESS_LINK_CLICKED_CONTINUE_HEADER: "Sign Up or Log In", - PWLESS_LINK_CLICKED_CONTINUE_DESC: "Click the button below to log in on this device", - PWLESS_LINK_CLICKED_CONTINUE_BUTTON: "CONTINUE", - PWLESS_RESEND_SUCCESS_EMAIL: "Email resent", - PWLESS_RESEND_SUCCESS_PHONE: "SMS resent", - PWLESS_RESEND_BTN_DISABLED_START: "Resend in ", - PWLESS_RESEND_BTN_DISABLED_END: "", - PWLESS_RESEND_BTN_EMAIL: "Resend Email", - PWLESS_RESEND_BTN_PHONE: "Resend SMS", - PWLESS_USER_INPUT_CODE_HEADER_TITLE: "Enter OTP", - PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE: "An OTP was sent to you at", - PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE_LINK: "An OTP and a magic link was sent to you at", - PWLESS_USER_INPUT_CODE_INPUT_LABEL: "OTP", - PWLESS_MFA_HEADER_TITLE_PHONE: "SMS based OTP", - PWLESS_MFA_HEADER_TITLE_EMAIL: "Email based OTP", - PWLESS_MFA_FOOTER_LOGOUT: "Logout", - /* - * The following are error messages from our backend SDK. - * These are returned as full messages to preserver compatibilty, but they work just like the keys above. - * They are shown as is by default (setting the value to undefined will display the raw translation key) - */ - "Failed to generate a one time code. Please try again": undefined, - "Phone number is invalid": undefined, - "Email is invalid": undefined, - "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_002)": - undefined, - "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_003)": - undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_017)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_018)": undefined, - "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_019)": undefined, - } - ), +var defaultTranslationsPasswordless = { + en: logger.__assign(logger.__assign({}, uiEntry.defaultTranslationsCommon.en), { GENERAL_ERROR_EMAIL_UNDEFINED: "Please set your email", GENERAL_ERROR_EMAIL_NON_STRING: "Email must be of type string", GENERAL_ERROR_EMAIL_INVALID: "Email is invalid", GENERAL_ERROR_PHONE_UNDEFINED: "Please set your phone number", GENERAL_ERROR_PHONE_NON_STRING: "Phone number must be of type string", GENERAL_ERROR_PHONE_INVALID: "Phone number is invalid", GENERAL_ERROR_OTP_UNDEFINED: "Please fill your OTP", GENERAL_ERROR_OTP_INVALID: "Invalid OTP", GENERAL_ERROR_OTP_EXPIRED: "Expired OTP.", GENERAL_ERROR_OTP_NON_STRING: "OTP must be of type string", GENERAL_ERROR_OTP_EMPTY: "OTP cannot be empty", ERROR_SIGN_IN_UP_LINK: "Invalid magic link. Please try again.", ERROR_SIGN_IN_UP_RESEND_RESTART_FLOW: "Login timed out. Please try again.", ERROR_SIGN_IN_UP_CODE_CONSUME_RESTART_FLOW: "Login unsuccessful. Please try again.", PWLESS_SIGN_IN_UP_EMAIL_LABEL: "Email", PWLESS_SIGN_IN_UP_PHONE_LABEL: "Phone Number", PWLESS_SIGN_IN_UP_SWITCH_TO_PHONE: "Use a Phone number", PWLESS_SIGN_IN_UP_SWITCH_TO_EMAIL: "Use an Email", PWLESS_SIGN_IN_UP_CONTINUE_BUTTON: "CONTINUE", PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_LINK: "Continue with passwordless", PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_BUTTON: "CONTINUE WITH PASSWORDLESS", PWLESS_COMBO_PASSWORD_LABEL: "Password", PWLESS_COMBO_FORGOT_PW_LINK: "Forgot password?", PWLESS_LINK_SENT_RESEND_SUCCESS: "Link resent", PWLESS_LINK_SENT_RESEND_TITLE: "Link sent!", PWLESS_LINK_SENT_RESEND_DESC_START_EMAIL: "We sent a link to ", PWLESS_LINK_SENT_RESEND_DESC_START_PHONE: "We sent a link to your phone number ", PWLESS_LINK_SENT_RESEND_DESC_END_EMAIL: ". Click the link to login or sign up", PWLESS_LINK_SENT_RESEND_DESC_END_PHONE: "", PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_EMAIL: "Change email", PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_PHONE: "Change phone number", PWLESS_LINK_CLICKED_CONTINUE_HEADER: "Sign Up or Log In", PWLESS_LINK_CLICKED_CONTINUE_DESC: "Click the button below to log in on this device", PWLESS_LINK_CLICKED_CONTINUE_BUTTON: "CONTINUE", PWLESS_RESEND_SUCCESS_EMAIL: "Email resent", PWLESS_RESEND_SUCCESS_PHONE: "SMS resent", PWLESS_RESEND_BTN_DISABLED_START: "Resend in ", PWLESS_RESEND_BTN_DISABLED_END: "", PWLESS_RESEND_BTN_EMAIL: "Resend Email", PWLESS_RESEND_BTN_PHONE: "Resend SMS", PWLESS_USER_INPUT_CODE_HEADER_TITLE: "Enter OTP", PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE: "An OTP was sent to you at", PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE_LINK: "An OTP and a magic link was sent to you at", PWLESS_USER_INPUT_CODE_INPUT_LABEL: "OTP", PWLESS_MFA_HEADER_TITLE_PHONE: "SMS based OTP", PWLESS_MFA_HEADER_TITLE_EMAIL: "Email based OTP", PWLESS_MFA_FOOTER_LOGOUT: "Logout", + /* + * The following are error messages from our backend SDK. + * These are returned as full messages to preserver compatibilty, but they work just like the keys above. + * They are shown as is by default (setting the value to undefined will display the raw translation key) + */ + "Failed to generate a one time code. Please try again": undefined, "Phone number is invalid": undefined, "Email is invalid": undefined, "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_002)": undefined, "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_003)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_017)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_018)": undefined, "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_019)": undefined }), }; -var LinkClickedScreen = function (props) { - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - var userContext = uiEntry.useUserContext(); - if (props.userContext !== undefined) { - userContext = props.userContext; - } - var _a = React.useState(false), - requireUserInteraction = _a[0], - setRequireUserInteraction = _a[1]; - var consumeCodeAtMount = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var preAuthSessionId, linkCode, loginAttemptInfo, payloadBeforeCall; - var _b; - return genericComponentOverrideContext.__generator(this, function (_c) { - switch (_c.label) { - case 0: - preAuthSessionId = genericComponentOverrideContext.getQueryParams("preAuthSessionId"); - linkCode = genericComponentOverrideContext.getURLHash(); - if (!(preAuthSessionId === null || preAuthSessionId.length === 0 || linkCode.length === 0)) - return [3 /*break*/, 2]; - return [ - 4 /*yield*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - navigate: props.navigate, - queryParams: { - error: "signin", - }, - redirectBack: false, - userContext: userContext, - }), - ]; - case 1: - _c.sent(); - return [2 /*return*/, "REDIRECTING"]; - case 2: - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.getLoginAttemptInfo({ userContext: userContext }), - ]; - case 3: - loginAttemptInfo = _c.sent(); - if ( - (loginAttemptInfo === null || loginAttemptInfo === void 0 - ? void 0 - : loginAttemptInfo.preAuthSessionId) !== preAuthSessionId - ) { - return [2 /*return*/, "REQUIRES_INTERACTION"]; - } - _c.label = 4; - case 4: - _c.trys.push([4, 6, , 7]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]; - case 5: - payloadBeforeCall = _c.sent(); - return [3 /*break*/, 7]; - case 6: - _c.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadBeforeCall = undefined; - return [3 /*break*/, 7]; - case 7: - _b = { - payloadBeforeCall: payloadBeforeCall, - }; - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.consumeCode({ - userContext: userContext, - }), - ]; - case 8: - return [2 /*return*/, ((_b.response = _c.sent()), _b)]; - } - }); - }); - }, - [props.recipe, props.navigate, userContext] - ); - var handleConsumeResp = React.useCallback( - function (consumeRes) { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var response, payloadBeforeCall, payloadAfterCall, loginAttemptInfo; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if (consumeRes === "REQUIRES_INTERACTION") { - // We set this here, to make sure it's set after a possible remount - setRequireUserInteraction(true); - } - if (typeof consumeRes === "string") { - // In this case we are already redirecting or showing the continue button - return [2 /*return*/]; - } - (response = consumeRes.response), (payloadBeforeCall = consumeRes.payloadBeforeCall); - if (response.status === "RESTART_FLOW_ERROR") { - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - navigate: props.navigate, - queryParams: { - error: "restart_link", - }, - redirectBack: false, - userContext: userContext, - }), - ]; - } - if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { - return [ - 2 /*return*/, - genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - navigate: props.navigate, - queryParams: { - error: response.reason, - }, - redirectBack: false, - userContext: userContext, - }), - ]; - } - if (!(response.status === "OK")) return [3 /*break*/, 7]; - payloadAfterCall = void 0; - _b.label = 1; - case 1: - _b.trys.push([1, 3, , 4]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]; - case 2: - payloadAfterCall = _b.sent(); - return [3 /*break*/, 4]; - case 3: - _b.sent(); - payloadAfterCall = undefined; - return [3 /*break*/, 4]; - case 4: - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.getLoginAttemptInfo({ - userContext: userContext, - }), - ]; - case 5: - loginAttemptInfo = _b.sent(); - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.clearLoginAttemptInfo({ - userContext: userContext, - }), - ]; - case 6: - _b.sent(); - return [ - 2 /*return*/, - types.Session.getInstanceOrThrow() - .validateGlobalClaimsAndHandleSuccessRedirection( - { - action: "SUCCESS", - createdNewUser: - response.createdNewRecipeUser && - response.user.loginMethods.length === 1, - isNewRecipeUser: response.createdNewRecipeUser, - newSessionCreated: - payloadAfterCall !== undefined && - (payloadBeforeCall === undefined || - payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), - recipeId: props.recipe.recipeID, - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - props.recipe.recipeID, - loginAttemptInfo === null || loginAttemptInfo === void 0 - ? void 0 - : loginAttemptInfo.redirectToPath, - userContext, - props.navigate - ) - .catch(rethrowInRender), - ]; - case 7: - return [2 /*return*/]; - } - }); - }); - }, - [props.navigate, props.recipe, userContext] - ); - var handleConsumeError = React.useCallback( - function (err) { - if (STGeneralError__default.default.isThisError(err)) { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - navigate: props.navigate, - queryParams: { - error: "custom", - message: err.message, - }, - redirectBack: false, - userContext: userContext, - }); - } else { - return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ - navigate: props.navigate, - queryParams: { - error: "signin", - }, - redirectBack: false, - userContext: userContext, - }); - } - }, - [props.navigate, userContext] - ); - genericComponentOverrideContext.useOnMountAPICall(consumeCodeAtMount, handleConsumeResp, handleConsumeError); - var recipeComponentOverrides = props.useComponentOverrides(); - var childProps = { - recipeImplementation: props.recipe.webJSRecipe, - config: props.recipe.config, - requireUserInteraction: requireUserInteraction, - consumeCode: function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var payloadBeforeCall, consumeResp, err_1; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - _b.trys.push([0, 7, , 8]); - payloadBeforeCall = void 0; - _b.label = 1; - case 1: - _b.trys.push([1, 3, , 4]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]; - case 2: - payloadBeforeCall = _b.sent(); - return [3 /*break*/, 4]; - case 3: - _b.sent(); - // If getAccessTokenPayloadSecurely threw, that generally means we have no active session - payloadBeforeCall = undefined; - return [3 /*break*/, 4]; - case 4: - return [ - 4 /*yield*/, - props.recipe.webJSRecipe.consumeCode({ - userContext: userContext, - }), - ]; - case 5: - consumeResp = _b.sent(); - return [ - 4 /*yield*/, - handleConsumeResp({ response: consumeResp, payloadBeforeCall: payloadBeforeCall }), - ]; - case 6: - _b.sent(); - return [3 /*break*/, 8]; - case 7: - err_1 = _b.sent(); - void handleConsumeError(err_1); - return [3 /*break*/, 8]; - case 8: - return [2 /*return*/]; - } - }); - }); - }, - }; - return jsxRuntime.jsx( - uiEntry.ComponentOverrideContext.Provider, - genericComponentOverrideContext.__assign( - { value: recipeComponentOverrides }, - { - children: jsxRuntime.jsx( - uiEntry.FeatureWrapper, - genericComponentOverrideContext.__assign( - { - useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, - defaultStore: defaultTranslationsPasswordless, - }, - { - children: jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - LinkClickedScreen$1, - genericComponentOverrideContext.__assign({}, childProps) - ), - props.children && - React__namespace.default.Children.map(props.children, function (child) { - if (React__namespace.default.isValidElement(child)) { - return React__namespace.default.cloneElement(child, childProps); - } - return child; - }), - ], - }), - } - ) - ), - } - ) - ); +var LinkClickedScreen = function (props) { + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + var userContext = uiEntry.useUserContext(); + if (props.userContext !== undefined) { + userContext = props.userContext; + } + var _a = React.useState(false), requireUserInteraction = _a[0], setRequireUserInteraction = _a[1]; + var consumeCodeAtMount = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var preAuthSessionId, linkCode, loginAttemptInfo, payloadBeforeCall; + var _b; + return logger.__generator(this, function (_c) { + switch (_c.label) { + case 0: + preAuthSessionId = genericComponentOverrideContext.getQueryParams("preAuthSessionId"); + linkCode = genericComponentOverrideContext.getURLHash(); + if (!(preAuthSessionId === null || preAuthSessionId.length === 0 || linkCode.length === 0)) return [3 /*break*/, 2]; + return [4 /*yield*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + navigate: props.navigate, + queryParams: { + error: "signin", + }, + redirectBack: false, + userContext: userContext, + })]; + case 1: + _c.sent(); + return [2 /*return*/, "REDIRECTING"]; + case 2: return [4 /*yield*/, props.recipe.webJSRecipe.getLoginAttemptInfo({ userContext: userContext })]; + case 3: + loginAttemptInfo = _c.sent(); + if ((loginAttemptInfo === null || loginAttemptInfo === void 0 ? void 0 : loginAttemptInfo.preAuthSessionId) !== preAuthSessionId) { + return [2 /*return*/, "REQUIRES_INTERACTION"]; + } + _c.label = 4; + case 4: + _c.trys.push([4, 6, , 7]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: userContext, + })]; + case 5: + payloadBeforeCall = _c.sent(); + return [3 /*break*/, 7]; + case 6: + _c.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadBeforeCall = undefined; + return [3 /*break*/, 7]; + case 7: + _b = { + payloadBeforeCall: payloadBeforeCall + }; + return [4 /*yield*/, props.recipe.webJSRecipe.consumeCode({ + userContext: userContext, + })]; + case 8: return [2 /*return*/, (_b.response = _c.sent(), + _b)]; + } + }); + }); }, [props.recipe, props.navigate, userContext]); + var handleConsumeResp = React.useCallback(function (consumeRes) { return logger.__awaiter(void 0, void 0, void 0, function () { + var response, payloadBeforeCall, payloadAfterCall, loginAttemptInfo; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (consumeRes === "REQUIRES_INTERACTION") { + // We set this here, to make sure it's set after a possible remount + setRequireUserInteraction(true); + } + if (typeof consumeRes === "string") { + // In this case we are already redirecting or showing the continue button + return [2 /*return*/]; + } + response = consumeRes.response, payloadBeforeCall = consumeRes.payloadBeforeCall; + if (response.status === "RESTART_FLOW_ERROR") { + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + navigate: props.navigate, + queryParams: { + error: "restart_link", + }, + redirectBack: false, + userContext: userContext, + })]; + } + if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { + return [2 /*return*/, genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + navigate: props.navigate, + queryParams: { + error: response.reason, + }, + redirectBack: false, + userContext: userContext, + })]; + } + if (!(response.status === "OK")) return [3 /*break*/, 7]; + payloadAfterCall = void 0; + _b.label = 1; + case 1: + _b.trys.push([1, 3, , 4]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: userContext, + })]; + case 2: + payloadAfterCall = _b.sent(); + return [3 /*break*/, 4]; + case 3: + _b.sent(); + payloadAfterCall = undefined; + return [3 /*break*/, 4]; + case 4: return [4 /*yield*/, props.recipe.webJSRecipe.getLoginAttemptInfo({ + userContext: userContext, + })]; + case 5: + loginAttemptInfo = _b.sent(); + return [4 /*yield*/, props.recipe.webJSRecipe.clearLoginAttemptInfo({ + userContext: userContext, + })]; + case 6: + _b.sent(); + return [2 /*return*/, types.Session.getInstanceOrThrow() + .validateGlobalClaimsAndHandleSuccessRedirection({ + action: "SUCCESS", + createdNewUser: response.createdNewRecipeUser && response.user.loginMethods.length === 1, + isNewRecipeUser: response.createdNewRecipeUser, + newSessionCreated: payloadAfterCall !== undefined && + (payloadBeforeCall === undefined || + payloadBeforeCall.sessionHandle !== payloadAfterCall.sessionHandle), + recipeId: props.recipe.recipeID, + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + }, props.recipe.recipeID, loginAttemptInfo === null || loginAttemptInfo === void 0 ? void 0 : loginAttemptInfo.redirectToPath, userContext, props.navigate) + .catch(rethrowInRender)]; + case 7: return [2 /*return*/]; + } + }); + }); }, [props.navigate, props.recipe, userContext]); + var handleConsumeError = React.useCallback(function (err) { + if (STGeneralError__default.default.isThisError(err)) { + return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + navigate: props.navigate, + queryParams: { + error: "custom", + message: err.message, + }, + redirectBack: false, + userContext: userContext, + }); + } + else { + return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().redirectToAuth({ + navigate: props.navigate, + queryParams: { + error: "signin", + }, + redirectBack: false, + userContext: userContext, + }); + } + }, [props.navigate, userContext]); + genericComponentOverrideContext.useOnMountAPICall(consumeCodeAtMount, handleConsumeResp, handleConsumeError); + var recipeComponentOverrides = props.useComponentOverrides(); + var childProps = { + recipeImplementation: props.recipe.webJSRecipe, + config: props.recipe.config, + requireUserInteraction: requireUserInteraction, + consumeCode: function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var payloadBeforeCall, consumeResp, err_1; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 7, , 8]); + payloadBeforeCall = void 0; + _b.label = 1; + case 1: + _b.trys.push([1, 3, , 4]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: userContext, + })]; + case 2: + payloadBeforeCall = _b.sent(); + return [3 /*break*/, 4]; + case 3: + _b.sent(); + // If getAccessTokenPayloadSecurely threw, that generally means we have no active session + payloadBeforeCall = undefined; + return [3 /*break*/, 4]; + case 4: return [4 /*yield*/, props.recipe.webJSRecipe.consumeCode({ + userContext: userContext, + })]; + case 5: + consumeResp = _b.sent(); + return [4 /*yield*/, handleConsumeResp({ response: consumeResp, payloadBeforeCall: payloadBeforeCall })]; + case 6: + _b.sent(); + return [3 /*break*/, 8]; + case 7: + err_1 = _b.sent(); + void handleConsumeError(err_1); + return [3 /*break*/, 8]; + case 8: return [2 /*return*/]; + } + }); + }); }, + }; + return (jsxRuntime.jsx(uiEntry.ComponentOverrideContext.Provider, logger.__assign({ value: recipeComponentOverrides }, { children: jsxRuntime.jsx(uiEntry.FeatureWrapper, logger.__assign({ useShadowDom: genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().useShadowDom, defaultStore: defaultTranslationsPasswordless }, { children: jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(LinkClickedScreen$1, logger.__assign({}, childProps)), props.children && + React__namespace.default.Children.map(props.children, function (child) { + if (React__namespace.default.isValidElement(child)) { + return React__namespace.default.cloneElement(child, childProps); + } + return child; + })] }) })) }))); }; -/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. - * - * This software is licensed under the Apache License, Version 2.0 (the - * "License") as published by the Apache Software Foundation. - * - * You may not use this file except in compliance with the License. You may - * obtain a copy of the License at http="//www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -/* - * Imports. - */ -/* - * Component. - */ -function SMSLargeIcon() { - return jsxRuntime.jsxs( - "svg", - genericComponentOverrideContext.__assign( - { width: "81", height: "74", viewBox: "0 0 81 74", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, - { - children: [ - jsxRuntime.jsx("rect", { - width: "81", - height: "74", - rx: "12", - fill: "#2D3644", - "fill-opacity": "0.1", - }), - jsxRuntime.jsx("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M24.2791 18.0721C23.4556 18.2346 22.8383 18.5501 22.2521 19.1081C21.8207 19.5187 21.386 20.2086 21.202 20.7749C20.9933 21.4174 21 21.014 21 32.9399C21 44.8055 20.9953 44.5105 21.1962 45.0802C21.6287 46.3063 22.5027 47.2275 23.6138 47.6284C24.2239 47.8485 24.5957 47.8781 26.7622 47.879L28.7938 47.8799L28.7945 51.3361C28.7953 54.928 28.797 54.9609 28.9957 55.3449C29.2026 55.7447 29.7368 56.0357 30.1914 55.9964C30.557 55.9648 30.7792 55.8285 31.6485 55.1029C32.0817 54.7413 32.5179 54.3786 32.6179 54.2969C32.718 54.2151 32.8782 54.0813 32.9739 53.9995C33.0696 53.9178 33.2293 53.784 33.3288 53.7022C33.6246 53.4593 35.3203 52.0426 35.4235 51.9522C35.476 51.9063 35.6683 51.7462 35.851 51.5963C36.0337 51.4464 36.2261 51.2867 36.2785 51.2414C36.3609 51.1702 37.0269 50.6141 38.5123 49.3762C38.7214 49.2019 38.9673 48.9969 39.0588 48.9205C39.1503 48.8442 39.4689 48.5788 39.7668 48.3308L40.3085 47.8799H48.2834C53.8058 47.8799 56.3722 47.8632 56.6286 47.8256C58.2358 47.59 59.5022 46.4036 59.9294 44.7333C60.0239 44.364 60.0233 21.5127 59.9288 21.1466C59.5021 19.493 58.3008 18.3427 56.7137 18.0678C56.1756 17.9746 24.7519 17.9788 24.2791 18.0721ZM51.4173 28.981C52.2557 29.3855 52.4751 30.4017 51.8772 31.1101C51.7556 31.254 51.5818 31.3895 51.4269 31.4609L51.1745 31.5773H40.5392C28.8194 31.5773 29.681 31.6007 29.2987 31.2721C28.9166 30.9437 28.7361 30.438 28.8355 29.9747C28.9464 29.458 29.3009 29.0629 29.7764 28.9262C29.9644 28.8722 31.912 28.8618 40.6033 28.8685L51.201 28.8767L51.4173 28.981ZM41.0193 34.419C41.3249 34.5599 41.6353 34.9094 41.7403 35.2309C41.9512 35.8762 41.6712 36.5538 41.0654 36.8639L40.7934 37.0032L35.4708 37.0186C31.645 37.0297 30.0783 37.0183 29.8996 36.9781C29.5714 36.9043 29.4061 36.814 29.1927 36.5921C28.6448 36.0224 28.6929 35.1284 29.2996 34.607C29.6628 34.2948 29.3424 34.3108 35.315 34.3065L40.767 34.3026L41.0193 34.419Z", - fill: "#2D3644", - }), - ], - } - ) - ); +/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http="//www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +/* + * Imports. + */ +/* + * Component. + */ +function SMSLargeIcon() { + return (jsxRuntime.jsxs("svg", logger.__assign({ width: "81", height: "74", viewBox: "0 0 81 74", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, { children: [jsxRuntime.jsx("rect", { width: "81", height: "74", rx: "12", fill: "#2D3644", "fill-opacity": "0.1" }), jsxRuntime.jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M24.2791 18.0721C23.4556 18.2346 22.8383 18.5501 22.2521 19.1081C21.8207 19.5187 21.386 20.2086 21.202 20.7749C20.9933 21.4174 21 21.014 21 32.9399C21 44.8055 20.9953 44.5105 21.1962 45.0802C21.6287 46.3063 22.5027 47.2275 23.6138 47.6284C24.2239 47.8485 24.5957 47.8781 26.7622 47.879L28.7938 47.8799L28.7945 51.3361C28.7953 54.928 28.797 54.9609 28.9957 55.3449C29.2026 55.7447 29.7368 56.0357 30.1914 55.9964C30.557 55.9648 30.7792 55.8285 31.6485 55.1029C32.0817 54.7413 32.5179 54.3786 32.6179 54.2969C32.718 54.2151 32.8782 54.0813 32.9739 53.9995C33.0696 53.9178 33.2293 53.784 33.3288 53.7022C33.6246 53.4593 35.3203 52.0426 35.4235 51.9522C35.476 51.9063 35.6683 51.7462 35.851 51.5963C36.0337 51.4464 36.2261 51.2867 36.2785 51.2414C36.3609 51.1702 37.0269 50.6141 38.5123 49.3762C38.7214 49.2019 38.9673 48.9969 39.0588 48.9205C39.1503 48.8442 39.4689 48.5788 39.7668 48.3308L40.3085 47.8799H48.2834C53.8058 47.8799 56.3722 47.8632 56.6286 47.8256C58.2358 47.59 59.5022 46.4036 59.9294 44.7333C60.0239 44.364 60.0233 21.5127 59.9288 21.1466C59.5021 19.493 58.3008 18.3427 56.7137 18.0678C56.1756 17.9746 24.7519 17.9788 24.2791 18.0721ZM51.4173 28.981C52.2557 29.3855 52.4751 30.4017 51.8772 31.1101C51.7556 31.254 51.5818 31.3895 51.4269 31.4609L51.1745 31.5773H40.5392C28.8194 31.5773 29.681 31.6007 29.2987 31.2721C28.9166 30.9437 28.7361 30.438 28.8355 29.9747C28.9464 29.458 29.3009 29.0629 29.7764 28.9262C29.9644 28.8722 31.912 28.8618 40.6033 28.8685L51.201 28.8767L51.4173 28.981ZM41.0193 34.419C41.3249 34.5599 41.6353 34.9094 41.7403 35.2309C41.9512 35.8762 41.6712 36.5538 41.0654 36.8639L40.7934 37.0032L35.4708 37.0186C31.645 37.0297 30.0783 37.0183 29.8996 36.9781C29.5714 36.9043 29.4061 36.814 29.1927 36.5921C28.6448 36.0224 28.6929 35.1284 29.2996 34.607C29.6628 34.2948 29.3424 34.3108 35.315 34.3065L40.767 34.3026L41.0193 34.419Z", fill: "#2D3644" })] }))); } -var ResendButton = uiEntry.withOverride("PasswordlessResendButton", function PasswordlessResendButton(_a) { - var loginAttemptInfo = _a.loginAttemptInfo, - resendEmailOrSMSGapInSeconds = _a.resendEmailOrSMSGapInSeconds, - onClick = _a.onClick; - var t = translationContext.useTranslation(); - var getTimeLeft = React.useCallback( - function () { - var timeLeft = loginAttemptInfo.lastResend + resendEmailOrSMSGapInSeconds * 1000 - Date.now(); - return timeLeft < 0 ? undefined : Math.ceil(timeLeft / 1000); - }, - [loginAttemptInfo, resendEmailOrSMSGapInSeconds] - ); - var _b = React.useState(getTimeLeft()), - secsUntilResend = _b[0], - setSecsUntilResend = _b[1]; - React.useEffect( - function () { - // This runs every time the loginAttemptInfo updates, so after every resend - var interval = setInterval(function () { - var timeLeft = getTimeLeft(); - if (timeLeft === undefined) { - clearInterval(interval); - } - setSecsUntilResend(timeLeft); - }, 500); - return function () { - // This can safely run twice - clearInterval(interval); - }; - }, - [getTimeLeft, setSecsUntilResend] - ); - return jsxRuntime.jsx( - "button", - genericComponentOverrideContext.__assign( - { - type: "button", - disabled: secsUntilResend !== undefined, - onClick: onClick, - "data-supertokens": "link linkButton formLabelLinkBtn resendCodeBtn", - }, - { - children: - secsUntilResend !== undefined - ? jsxRuntime.jsxs(React__namespace.default.Fragment, { - children: [ - t("PWLESS_RESEND_BTN_DISABLED_START"), - jsxRuntime.jsxs("strong", { - children: [ - Math.floor(secsUntilResend / 60) - .toString() - .padStart(2, "0"), - ":", - (secsUntilResend % 60).toString().padStart(2, "0"), - ], - }), - t("PWLESS_RESEND_BTN_DISABLED_END"), - ], - }) - : loginAttemptInfo.contactMethod === "EMAIL" - ? t("PWLESS_RESEND_BTN_EMAIL") - : t("PWLESS_RESEND_BTN_PHONE"), - } - ) - ); +var ResendButton = uiEntry.withOverride("PasswordlessResendButton", function PasswordlessResendButton(_a) { + var loginAttemptInfo = _a.loginAttemptInfo, resendEmailOrSMSGapInSeconds = _a.resendEmailOrSMSGapInSeconds, onClick = _a.onClick; + var t = translationContext.useTranslation(); + var getTimeLeft = React.useCallback(function () { + var timeLeft = loginAttemptInfo.lastResend + resendEmailOrSMSGapInSeconds * 1000 - Date.now(); + return timeLeft < 0 ? undefined : Math.ceil(timeLeft / 1000); + }, [loginAttemptInfo, resendEmailOrSMSGapInSeconds]); + var _b = React.useState(getTimeLeft()), secsUntilResend = _b[0], setSecsUntilResend = _b[1]; + React.useEffect(function () { + // This runs every time the loginAttemptInfo updates, so after every resend + var interval = setInterval(function () { + var timeLeft = getTimeLeft(); + if (timeLeft === undefined) { + clearInterval(interval); + } + setSecsUntilResend(timeLeft); + }, 500); + return function () { + // This can safely run twice + clearInterval(interval); + }; + }, [getTimeLeft, setSecsUntilResend]); + return (jsxRuntime.jsx("button", logger.__assign({ type: "button", disabled: secsUntilResend !== undefined, onClick: onClick, "data-supertokens": "link linkButton formLabelLinkBtn resendCodeBtn" }, { children: secsUntilResend !== undefined ? (jsxRuntime.jsxs(React__namespace.default.Fragment, { children: [t("PWLESS_RESEND_BTN_DISABLED_START"), jsxRuntime.jsxs("strong", { children: [Math.floor(secsUntilResend / 60) + .toString() + .padStart(2, "0"), ":", (secsUntilResend % 60).toString().padStart(2, "0")] }), t("PWLESS_RESEND_BTN_DISABLED_END")] })) : loginAttemptInfo.contactMethod === "EMAIL" ? (t("PWLESS_RESEND_BTN_EMAIL")) : (t("PWLESS_RESEND_BTN_PHONE")) }))); }); -var PasswordlessLinkSent = function (props) { - var t = translationContext.useTranslation(); - var userContext = uiEntry.useUserContext(); - var _a = React.useState(props.error !== undefined ? "ERROR" : "READY"), - status = _a[0], - setStatus = _a[1]; - // Any because node types are included here, messing with return type of setTimeout - var resendNotifTimeout = React.useRef(); - React.useEffect(function () { - return function () { - // This can safely run even if it was cleared before - if (resendNotifTimeout.current) { - clearTimeout(resendNotifTimeout.current); - } - }; - }, []); - var resendEmail = React.useCallback( - function () { - return genericComponentOverrideContext.__awaiter(void 0, void 0, void 0, function () { - var response, generalError, e_1; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 5, , 6]); - props.clearError(); - response = void 0; - generalError = void 0; - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [ - 4 /*yield*/, - props.recipeImplementation.resendCode({ - userContext: userContext, - }), - ]; - case 2: - response = _a.sent(); - return [3 /*break*/, 4]; - case 3: - e_1 = _a.sent(); - if (STGeneralError__default.default.isThisError(e_1)) { - generalError = e_1; - } else { - throw e_1; - } - return [3 /*break*/, 4]; - case 4: - if (response !== undefined && response.status === "OK") { - setStatus("LINK_RESENT"); - resendNotifTimeout.current = setTimeout(function () { - setStatus(function (status) { - return status === "LINK_RESENT" ? "READY" : status; - }); - resendNotifTimeout.current = undefined; - }, 2000); - } else { - setStatus("ERROR"); - if (generalError !== undefined) { - props.onError(generalError.message); - } - } - return [3 /*break*/, 6]; - case 5: - _a.sent(); - setStatus("ERROR"); - return [3 /*break*/, 6]; - case 6: - return [2 /*return*/]; - } - }); - }); - }, - [props.recipeImplementation, props.loginAttemptInfo, props.config, setStatus] - ); - var resendActive = status === "LINK_RESENT"; - return jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "container" }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "row" }, - { - children: [ - status === "ERROR" && - jsxRuntime.jsx(uiEntry.GeneralError, { - error: props.error === undefined ? "SOMETHING_WENT_WRONG_ERROR" : props.error, - }), - resendActive && - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "generalSuccess" }, - { children: t("PWLESS_LINK_SENT_RESEND_SUCCESS") } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "sendCodeIcon" }, - { - children: - props.loginAttemptInfo.contactMethod === "EMAIL" - ? jsxRuntime.jsx(emailLargeIcon.EmailLargeIcon, {}) - : jsxRuntime.jsx(SMSLargeIcon, {}), - } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "headerTitle headerTinyTitle" }, - { children: t("PWLESS_LINK_SENT_RESEND_TITLE") } - ) - ), - jsxRuntime.jsx("div", { "data-supertokens": "divider" }), - jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "primaryText sendCodeText" }, - { - children: [ - props.loginAttemptInfo.contactMethod === "EMAIL" - ? t("PWLESS_LINK_SENT_RESEND_DESC_START_EMAIL") - : t("PWLESS_LINK_SENT_RESEND_DESC_START_PHONE"), - jsxRuntime.jsx("strong", { - children: props.loginAttemptInfo.contactInfo, - }), - props.loginAttemptInfo.contactMethod === "EMAIL" - ? t("PWLESS_LINK_SENT_RESEND_DESC_END_EMAIL") - : t("PWLESS_LINK_SENT_RESEND_DESC_END_PHONE"), - ], - } - ) - ), - jsxRuntime.jsx( - "div", - genericComponentOverrideContext.__assign( - { - "data-supertokens": "buttonWithArrow", - onClick: function () { - return props.recipeImplementation.clearLoginAttemptInfo({ - userContext: userContext, - }); - }, - }, - { - children: jsxRuntime.jsxs( - "div", - genericComponentOverrideContext.__assign( - { "data-supertokens": "secondaryText secondaryLinkWithLeftArrow" }, - { - children: [ - jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { - color: "rgb(var(--palette-textGray))", - }), - jsxRuntime.jsx("span", { - children: - props.loginAttemptInfo.contactMethod === "EMAIL" - ? t( - "PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_EMAIL" - ) - : t( - "PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_PHONE" - ), - }), - ], - } - ) - ), - } - ) - ), - jsxRuntime.jsx(ResendButton, { - loginAttemptInfo: props.loginAttemptInfo, - resendEmailOrSMSGapInSeconds: - props.config.signInUpFeature.resendEmailOrSMSGapInSeconds, - onClick: resendEmail, - }), - ], - } - ) - ), - } - ) - ); -}; -var LinkSent = uiEntry.withOverride("PasswordlessLinkSent", PasswordlessLinkSent); -function LinkSentWrapper(props) { - var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; - var activeStyle = props.config.signInUpFeature.linkSentScreenStyle; - return jsxRuntime.jsx( - uiEntry.UserContextWrapper, - genericComponentOverrideContext.__assign( - { userContext: props.userContext }, - { - children: jsxRuntime.jsx( - ThemeBase, - genericComponentOverrideContext.__assign( - { userStyles: [rootStyle, props.config.recipeRootStyle, activeStyle] }, - { children: jsxRuntime.jsx(LinkSent, genericComponentOverrideContext.__assign({}, props)) } - ) - ), - } - ) - ); +var PasswordlessLinkSent = function (props) { + var t = translationContext.useTranslation(); + var userContext = uiEntry.useUserContext(); + var _a = React.useState(props.error !== undefined ? "ERROR" : "READY"), status = _a[0], setStatus = _a[1]; + // Any because node types are included here, messing with return type of setTimeout + var resendNotifTimeout = React.useRef(); + React.useEffect(function () { + return function () { + // This can safely run even if it was cleared before + if (resendNotifTimeout.current) { + clearTimeout(resendNotifTimeout.current); + } + }; + }, []); + var resendEmail = React.useCallback(function () { return logger.__awaiter(void 0, void 0, void 0, function () { + var response, generalError, e_1; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 5, , 6]); + props.clearError(); + response = void 0; + generalError = void 0; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, props.recipeImplementation.resendCode({ + userContext: userContext, + })]; + case 2: + response = _a.sent(); + return [3 /*break*/, 4]; + case 3: + e_1 = _a.sent(); + if (STGeneralError__default.default.isThisError(e_1)) { + generalError = e_1; + } + else { + throw e_1; + } + return [3 /*break*/, 4]; + case 4: + if (response !== undefined && response.status === "OK") { + setStatus("LINK_RESENT"); + resendNotifTimeout.current = setTimeout(function () { + setStatus(function (status) { return (status === "LINK_RESENT" ? "READY" : status); }); + resendNotifTimeout.current = undefined; + }, 2000); + } + else { + setStatus("ERROR"); + if (generalError !== undefined) { + props.onError(generalError.message); + } + } + return [3 /*break*/, 6]; + case 5: + _a.sent(); + setStatus("ERROR"); + return [3 /*break*/, 6]; + case 6: return [2 /*return*/]; + } + }); + }); }, [props.recipeImplementation, props.loginAttemptInfo, props.config, setStatus]); + var resendActive = status === "LINK_RESENT"; + return (jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "container" }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "row" }, { children: [status === "ERROR" && (jsxRuntime.jsx(uiEntry.GeneralError, { error: props.error === undefined ? "SOMETHING_WENT_WRONG_ERROR" : props.error })), resendActive && jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "generalSuccess" }, { children: t("PWLESS_LINK_SENT_RESEND_SUCCESS") })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "sendCodeIcon" }, { children: props.loginAttemptInfo.contactMethod === "EMAIL" ? jsxRuntime.jsx(emailLargeIcon.EmailLargeIcon, {}) : jsxRuntime.jsx(SMSLargeIcon, {}) })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "headerTitle headerTinyTitle" }, { children: t("PWLESS_LINK_SENT_RESEND_TITLE") })), jsxRuntime.jsx("div", { "data-supertokens": "divider" }), jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "primaryText sendCodeText" }, { children: [props.loginAttemptInfo.contactMethod === "EMAIL" + ? t("PWLESS_LINK_SENT_RESEND_DESC_START_EMAIL") + : t("PWLESS_LINK_SENT_RESEND_DESC_START_PHONE"), jsxRuntime.jsx("strong", { children: props.loginAttemptInfo.contactInfo }), props.loginAttemptInfo.contactMethod === "EMAIL" + ? t("PWLESS_LINK_SENT_RESEND_DESC_END_EMAIL") + : t("PWLESS_LINK_SENT_RESEND_DESC_END_PHONE")] })), jsxRuntime.jsx("div", logger.__assign({ "data-supertokens": "buttonWithArrow", onClick: function () { + return props.recipeImplementation.clearLoginAttemptInfo({ + userContext: userContext, + }); + } }, { children: jsxRuntime.jsxs("div", logger.__assign({ "data-supertokens": "secondaryText secondaryLinkWithLeftArrow" }, { children: [jsxRuntime.jsx(arrowLeftIcon.ArrowLeftIcon, { color: "rgb(var(--palette-textGray))" }), jsxRuntime.jsx("span", { children: props.loginAttemptInfo.contactMethod === "EMAIL" + ? t("PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_EMAIL") + : t("PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_PHONE") })] })) })), jsxRuntime.jsx(ResendButton, { loginAttemptInfo: props.loginAttemptInfo, resendEmailOrSMSGapInSeconds: props.config.signInUpFeature.resendEmailOrSMSGapInSeconds, onClick: resendEmail })] })) }))); +}; +var LinkSent = uiEntry.withOverride("PasswordlessLinkSent", PasswordlessLinkSent); +function LinkSentWrapper(props) { + var rootStyle = genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().rootStyle; + var activeStyle = props.config.signInUpFeature.linkSentScreenStyle; + return (jsxRuntime.jsx(uiEntry.UserContextWrapper, logger.__assign({ userContext: props.userContext }, { children: jsxRuntime.jsx(ThemeBase, logger.__assign({ userStyles: [rootStyle, props.config.recipeRootStyle, activeStyle] }, { children: jsxRuntime.jsx(LinkSent, logger.__assign({}, props)) })) }))); } -function useChildProps$4( - recipe$1, - loginAttemptInfo, - error, - onError, - clearError, - rebuildAuthPage, - userContext, - navigate -) { - var _this = this; - var session$1 = uiEntry.useSessionContext(); - var recipeImplementation = React__namespace.useMemo( - function () { - return getModifiedRecipeImplementation$4(recipe$1.webJSRecipe, onError, rebuildAuthPage); - }, - [recipe$1, onError, rebuildAuthPage] - ); - var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); - return React.useMemo( - function () { - return { - userContext: userContext, - onSuccess: function (result) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var payloadAfterCall; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - _b.trys.push([0, 2, , 3]); - return [ - 4 /*yield*/, - types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ - userContext: userContext, - }), - ]; - case 1: - payloadAfterCall = _b.sent(); - return [3 /*break*/, 3]; - case 2: - _b.sent(); - payloadAfterCall = undefined; - return [3 /*break*/, 3]; - case 3: - return [ - 2 /*return*/, - types.Session.getInstanceOrThrow() - .validateGlobalClaimsAndHandleSuccessRedirection( - { - action: "SUCCESS", - createdNewUser: - result.createdNewRecipeUser && - result.user.loginMethods.length === 1, - isNewRecipeUser: result.createdNewRecipeUser, - newSessionCreated: - session$1.loading || - !session$1.doesSessionExist || - (payloadAfterCall !== undefined && - session$1.accessTokenPayload.sessionHandle !== - payloadAfterCall.sessionHandle), - recipeId: recipe$1.recipeID, - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - }, - recipe$1.recipeID, - genericComponentOverrideContext.getRedirectToPathFromURL(), - userContext, - navigate - ) - .catch(rethrowInRender), - ]; - } - }); - }); - }, - onFetchError: function (err) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var invalidClaims, evInstance; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - if ( - !( - err.status === - types.Session.getInstanceOrThrow().config.invalidClaimStatusCode - ) - ) - return [3 /*break*/, 5]; - return [ - 4 /*yield*/, - session.getInvalidClaimsFromResponse({ - response: err, - userContext: userContext, - }), - ]; - case 1: - invalidClaims = _b.sent(); - if ( - !invalidClaims.some(function (i) { - return i.id === emailverification.EmailVerificationClaim.id; - }) - ) - return [3 /*break*/, 5]; - _b.label = 2; - case 2: - _b.trys.push([2, 4, , 5]); - evInstance = recipe.EmailVerification.getInstanceOrThrow(); - return [ - 4 /*yield*/, - evInstance.redirect( - { - tenantIdFromQueryParams: - genericComponentOverrideContext.getTenantIdFromQueryParams(), - action: "VERIFY_EMAIL", - }, - navigate, - undefined, - userContext - ), - ]; - case 3: - _b.sent(); - return [2 /*return*/]; - case 4: - _b.sent(); - return [3 /*break*/, 5]; - case 5: - onError("SOMETHING_WENT_WRONG_ERROR"); - return [2 /*return*/]; - } - }); - }); - }, - loginAttemptInfo: loginAttemptInfo, - error: error, - onError: onError, - clearError: clearError, - recipeImplementation: recipeImplementation, - config: recipe$1.config, - }; - }, - [error, recipeImplementation] - ); -} -var LinkSentFeatureInner = function (props) { - var childProps = useChildProps$4( - props.recipe, - props.loginAttemptInfo, - props.error, - props.onError, - props.clearError, - props.rebuildAuthPage, - props.userContext, - props.navigate - ); - return jsxRuntime.jsxs(React.Fragment, { - children: [ - props.children === undefined && - jsxRuntime.jsx( - LinkSentWrapper, - genericComponentOverrideContext.__assign({}, childProps, { userContext: props.userContext }) - ), - props.children && - React__namespace.Children.map(props.children, function (child) { - if (React__namespace.isValidElement(child)) { - return React__namespace.cloneElement( - child, - genericComponentOverrideContext.__assign({}, childProps) - ); - } - return child; - }), - ], - }); -}; -var LinkSentFeature = function (props) { - var recipeComponentOverrides = props.useComponentOverrides(); - return jsxRuntime.jsx( - authCompWrapper.AuthComponentWrapper, - genericComponentOverrideContext.__assign( - { recipeComponentOverrides: recipeComponentOverrides }, - { children: jsxRuntime.jsx(LinkSentFeatureInner, genericComponentOverrideContext.__assign({}, props)) } - ) - ); -}; -function getModifiedRecipeImplementation$4(originalImpl, setError, rebuildAuthPage) { - var _this = this; - return genericComponentOverrideContext.__assign(genericComponentOverrideContext.__assign({}, originalImpl), { - resendCode: function (input) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var res, loginAttemptInfo, timestamp; - var _a; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - return [4 /*yield*/, originalImpl.resendCode(input)]; - case 1: - res = _b.sent(); - if (!(res.status === "OK")) return [3 /*break*/, 5]; - return [ - 4 /*yield*/, - originalImpl.getLoginAttemptInfo({ - userContext: input.userContext, - }), - ]; - case 2: - loginAttemptInfo = _b.sent(); - if (!(loginAttemptInfo !== undefined)) return [3 /*break*/, 4]; - timestamp = Date.now(); - return [ - 4 /*yield*/, - originalImpl.setLoginAttemptInfo({ - userContext: input.userContext, - attemptInfo: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, loginAttemptInfo), - { - shouldTryLinkingWithSessionUser: - (_a = loginAttemptInfo.shouldTryLinkingWithSessionUser) !== null && - _a !== void 0 - ? _a - : false, - lastResend: timestamp, - } - ), - }), - ]; - case 3: - _b.sent(); - _b.label = 4; - case 4: - return [3 /*break*/, 7]; - case 5: - if (!(res.status === "RESTART_FLOW_ERROR")) return [3 /*break*/, 7]; - return [ - 4 /*yield*/, - originalImpl.clearLoginAttemptInfo({ - userContext: input.userContext, - }), - ]; - case 6: - _b.sent(); - setError("ERROR_SIGN_IN_UP_RESEND_RESTART_FLOW"); - rebuildAuthPage(); - _b.label = 7; - case 7: - return [2 /*return*/, res]; - } - }); - }); - }, - consumeCode: function (input) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var res; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, originalImpl.consumeCode(input)]; - case 1: - res = _a.sent(); - if (!(res.status === "RESTART_FLOW_ERROR")) return [3 /*break*/, 3]; - return [ - 4 /*yield*/, - originalImpl.clearLoginAttemptInfo({ - userContext: input.userContext, - }), - ]; - case 2: - _a.sent(); - setError("ERROR_SIGN_IN_UP_CODE_CONSUME_RESTART_FLOW"); - rebuildAuthPage(); - return [3 /*break*/, 7]; - case 3: - if (!(res.status === "SIGN_IN_UP_NOT_ALLOWED")) return [3 /*break*/, 5]; - return [ - 4 /*yield*/, - originalImpl.clearLoginAttemptInfo({ - userContext: input.userContext, - }), - ]; - case 4: - _a.sent(); - setError(res.reason); - rebuildAuthPage(); - return [3 /*break*/, 7]; - case 5: - if (!(res.status === "OK")) return [3 /*break*/, 7]; - return [ - 4 /*yield*/, - originalImpl.clearLoginAttemptInfo({ - userContext: input.userContext, - }), - ]; - case 6: - _a.sent(); - _a.label = 7; - case 7: - return [2 /*return*/, res]; - } - }); - }); - }, - clearLoginAttemptInfo: function (input) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [ - 4 /*yield*/, - originalImpl.clearLoginAttemptInfo({ - userContext: input.userContext, - }), - ]; - case 1: - _a.sent(); - genericComponentOverrideContext.clearErrorQueryParam(); - rebuildAuthPage(); - return [2 /*return*/]; - } - }); - }); - }, - }); +function useChildProps$4(recipe$1, loginAttemptInfo, error, onError, clearError, rebuildAuthPage, userContext, navigate) { + var _this = this; + var session$1 = uiEntry.useSessionContext(); + var recipeImplementation = React__namespace.useMemo(function () { return getModifiedRecipeImplementation$4(recipe$1.webJSRecipe, onError, rebuildAuthPage); }, [recipe$1, onError, rebuildAuthPage]); + var rethrowInRender = genericComponentOverrideContext.useRethrowInRender(); + return React.useMemo(function () { + return { + userContext: userContext, + onSuccess: function (result) { return logger.__awaiter(_this, void 0, void 0, function () { + var payloadAfterCall; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 2, , 3]); + return [4 /*yield*/, types.Session.getInstanceOrThrow().getAccessTokenPayloadSecurely({ + userContext: userContext, + })]; + case 1: + payloadAfterCall = _b.sent(); + return [3 /*break*/, 3]; + case 2: + _b.sent(); + payloadAfterCall = undefined; + return [3 /*break*/, 3]; + case 3: return [2 /*return*/, types.Session.getInstanceOrThrow() + .validateGlobalClaimsAndHandleSuccessRedirection({ + action: "SUCCESS", + createdNewUser: result.createdNewRecipeUser && result.user.loginMethods.length === 1, + isNewRecipeUser: result.createdNewRecipeUser, + newSessionCreated: session$1.loading || + !session$1.doesSessionExist || + (payloadAfterCall !== undefined && + session$1.accessTokenPayload.sessionHandle !== payloadAfterCall.sessionHandle), + recipeId: recipe$1.recipeID, + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + }, recipe$1.recipeID, genericComponentOverrideContext.getRedirectToPathFromURL(), userContext, navigate) + .catch(rethrowInRender)]; + } + }); + }); }, + onFetchError: function (err) { return logger.__awaiter(_this, void 0, void 0, function () { + var invalidClaims, evInstance; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!(err.status === types.Session.getInstanceOrThrow().config.invalidClaimStatusCode)) return [3 /*break*/, 5]; + return [4 /*yield*/, session.getInvalidClaimsFromResponse({ response: err, userContext: userContext })]; + case 1: + invalidClaims = _b.sent(); + if (!invalidClaims.some(function (i) { return i.id === emailverification.EmailVerificationClaim.id; })) return [3 /*break*/, 5]; + _b.label = 2; + case 2: + _b.trys.push([2, 4, , 5]); + evInstance = recipe.EmailVerification.getInstanceOrThrow(); + return [4 /*yield*/, evInstance.redirect({ + tenantIdFromQueryParams: genericComponentOverrideContext.getTenantIdFromQueryParams(), + action: "VERIFY_EMAIL", + }, navigate, undefined, userContext)]; + case 3: + _b.sent(); + return [2 /*return*/]; + case 4: + _b.sent(); + return [3 /*break*/, 5]; + case 5: + onError("SOMETHING_WENT_WRONG_ERROR"); + return [2 /*return*/]; + } + }); + }); }, + loginAttemptInfo: loginAttemptInfo, + error: error, + onError: onError, + clearError: clearError, + recipeImplementation: recipeImplementation, + config: recipe$1.config, + }; + }, [error, recipeImplementation]); +} +var LinkSentFeatureInner = function (props) { + var childProps = useChildProps$4(props.recipe, props.loginAttemptInfo, props.error, props.onError, props.clearError, props.rebuildAuthPage, props.userContext, props.navigate); + return (jsxRuntime.jsxs(React.Fragment, { children: [props.children === undefined && jsxRuntime.jsx(LinkSentWrapper, logger.__assign({}, childProps, { userContext: props.userContext })), props.children && + React__namespace.Children.map(props.children, function (child) { + if (React__namespace.isValidElement(child)) { + return React__namespace.cloneElement(child, logger.__assign({}, childProps)); + } + return child; + })] })); +}; +var LinkSentFeature = function (props) { + var recipeComponentOverrides = props.useComponentOverrides(); + return (jsxRuntime.jsx(authCompWrapper.AuthComponentWrapper, logger.__assign({ recipeComponentOverrides: recipeComponentOverrides }, { children: jsxRuntime.jsx(LinkSentFeatureInner, logger.__assign({}, props)) }))); +}; +function getModifiedRecipeImplementation$4(originalImpl, setError, rebuildAuthPage) { + var _this = this; + return logger.__assign(logger.__assign({}, originalImpl), { resendCode: function (input) { return logger.__awaiter(_this, void 0, void 0, function () { + var res, loginAttemptInfo, timestamp; + var _a; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, originalImpl.resendCode(input)]; + case 1: + res = _b.sent(); + if (!(res.status === "OK")) return [3 /*break*/, 5]; + return [4 /*yield*/, originalImpl.getLoginAttemptInfo({ + userContext: input.userContext, + })]; + case 2: + loginAttemptInfo = _b.sent(); + if (!(loginAttemptInfo !== undefined)) return [3 /*break*/, 4]; + timestamp = Date.now(); + return [4 /*yield*/, originalImpl.setLoginAttemptInfo({ + userContext: input.userContext, + attemptInfo: logger.__assign(logger.__assign({}, loginAttemptInfo), { shouldTryLinkingWithSessionUser: (_a = loginAttemptInfo.shouldTryLinkingWithSessionUser) !== null && _a !== void 0 ? _a : false, lastResend: timestamp }), + })]; + case 3: + _b.sent(); + _b.label = 4; + case 4: return [3 /*break*/, 7]; + case 5: + if (!(res.status === "RESTART_FLOW_ERROR")) return [3 /*break*/, 7]; + return [4 /*yield*/, originalImpl.clearLoginAttemptInfo({ + userContext: input.userContext, + })]; + case 6: + _b.sent(); + setError("ERROR_SIGN_IN_UP_RESEND_RESTART_FLOW"); + rebuildAuthPage(); + _b.label = 7; + case 7: return [2 /*return*/, res]; + } + }); + }); }, consumeCode: function (input) { return logger.__awaiter(_this, void 0, void 0, function () { + var res; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImpl.consumeCode(input)]; + case 1: + res = _a.sent(); + if (!(res.status === "RESTART_FLOW_ERROR")) return [3 /*break*/, 3]; + return [4 /*yield*/, originalImpl.clearLoginAttemptInfo({ + userContext: input.userContext, + })]; + case 2: + _a.sent(); + setError("ERROR_SIGN_IN_UP_CODE_CONSUME_RESTART_FLOW"); + rebuildAuthPage(); + return [3 /*break*/, 7]; + case 3: + if (!(res.status === "SIGN_IN_UP_NOT_ALLOWED")) return [3 /*break*/, 5]; + return [4 /*yield*/, originalImpl.clearLoginAttemptInfo({ + userContext: input.userContext, + })]; + case 4: + _a.sent(); + setError(res.reason); + rebuildAuthPage(); + return [3 /*break*/, 7]; + case 5: + if (!(res.status === "OK")) return [3 /*break*/, 7]; + return [4 /*yield*/, originalImpl.clearLoginAttemptInfo({ + userContext: input.userContext, + })]; + case 6: + _a.sent(); + _a.label = 7; + case 7: return [2 /*return*/, res]; + } + }); + }); }, clearLoginAttemptInfo: function (input) { return logger.__awaiter(_this, void 0, void 0, function () { + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, originalImpl.clearLoginAttemptInfo({ + userContext: input.userContext, + })]; + case 1: + _a.sent(); + genericComponentOverrideContext.clearErrorQueryParam(); + rebuildAuthPage(); + return [2 /*return*/]; + } + }); + }); } }); } -var phoneNumberUtilsImport; -function getPhoneNumberUtils() { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var global; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 /*yield*/, preloadPhoneNumberUtils()]; - case 1: - _a.sent(); - global = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.getWindowUnsafe(); - return [2 /*return*/, global.intlTelInputUtils]; - } - }); - }); -} -function preloadPhoneNumberUtils() { - if (phoneNumberUtilsImport === undefined) { - /* eslint-disable @typescript-eslint/ban-ts-comment */ - // @ts-ignore: We need to disable no implicit any here, otherwise we'd need to add types for this module - phoneNumberUtilsImport = Promise.resolve().then(function () { - return require("./utils.js"); - }); - /* eslint-enable @typescript-eslint/ban-ts-comment */ - } - return phoneNumberUtilsImport; +var phoneNumberUtilsImport; +function getPhoneNumberUtils() { + return logger.__awaiter(this, void 0, void 0, function () { + var global; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, preloadPhoneNumberUtils()]; + case 1: + _a.sent(); + global = windowHandler.WindowHandlerReference.getReferenceOrThrow().windowHandler.getWindowUnsafe(); + return [2 /*return*/, global.intlTelInputUtils]; + } + }); + }); +} +function preloadPhoneNumberUtils() { + if (phoneNumberUtilsImport === undefined) { + /* eslint-disable @typescript-eslint/ban-ts-comment */ + // @ts-ignore: We need to disable no implicit any here, otherwise we'd need to add types for this module + phoneNumberUtilsImport = Promise.resolve().then(function () { return require('./utils.js'); }); + /* eslint-enable @typescript-eslint/ban-ts-comment */ + } + return phoneNumberUtilsImport; } -// This was moved to a separate file to make tree-shaking more effective, since we do not want to include the phoneNumberUtils -// in the base pwless recipe because it increases the bundle size by a lot -function defaultPhoneNumberValidator(value) { - return genericComponentOverrideContext.__awaiter(this, void 0, void 0, function () { - var intlTelInputUtils; - return genericComponentOverrideContext.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (typeof value !== "string") { - return [2 /*return*/, "GENERAL_ERROR_PHONE_NON_STRING"]; - } - value = value.trim(); - return [4 /*yield*/, getPhoneNumberUtils()]; - case 1: - intlTelInputUtils = _a.sent(); - if (!intlTelInputUtils.isValidNumber(value, undefined)) { - return [2 /*return*/, "GENERAL_ERROR_PHONE_INVALID"]; - } - return [2 /*return*/, undefined]; - } - }); - }); +// This was moved to a separate file to make tree-shaking more effective, since we do not want to include the phoneNumberUtils +// in the base pwless recipe because it increases the bundle size by a lot +function defaultPhoneNumberValidator(value) { + return logger.__awaiter(this, void 0, void 0, function () { + var intlTelInputUtils; + return logger.__generator(this, function (_a) { + switch (_a.label) { + case 0: + if (typeof value !== "string") { + return [2 /*return*/, "GENERAL_ERROR_PHONE_NON_STRING"]; + } + value = value.trim(); + return [4 /*yield*/, getPhoneNumberUtils()]; + case 1: + intlTelInputUtils = _a.sent(); + if (!intlTelInputUtils.isValidNumber(value, undefined)) { + return [2 /*return*/, "GENERAL_ERROR_PHONE_INVALID"]; + } + return [2 /*return*/, undefined]; + } + }); + }); } -var EmailForm = uiEntry.withOverride("PasswordlessEmailForm", function PasswordlessEmailForm(props) { - var _this = this; - var userContext = uiEntry.useUserContext(); - return jsxRuntime.jsx(formBase.FormBase, { - clearError: props.clearError, - onFetchError: props.onFetchError, - onError: props.onError, - formFields: [ - { - id: "email", - label: "PWLESS_SIGN_IN_UP_EMAIL_LABEL", - optional: false, - autofocus: true, - placeholder: "", - autoComplete: "email", - // We are using the default validator that allows any string - validate: recipe$1.defaultValidate, - }, - ], - buttonLabel: "PWLESS_SIGN_IN_UP_CONTINUE_BUTTON", - onSuccess: props.onSuccess, - callAPI: function (formFields) { - return genericComponentOverrideContext.__awaiter(_this, void 0, void 0, function () { - var email, validationRes, response; - var _a; - return genericComponentOverrideContext.__generator(this, function (_b) { - switch (_b.label) { - case 0: - email = - (_a = formFields.find(function (field) { - return field.id === "email"; - })) === null || _a === void 0 - ? void 0 - : _a.value; - if (email === undefined) { - throw new STGeneralError__default.default("GENERAL_ERROR_EMAIL_UNDEFINED"); - } - return [4 /*yield*/, props.config.validateEmailAddress(email)]; - case 1: - validationRes = _b.sent(); - if (validationRes !== undefined) { - throw new STGeneralError__default.default(validationRes); - } - return [ - 4 /*yield*/, - props.recipeImplementation.createCode({ - email: email, - // shouldTryLinkingWithSessionUser is set by the fn override - userContext: userContext, - }), - ]; - case 2: - response = _b.sent(); - if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { - throw new STGeneralError__default.default(response.reason); - } - return [2 /*return*/, response]; - } - }); - }); - }, - validateOnBlur: false, - showLabels: true, - footer: props.footer, - }); +var EmailForm = uiEntry.withOverride("PasswordlessEmailForm", function PasswordlessEmailForm(props) { + var _this = this; + var userContext = uiEntry.useUserContext(); + return (jsxRuntime.jsx(formBase.FormBase, { clearError: props.clearError, onFetchError: props.onFetchError, onError: props.onError, formFields: [ + { + id: "email", + label: "PWLESS_SIGN_IN_UP_EMAIL_LABEL", + optional: false, + autofocus: true, + placeholder: "", + autoComplete: "email", + // We are using the default validator that allows any string + validate: recipe$1.defaultValidate, + }, + ], buttonLabel: "PWLESS_SIGN_IN_UP_CONTINUE_BUTTON", onSuccess: props.onSuccess, callAPI: function (formFields) { return logger.__awaiter(_this, void 0, void 0, function () { + var email, validationRes, response; + var _a; + return logger.__generator(this, function (_b) { + switch (_b.label) { + case 0: + email = (_a = formFields.find(function (field) { return field.id === "email"; })) === null || _a === void 0 ? void 0 : _a.value; + if (email === undefined) { + throw new STGeneralError__default.default("GENERAL_ERROR_EMAIL_UNDEFINED"); + } + return [4 /*yield*/, props.config.validateEmailAddress(email)]; + case 1: + validationRes = _b.sent(); + if (validationRes !== undefined) { + throw new STGeneralError__default.default(validationRes); + } + return [4 /*yield*/, props.recipeImplementation.createCode({ + email: email, + // shouldTryLinkingWithSessionUser is set by the fn override + userContext: userContext, + })]; + case 2: + response = _b.sent(); + if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { + throw new STGeneralError__default.default(response.reason); + } + return [2 /*return*/, response]; + } + }); + }); }, validateOnBlur: false, showLabels: true, footer: props.footer })); }); -function getDefaultExportFromCjs(x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var intlTelInputExports$1 = {}; var intlTelInput$2 = { - get exports() { - return intlTelInputExports$1; - }, - set exports(v) { - intlTelInputExports$1 = v; - }, + get exports(){ return intlTelInputExports$1; }, + set exports(v){ intlTelInputExports$1 = v; }, }; var intlTelInputExports = {}; var intlTelInput$1 = { - get exports() { - return intlTelInputExports; - }, - set exports(v) { - intlTelInputExports = v; - }, + get exports(){ return intlTelInputExports; }, + set exports(v){ intlTelInputExports = v; }, }; /* @@ -1422,5830 +769,3398 @@ var intlTelInput$1 = { */ (function (module) { - // wrap in UMD - (function (factory) { - if (module.exports) module.exports = factory(); - else window.intlTelInput = factory(); - })(function (undefined$1) { - return (function () { - // Array of country objects for the flag dropdown. - // Here is the criteria for the plugin to support a given country/territory - // - It has an iso2 code: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 - // - It has it's own country calling code (it is not a sub-region of another country): https://en.wikipedia.org/wiki/List_of_country_calling_codes - // - It has a flag in the region-flags project: https://github.com/behdad/region-flags/tree/gh-pages/png - // - It is supported by libphonenumber (it must be listed on this page): https://github.com/googlei18n/libphonenumber/blob/master/resources/ShortNumberMetadata.xml - // Each country array has the following information: - // [ - // Country name, - // iso2 code, - // International dial code, - // Order (if >1 country with same dial code), - // Area codes - // ] - var allCountries = [ - ["Afghanistan (‫افغانستان‬‎)", "af", "93"], - ["Albania (Shqipëri)", "al", "355"], - ["Algeria (‫الجزائر‬‎)", "dz", "213"], - ["American Samoa", "as", "1", 5, ["684"]], - ["Andorra", "ad", "376"], - ["Angola", "ao", "244"], - ["Anguilla", "ai", "1", 6, ["264"]], - ["Antigua and Barbuda", "ag", "1", 7, ["268"]], - ["Argentina", "ar", "54"], - ["Armenia (Հայաստան)", "am", "374"], - ["Aruba", "aw", "297"], - ["Ascension Island", "ac", "247"], - ["Australia", "au", "61", 0], - ["Austria (Österreich)", "at", "43"], - ["Azerbaijan (Azərbaycan)", "az", "994"], - ["Bahamas", "bs", "1", 8, ["242"]], - ["Bahrain (‫البحرين‬‎)", "bh", "973"], - ["Bangladesh (বাংলাদেশ)", "bd", "880"], - ["Barbados", "bb", "1", 9, ["246"]], - ["Belarus (Беларусь)", "by", "375"], - ["Belgium (België)", "be", "32"], - ["Belize", "bz", "501"], - ["Benin (Bénin)", "bj", "229"], - ["Bermuda", "bm", "1", 10, ["441"]], - ["Bhutan (འབྲུག)", "bt", "975"], - ["Bolivia", "bo", "591"], - ["Bosnia and Herzegovina (Босна и Херцеговина)", "ba", "387"], - ["Botswana", "bw", "267"], - ["Brazil (Brasil)", "br", "55"], - ["British Indian Ocean Territory", "io", "246"], - ["British Virgin Islands", "vg", "1", 11, ["284"]], - ["Brunei", "bn", "673"], - ["Bulgaria (България)", "bg", "359"], - ["Burkina Faso", "bf", "226"], - ["Burundi (Uburundi)", "bi", "257"], - ["Cambodia (កម្ពុជា)", "kh", "855"], - ["Cameroon (Cameroun)", "cm", "237"], - [ - "Canada", - "ca", - "1", - 1, - [ - "204", - "226", - "236", - "249", - "250", - "289", - "306", - "343", - "365", - "387", - "403", - "416", - "418", - "431", - "437", - "438", - "450", - "506", - "514", - "519", - "548", - "579", - "581", - "587", - "604", - "613", - "639", - "647", - "672", - "705", - "709", - "742", - "778", - "780", - "782", - "807", - "819", - "825", - "867", - "873", - "902", - "905", - ], - ], - ["Cape Verde (Kabu Verdi)", "cv", "238"], - ["Caribbean Netherlands", "bq", "599", 1, ["3", "4", "7"]], - ["Cayman Islands", "ky", "1", 12, ["345"]], - ["Central African Republic (République centrafricaine)", "cf", "236"], - ["Chad (Tchad)", "td", "235"], - ["Chile", "cl", "56"], - ["China (中国)", "cn", "86"], - ["Christmas Island", "cx", "61", 2, ["89164"]], - ["Cocos (Keeling) Islands", "cc", "61", 1, ["89162"]], - ["Colombia", "co", "57"], - ["Comoros (‫جزر القمر‬‎)", "km", "269"], - ["Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)", "cd", "243"], - ["Congo (Republic) (Congo-Brazzaville)", "cg", "242"], - ["Cook Islands", "ck", "682"], - ["Costa Rica", "cr", "506"], - ["Côte d’Ivoire", "ci", "225"], - ["Croatia (Hrvatska)", "hr", "385"], - ["Cuba", "cu", "53"], - ["Curaçao", "cw", "599", 0], - ["Cyprus (Κύπρος)", "cy", "357"], - ["Czech Republic (Česká republika)", "cz", "420"], - ["Denmark (Danmark)", "dk", "45"], - ["Djibouti", "dj", "253"], - ["Dominica", "dm", "1", 13, ["767"]], - ["Dominican Republic (República Dominicana)", "do", "1", 2, ["809", "829", "849"]], - ["Ecuador", "ec", "593"], - ["Egypt (‫مصر‬‎)", "eg", "20"], - ["El Salvador", "sv", "503"], - ["Equatorial Guinea (Guinea Ecuatorial)", "gq", "240"], - ["Eritrea", "er", "291"], - ["Estonia (Eesti)", "ee", "372"], - ["Eswatini", "sz", "268"], - ["Ethiopia", "et", "251"], - ["Falkland Islands (Islas Malvinas)", "fk", "500"], - ["Faroe Islands (Føroyar)", "fo", "298"], - ["Fiji", "fj", "679"], - ["Finland (Suomi)", "fi", "358", 0], - ["France", "fr", "33"], - ["French Guiana (Guyane française)", "gf", "594"], - ["French Polynesia (Polynésie française)", "pf", "689"], - ["Gabon", "ga", "241"], - ["Gambia", "gm", "220"], - ["Georgia (საქართველო)", "ge", "995"], - ["Germany (Deutschland)", "de", "49"], - ["Ghana (Gaana)", "gh", "233"], - ["Gibraltar", "gi", "350"], - ["Greece (Ελλάδα)", "gr", "30"], - ["Greenland (Kalaallit Nunaat)", "gl", "299"], - ["Grenada", "gd", "1", 14, ["473"]], - ["Guadeloupe", "gp", "590", 0], - ["Guam", "gu", "1", 15, ["671"]], - ["Guatemala", "gt", "502"], - ["Guernsey", "gg", "44", 1, ["1481", "7781", "7839", "7911"]], - ["Guinea (Guinée)", "gn", "224"], - ["Guinea-Bissau (Guiné Bissau)", "gw", "245"], - ["Guyana", "gy", "592"], - ["Haiti", "ht", "509"], - ["Honduras", "hn", "504"], - ["Hong Kong (香港)", "hk", "852"], - ["Hungary (Magyarország)", "hu", "36"], - ["Iceland (Ísland)", "is", "354"], - ["India (भारत)", "in", "91"], - ["Indonesia", "id", "62"], - ["Iran (‫ایران‬‎)", "ir", "98"], - ["Iraq (‫العراق‬‎)", "iq", "964"], - ["Ireland", "ie", "353"], - ["Isle of Man", "im", "44", 2, ["1624", "74576", "7524", "7924", "7624"]], - ["Israel (‫ישראל‬‎)", "il", "972"], - ["Italy (Italia)", "it", "39", 0], - ["Jamaica", "jm", "1", 4, ["876", "658"]], - ["Japan (日本)", "jp", "81"], - ["Jersey", "je", "44", 3, ["1534", "7509", "7700", "7797", "7829", "7937"]], - ["Jordan (‫الأردن‬‎)", "jo", "962"], - ["Kazakhstan (Казахстан)", "kz", "7", 1, ["33", "7"]], - ["Kenya", "ke", "254"], - ["Kiribati", "ki", "686"], - ["Kosovo", "xk", "383"], - ["Kuwait (‫الكويت‬‎)", "kw", "965"], - ["Kyrgyzstan (Кыргызстан)", "kg", "996"], - ["Laos (ລາວ)", "la", "856"], - ["Latvia (Latvija)", "lv", "371"], - ["Lebanon (‫لبنان‬‎)", "lb", "961"], - ["Lesotho", "ls", "266"], - ["Liberia", "lr", "231"], - ["Libya (‫ليبيا‬‎)", "ly", "218"], - ["Liechtenstein", "li", "423"], - ["Lithuania (Lietuva)", "lt", "370"], - ["Luxembourg", "lu", "352"], - ["Macau (澳門)", "mo", "853"], - ["Madagascar (Madagasikara)", "mg", "261"], - ["Malawi", "mw", "265"], - ["Malaysia", "my", "60"], - ["Maldives", "mv", "960"], - ["Mali", "ml", "223"], - ["Malta", "mt", "356"], - ["Marshall Islands", "mh", "692"], - ["Martinique", "mq", "596"], - ["Mauritania (‫موريتانيا‬‎)", "mr", "222"], - ["Mauritius (Moris)", "mu", "230"], - ["Mayotte", "yt", "262", 1, ["269", "639"]], - ["Mexico (México)", "mx", "52"], - ["Micronesia", "fm", "691"], - ["Moldova (Republica Moldova)", "md", "373"], - ["Monaco", "mc", "377"], - ["Mongolia (Монгол)", "mn", "976"], - ["Montenegro (Crna Gora)", "me", "382"], - ["Montserrat", "ms", "1", 16, ["664"]], - ["Morocco (‫المغرب‬‎)", "ma", "212", 0], - ["Mozambique (Moçambique)", "mz", "258"], - ["Myanmar (Burma) (မြန်မာ)", "mm", "95"], - ["Namibia (Namibië)", "na", "264"], - ["Nauru", "nr", "674"], - ["Nepal (नेपाल)", "np", "977"], - ["Netherlands (Nederland)", "nl", "31"], - ["New Caledonia (Nouvelle-Calédonie)", "nc", "687"], - ["New Zealand", "nz", "64"], - ["Nicaragua", "ni", "505"], - ["Niger (Nijar)", "ne", "227"], - ["Nigeria", "ng", "234"], - ["Niue", "nu", "683"], - ["Norfolk Island", "nf", "672"], - ["North Korea (조선 민주주의 인민 공화국)", "kp", "850"], - ["North Macedonia (Северна Македонија)", "mk", "389"], - ["Northern Mariana Islands", "mp", "1", 17, ["670"]], - ["Norway (Norge)", "no", "47", 0], - ["Oman (‫عُمان‬‎)", "om", "968"], - ["Pakistan (‫پاکستان‬‎)", "pk", "92"], - ["Palau", "pw", "680"], - ["Palestine (‫فلسطين‬‎)", "ps", "970"], - ["Panama (Panamá)", "pa", "507"], - ["Papua New Guinea", "pg", "675"], - ["Paraguay", "py", "595"], - ["Peru (Perú)", "pe", "51"], - ["Philippines", "ph", "63"], - ["Poland (Polska)", "pl", "48"], - ["Portugal", "pt", "351"], - ["Puerto Rico", "pr", "1", 3, ["787", "939"]], - ["Qatar (‫قطر‬‎)", "qa", "974"], - ["Réunion (La Réunion)", "re", "262", 0], - ["Romania (România)", "ro", "40"], - ["Russia (Россия)", "ru", "7", 0], - ["Rwanda", "rw", "250"], - ["Saint Barthélemy", "bl", "590", 1], - ["Saint Helena", "sh", "290"], - ["Saint Kitts and Nevis", "kn", "1", 18, ["869"]], - ["Saint Lucia", "lc", "1", 19, ["758"]], - ["Saint Martin (Saint-Martin (partie française))", "mf", "590", 2], - ["Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)", "pm", "508"], - ["Saint Vincent and the Grenadines", "vc", "1", 20, ["784"]], - ["Samoa", "ws", "685"], - ["San Marino", "sm", "378"], - ["São Tomé and Príncipe (São Tomé e Príncipe)", "st", "239"], - ["Saudi Arabia (‫المملكة العربية السعودية‬‎)", "sa", "966"], - ["Senegal (Sénégal)", "sn", "221"], - ["Serbia (Србија)", "rs", "381"], - ["Seychelles", "sc", "248"], - ["Sierra Leone", "sl", "232"], - ["Singapore", "sg", "65"], - ["Sint Maarten", "sx", "1", 21, ["721"]], - ["Slovakia (Slovensko)", "sk", "421"], - ["Slovenia (Slovenija)", "si", "386"], - ["Solomon Islands", "sb", "677"], - ["Somalia (Soomaaliya)", "so", "252"], - ["South Africa", "za", "27"], - ["South Korea (대한민국)", "kr", "82"], - ["South Sudan (‫جنوب السودان‬‎)", "ss", "211"], - ["Spain (España)", "es", "34"], - ["Sri Lanka (ශ්‍රී ලංකාව)", "lk", "94"], - ["Sudan (‫السودان‬‎)", "sd", "249"], - ["Suriname", "sr", "597"], - ["Svalbard and Jan Mayen", "sj", "47", 1, ["79"]], - ["Sweden (Sverige)", "se", "46"], - ["Switzerland (Schweiz)", "ch", "41"], - ["Syria (‫سوريا‬‎)", "sy", "963"], - ["Taiwan (台灣)", "tw", "886"], - ["Tajikistan", "tj", "992"], - ["Tanzania", "tz", "255"], - ["Thailand (ไทย)", "th", "66"], - ["Timor-Leste", "tl", "670"], - ["Togo", "tg", "228"], - ["Tokelau", "tk", "690"], - ["Tonga", "to", "676"], - ["Trinidad and Tobago", "tt", "1", 22, ["868"]], - ["Tunisia (‫تونس‬‎)", "tn", "216"], - ["Turkey (Türkiye)", "tr", "90"], - ["Turkmenistan", "tm", "993"], - ["Turks and Caicos Islands", "tc", "1", 23, ["649"]], - ["Tuvalu", "tv", "688"], - ["U.S. Virgin Islands", "vi", "1", 24, ["340"]], - ["Uganda", "ug", "256"], - ["Ukraine (Україна)", "ua", "380"], - ["United Arab Emirates (‫الإمارات العربية المتحدة‬‎)", "ae", "971"], - ["United Kingdom", "gb", "44", 0], - ["United States", "us", "1", 0], - ["Uruguay", "uy", "598"], - ["Uzbekistan (Oʻzbekiston)", "uz", "998"], - ["Vanuatu", "vu", "678"], - ["Vatican City (Città del Vaticano)", "va", "39", 1, ["06698"]], - ["Venezuela", "ve", "58"], - ["Vietnam (Việt Nam)", "vn", "84"], - ["Wallis and Futuna (Wallis-et-Futuna)", "wf", "681"], - ["Western Sahara (‫الصحراء الغربية‬‎)", "eh", "212", 1, ["5288", "5289"]], - ["Yemen (‫اليمن‬‎)", "ye", "967"], - ["Zambia", "zm", "260"], - ["Zimbabwe", "zw", "263"], - ["Åland Islands", "ax", "358", 1, ["18"]], - ]; - // loop over all of the countries above, restructuring the data to be objects with named keys - for (var i = 0; i < allCountries.length; i++) { - var c = allCountries[i]; - allCountries[i] = { - name: c[0], - iso2: c[1], - dialCode: c[2], - priority: c[3] || 0, - areaCodes: c[4] || null, - }; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - var intlTelInputGlobals = { - getInstance: function getInstance(input) { - var id = input.getAttribute("data-intl-tel-input-id"); - return window.intlTelInputGlobals.instances[id]; - }, - instances: {}, - // using a global like this allows us to mock it in the tests - documentReady: function documentReady() { - return document.readyState === "complete"; - }, - }; - if (typeof window === "object") window.intlTelInputGlobals = intlTelInputGlobals; - // these vars persist through all instances of the plugin - var id = 0; - var defaults = { - // whether or not to allow the dropdown - allowDropdown: true, - // if there is just a dial code in the input: remove it on blur - autoHideDialCode: true, - // add a placeholder in the input with an example number for the selected country - autoPlaceholder: "polite", - // modify the parentClass - customContainer: "", - // modify the auto placeholder - customPlaceholder: null, - // append menu to specified element - dropdownContainer: null, - // don't display these countries - excludeCountries: [], - // format the input value during initialisation and on setNumber - formatOnDisplay: true, - // geoIp lookup function - geoIpLookup: null, - // inject a hidden input with this name, and on submit, populate it with the result of getNumber - hiddenInput: "", - // initial country - initialCountry: "", - // localized country names e.g. { 'de': 'Deutschland' } - localizedCountries: null, - // don't insert international dial codes - nationalMode: true, - // display only these countries - onlyCountries: [], - // number type to use for placeholders - placeholderNumberType: "MOBILE", - // the countries at the top of the list. defaults to united states and united kingdom - preferredCountries: ["us", "gb"], - // display the country dial code next to the selected flag so it's not part of the typed number - separateDialCode: false, - // specify the path to the libphonenumber script to enable validation/formatting - utilsScript: "", - }; - // https://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes#Non-geographic_area_codes - var regionlessNanpNumbers = [ - "800", - "822", - "833", - "844", - "855", - "866", - "877", - "880", - "881", - "882", - "883", - "884", - "885", - "886", - "887", - "888", - "889", - ]; - // utility function to iterate over an object. can't use Object.entries or native forEach because - // of IE11 - var forEachProp = function forEachProp(obj, callback) { - var keys = Object.keys(obj); - for (var i = 0; i < keys.length; i++) { - callback(keys[i], obj[keys[i]]); - } - }; - // run a method on each instance of the plugin - var forEachInstance = function forEachInstance(method) { - forEachProp(window.intlTelInputGlobals.instances, function (key) { - window.intlTelInputGlobals.instances[key][method](); - }); - }; - // this is our plugin class that we will create an instance of - // eslint-disable-next-line no-unused-vars - var Iti = - /*#__PURE__*/ - (function () { - function Iti(input, options) { - var _this = this; - _classCallCheck(this, Iti); - this.id = id++; - this.telInput = input; - this.activeItem = null; - this.highlightedItem = null; - // process specified options / defaults - // alternative to Object.assign, which isn't supported by IE11 - var customOptions = options || {}; - this.options = {}; - forEachProp(defaults, function (key, value) { - _this.options[key] = customOptions.hasOwnProperty(key) ? customOptions[key] : value; - }); - this.hadInitialPlaceholder = Boolean(input.getAttribute("placeholder")); - } - _createClass(Iti, [ - { - key: "_init", - value: function _init() { - var _this2 = this; - // if in nationalMode, disable options relating to dial codes - if (this.options.nationalMode) this.options.autoHideDialCode = false; - // if separateDialCode then doesn't make sense to A) insert dial code into input - // (autoHideDialCode), and B) display national numbers (because we're displaying the country - // dial code next to them) - if (this.options.separateDialCode) { - this.options.autoHideDialCode = this.options.nationalMode = false; - } - // we cannot just test screen size as some smartphones/website meta tags will report desktop - // resolutions - // Note: for some reason jasmine breaks if you put this in the main Plugin function with the - // rest of these declarations - // Note: to target Android Mobiles (and not Tablets), we must find 'Android' and 'Mobile' - this.isMobile = - /Android.+Mobile|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ); - if (this.isMobile) { - // trigger the mobile dropdown css - document.body.classList.add("iti-mobile"); - // on mobile, we want a full screen dropdown, so we must append it to the body - if (!this.options.dropdownContainer) this.options.dropdownContainer = document.body; - } - // these promises get resolved when their individual requests complete - // this way the dev can do something like iti.promise.then(...) to know when all requests are - // complete - if (typeof Promise !== "undefined") { - var autoCountryPromise = new Promise(function (resolve, reject) { - _this2.resolveAutoCountryPromise = resolve; - _this2.rejectAutoCountryPromise = reject; - }); - var utilsScriptPromise = new Promise(function (resolve, reject) { - _this2.resolveUtilsScriptPromise = resolve; - _this2.rejectUtilsScriptPromise = reject; - }); - this.promise = Promise.all([autoCountryPromise, utilsScriptPromise]); - } else { - // prevent errors when Promise doesn't exist - this.resolveAutoCountryPromise = this.rejectAutoCountryPromise = function () {}; - this.resolveUtilsScriptPromise = this.rejectUtilsScriptPromise = function () {}; - } - // in various situations there could be no country selected initially, but we need to be able - // to assume this variable exists - this.selectedCountryData = {}; - // process all the data: onlyCountries, excludeCountries, preferredCountries etc - this._processCountryData(); - // generate the markup - this._generateMarkup(); - // set the initial state of the input value and the selected flag - this._setInitialState(); - // start all of the event listeners: autoHideDialCode, input keydown, selectedFlag click - this._initListeners(); - // utils script, and auto country - this._initRequests(); - }, - }, - { - key: "_processCountryData", - value: function _processCountryData() { - // process onlyCountries or excludeCountries array if present - this._processAllCountries(); - // process the countryCodes map - this._processCountryCodes(); - // process the preferredCountries - this._processPreferredCountries(); - // translate countries according to localizedCountries option - if (this.options.localizedCountries) this._translateCountriesByLocale(); - // sort countries by name - if (this.options.onlyCountries.length || this.options.localizedCountries) { - this.countries.sort(this._countryNameSort); - } - }, - }, - { - key: "_addCountryCode", - value: function _addCountryCode(iso2, countryCode, priority) { - if (countryCode.length > this.countryCodeMaxLen) { - this.countryCodeMaxLen = countryCode.length; - } - if (!this.countryCodes.hasOwnProperty(countryCode)) { - this.countryCodes[countryCode] = []; - } - // bail if we already have this country for this countryCode - for (var i = 0; i < this.countryCodes[countryCode].length; i++) { - if (this.countryCodes[countryCode][i] === iso2) return; - } - // check for undefined as 0 is falsy - var index = priority !== undefined$1 ? priority : this.countryCodes[countryCode].length; - this.countryCodes[countryCode][index] = iso2; - }, - }, - { - key: "_processAllCountries", - value: function _processAllCountries() { - if (this.options.onlyCountries.length) { - var lowerCaseOnlyCountries = this.options.onlyCountries.map(function (country) { - return country.toLowerCase(); - }); - this.countries = allCountries.filter(function (country) { - return lowerCaseOnlyCountries.indexOf(country.iso2) > -1; - }); - } else if (this.options.excludeCountries.length) { - var lowerCaseExcludeCountries = this.options.excludeCountries.map(function ( - country - ) { - return country.toLowerCase(); - }); - this.countries = allCountries.filter(function (country) { - return lowerCaseExcludeCountries.indexOf(country.iso2) === -1; - }); - } else { - this.countries = allCountries; - } - }, - }, - { - key: "_translateCountriesByLocale", - value: function _translateCountriesByLocale() { - for (var i = 0; i < this.countries.length; i++) { - var iso = this.countries[i].iso2.toLowerCase(); - if (this.options.localizedCountries.hasOwnProperty(iso)) { - this.countries[i].name = this.options.localizedCountries[iso]; - } - } - }, - }, - { - key: "_countryNameSort", - value: function _countryNameSort(a, b) { - return a.name.localeCompare(b.name); - }, - }, - { - key: "_processCountryCodes", - value: function _processCountryCodes() { - this.countryCodeMaxLen = 0; - // here we store just dial codes - this.dialCodes = {}; - // here we store "country codes" (both dial codes and their area codes) - this.countryCodes = {}; - // first: add dial codes - for (var i = 0; i < this.countries.length; i++) { - var c = this.countries[i]; - if (!this.dialCodes[c.dialCode]) this.dialCodes[c.dialCode] = true; - this._addCountryCode(c.iso2, c.dialCode, c.priority); - } - // next: add area codes - // this is a second loop over countries, to make sure we have all of the "root" countries - // already in the map, so that we can access them, as each time we add an area code substring - // to the map, we also need to include the "root" country's code, as that also matches - for (var _i = 0; _i < this.countries.length; _i++) { - var _c = this.countries[_i]; - // area codes - if (_c.areaCodes) { - var rootCountryCode = this.countryCodes[_c.dialCode][0]; - // for each area code - for (var j = 0; j < _c.areaCodes.length; j++) { - var areaCode = _c.areaCodes[j]; - // for each digit in the area code to add all partial matches as well - for (var k = 1; k < areaCode.length; k++) { - var partialDialCode = _c.dialCode + areaCode.substr(0, k); - // start with the root country, as that also matches this dial code - this._addCountryCode(rootCountryCode, partialDialCode); - this._addCountryCode(_c.iso2, partialDialCode); - } - // add the full area code - this._addCountryCode(_c.iso2, _c.dialCode + areaCode); - } - } - } - }, - }, - { - key: "_processPreferredCountries", - value: function _processPreferredCountries() { - this.preferredCountries = []; - for (var i = 0; i < this.options.preferredCountries.length; i++) { - var countryCode = this.options.preferredCountries[i].toLowerCase(); - var countryData = this._getCountryData(countryCode, false, true); - if (countryData) this.preferredCountries.push(countryData); - } - }, - }, - { - key: "_createEl", - value: function _createEl(name, attrs, container) { - var el = document.createElement(name); - if (attrs) - forEachProp(attrs, function (key, value) { - return el.setAttribute(key, value); - }); - if (container) container.appendChild(el); - return el; - }, - }, - { - key: "_generateMarkup", - value: function _generateMarkup() { - // if autocomplete does not exist on the element and its form, then - // prevent autocomplete as there's no safe, cross-browser event we can react to, so it can - // easily put the plugin in an inconsistent state e.g. the wrong flag selected for the - // autocompleted number, which on submit could mean wrong number is saved (esp in nationalMode) - if ( - !this.telInput.hasAttribute("autocomplete") && - !(this.telInput.form && this.telInput.form.hasAttribute("autocomplete")) - ) { - this.telInput.setAttribute("autocomplete", "off"); - } - // containers (mostly for positioning) - var parentClass = "iti"; - if (this.options.allowDropdown) parentClass += " iti--allow-dropdown"; - if (this.options.separateDialCode) parentClass += " iti--separate-dial-code"; - if (this.options.customContainer) { - parentClass += " "; - parentClass += this.options.customContainer; - } - var wrapper = this._createEl("div", { - class: parentClass, - }); - this.telInput.parentNode.insertBefore(wrapper, this.telInput); - this.flagsContainer = this._createEl( - "div", - { - class: "iti__flag-container", - }, - wrapper - ); - wrapper.appendChild(this.telInput); - // selected flag (displayed to left of input) - this.selectedFlag = this._createEl( - "div", - { - class: "iti__selected-flag", - role: "combobox", - "aria-controls": "iti-".concat(this.id, "__country-listbox"), - "aria-owns": "iti-".concat(this.id, "__country-listbox"), - "aria-expanded": "false", - }, - this.flagsContainer - ); - this.selectedFlagInner = this._createEl( - "div", - { - class: "iti__flag", - }, - this.selectedFlag - ); - if (this.options.separateDialCode) { - this.selectedDialCode = this._createEl( - "div", - { - class: "iti__selected-dial-code", - }, - this.selectedFlag - ); - } - if (this.options.allowDropdown) { - // make element focusable and tab navigable - this.selectedFlag.setAttribute("tabindex", "0"); - this.dropdownArrow = this._createEl( - "div", - { - class: "iti__arrow", - }, - this.selectedFlag - ); - // country dropdown: preferred countries, then divider, then all countries - this.countryList = this._createEl("ul", { - class: "iti__country-list iti__hide", - id: "iti-".concat(this.id, "__country-listbox"), - role: "listbox", - "aria-label": "List of countries", - }); - if (this.preferredCountries.length) { - this._appendListItems(this.preferredCountries, "iti__preferred", true); - this._createEl( - "li", - { - class: "iti__divider", - role: "separator", - "aria-disabled": "true", - }, - this.countryList - ); - } - this._appendListItems(this.countries, "iti__standard"); - // create dropdownContainer markup - if (this.options.dropdownContainer) { - this.dropdown = this._createEl("div", { - class: "iti iti--container", - }); - this.dropdown.appendChild(this.countryList); - } else { - this.flagsContainer.appendChild(this.countryList); - } - } - if (this.options.hiddenInput) { - var hiddenInputName = this.options.hiddenInput; - var name = this.telInput.getAttribute("name"); - if (name) { - var i = name.lastIndexOf("["); - // if input name contains square brackets, then give the hidden input the same name, - // replacing the contents of the last set of brackets with the given hiddenInput name - if (i !== -1) - hiddenInputName = "" - .concat(name.substr(0, i), "[") - .concat(hiddenInputName, "]"); - } - this.hiddenInput = this._createEl("input", { - type: "hidden", - name: hiddenInputName, - }); - wrapper.appendChild(this.hiddenInput); - } - }, - }, - { - key: "_appendListItems", - value: function _appendListItems(countries, className, preferred) { - // we create so many DOM elements, it is faster to build a temp string - // and then add everything to the DOM in one go at the end - var tmp = ""; - // for each country - for (var i = 0; i < countries.length; i++) { - var c = countries[i]; - var idSuffix = preferred ? "-preferred" : ""; - // open the list item - tmp += "
    1. "); - // add the flag - tmp += "
      " - ); - // and the country name and dial code - tmp += "".concat(c.name, ""); - tmp += "+".concat(c.dialCode, ""); - // close the list item - tmp += "
    2. "; - } - this.countryList.insertAdjacentHTML("beforeend", tmp); - }, - }, - { - key: "_setInitialState", - value: function _setInitialState() { - // fix firefox bug: when first load page (with input with value set to number with intl dial - // code) and initialising plugin removes the dial code from the input, then refresh page, - // and we try to init plugin again but this time on number without dial code so get grey flag - var attributeValue = this.telInput.getAttribute("value"); - var inputValue = this.telInput.value; - var useAttribute = - attributeValue && - attributeValue.charAt(0) === "+" && - (!inputValue || inputValue.charAt(0) !== "+"); - var val = useAttribute ? attributeValue : inputValue; - var dialCode = this._getDialCode(val); - var isRegionlessNanp = this._isRegionlessNanp(val); - var _this$options = this.options, - initialCountry = _this$options.initialCountry, - nationalMode = _this$options.nationalMode, - autoHideDialCode = _this$options.autoHideDialCode, - separateDialCode = _this$options.separateDialCode; - // if we already have a dial code, and it's not a regionlessNanp, we can go ahead and set the - // flag, else fall back to the default country - if (dialCode && !isRegionlessNanp) { - this._updateFlagFromNumber(val); - } else if (initialCountry !== "auto") { - // see if we should select a flag - if (initialCountry) { - this._setFlag(initialCountry.toLowerCase()); - } else { - if (dialCode && isRegionlessNanp) { - // has intl dial code, is regionless nanp, and no initialCountry, so default to US - this._setFlag("us"); - } else { - // no dial code and no initialCountry, so default to first in list - this.defaultCountry = this.preferredCountries.length - ? this.preferredCountries[0].iso2 - : this.countries[0].iso2; - if (!val) { - this._setFlag(this.defaultCountry); - } - } - } - // if empty and no nationalMode and no autoHideDialCode then insert the default dial code - if (!val && !nationalMode && !autoHideDialCode && !separateDialCode) { - this.telInput.value = "+".concat(this.selectedCountryData.dialCode); - } - } - // NOTE: if initialCountry is set to auto, that will be handled separately - // format - note this wont be run after _updateDialCode as that's only called if no val - if (val) this._updateValFromNumber(val); - }, - }, - { - key: "_initListeners", - value: function _initListeners() { - this._initKeyListeners(); - if (this.options.autoHideDialCode) this._initBlurListeners(); - if (this.options.allowDropdown) this._initDropdownListeners(); - if (this.hiddenInput) this._initHiddenInputListener(); - }, - }, - { - key: "_initHiddenInputListener", - value: function _initHiddenInputListener() { - var _this3 = this; - this._handleHiddenInputSubmit = function () { - _this3.hiddenInput.value = _this3.getNumber(); - }; - if (this.telInput.form) - this.telInput.form.addEventListener("submit", this._handleHiddenInputSubmit); - }, - }, - { - key: "_getClosestLabel", - value: function _getClosestLabel() { - var el = this.telInput; - while (el && el.tagName !== "LABEL") { - el = el.parentNode; - } - return el; - }, - }, - { - key: "_initDropdownListeners", - value: function _initDropdownListeners() { - var _this4 = this; - // hack for input nested inside label (which is valid markup): clicking the selected-flag to - // open the dropdown would then automatically trigger a 2nd click on the input which would - // close it again - this._handleLabelClick = function (e) { - // if the dropdown is closed, then focus the input, else ignore the click - if (_this4.countryList.classList.contains("iti__hide")) _this4.telInput.focus(); - else e.preventDefault(); - }; - var label = this._getClosestLabel(); - if (label) label.addEventListener("click", this._handleLabelClick); - // toggle country dropdown on click - this._handleClickSelectedFlag = function () { - // only intercept this event if we're opening the dropdown - // else let it bubble up to the top ("click-off-to-close" listener) - // we cannot just stopPropagation as it may be needed to close another instance - if ( - _this4.countryList.classList.contains("iti__hide") && - !_this4.telInput.disabled && - !_this4.telInput.readOnly - ) { - _this4._showDropdown(); - } - }; - this.selectedFlag.addEventListener("click", this._handleClickSelectedFlag); - // open dropdown list if currently focused - this._handleFlagsContainerKeydown = function (e) { - var isDropdownHidden = _this4.countryList.classList.contains("iti__hide"); - if ( - isDropdownHidden && - ["ArrowUp", "Up", "ArrowDown", "Down", " ", "Enter"].indexOf(e.key) !== -1 - ) { - // prevent form from being submitted if "ENTER" was pressed - e.preventDefault(); - // prevent event from being handled again by document - e.stopPropagation(); - _this4._showDropdown(); - } - // allow navigation from dropdown to input on TAB - if (e.key === "Tab") _this4._closeDropdown(); - }; - this.flagsContainer.addEventListener("keydown", this._handleFlagsContainerKeydown); - }, - }, - { - key: "_initRequests", - value: function _initRequests() { - var _this5 = this; - // if the user has specified the path to the utils script, fetch it on window.load, else resolve - if (this.options.utilsScript && !window.intlTelInputUtils) { - // if the plugin is being initialised after the window.load event has already been fired - if (window.intlTelInputGlobals.documentReady()) { - window.intlTelInputGlobals.loadUtils(this.options.utilsScript); - } else { - // wait until the load event so we don't block any other requests e.g. the flags image - window.addEventListener("load", function () { - window.intlTelInputGlobals.loadUtils(_this5.options.utilsScript); - }); - } - } else this.resolveUtilsScriptPromise(); - if (this.options.initialCountry === "auto") this._loadAutoCountry(); - else this.resolveAutoCountryPromise(); - }, - }, - { - key: "_loadAutoCountry", - value: function _loadAutoCountry() { - // 3 options: - // 1) already loaded (we're done) - // 2) not already started loading (start) - // 3) already started loading (do nothing - just wait for loading callback to fire) - if (window.intlTelInputGlobals.autoCountry) { - this.handleAutoCountry(); - } else if (!window.intlTelInputGlobals.startedLoadingAutoCountry) { - // don't do this twice! - window.intlTelInputGlobals.startedLoadingAutoCountry = true; - if (typeof this.options.geoIpLookup === "function") { - this.options.geoIpLookup( - function (countryCode) { - window.intlTelInputGlobals.autoCountry = countryCode.toLowerCase(); - // tell all instances the auto country is ready - // TODO: this should just be the current instances - // UPDATE: use setTimeout in case their geoIpLookup function calls this callback straight - // away (e.g. if they have already done the geo ip lookup somewhere else). Using - // setTimeout means that the current thread of execution will finish before executing - // this, which allows the plugin to finish initialising. - setTimeout(function () { - return forEachInstance("handleAutoCountry"); - }); - }, - function () { - return forEachInstance("rejectAutoCountryPromise"); - } - ); - } - } - }, - }, - { - key: "_initKeyListeners", - value: function _initKeyListeners() { - var _this6 = this; - // update flag on keyup - this._handleKeyupEvent = function () { - if (_this6._updateFlagFromNumber(_this6.telInput.value)) { - _this6._triggerCountryChange(); - } - }; - this.telInput.addEventListener("keyup", this._handleKeyupEvent); - // update flag on cut/paste events (now supported in all major browsers) - this._handleClipboardEvent = function () { - // hack because "paste" event is fired before input is updated - setTimeout(_this6._handleKeyupEvent); - }; - this.telInput.addEventListener("cut", this._handleClipboardEvent); - this.telInput.addEventListener("paste", this._handleClipboardEvent); - }, - }, - { - key: "_cap", - value: function _cap(number) { - var max = this.telInput.getAttribute("maxlength"); - return max && number.length > max ? number.substr(0, max) : number; - }, - }, - { - key: "_initBlurListeners", - value: function _initBlurListeners() { - var _this7 = this; - // on blur or form submit: if just a dial code then remove it - this._handleSubmitOrBlurEvent = function () { - _this7._removeEmptyDialCode(); - }; - if (this.telInput.form) - this.telInput.form.addEventListener("submit", this._handleSubmitOrBlurEvent); - this.telInput.addEventListener("blur", this._handleSubmitOrBlurEvent); - }, - }, - { - key: "_removeEmptyDialCode", - value: function _removeEmptyDialCode() { - if (this.telInput.value.charAt(0) === "+") { - var numeric = this._getNumeric(this.telInput.value); - // if just a plus, or if just a dial code - if (!numeric || this.selectedCountryData.dialCode === numeric) { - this.telInput.value = ""; - } - } - }, - }, - { - key: "_getNumeric", - value: function _getNumeric(s) { - return s.replace(/\D/g, ""); - }, - }, - { - key: "_trigger", - value: function _trigger(name) { - // have to use old school document.createEvent as IE11 doesn't support `new Event()` syntax - var e = document.createEvent("Event"); - e.initEvent(name, true, true); - // can bubble, and is cancellable - this.telInput.dispatchEvent(e); - }, - }, - { - key: "_showDropdown", - value: function _showDropdown() { - this.countryList.classList.remove("iti__hide"); - this.selectedFlag.setAttribute("aria-expanded", "true"); - this._setDropdownPosition(); - // update highlighting and scroll to active list item - if (this.activeItem) { - this._highlightListItem(this.activeItem, false); - this._scrollTo(this.activeItem, true); - } - // bind all the dropdown-related listeners: mouseover, click, click-off, keydown - this._bindDropdownListeners(); - // update the arrow - this.dropdownArrow.classList.add("iti__arrow--up"); - this._trigger("open:countrydropdown"); - }, - }, - { - key: "_toggleClass", - value: function _toggleClass(el, className, shouldHaveClass) { - if (shouldHaveClass && !el.classList.contains(className)) el.classList.add(className); - else if (!shouldHaveClass && el.classList.contains(className)) - el.classList.remove(className); - }, - }, - { - key: "_setDropdownPosition", - value: function _setDropdownPosition() { - var _this8 = this; - if (this.options.dropdownContainer) { - this.options.dropdownContainer.appendChild(this.dropdown); - } - if (!this.isMobile) { - var pos = this.telInput.getBoundingClientRect(); - // windowTop from https://stackoverflow.com/a/14384091/217866 - var windowTop = window.pageYOffset || document.documentElement.scrollTop; - var inputTop = pos.top + windowTop; - var dropdownHeight = this.countryList.offsetHeight; - // dropdownFitsBelow = (dropdownBottom < windowBottom) - var dropdownFitsBelow = - inputTop + this.telInput.offsetHeight + dropdownHeight < - windowTop + window.innerHeight; - var dropdownFitsAbove = inputTop - dropdownHeight > windowTop; - // by default, the dropdown will be below the input. If we want to position it above the - // input, we add the dropup class. - this._toggleClass( - this.countryList, - "iti__country-list--dropup", - !dropdownFitsBelow && dropdownFitsAbove - ); - // if dropdownContainer is enabled, calculate postion - if (this.options.dropdownContainer) { - // by default the dropdown will be directly over the input because it's not in the flow. - // If we want to position it below, we need to add some extra top value. - var extraTop = - !dropdownFitsBelow && dropdownFitsAbove ? 0 : this.telInput.offsetHeight; - // calculate placement - this.dropdown.style.top = "".concat(inputTop + extraTop, "px"); - this.dropdown.style.left = "".concat(pos.left + document.body.scrollLeft, "px"); - // close menu on window scroll - this._handleWindowScroll = function () { - return _this8._closeDropdown(); - }; - window.addEventListener("scroll", this._handleWindowScroll); - } - } - }, - }, - { - key: "_getClosestListItem", - value: function _getClosestListItem(target) { - var el = target; - while (el && el !== this.countryList && !el.classList.contains("iti__country")) { - el = el.parentNode; - } - // if we reached the countryList element, then return null - return el === this.countryList ? null : el; - }, - }, - { - key: "_bindDropdownListeners", - value: function _bindDropdownListeners() { - var _this9 = this; - // when mouse over a list item, just highlight that one - // we add the class "highlight", so if they hit "enter" we know which one to select - this._handleMouseoverCountryList = function (e) { - // handle event delegation, as we're listening for this event on the countryList - var listItem = _this9._getClosestListItem(e.target); - if (listItem) _this9._highlightListItem(listItem, false); - }; - this.countryList.addEventListener("mouseover", this._handleMouseoverCountryList); - // listen for country selection - this._handleClickCountryList = function (e) { - var listItem = _this9._getClosestListItem(e.target); - if (listItem) _this9._selectListItem(listItem); - }; - this.countryList.addEventListener("click", this._handleClickCountryList); - // click off to close - // (except when this initial opening click is bubbling up) - // we cannot just stopPropagation as it may be needed to close another instance - var isOpening = true; - this._handleClickOffToClose = function () { - if (!isOpening) _this9._closeDropdown(); - isOpening = false; - }; - document.documentElement.addEventListener("click", this._handleClickOffToClose); - // listen for up/down scrolling, enter to select, or letters to jump to country name. - // use keydown as keypress doesn't fire for non-char keys and we want to catch if they - // just hit down and hold it to scroll down (no keyup event). - // listen on the document because that's where key events are triggered if no input has focus - var query = ""; - var queryTimer = null; - this._handleKeydownOnDropdown = function (e) { - // prevent down key from scrolling the whole page, - // and enter key from submitting a form etc - e.preventDefault(); - // up and down to navigate - if ( - e.key === "ArrowUp" || - e.key === "Up" || - e.key === "ArrowDown" || - e.key === "Down" - ) - _this9._handleUpDownKey(e.key); - else if (e.key === "Enter") _this9._handleEnterKey(); - else if (e.key === "Escape") _this9._closeDropdown(); - else if (/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(e.key)) { - // jump to countries that start with the query string - if (queryTimer) clearTimeout(queryTimer); - query += e.key.toLowerCase(); - _this9._searchForCountry(query); - // if the timer hits 1 second, reset the query - queryTimer = setTimeout(function () { - query = ""; - }, 1e3); - } - }; - document.addEventListener("keydown", this._handleKeydownOnDropdown); - }, - }, - { - key: "_handleUpDownKey", - value: function _handleUpDownKey(key) { - var next = - key === "ArrowUp" || key === "Up" - ? this.highlightedItem.previousElementSibling - : this.highlightedItem.nextElementSibling; - if (next) { - // skip the divider - if (next.classList.contains("iti__divider")) { - next = - key === "ArrowUp" || key === "Up" - ? next.previousElementSibling - : next.nextElementSibling; - } - this._highlightListItem(next, true); - } - }, - }, - { - key: "_handleEnterKey", - value: function _handleEnterKey() { - if (this.highlightedItem) this._selectListItem(this.highlightedItem); - }, - }, - { - key: "_searchForCountry", - value: function _searchForCountry(query) { - for (var i = 0; i < this.countries.length; i++) { - if (this._startsWith(this.countries[i].name, query)) { - var listItem = this.countryList.querySelector( - "#iti-".concat(this.id, "__item-").concat(this.countries[i].iso2) - ); - // update highlighting and scroll - this._highlightListItem(listItem, false); - this._scrollTo(listItem, true); - break; - } - } - }, - }, - { - key: "_startsWith", - value: function _startsWith(a, b) { - return a.substr(0, b.length).toLowerCase() === b; - }, - }, - { - key: "_updateValFromNumber", - value: function _updateValFromNumber(originalNumber) { - var number = originalNumber; - if ( - this.options.formatOnDisplay && - window.intlTelInputUtils && - this.selectedCountryData - ) { - var useNational = - !this.options.separateDialCode && - (this.options.nationalMode || number.charAt(0) !== "+"); - var _intlTelInputUtils$nu = intlTelInputUtils.numberFormat, - NATIONAL = _intlTelInputUtils$nu.NATIONAL, - INTERNATIONAL = _intlTelInputUtils$nu.INTERNATIONAL; - var format = useNational ? NATIONAL : INTERNATIONAL; - number = intlTelInputUtils.formatNumber( - number, - this.selectedCountryData.iso2, - format - ); - } - number = this._beforeSetNumber(number); - this.telInput.value = number; - }, - }, - { - key: "_updateFlagFromNumber", - value: function _updateFlagFromNumber(originalNumber) { - // if we're in nationalMode and we already have US/Canada selected, make sure the number starts - // with a +1 so _getDialCode will be able to extract the area code - // update: if we dont yet have selectedCountryData, but we're here (trying to update the flag - // from the number), that means we're initialising the plugin with a number that already has a - // dial code, so fine to ignore this bit - var number = originalNumber; - var selectedDialCode = this.selectedCountryData.dialCode; - var isNanp = selectedDialCode === "1"; - if (number && this.options.nationalMode && isNanp && number.charAt(0) !== "+") { - if (number.charAt(0) !== "1") number = "1".concat(number); - number = "+".concat(number); - } - // update flag if user types area code for another country - if (this.options.separateDialCode && selectedDialCode && number.charAt(0) !== "+") { - number = "+".concat(selectedDialCode).concat(number); - } - // try and extract valid dial code from input - var dialCode = this._getDialCode(number, true); - var numeric = this._getNumeric(number); - var countryCode = null; - if (dialCode) { - var countryCodes = this.countryCodes[this._getNumeric(dialCode)]; - // check if the right country is already selected. this should be false if the number is - // longer than the matched dial code because in this case we need to make sure that if - // there are multiple country matches, that the first one is selected (note: we could - // just check that here, but it requires the same loop that we already have later) - var alreadySelected = - countryCodes.indexOf(this.selectedCountryData.iso2) !== -1 && - numeric.length <= dialCode.length - 1; - var isRegionlessNanpNumber = - selectedDialCode === "1" && this._isRegionlessNanp(numeric); - // only update the flag if: - // A) NOT (we currently have a NANP flag selected, and the number is a regionlessNanp) - // AND - // B) the right country is not already selected - if (!isRegionlessNanpNumber && !alreadySelected) { - // if using onlyCountries option, countryCodes[0] may be empty, so we must find the first - // non-empty index - for (var j = 0; j < countryCodes.length; j++) { - if (countryCodes[j]) { - countryCode = countryCodes[j]; - break; - } - } - } - } else if (number.charAt(0) === "+" && numeric.length) { - // invalid dial code, so empty - // Note: use getNumeric here because the number has not been formatted yet, so could contain - // bad chars - countryCode = ""; - } else if (!number || number === "+") { - // empty, or just a plus, so default - countryCode = this.defaultCountry; - } - if (countryCode !== null) { - return this._setFlag(countryCode); - } - return false; - }, - }, - { - key: "_isRegionlessNanp", - value: function _isRegionlessNanp(number) { - var numeric = this._getNumeric(number); - if (numeric.charAt(0) === "1") { - var areaCode = numeric.substr(1, 3); - return regionlessNanpNumbers.indexOf(areaCode) !== -1; - } - return false; - }, - }, - { - key: "_highlightListItem", - value: function _highlightListItem(listItem, shouldFocus) { - var prevItem = this.highlightedItem; - if (prevItem) prevItem.classList.remove("iti__highlight"); - this.highlightedItem = listItem; - this.highlightedItem.classList.add("iti__highlight"); - if (shouldFocus) this.highlightedItem.focus(); - }, - }, - { - key: "_getCountryData", - value: function _getCountryData(countryCode, ignoreOnlyCountriesOption, allowFail) { - var countryList = ignoreOnlyCountriesOption ? allCountries : this.countries; - for (var i = 0; i < countryList.length; i++) { - if (countryList[i].iso2 === countryCode) { - return countryList[i]; - } - } - if (allowFail) { - return null; - } - throw new Error("No country data for '".concat(countryCode, "'")); - }, - }, - { - key: "_setFlag", - value: function _setFlag(countryCode) { - var prevCountry = this.selectedCountryData.iso2 ? this.selectedCountryData : {}; - // do this first as it will throw an error and stop if countryCode is invalid - this.selectedCountryData = countryCode - ? this._getCountryData(countryCode, false, false) - : {}; - // update the defaultCountry - we only need the iso2 from now on, so just store that - if (this.selectedCountryData.iso2) { - this.defaultCountry = this.selectedCountryData.iso2; - } - this.selectedFlagInner.setAttribute("class", "iti__flag iti__".concat(countryCode)); - // update the selected country's title attribute - var title = countryCode - ? "" - .concat(this.selectedCountryData.name, ": +") - .concat(this.selectedCountryData.dialCode) - : "Unknown"; - this.selectedFlag.setAttribute("title", title); - if (this.options.separateDialCode) { - var dialCode = this.selectedCountryData.dialCode - ? "+".concat(this.selectedCountryData.dialCode) - : ""; - this.selectedDialCode.innerHTML = dialCode; - // offsetWidth is zero if input is in a hidden container during initialisation - var selectedFlagWidth = - this.selectedFlag.offsetWidth || this._getHiddenSelectedFlagWidth(); - // add 6px of padding after the grey selected-dial-code box, as this is what we use in the css - this.telInput.style.paddingLeft = "".concat(selectedFlagWidth + 6, "px"); - } - // and the input's placeholder - this._updatePlaceholder(); - // update the active list item - if (this.options.allowDropdown) { - var prevItem = this.activeItem; - if (prevItem) { - prevItem.classList.remove("iti__active"); - prevItem.setAttribute("aria-selected", "false"); - } - if (countryCode) { - // check if there is a preferred item first, else fall back to standard - var nextItem = - this.countryList.querySelector( - "#iti-".concat(this.id, "__item-").concat(countryCode, "-preferred") - ) || - this.countryList.querySelector( - "#iti-".concat(this.id, "__item-").concat(countryCode) - ); - nextItem.setAttribute("aria-selected", "true"); - nextItem.classList.add("iti__active"); - this.activeItem = nextItem; - this.selectedFlag.setAttribute( - "aria-activedescendant", - nextItem.getAttribute("id") - ); - } - } - // return if the flag has changed or not - return prevCountry.iso2 !== countryCode; - }, - }, - { - key: "_getHiddenSelectedFlagWidth", - value: function _getHiddenSelectedFlagWidth() { - // to get the right styling to apply, all we need is a shallow clone of the container, - // and then to inject a deep clone of the selectedFlag element - var containerClone = this.telInput.parentNode.cloneNode(); - containerClone.style.visibility = "hidden"; - document.body.appendChild(containerClone); - var flagsContainerClone = this.flagsContainer.cloneNode(); - containerClone.appendChild(flagsContainerClone); - var selectedFlagClone = this.selectedFlag.cloneNode(true); - flagsContainerClone.appendChild(selectedFlagClone); - var width = selectedFlagClone.offsetWidth; - containerClone.parentNode.removeChild(containerClone); - return width; - }, - }, - { - key: "_updatePlaceholder", - value: function _updatePlaceholder() { - var shouldSetPlaceholder = - this.options.autoPlaceholder === "aggressive" || - (!this.hadInitialPlaceholder && this.options.autoPlaceholder === "polite"); - if (window.intlTelInputUtils && shouldSetPlaceholder) { - var numberType = intlTelInputUtils.numberType[this.options.placeholderNumberType]; - var placeholder = this.selectedCountryData.iso2 - ? intlTelInputUtils.getExampleNumber( - this.selectedCountryData.iso2, - this.options.nationalMode, - numberType - ) - : ""; - placeholder = this._beforeSetNumber(placeholder); - if (typeof this.options.customPlaceholder === "function") { - placeholder = this.options.customPlaceholder( - placeholder, - this.selectedCountryData - ); - } - this.telInput.setAttribute("placeholder", placeholder); - } - }, - }, - { - key: "_selectListItem", - value: function _selectListItem(listItem) { - // update selected flag and active list item - var flagChanged = this._setFlag(listItem.getAttribute("data-country-code")); - this._closeDropdown(); - this._updateDialCode(listItem.getAttribute("data-dial-code"), true); - // focus the input - this.telInput.focus(); - // put cursor at end - this fix is required for FF and IE11 (with nationalMode=false i.e. auto - // inserting dial code), who try to put the cursor at the beginning the first time - var len = this.telInput.value.length; - this.telInput.setSelectionRange(len, len); - if (flagChanged) { - this._triggerCountryChange(); - } - }, - }, - { - key: "_closeDropdown", - value: function _closeDropdown() { - this.countryList.classList.add("iti__hide"); - this.selectedFlag.setAttribute("aria-expanded", "false"); - // update the arrow - this.dropdownArrow.classList.remove("iti__arrow--up"); - // unbind key events - document.removeEventListener("keydown", this._handleKeydownOnDropdown); - document.documentElement.removeEventListener("click", this._handleClickOffToClose); - this.countryList.removeEventListener("mouseover", this._handleMouseoverCountryList); - this.countryList.removeEventListener("click", this._handleClickCountryList); - // remove menu from container - if (this.options.dropdownContainer) { - if (!this.isMobile) window.removeEventListener("scroll", this._handleWindowScroll); - if (this.dropdown.parentNode) this.dropdown.parentNode.removeChild(this.dropdown); - } - this._trigger("close:countrydropdown"); - }, - }, - { - key: "_scrollTo", - value: function _scrollTo(element, middle) { - var container = this.countryList; - // windowTop from https://stackoverflow.com/a/14384091/217866 - var windowTop = window.pageYOffset || document.documentElement.scrollTop; - var containerHeight = container.offsetHeight; - var containerTop = container.getBoundingClientRect().top + windowTop; - var containerBottom = containerTop + containerHeight; - var elementHeight = element.offsetHeight; - var elementTop = element.getBoundingClientRect().top + windowTop; - var elementBottom = elementTop + elementHeight; - var newScrollTop = elementTop - containerTop + container.scrollTop; - var middleOffset = containerHeight / 2 - elementHeight / 2; - if (elementTop < containerTop) { - // scroll up - if (middle) newScrollTop -= middleOffset; - container.scrollTop = newScrollTop; - } else if (elementBottom > containerBottom) { - // scroll down - if (middle) newScrollTop += middleOffset; - var heightDifference = containerHeight - elementHeight; - container.scrollTop = newScrollTop - heightDifference; - } - }, - }, - { - key: "_updateDialCode", - value: function _updateDialCode(newDialCodeBare, hasSelectedListItem) { - var inputVal = this.telInput.value; - // save having to pass this every time - var newDialCode = "+".concat(newDialCodeBare); - var newNumber; - if (inputVal.charAt(0) === "+") { - // there's a plus so we're dealing with a replacement (doesn't matter if nationalMode or not) - var prevDialCode = this._getDialCode(inputVal); - if (prevDialCode) { - // current number contains a valid dial code, so replace it - newNumber = inputVal.replace(prevDialCode, newDialCode); - } else { - // current number contains an invalid dial code, so ditch it - // (no way to determine where the invalid dial code ends and the rest of the number begins) - newNumber = newDialCode; - } - } else if (this.options.nationalMode || this.options.separateDialCode) { - // don't do anything - return; - } else { - // nationalMode is disabled - if (inputVal) { - // there is an existing value with no dial code: prefix the new dial code - newNumber = newDialCode + inputVal; - } else if (hasSelectedListItem || !this.options.autoHideDialCode) { - // no existing value and either they've just selected a list item, or autoHideDialCode is - // disabled: insert new dial code - newNumber = newDialCode; - } else { - return; - } - } - this.telInput.value = newNumber; - }, - }, - { - key: "_getDialCode", - value: function _getDialCode(number, includeAreaCode) { - var dialCode = ""; - // only interested in international numbers (starting with a plus) - if (number.charAt(0) === "+") { - var numericChars = ""; - // iterate over chars - for (var i = 0; i < number.length; i++) { - var c = number.charAt(i); - // if char is number (https://stackoverflow.com/a/8935649/217866) - if (!isNaN(parseInt(c, 10))) { - numericChars += c; - // if current numericChars make a valid dial code - if (includeAreaCode) { - if (this.countryCodes[numericChars]) { - // store the actual raw string (useful for matching later) - dialCode = number.substr(0, i + 1); - } - } else { - if (this.dialCodes[numericChars]) { - dialCode = number.substr(0, i + 1); - // if we're just looking for a dial code, we can break as soon as we find one - break; - } - } - // stop searching as soon as we can - in this case when we hit max len - if (numericChars.length === this.countryCodeMaxLen) { - break; - } - } - } - } - return dialCode; - }, - }, - { - key: "_getFullNumber", - value: function _getFullNumber() { - var val = this.telInput.value.trim(); - var dialCode = this.selectedCountryData.dialCode; - var prefix; - var numericVal = this._getNumeric(val); - if (this.options.separateDialCode && val.charAt(0) !== "+" && dialCode && numericVal) { - // when using separateDialCode, it is visible so is effectively part of the typed number - prefix = "+".concat(dialCode); - } else { - prefix = ""; - } - return prefix + val; - }, - }, - { - key: "_beforeSetNumber", - value: function _beforeSetNumber(originalNumber) { - var number = originalNumber; - if (this.options.separateDialCode) { - var dialCode = this._getDialCode(number); - // if there is a valid dial code - if (dialCode) { - // in case _getDialCode returned an area code as well - dialCode = "+".concat(this.selectedCountryData.dialCode); - // a lot of numbers will have a space separating the dial code and the main number, and - // some NANP numbers will have a hyphen e.g. +1 684-733-1234 - in both cases we want to get - // rid of it - // NOTE: don't just trim all non-numerics as may want to preserve an open parenthesis etc - var start = - number[dialCode.length] === " " || number[dialCode.length] === "-" - ? dialCode.length + 1 - : dialCode.length; - number = number.substr(start); - } - } - return this._cap(number); - }, - }, - { - key: "_triggerCountryChange", - value: function _triggerCountryChange() { - this._trigger("countrychange"); - }, - }, - { - key: "handleAutoCountry", - value: function handleAutoCountry() { - if (this.options.initialCountry === "auto") { - // we must set this even if there is an initial val in the input: in case the initial val is - // invalid and they delete it - they should see their auto country - this.defaultCountry = window.intlTelInputGlobals.autoCountry; - // if there's no initial value in the input, then update the flag - if (!this.telInput.value) { - this.setCountry(this.defaultCountry); - } - this.resolveAutoCountryPromise(); - } - }, - }, - { - key: "handleUtils", - value: function handleUtils() { - // if the request was successful - if (window.intlTelInputUtils) { - // if there's an initial value in the input, then format it - if (this.telInput.value) { - this._updateValFromNumber(this.telInput.value); - } - this._updatePlaceholder(); - } - this.resolveUtilsScriptPromise(); - }, - }, - { - key: "destroy", - value: function destroy() { - var form = this.telInput.form; - if (this.options.allowDropdown) { - // make sure the dropdown is closed (and unbind listeners) - this._closeDropdown(); - this.selectedFlag.removeEventListener("click", this._handleClickSelectedFlag); - this.flagsContainer.removeEventListener( - "keydown", - this._handleFlagsContainerKeydown - ); - // label click hack - var label = this._getClosestLabel(); - if (label) label.removeEventListener("click", this._handleLabelClick); - } - // unbind hiddenInput listeners - if (this.hiddenInput && form) - form.removeEventListener("submit", this._handleHiddenInputSubmit); - // unbind autoHideDialCode listeners - if (this.options.autoHideDialCode) { - if (form) form.removeEventListener("submit", this._handleSubmitOrBlurEvent); - this.telInput.removeEventListener("blur", this._handleSubmitOrBlurEvent); - } - // unbind key events, and cut/paste events - this.telInput.removeEventListener("keyup", this._handleKeyupEvent); - this.telInput.removeEventListener("cut", this._handleClipboardEvent); - this.telInput.removeEventListener("paste", this._handleClipboardEvent); - // remove attribute of id instance: data-intl-tel-input-id - this.telInput.removeAttribute("data-intl-tel-input-id"); - // remove markup (but leave the original input) - var wrapper = this.telInput.parentNode; - wrapper.parentNode.insertBefore(this.telInput, wrapper); - wrapper.parentNode.removeChild(wrapper); - delete window.intlTelInputGlobals.instances[this.id]; - }, - }, - { - key: "getExtension", - value: function getExtension() { - if (window.intlTelInputUtils) { - return intlTelInputUtils.getExtension( - this._getFullNumber(), - this.selectedCountryData.iso2 - ); - } - return ""; - }, - }, - { - key: "getNumber", - value: function getNumber(format) { - if (window.intlTelInputUtils) { - var iso2 = this.selectedCountryData.iso2; - return intlTelInputUtils.formatNumber(this._getFullNumber(), iso2, format); - } - return ""; - }, - }, - { - key: "getNumberType", - value: function getNumberType() { - if (window.intlTelInputUtils) { - return intlTelInputUtils.getNumberType( - this._getFullNumber(), - this.selectedCountryData.iso2 - ); - } - return -99; - }, - }, - { - key: "getSelectedCountryData", - value: function getSelectedCountryData() { - return this.selectedCountryData; - }, - }, - { - key: "getValidationError", - value: function getValidationError() { - if (window.intlTelInputUtils) { - var iso2 = this.selectedCountryData.iso2; - return intlTelInputUtils.getValidationError(this._getFullNumber(), iso2); - } - return -99; - }, - }, - { - key: "isValidNumber", - value: function isValidNumber() { - var val = this._getFullNumber().trim(); - var countryCode = this.options.nationalMode ? this.selectedCountryData.iso2 : ""; - return window.intlTelInputUtils - ? intlTelInputUtils.isValidNumber(val, countryCode) - : null; - }, - }, - { - key: "setCountry", - value: function setCountry(originalCountryCode) { - var countryCode = originalCountryCode.toLowerCase(); - // check if already selected - if (!this.selectedFlagInner.classList.contains("iti__".concat(countryCode))) { - this._setFlag(countryCode); - this._updateDialCode(this.selectedCountryData.dialCode, false); - this._triggerCountryChange(); - } - }, - }, - { - key: "setNumber", - value: function setNumber(number) { - // we must update the flag first, which updates this.selectedCountryData, which is used for - // formatting the number before displaying it - var flagChanged = this._updateFlagFromNumber(number); - this._updateValFromNumber(number); - if (flagChanged) { - this._triggerCountryChange(); - } - }, - }, - { - key: "setPlaceholderNumberType", - value: function setPlaceholderNumberType(type) { - this.options.placeholderNumberType = type; - this._updatePlaceholder(); - }, - }, - ]); - return Iti; - })(); - /******************** - * STATIC METHODS - ********************/ - // get the country data object - intlTelInputGlobals.getCountryData = function () { - return allCountries; - }; - // inject a