diff --git a/lib/build/emailpassword-shared3.js b/lib/build/emailpassword-shared3.js index 4cce69e81..57c3c79e9 100644 --- a/lib/build/emailpassword-shared3.js +++ b/lib/build/emailpassword-shared3.js @@ -538,21 +538,28 @@ var EmailPassword = /** @class */ (function (_super) { ); 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; + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = 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; + }, }, - }, - } - ) - ), + } + ) + ); + return init.apply(void 0, args); + }, }; }; EmailPassword.getInstanceOrThrow = function () { diff --git a/lib/build/emailpassword-shared6.js b/lib/build/emailpassword-shared6.js index b8dc26b72..22b2c0b5f 100644 --- a/lib/build/emailpassword-shared6.js +++ b/lib/build/emailpassword-shared6.js @@ -672,7 +672,8 @@ var FormBase = function (props) { _b, field, errorFields_1, - getErrorMessage_1; + getErrorMessage_1, + e_1; return genericComponentOverrideContext.__generator(this, function (_c) { switch (_c.label) { case 0: @@ -814,7 +815,8 @@ var FormBase = function (props) { } return [3 /*break*/, 5]; case 3: - _c.sent(); + e_1 = _c.sent(); + console.error(e_1); props.onError("SOMETHING_WENT_WRONG_ERROR"); return [3 /*break*/, 5]; case 4: diff --git a/lib/build/emailpasswordprebuiltui.js b/lib/build/emailpasswordprebuiltui.js index d05eba249..905b0d5ef 100644 --- a/lib/build/emailpasswordprebuiltui.js +++ b/lib/build/emailpasswordprebuiltui.js @@ -518,7 +518,7 @@ function ResetPasswordUsingTokenThemeWrapper(props) { var defaultTranslationsEmailPassword = { en: genericComponentOverrideContext.__assign( genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), translations.defaultTranslationsEmailVerification.en ), { @@ -1517,6 +1517,7 @@ var EmailPasswordPreBuiltUI = /** @class */ (function (_super) { EmailPasswordPreBuiltUI.instance = undefined; return; }; + EmailPasswordPreBuiltUI.languageTranslations = defaultTranslationsEmailPassword; EmailPasswordPreBuiltUI.ResetPasswordUsingToken = function (prop) { return EmailPasswordPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("resetpassword", prop); }; diff --git a/lib/build/emailverification-shared.js b/lib/build/emailverification-shared.js index 156ebbd02..8b71aea4f 100644 --- a/lib/build/emailverification-shared.js +++ b/lib/build/emailverification-shared.js @@ -238,21 +238,28 @@ var EmailVerification = /** @class */ (function (_super) { ); 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; + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = 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; + }, }, - }, - } - ) - ), + } + ) + ); + return init.apply(void 0, args); + }, }; }; EmailVerification.getInstanceOrThrow = function () { diff --git a/lib/build/emailverification-shared2.js b/lib/build/emailverification-shared2.js index 5950573f8..a1d516121 100644 --- a/lib/build/emailverification-shared2.js +++ b/lib/build/emailverification-shared2.js @@ -3,7 +3,6 @@ var jsxRuntime = require("react/jsx-runtime"); var React = require("react"); var genericComponentOverrideContext = require("./genericComponentOverrideContext.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 --palette-buttonGreyedOut: 221, 221, 221;\n --palette-caution: 124, 96, 62;\n --palette-errorDark: 207, 54, 68;\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: 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~="buttonGreyedOut"] {\n background-color: rgb(var(--palette-buttonGreyedOut));\n border-color: rgb(var(--palette-buttonGreyedOut));\n}\n\n[data-supertokens~="buttonWithIcon"] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\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'; @@ -18,7 +17,7 @@ var ThemeBase = function (_a) { var defaultTranslationsEmailVerification = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { EMAIL_VERIFICATION_RESEND_SUCCESS: "Email resent", EMAIL_VERIFICATION_SEND_TITLE: "Verify your email!", diff --git a/lib/build/emailverificationprebuiltui.js b/lib/build/emailverificationprebuiltui.js index 8415df627..27c89c61a 100644 --- a/lib/build/emailverificationprebuiltui.js +++ b/lib/build/emailverificationprebuiltui.js @@ -1175,6 +1175,7 @@ var EmailVerificationPreBuiltUI = /** @class */ (function (_super) { EmailVerificationPreBuiltUI.instance = undefined; return; }; + EmailVerificationPreBuiltUI.languageTranslations = translations.defaultTranslationsEmailVerification; EmailVerificationPreBuiltUI.EmailVerification = function (props) { return EmailVerificationPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( "emailverification", diff --git a/lib/build/genericComponentOverrideContext.js b/lib/build/genericComponentOverrideContext.js index 2f89c7e68..25ddbc4c1 100644 --- a/lib/build/genericComponentOverrideContext.js +++ b/lib/build/genericComponentOverrideContext.js @@ -304,6 +304,22 @@ function logDebugMessage(message) { } } +/* 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 nonPublicConfigProperties = ["experimental"]; + /* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. * * This software is licensed under the Apache License, Version 2.0 (the @@ -949,6 +965,28 @@ var handleCallAPI = function (_a) { }); }); }; +function getPublicPlugin(plugin) { + return { + id: plugin.id, + initialized: plugin.init ? false : true, + version: plugin.version, + exports: plugin.exports, + compatibleAuthReactSDKVersions: plugin.compatibleAuthReactSDKVersions, + compatibleWebJSSDKVersions: plugin.compatibleWebJSSDKVersions, + }; +} +function getPublicConfig(config) { + var configKeys = Object.keys(config); + var publicConfig = configKeys.reduce(function (acc, key) { + var _a; + if (nonPublicConfigProperties.includes(key)) { + return acc; + } else { + return exports.__assign(exports.__assign({}, acc), ((_a = {}), (_a[key] = config[key]), _a)); + } + }, {}); + return publicConfig; +} var BaseRecipeModule = /** @class */ (function () { /* @@ -1135,7 +1173,14 @@ var Multitenancy = /** @class */ (function (_super) { ); return Multitenancy.instance; }, - webJS: MultitenancyWebJS__default.default.init(exports.__assign({}, normalisedConfig)), + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = MultitenancyWebJS__default.default.init(exports.__assign({}, normalisedConfig)); + return init.apply(void 0, args); + }, }; }; Multitenancy.getInstanceOrThrow = function () { @@ -1165,6 +1210,31 @@ var Multitenancy = /** @class */ (function (_super) { return Multitenancy; })(BaseRecipeModule); +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 TranslationController = /** @class */ (function () { function TranslationController() { this.handlers = new Map(); @@ -1231,6 +1301,71 @@ function getCurrentLanguageFromCookie() { }); }); } +var getTranslationFunction = function () { + var stores = []; + for (var _i = 0; _i < arguments.length; _i++) { + stores[_i] = arguments[_i]; + } + var _a = SuperTokens.getInstanceOrThrow().languageTranslations, + translationEventSource = _a.translationEventSource, + userTranslationFunc = _a.userTranslationFunc, + defaultLanguage = _a.defaultLanguage, + userTranslationStore = _a.userTranslationStore; + var _store = __spreadArray( + __spreadArray([defaultTranslationsCommon], stores, true), + [userTranslationStore], + false + ).reduce(mergeObjects, {}); + var getStore = function () { + return _store; + }; + var setStore = function (newStore) { + _store = newStore; + }; + var _language = defaultLanguage; + var getLanguage = function () { + return _language; + }; + var setLanguage = function (lang) { + _language = lang; + }; + var changeHandler = function (_eventName, detail) { + setLanguage(detail); + }; + var loadHandler = function (_eventName, detail) { + setStore(mergeObjects(_store, detail)); + }; + translationEventSource.off("LanguageChange", changeHandler); + translationEventSource.off("TranslationLoaded", loadHandler); + translationEventSource.on("LanguageChange", changeHandler); + translationEventSource.on("TranslationLoaded", loadHandler); + getCurrentLanguageFromCookie().then(function (cookieLanguage) { + if (cookieLanguage) setLanguage(cookieLanguage); + }); + var translate = function (key, replacements) { + if (replacements === void 0) { + replacements = {}; + } + if (userTranslationFunc) { + return userTranslationFunc(key); + } + if (getLanguage() !== undefined) { + var res = getStore()[getLanguage()] && getStore()[getLanguage()][key]; + var fallback = getStore()[defaultLanguage] && getStore()[defaultLanguage][key]; + if (res === undefined) { + if (fallback !== undefined) { + return fallback; + } + return key; + } + return res.replace(/{(\w+)}/g, function (match, p1) { + return replacements[p1] || match; + }); + } + throw new Error("Should never come here"); + }; + return translate; +}; /* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved. * @@ -1254,9 +1389,10 @@ var SuperTokens = /** @class */ (function () { * Constructor. */ function SuperTokens(config, plugins) { - var _a; var _this = this; - var _b, _c, _d, _e, _f, _g, _h, _j; + var _a, _b, _c, _d, _e, _f, _g, _h; + // give access to plugins through the instance + this.pluginList = []; this.recipeList = []; this.componentOverrides = {}; this.pluginRouteHandlers = []; @@ -1357,23 +1493,52 @@ var SuperTokens = /** @class */ (function () { for (var _i = 0, plugins_1 = plugins; _i < plugins_1.length; _i++) { var plugin = plugins_1[_i]; if (plugin.overrideMap !== undefined) { - for (var _k = 0, _l = Object.keys(plugin.overrideMap); _k < _l.length; _k++) { - var t = _l[_k]; - if ((_b = plugin.overrideMap[t]) === null || _b === void 0 ? void 0 : _b.components) { - this.componentOverrides[t] = exports.__assign( - exports.__assign({}, this.componentOverrides[t]), - (_c = plugin.overrideMap[t]) === null || _c === void 0 ? void 0 : _c.components - ); - } + for (var _j = 0, _k = Object.keys(plugin.overrideMap); _j < _k.length; _j++) { + var t = _k[_j]; + this.componentOverrides[t] = exports.__assign( + exports.__assign({}, this.componentOverrides[t]), + (_b = (_a = plugin.overrideMap[t]) === null || _a === void 0 ? void 0 : _a.components) !== + null && _b !== void 0 + ? _b + : {} + ); } } this.componentOverrides.authRecipe = exports.__assign( - exports.__assign({}, (_d = this.componentOverrides.authRecipe) !== null && _d !== void 0 ? _d : {}), - (_e = plugin.generalAuthRecipeComponentOverrides) !== null && _e !== void 0 ? _e : {} + exports.__assign({}, (_c = this.componentOverrides.authRecipe) !== null && _c !== void 0 ? _c : {}), + (_d = plugin.generalAuthRecipeComponentOverrides) !== null && _d !== void 0 ? _d : {} ); - if (plugin.routeHandlers) { - (_a = this.pluginRouteHandlers).push.apply(_a, plugin.routeHandlers); + } + this.pluginList = plugins.map(getPublicPlugin); + var publicConfig = getPublicConfig(exports.__assign(exports.__assign({}, config), { appInfo: this.appInfo })); + var _loop_1 = function (pluginIndex) { + var _l; + var pluginInit = plugins[pluginIndex].init; + if (pluginInit && !this_1.pluginList[pluginIndex].initialized) { + postSuperTokensInitCallbacks.PostSuperTokensInitCallbacks.addPostInitCallback(function () { + pluginInit(publicConfig, _this.pluginList, package_version); + _this.pluginList[pluginIndex].initialized = true; + }); + } + var pluginRouteHandlers = plugins[pluginIndex].routeHandlers; + if (pluginRouteHandlers) { + var handlers = []; + if (typeof pluginRouteHandlers === "function") { + var result = pluginRouteHandlers(publicConfig, this_1.pluginList, package_version); + if (result.status === "ERROR") { + throw new Error(result.message); + } + handlers = result.routeHandlers; + } else { + handlers = pluginRouteHandlers; + } + (_l = this_1.pluginRouteHandlers).push.apply(_l, handlers); } + }; + var this_1 = this; + // iterated separately so we can pass the instance plugins as reference so they always have access to the latest + for (var pluginIndex = 0; pluginIndex < this.pluginList.length; pluginIndex += 1) { + _loop_1(pluginIndex); } var translationConfig = config.languageTranslations === undefined ? {} : config.languageTranslations; this.languageTranslations = { @@ -1395,12 +1560,12 @@ var SuperTokens = /** @class */ (function () { var authReact = _a.authReact; return authReact(_this.appInfo, enableDebugLogs); }); - this.rootStyle = (_f = config.style) !== null && _f !== void 0 ? _f : ""; + this.rootStyle = (_e = config.style) !== null && _e !== void 0 ? _e : ""; this.privacyPolicyLink = config.privacyPolicyLink; this.termsOfServiceLink = config.termsOfServiceLink; - this.useShadowDom = (_g = config.useShadowDom) !== null && _g !== void 0 ? _g : true; - this.defaultToSignUp = (_h = config.defaultToSignUp) !== null && _h !== void 0 ? _h : false; - this.disableAuthRoute = (_j = config.disableAuthRoute) !== null && _j !== void 0 ? _j : false; + this.useShadowDom = (_f = config.useShadowDom) !== null && _f !== void 0 ? _f : true; + this.defaultToSignUp = (_g = config.defaultToSignUp) !== null && _g !== void 0 ? _g : false; + this.disableAuthRoute = (_h = config.disableAuthRoute) !== null && _h !== void 0 ? _h : false; } /* * Static Methods. @@ -1421,6 +1586,10 @@ var SuperTokens = /** @class */ (function () { }) !== undefined ? config.recipeList : config.recipeList.concat(Multitenancy.init({})); + var normalisedAppInfo = normaliseInputAppInfoOrThrowError(config.appInfo); + var publicConfig = getPublicConfig( + exports.__assign(exports.__assign({}, config), { appInfo: normalisedAppInfo }) + ); var finalPluginList = []; if ((_b = config.experimental) === null || _b === void 0 ? void 0 : _b.plugins) { for (var _i = 0, _c = config.experimental.plugins; _i < _c.length; _i++) { @@ -1431,11 +1600,19 @@ var SuperTokens = /** @class */ (function () { : [plugin.compatibleAuthReactSDKVersions]; if (!versionContraints.includes(package_version)) { // TODO: better checks - throw new Error("Plugin version mismatch"); + throw new Error( + "Plugin version mismatch. Version " + .concat(package_version, " not found in compatible versions: ") + .concat(versionContraints.join(", ")) + ); } } if (plugin.dependencies) { - var result = plugin.dependencies(finalPluginList, package_version); + var result = plugin.dependencies( + publicConfig, + finalPluginList.map(getPublicPlugin), + package_version + ); if (result.status === "ERROR") { throw new Error(result.message); } @@ -1446,10 +1623,32 @@ var SuperTokens = /** @class */ (function () { finalPluginList.push(plugin); } } + var duplicatePluginIds = finalPluginList.filter(function (plugin, index) { + return finalPluginList.some(function (elem, idx) { + return elem.id === plugin.id && idx !== index; + }); + }); + if (duplicatePluginIds.length > 0) { + throw new Error( + "Duplicate plugin IDs: ".concat( + duplicatePluginIds + .map(function (plugin) { + return plugin.id; + }) + .join(", ") + ) + ); + } for (var _d = 0, finalPluginList_1 = finalPluginList; _d < finalPluginList_1.length; _d++) { var plugin = finalPluginList_1[_d]; if (plugin.config) { - config = exports.__assign(exports.__assign({}, config), plugin.config(config)); + var pluginConfig = + plugin.config( + getPublicConfig(exports.__assign(exports.__assign({}, config), { appInfo: normalisedAppInfo })) + ) || {}; + // @ts-expect-error we don't want to override the appInfo and we can't make sure the plugin won't return it + delete pluginConfig.appInfo; + config = exports.__assign(exports.__assign({}, config), pluginConfig); } } SuperTokensWebJS__default.default.init( @@ -1610,6 +1809,7 @@ exports.appendQueryParamsToURL = appendQueryParamsToURL; exports.clearErrorQueryParam = clearErrorQueryParam; exports.clearQueryParams = clearQueryParams; exports.createGenericComponentsOverrideContext = createGenericComponentsOverrideContext; +exports.defaultTranslationsCommon = defaultTranslationsCommon; exports.getCurrentLanguageFromCookie = getCurrentLanguageFromCookie; exports.getCurrentNormalisedUrlPath = getCurrentNormalisedUrlPath; exports.getCurrentNormalisedUrlPathWithQueryParamsAndFragments = getCurrentNormalisedUrlPathWithQueryParamsAndFragments; @@ -1619,6 +1819,7 @@ exports.getNormalisedUserContext = getNormalisedUserContext; exports.getQueryParams = getQueryParams; exports.getRedirectToPathFromURL = getRedirectToPathFromURL; exports.getTenantIdFromQueryParams = getTenantIdFromQueryParams; +exports.getTranslationFunction = getTranslationFunction; exports.getURLHash = getURLHash; exports.handleCallAPI = handleCallAPI; exports.isTest = isTest; diff --git a/lib/build/index.d.ts b/lib/build/index.d.ts index 3e0395d4b..f2558b3b7 100644 --- a/lib/build/index.d.ts +++ b/lib/build/index.d.ts @@ -17,7 +17,9 @@ export default class SuperTokensAPIWrapper { redirectBack?: boolean; userContext?: UserContext; }) => Promise; + static isRecipeInitialized(recipeId: string): boolean; static useTranslation: () => import("./translation/translationHelpers").TranslationFunc; + static getTranslationFunction: (...stores: TranslationStore[]) => (key: T) => string; static useUserContext: () => UserContext; } export declare const init: typeof SuperTokensAPIWrapper.init; @@ -30,6 +32,10 @@ export declare const redirectToAuth: (options?: { redirectBack?: boolean; userContext?: UserContext; }) => Promise; +export declare const isRecipeInitialized: typeof SuperTokensAPIWrapper.isRecipeInitialized; +export type { SuperTokensConfig, SuperTokensPublicConfig, SuperTokensPublicPlugin, SuperTokensPlugin } from "./types"; +export type { TranslationStore } from "./translation/translationHelpers"; export { SuperTokensWrapper } from "./components/supertokensWrapper"; export { useTranslation } from "./translation/translationContext"; +export { getTranslationFunction } from "./translation/translationHelpers"; export { useUserContext } from "./usercontext"; diff --git a/lib/build/index.js b/lib/build/index.js index 1ced07799..43ad2473a 100644 --- a/lib/build/index.js +++ b/lib/build/index.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -require("./genericComponentOverrideContext.js"); +var genericComponentOverrideContext = require("./genericComponentOverrideContext.js"); var uiEntry = require("./index2.js"); var translationContext = require("./translationContext.js"); require("react/jsx-runtime"); @@ -29,10 +29,12 @@ require("supertokens-web-js/recipe/oauth2provider"); require("./authRecipe-shared.js"); require("supertokens-web-js/lib/build/normalisedURLPath"); +exports.getTranslationFunction = genericComponentOverrideContext.getTranslationFunction; exports.SuperTokensWrapper = uiEntry.SuperTokensWrapper; exports.changeLanguage = uiEntry.changeLanguage; exports.default = uiEntry.SuperTokensAPIWrapper; exports.init = uiEntry.init; +exports.isRecipeInitialized = uiEntry.isRecipeInitialized; exports.loadTranslation = uiEntry.loadTranslation; exports.redirectToAuth = uiEntry.redirectToAuth; exports.useUserContext = uiEntry.useUserContext; diff --git a/lib/build/index2.js b/lib/build/index2.js index a80322cdc..2075807ae 100644 --- a/lib/build/index2.js +++ b/lib/build/index2.js @@ -350,31 +350,6 @@ function DisableAutoFillInput() { /* 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 SessionContext = React__default.default.createContext({ loading: true, isDefault: true, @@ -1250,7 +1225,7 @@ var AuthPageInner = function (props) { : undefined; var mergedTranslations = React.useMemo( function () { - var res = defaultTranslationsCommon; + var res = genericComponentOverrideContext.defaultTranslationsCommon; if (authComponentListInfo !== undefined) { for (var _i = 0, _a = props.preBuiltUIList; _i < _a.length; _i++) { var ui = _a[_i]; @@ -2268,6 +2243,7 @@ var UI = /** @class */ (function () { preBuiltUIList: recipeList, }); }; + UI.languageTranslations = genericComponentOverrideContext.defaultTranslationsCommon; UI.getReactRouterDomWithCustomHistory = function () { return UI.reactRouterDom; }; @@ -2288,6 +2264,7 @@ var UI = /** @class */ (function () { UI.AuthRecipeComponentsOverrideContextProvider = Provider; return UI; })(); +var languageTranslations = UI.languageTranslations; var getSuperTokensRoutesForReactRouterDom = UI.getSuperTokensRoutesForReactRouterDom; var canHandleRoute = UI.canHandleRoute; var getRoutingComponent = UI.getRoutingComponent; @@ -2776,6 +2753,13 @@ var SuperTokensAPIWrapper = /** @class */ (function () { SuperTokensAPIWrapper.loadTranslation = function (store) { return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow().loadTranslation(store); }; + SuperTokensAPIWrapper.isRecipeInitialized = function (recipeId) { + return genericComponentOverrideContext.SuperTokens.getInstanceOrThrow() + .recipeList.map(function (recipe) { + return recipe.recipeID; + }) + .includes(recipeId); + }; var _a; _a = SuperTokensAPIWrapper; SuperTokensAPIWrapper.SuperTokensWrapper = SuperTokensWrapper; @@ -2805,6 +2789,7 @@ var SuperTokensAPIWrapper = /** @class */ (function () { }); }; SuperTokensAPIWrapper.useTranslation = translationContext.useTranslation; + SuperTokensAPIWrapper.getTranslationFunction = genericComponentOverrideContext.getTranslationFunction; SuperTokensAPIWrapper.useUserContext = useUserContext; return SuperTokensAPIWrapper; })(); @@ -2812,6 +2797,7 @@ var init = SuperTokensAPIWrapper.init; var changeLanguage = SuperTokensAPIWrapper.changeLanguage; var loadTranslation = SuperTokensAPIWrapper.loadTranslation; var redirectToAuth = SuperTokensAPIWrapper.redirectToAuth; +var isRecipeInitialized = SuperTokensAPIWrapper.isRecipeInitialized; exports.AuthPage = AuthPage; exports.AuthPageComponentList = AuthPageComponentList; @@ -2836,10 +2822,11 @@ exports.UserContextContext = UserContextContext; exports.UserContextWrapper = UserContextWrapper; exports.canHandleRoute = canHandleRoute; exports.changeLanguage = changeLanguage; -exports.defaultTranslationsCommon = defaultTranslationsCommon; exports.getRoutingComponent = getRoutingComponent; exports.getSuperTokensRoutesForReactRouterDom = getSuperTokensRoutesForReactRouterDom; exports.init = init; +exports.isRecipeInitialized = isRecipeInitialized; +exports.languageTranslations = languageTranslations; exports.loadTranslation = loadTranslation; exports.redirectToAuth = redirectToAuth; exports.useDynamicLoginMethods = useDynamicLoginMethods; diff --git a/lib/build/multifactorauth-shared.js b/lib/build/multifactorauth-shared.js index a8b16358d..8edb35b3c 100644 --- a/lib/build/multifactorauth-shared.js +++ b/lib/build/multifactorauth-shared.js @@ -492,48 +492,55 @@ var Session = /** @class */ (function (_super) { ); 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 + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = 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 } ), - { rid: Session.RECIPE_ID } - ), - } - ), + } + ), + } + ); + if (normalisedConfig.preAPIHook === undefined) { + return [2 /*return*/, response]; + } else { + return [2 /*return*/, normalisedConfig.preAPIHook(context)]; } - ); - if (normalisedConfig.preAPIHook === undefined) { - return [2 /*return*/, response]; - } else { - return [2 /*return*/, normalisedConfig.preAPIHook(context)]; - } + }); }); - }); - }, - } - ) - ), + }, + } + ) + ); + return init.apply(void 0, args); + }, }; }; Session.getInstanceOrThrow = function () { diff --git a/lib/build/multifactorauth-shared2.js b/lib/build/multifactorauth-shared2.js index d5e65825c..fa78097b5 100644 --- a/lib/build/multifactorauth-shared2.js +++ b/lib/build/multifactorauth-shared2.js @@ -475,21 +475,28 @@ var MultiFactorAuth = /** @class */ (function (_super) { ); 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; + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = 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; + }, }, - }, - } - ) - ), + } + ) + ); + return init.apply(void 0, args); + }, }; }; MultiFactorAuth.getInstance = function () { diff --git a/lib/build/multifactorauth.js b/lib/build/multifactorauth.js index b0e4c3e3a..03736455f 100644 --- a/lib/build/multifactorauth.js +++ b/lib/build/multifactorauth.js @@ -73,6 +73,11 @@ var Wrapper = /** @class */ (function () { userContext: genericComponentOverrideContext.getNormalisedUserContext(input.userContext), }); }; + Wrapper.getSecondaryFactors = function (input) { + return recipe.MultiFactorAuth.getInstanceOrThrow().getSecondaryFactors( + genericComponentOverrideContext.getNormalisedUserContext(input.userContext) + ); + }; Wrapper.MultiFactorAuthClaim = recipe.MultiFactorAuth.MultiFactorAuthClaim; Wrapper.FactorIds = types.FactorIds; Wrapper.ComponentsOverrideProvider = componentOverrideContext.Provider; @@ -82,6 +87,7 @@ var init = Wrapper.init; var resyncSessionAndFetchMFAInfo = Wrapper.resyncSessionAndFetchMFAInfo; var redirectToFactor = Wrapper.redirectToFactor; var redirectToFactorChooser = Wrapper.redirectToFactorChooser; +var getSecondaryFactors = Wrapper.getSecondaryFactors; var MultiFactorAuthComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; var MultiFactorAuthClaim = recipe.MultiFactorAuth.MultiFactorAuthClaim; @@ -89,6 +95,7 @@ exports.FactorIds = types.FactorIds; exports.MultiFactorAuthClaim = MultiFactorAuthClaim; exports.MultiFactorAuthComponentsOverrideProvider = MultiFactorAuthComponentsOverrideProvider; exports.default = Wrapper; +exports.getSecondaryFactors = getSecondaryFactors; exports.init = init; exports.redirectToFactor = redirectToFactor; exports.redirectToFactorChooser = redirectToFactorChooser; diff --git a/lib/build/multifactorauthprebuiltui.js b/lib/build/multifactorauthprebuiltui.js index f7a16c3ab..ef1f8c7fc 100644 --- a/lib/build/multifactorauthprebuiltui.js +++ b/lib/build/multifactorauthprebuiltui.js @@ -273,7 +273,7 @@ function FactorChooserThemeWrapper(props) { var defaultTranslationsMultiFactorAuth = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { MULTI_FACTOR_CHOOSER_HEADER_TITLE: "Please select a factor", MULTI_FACTOR_AUTH_LOGOUT: "Log out", @@ -607,6 +607,7 @@ var MultiFactorAuthPreBuiltUI = /** @class */ (function (_super) { MultiFactorAuthPreBuiltUI.instance = undefined; return; }; + MultiFactorAuthPreBuiltUI.languageTranslations = defaultTranslationsMultiFactorAuth; MultiFactorAuthPreBuiltUI.FactorChooser = function (props) { return MultiFactorAuthPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("factorchooser", props); }; diff --git a/lib/build/oauth2provider-shared.js b/lib/build/oauth2provider-shared.js index 27f1e02ea..5c90b7d94 100644 --- a/lib/build/oauth2provider-shared.js +++ b/lib/build/oauth2provider-shared.js @@ -129,21 +129,28 @@ var OAuth2Provider = /** @class */ (function (_super) { ); 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; + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = 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; + }, }, - }, - } - ) - ), + } + ) + ); + return init.apply(void 0, args); + }, }; }; OAuth2Provider.getInstanceOrThrow = function () { diff --git a/lib/build/oauth2providerprebuiltui.js b/lib/build/oauth2providerprebuiltui.js index 93b384ce7..a93d9e295 100644 --- a/lib/build/oauth2providerprebuiltui.js +++ b/lib/build/oauth2providerprebuiltui.js @@ -184,7 +184,7 @@ var OAuth2LogoutScreenTheme = function (props) { var defaultTranslationsOAuth2Provider = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { LOGGING_OUT: "Logging Out", LOGOUT_CONFIRMATION: "Are you sure you want to log out?", LOGOUT: "LOG OUT" } ), }; @@ -608,6 +608,7 @@ var OAuth2ProviderPreBuiltUI = /** @class */ (function (_super) { OAuth2ProviderPreBuiltUI.instance = undefined; return; }; + OAuth2ProviderPreBuiltUI.languageTranslations = defaultTranslationsOAuth2Provider; OAuth2ProviderPreBuiltUI.TryRefreshPage = function (props) { return OAuth2ProviderPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent( "try-refresh-page", diff --git a/lib/build/passwordless-shared.js b/lib/build/passwordless-shared.js index e8ca6f001..85af15550 100644 --- a/lib/build/passwordless-shared.js +++ b/lib/build/passwordless-shared.js @@ -491,21 +491,28 @@ var Passwordless = /** @class */ (function (_super) { ); 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; + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = 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; + }, }, - }, - } - ) - ), + } + ) + ); + return init.apply(void 0, args); + }, }; }; Passwordless.getInstanceOrThrow = function () { diff --git a/lib/build/passwordlessprebuiltui.js b/lib/build/passwordlessprebuiltui.js index 321e16cb1..2132823bc 100644 --- a/lib/build/passwordlessprebuiltui.js +++ b/lib/build/passwordlessprebuiltui.js @@ -241,7 +241,7 @@ var LinkClickedScreen$1 = function (props) { var defaultTranslationsPasswordless = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { GENERAL_ERROR_EMAIL_UNDEFINED: "Please set your email", GENERAL_ERROR_EMAIL_NON_STRING: "Email must be of type string", @@ -7216,6 +7216,7 @@ var PasswordlessPreBuiltUI = /** @class */ (function (_super) { }; var _a; _a = PasswordlessPreBuiltUI; + PasswordlessPreBuiltUI.languageTranslations = defaultTranslationsPasswordless; PasswordlessPreBuiltUI.LinkClicked = function (props) { return _a.getFeatureComponent("linkClickedScreen", props); }; diff --git a/lib/build/recipe/emailpassword/prebuiltui.d.ts b/lib/build/recipe/emailpassword/prebuiltui.d.ts index dde794f58..01251cb8b 100644 --- a/lib/build/recipe/emailpassword/prebuiltui.d.ts +++ b/lib/build/recipe/emailpassword/prebuiltui.d.ts @@ -103,6 +103,101 @@ export declare class EmailPasswordPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + EMAIL_PASSWORD_EMAIL_LABEL: string; + EMAIL_PASSWORD_EMAIL_PLACEHOLDER: string; + EMAIL_PASSWORD_PASSWORD_LABEL: string; + EMAIL_PASSWORD_PASSWORD_PLACEHOLDER: string; + EMAIL_PASSWORD_SIGN_IN_FORGOT_PW_LINK: string; + EMAIL_PASSWORD_SIGN_IN_SUBMIT_BTN: string; + EMAIL_PASSWORD_SIGN_IN_WRONG_CREDENTIALS_ERROR: string; + EMAIL_PASSWORD_SIGN_UP_SUBMIT_BTN: string; + EMAIL_PASSWORD_EMAIL_ALREADY_EXISTS: string; + EMAIL_PASSWORD_RESET_HEADER_TITLE: string; + EMAIL_PASSWORD_RESET_HEADER_SUBTITLE: string; + EMAIL_PASSWORD_RESET_SEND_FALLBACK_EMAIL: string; + EMAIL_PASSWORD_RESET_SEND_BEFORE_EMAIL: string; + EMAIL_PASSWORD_RESET_SEND_AFTER_EMAIL: string; + EMAIL_PASSWORD_RESET_RESEND_LINK: string; + EMAIL_PASSWORD_RESET_SEND_BTN: string; + EMAIL_PASSWORD_RESET_SIGN_IN_LINK: string; + EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_HEADER_TITLE: string; + EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_DESC: string; + EMAIL_PASSWORD_RESET_SUBMIT_PW_SUCCESS_SIGN_IN_BTN: string; + EMAIL_PASSWORD_NEW_PASSWORD_LABEL: string; + EMAIL_PASSWORD_NEW_PASSWORD_PLACEHOLDER: string; + EMAIL_PASSWORD_CONFIRM_PASSWORD_LABEL: string; + EMAIL_PASSWORD_CONFIRM_PASSWORD_PLACEHOLDER: string; + EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_TITLE: string; + EMAIL_PASSWORD_RESET_SUBMIT_PW_HEADER_SUBTITLE: string; + EMAIL_PASSWORD_RESET_SUBMIT_PW_CHANGE_PW_BTN: string; + EMAIL_PASSWORD_RESET_PASSWORD_INVALID_TOKEN_ERROR: string; + ERROR_EMAIL_NON_STRING: string; + ERROR_EMAIL_INVALID: string; + ERROR_PASSWORD_NON_STRING: string; + ERROR_PASSWORD_TOO_SHORT: string; + ERROR_PASSWORD_TOO_LONG: string; + ERROR_PASSWORD_NO_ALPHA: string; + ERROR_PASSWORD_NO_NUM: string; + ERROR_CONFIRM_PASSWORD_NO_MATCH: string; + ERROR_NON_OPTIONAL: string; + "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; + EMAIL_VERIFICATION_RESEND_SUCCESS: string; + EMAIL_VERIFICATION_SEND_TITLE: string; + EMAIL_VERIFICATION_SEND_DESC_START: string; + EMAIL_VERIFICATION_SEND_DESC_STRONG: string; + EMAIL_VERIFICATION_SEND_DESC_END: string; + EMAIL_VERIFICATION_RESEND_BTN: string; + EMAIL_VERIFICATION_LOGOUT: string; + EMAIL_VERIFICATION_SUCCESS: string; + EMAIL_VERIFICATION_CONTINUE_BTN: string; + EMAIL_VERIFICATION_CONTINUE_LINK: string; + EMAIL_VERIFICATION_EXPIRED: string; + EMAIL_VERIFICATION_ERROR_TITLE: string; + EMAIL_VERIFICATION_ERROR_DESC: string; + EMAIL_VERIFICATION_LINK_CLICKED_HEADER: string; + EMAIL_VERIFICATION_LINK_CLICKED_DESC: string; + EMAIL_VERIFICATION_LINK_CLICKED_CONTINUE_BUTTON: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: EmailPassword); static getInstanceOrInitAndGetInstance(): EmailPasswordPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/recipe/emailverification/prebuiltui.d.ts b/lib/build/recipe/emailverification/prebuiltui.d.ts index 4ada857a7..3873fecb5 100644 --- a/lib/build/recipe/emailverification/prebuiltui.d.ts +++ b/lib/build/recipe/emailverification/prebuiltui.d.ts @@ -48,6 +48,46 @@ export declare class EmailVerificationPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + EMAIL_VERIFICATION_RESEND_SUCCESS: string; + EMAIL_VERIFICATION_SEND_TITLE: string; + EMAIL_VERIFICATION_SEND_DESC_START: string; + EMAIL_VERIFICATION_SEND_DESC_STRONG: string; + EMAIL_VERIFICATION_SEND_DESC_END: string; + EMAIL_VERIFICATION_RESEND_BTN: string; + EMAIL_VERIFICATION_LOGOUT: string; + EMAIL_VERIFICATION_SUCCESS: string; + EMAIL_VERIFICATION_CONTINUE_BTN: string; + EMAIL_VERIFICATION_CONTINUE_LINK: string; + EMAIL_VERIFICATION_EXPIRED: string; + EMAIL_VERIFICATION_ERROR_TITLE: string; + EMAIL_VERIFICATION_ERROR_DESC: string; + EMAIL_VERIFICATION_LINK_CLICKED_HEADER: string; + EMAIL_VERIFICATION_LINK_CLICKED_DESC: string; + EMAIL_VERIFICATION_LINK_CLICKED_CONTINUE_BUTTON: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: EmailVerificationRecipe); static getInstanceOrInitAndGetInstance(): EmailVerificationPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/recipe/multifactorauth/index.d.ts b/lib/build/recipe/multifactorauth/index.d.ts index 3ec394fa8..0e14d506e 100644 --- a/lib/build/recipe/multifactorauth/index.d.ts +++ b/lib/build/recipe/multifactorauth/index.d.ts @@ -50,6 +50,9 @@ export default class Wrapper { navigate?: Navigate; userContext?: UserContext; }): Promise; + static getSecondaryFactors(input: { + userContext?: UserContext; + }): import("./types").SecondaryFactorRedirectionInfo[]; static ComponentsOverrideProvider: import("react").FC< import("react").PropsWithChildren<{ components: import("./types").ComponentOverrideMap; @@ -60,6 +63,7 @@ declare const init: typeof Wrapper.init; declare const resyncSessionAndFetchMFAInfo: typeof Wrapper.resyncSessionAndFetchMFAInfo; declare const redirectToFactor: typeof Wrapper.redirectToFactor; declare const redirectToFactorChooser: typeof Wrapper.redirectToFactorChooser; +declare const getSecondaryFactors: typeof Wrapper.getSecondaryFactors; declare const MultiFactorAuthComponentsOverrideProvider: import("react").FC< import("react").PropsWithChildren<{ components: import("./types").ComponentOverrideMap; @@ -71,6 +75,7 @@ export { resyncSessionAndFetchMFAInfo, redirectToFactor, redirectToFactorChooser, + getSecondaryFactors, MultiFactorAuthComponentsOverrideProvider, GetRedirectionURLContext, PreAPIHookContext as PreAPIHookContext, diff --git a/lib/build/recipe/multifactorauth/prebuiltui.d.ts b/lib/build/recipe/multifactorauth/prebuiltui.d.ts index 796cdfa3d..c7e8ab2cb 100644 --- a/lib/build/recipe/multifactorauth/prebuiltui.d.ts +++ b/lib/build/recipe/multifactorauth/prebuiltui.d.ts @@ -42,6 +42,40 @@ export declare class MultiFactorAuthPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + MULTI_FACTOR_CHOOSER_HEADER_TITLE: string; + MULTI_FACTOR_AUTH_LOGOUT: string; + PWLESS_MFA_OTP_PHONE_NAME: string; + PWLESS_MFA_OTP_PHONE_DESCRIPTION: string; + PWLESS_MFA_OTP_EMAIL_NAME: string; + PWLESS_MFA_OTP_EMAIL_DESCRIPTION: string; + TOTP_MFA_NAME: string; + TOTP_MFA_DESCRIPTION: string; + MFA_NO_AVAILABLE_OPTIONS: string; + MFA_NO_AVAILABLE_OPTIONS_LOGIN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: MultiFactorAuthRecipe); static getInstanceOrInitAndGetInstance(): MultiFactorAuthPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts b/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts index b39f4200a..ae184816e 100644 --- a/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts +++ b/lib/build/recipe/oauth2provider/componentOverrideContext.d.ts @@ -425,6 +425,87 @@ declare const useContext: () => import("react").ComponentType > | undefined; + } & ComponentOverrideMap) + | ({ + WebauthnContinueWithPasskey_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType + > + | undefined; + WebauthnPasskeyNotSupportedError_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType + > + | undefined; + WebauthnPasskeyRecoveryEmailSent_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType + > + | undefined; + WebauthnRecoverAccountForm_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/types").RecoverFormProps & { + setError: import("react").Dispatch>; + } + > + > + | undefined; + WebauthnRecoverAccount_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType + > + | undefined; + WebauthnPasskeyConfirmation_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/types").SignUpFormProps & { + email?: string | undefined; + onContinueClick: () => void; + errorMessageLabel?: string | undefined; + isLoading: boolean; + hideContinueWithoutPasskey?: boolean | undefined; + isContinueDisabled?: boolean | undefined; + isPasskeySupported: boolean; + } + > + > + | undefined; + WebauthnPasskeyFeatureBlock_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType + > + | undefined; + WebauthnContinueWithoutPasskey_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType<{ + onClick: () => void; + }> + > + | undefined; + WebauthnPasskeySignUpForm_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType< + import("../webauthn/types").SignUpFormProps & { + footer?: JSX.Element | undefined; + onContinueClick: (params: import("../webauthn/types").ContinueOnSuccessParams) => void; + setActiveScreen: import("react").Dispatch< + import("react").SetStateAction< + import("../webauthn/components/themes/signUp/signUpForm").SignUpScreen + > + >; + onRecoverAccountClick: () => void; + } + > + > + | undefined; + WebauthnPasskeySignUpSomethingWentWrong_Override?: + | import("../../components/componentOverride/componentOverride").ComponentOverride< + import("react").ComponentType<{ + onClick: () => void; + }> + > + | undefined; } & ComponentOverrideMap), Provider: import("react").FC< import("react").PropsWithChildren<{ diff --git a/lib/build/recipe/oauth2provider/prebuiltui.d.ts b/lib/build/recipe/oauth2provider/prebuiltui.d.ts index 8b17b7fb5..caf39ca23 100644 --- a/lib/build/recipe/oauth2provider/prebuiltui.d.ts +++ b/lib/build/recipe/oauth2provider/prebuiltui.d.ts @@ -34,6 +34,33 @@ export declare class OAuth2ProviderPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + LOGGING_OUT: string; + LOGOUT_CONFIRMATION: string; + LOGOUT: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: OAuth2ProviderRecipe); static getInstanceOrInitAndGetInstance(): OAuth2ProviderPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/recipe/passwordless/prebuiltui.d.ts b/lib/build/recipe/passwordless/prebuiltui.d.ts index 10c96a0a5..c1d0f85a6 100644 --- a/lib/build/recipe/passwordless/prebuiltui.d.ts +++ b/lib/build/recipe/passwordless/prebuiltui.d.ts @@ -88,6 +88,85 @@ export declare class PasswordlessPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + GENERAL_ERROR_EMAIL_UNDEFINED: string; + GENERAL_ERROR_EMAIL_NON_STRING: string; + GENERAL_ERROR_EMAIL_INVALID: string; + GENERAL_ERROR_PHONE_UNDEFINED: string; + GENERAL_ERROR_PHONE_NON_STRING: string; + GENERAL_ERROR_PHONE_INVALID: string; + GENERAL_ERROR_OTP_UNDEFINED: string; + GENERAL_ERROR_OTP_INVALID: string; + GENERAL_ERROR_OTP_EXPIRED: string; + GENERAL_ERROR_OTP_NON_STRING: string; + GENERAL_ERROR_OTP_EMPTY: string; + ERROR_SIGN_IN_UP_LINK: string; + ERROR_SIGN_IN_UP_RESEND_RESTART_FLOW: string; + ERROR_SIGN_IN_UP_CODE_CONSUME_RESTART_FLOW: string; + PWLESS_SIGN_IN_UP_EMAIL_LABEL: string; + PWLESS_SIGN_IN_UP_PHONE_LABEL: string; + PWLESS_SIGN_IN_UP_SWITCH_TO_PHONE: string; + PWLESS_SIGN_IN_UP_SWITCH_TO_EMAIL: string; + PWLESS_SIGN_IN_UP_CONTINUE_BUTTON: string; + PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_LINK: string; + PWLESS_COMBO_CONTINUE_WITH_PASSWORDLESS_BUTTON: string; + PWLESS_COMBO_PASSWORD_LABEL: string; + PWLESS_COMBO_FORGOT_PW_LINK: string; + PWLESS_LINK_SENT_RESEND_SUCCESS: string; + PWLESS_LINK_SENT_RESEND_TITLE: string; + PWLESS_LINK_SENT_RESEND_DESC_START_EMAIL: string; + PWLESS_LINK_SENT_RESEND_DESC_START_PHONE: string; + PWLESS_LINK_SENT_RESEND_DESC_END_EMAIL: string; + PWLESS_LINK_SENT_RESEND_DESC_END_PHONE: string; + PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_EMAIL: string; + PWLESS_SIGN_IN_UP_CHANGE_CONTACT_INFO_PHONE: string; + PWLESS_LINK_CLICKED_CONTINUE_HEADER: string; + PWLESS_LINK_CLICKED_CONTINUE_DESC: string; + PWLESS_LINK_CLICKED_CONTINUE_BUTTON: string; + PWLESS_RESEND_SUCCESS_EMAIL: string; + PWLESS_RESEND_SUCCESS_PHONE: string; + PWLESS_RESEND_BTN_DISABLED_START: string; + PWLESS_RESEND_BTN_DISABLED_END: string; + PWLESS_RESEND_BTN_EMAIL: string; + PWLESS_RESEND_BTN_PHONE: string; + PWLESS_USER_INPUT_CODE_HEADER_TITLE: string; + PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE: string; + PWLESS_USER_INPUT_CODE_HEADER_SUBTITLE_LINK: string; + PWLESS_USER_INPUT_CODE_INPUT_LABEL: string; + PWLESS_MFA_HEADER_TITLE_PHONE: string; + PWLESS_MFA_HEADER_TITLE_EMAIL: string; + PWLESS_MFA_FOOTER_LOGOUT: string; + "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; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: Passwordless); static getInstanceOrInitAndGetInstance(): PasswordlessPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/recipe/session/prebuiltui.d.ts b/lib/build/recipe/session/prebuiltui.d.ts index 85559c54b..72ae384e7 100644 --- a/lib/build/recipe/session/prebuiltui.d.ts +++ b/lib/build/recipe/session/prebuiltui.d.ts @@ -35,6 +35,33 @@ export declare class SessionPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + ACCESS_DENIED: string; + GO_BACK: string; + LOGOUT: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: Session); static getInstanceOrInitAndGetInstance(): SessionPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/recipe/thirdparty/index.d.ts b/lib/build/recipe/thirdparty/index.d.ts index 6b2d6695f..08916c966 100644 --- a/lib/build/recipe/thirdparty/index.d.ts +++ b/lib/build/recipe/thirdparty/index.d.ts @@ -66,6 +66,10 @@ export default class Wrapper { fetchResponse: Response; } >; + static getProviders(): { + id: string; + name: string; + }[]; static Apple: typeof Apple; static Bitbucket: typeof Bitbucket; static Discord: typeof Discord; @@ -91,6 +95,7 @@ declare const redirectToThirdPartyLogin: typeof Wrapper.redirectToThirdPartyLogi declare const getStateAndOtherInfoFromStorage: typeof Wrapper.getStateAndOtherInfoFromStorage; declare const getAuthorisationURLWithQueryParamsAndSetState: typeof Wrapper.getAuthorisationURLWithQueryParamsAndSetState; declare const signInAndUp: typeof Wrapper.signInAndUp; +declare const getProviders: typeof Wrapper.getProviders; declare const ThirdpartyComponentsOverrideProvider: import("react").FC< import("react").PropsWithChildren<{ components: import("./types").ComponentOverrideMap; @@ -114,6 +119,7 @@ export { getStateAndOtherInfoFromStorage, getAuthorisationURLWithQueryParamsAndSetState, signInAndUp, + getProviders, redirectToThirdPartyLogin, ThirdpartyComponentsOverrideProvider, signOut, diff --git a/lib/build/recipe/thirdparty/prebuiltui.d.ts b/lib/build/recipe/thirdparty/prebuiltui.d.ts index 4c3899d89..2f8f6a51e 100644 --- a/lib/build/recipe/thirdparty/prebuiltui.d.ts +++ b/lib/build/recipe/thirdparty/prebuiltui.d.ts @@ -42,6 +42,40 @@ export declare class ThirdPartyPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + THIRD_PARTY_PROVIDER_DEFAULT_BTN_START: string; + THIRD_PARTY_PROVIDER_DEFAULT_BTN_END: string; + THIRD_PARTY_ERROR_NO_EMAIL: string; + "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_004)": undefined; + "Cannot sign in / up because new email cannot be applied to existing account. Please contact support. (ERR_CODE_005)": undefined; + "Cannot sign in / up due to security reasons. Please try a different login method or contact support. (ERR_CODE_006)": undefined; + "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_020)": undefined; + "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_021)": undefined; + "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_022)": undefined; + "Cannot sign in / up due to security reasons. Please contact support. (ERR_CODE_023)": undefined; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: ThirdParty); static getInstanceOrInitAndGetInstance(): ThirdPartyPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/recipe/totp/prebuiltui.d.ts b/lib/build/recipe/totp/prebuiltui.d.ts index 690aa7282..a0e37d80c 100644 --- a/lib/build/recipe/totp/prebuiltui.d.ts +++ b/lib/build/recipe/totp/prebuiltui.d.ts @@ -54,6 +54,52 @@ export declare class TOTPPreBuiltUI extends RecipeRouter { SOMETHING_WENT_WRONG_ERROR_RELOAD: string; }; }; + static languageTranslations: { + en: { + TOTP_SHOW_SECRET_START: string; + TOTP_SHOW_SECRET_LINK: string; + TOTP_SHOW_SECRET_END: string; + TOTP_CODE_VERIFICATION_HEADER_TITLE: string; + TOTP_CODE_VERIFICATION_HEADER_SUBTITLE: string; + TOTP_DEVICE_SETUP_HEADER_TITLE: string; + TOTP_DEVICE_SETUP_HEADER_SUBTITLE: string; + TOTP_CODE_INPUT_LABEL: string; + TOTP_CODE_CONTINUE_BUTTON: string; + TOTP_BLOCKED_TITLE: string; + TOTP_BLOCKED_SUBTITLE: string; + TOTP_MFA_BLOCKED_TIMER_START: string; + TOTP_MFA_BLOCKED_TIMER_END: string; + TOTP_MFA_BLOCKED_RETRY: string; + TOTP_MFA_LOGOUT: string; + ERROR_TOTP_INVALID_CODE: string; + ERROR_TOTP_INVALID_CODE_RETRY_START: string; + ERROR_TOTP_INVALID_CODE_RETRY_END: string; + ERROR_TOTP_UNKNOWN_DEVICE: string; + GENERAL_ERROR_TOTP_NON_STRING: string; + GENERAL_ERROR_TOTP_EMPTY: string; + GENERAL_ERROR_TOTP_UNDEFINED: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; constructor(recipeInstance: TOTPRecipe); static getInstanceOrInitAndGetInstance(): TOTPPreBuiltUI; static getFeatures(useComponentOverrides?: () => GenericComponentOverrideMap): RecipeFeatureComponentMap; diff --git a/lib/build/sessionprebuiltui.js b/lib/build/sessionprebuiltui.js index 2d0bf0987..ff3859ba9 100644 --- a/lib/build/sessionprebuiltui.js +++ b/lib/build/sessionprebuiltui.js @@ -213,7 +213,7 @@ var AccessDeniedScreenTheme = function (props) { var defaultTranslationsSession = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { ACCESS_DENIED: "Access denied", GO_BACK: "Go back", LOGOUT: "Log out" } ), }; @@ -331,6 +331,7 @@ var SessionPreBuiltUI = /** @class */ (function (_super) { }; var _a; _a = SessionPreBuiltUI; + SessionPreBuiltUI.languageTranslations = defaultTranslationsSession; SessionPreBuiltUI.AccessDeniedScreen = function (prop) { if (prop === void 0) { prop = {}; diff --git a/lib/build/superTokens.d.ts b/lib/build/superTokens.d.ts index d171d800f..7b36760cc 100644 --- a/lib/build/superTokens.d.ts +++ b/lib/build/superTokens.d.ts @@ -13,11 +13,13 @@ import type { AllRecipeComponentOverrides, SuperTokensPlugin, PluginRouteHandler, + SuperTokensPublicPlugin, } from "./types"; export default class SuperTokens { private static instance?; static usesDynamicLoginMethods: boolean; appInfo: NormalisedAppInfo; + pluginList: SuperTokensPublicPlugin[]; languageTranslations: { defaultLanguage: string; userTranslationStore: TranslationStore; diff --git a/lib/build/thirdparty-shared.js b/lib/build/thirdparty-shared.js index d94ac874f..0ed85b898 100644 --- a/lib/build/thirdparty-shared.js +++ b/lib/build/thirdparty-shared.js @@ -2018,24 +2018,31 @@ var ThirdParty = /** @class */ (function (_super) { ); return ThirdParty.instance; }, - webJS: ThirdpartyWebJS__default.default.init( - genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, normalisedConfig), - { - override: { - functions: function (originalImpl, builder) { - var functions = getFunctionOverrides( - ThirdParty.RECIPE_ID, - normalisedConfig.onHandleEvent - ); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = ThirdpartyWebJS__default.default.init( + genericComponentOverrideContext.__assign( + genericComponentOverrideContext.__assign({}, normalisedConfig), + { + override: { + functions: function (originalImpl, builder) { + var functions = getFunctionOverrides( + ThirdParty.RECIPE_ID, + normalisedConfig.onHandleEvent + ); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - } - ) - ), + } + ) + ); + return init.apply(void 0, args); + }, }; }; ThirdParty.getInstanceOrThrow = function () { diff --git a/lib/build/thirdparty.js b/lib/build/thirdparty.js index 58f7debbf..a6289951e 100644 --- a/lib/build/thirdparty.js +++ b/lib/build/thirdparty.js @@ -119,6 +119,16 @@ var Wrapper = /** @class */ (function () { }); }); }; + Wrapper.getProviders = function () { + return componentOverrideContext.ThirdParty.getInstanceOrThrow().config.signInAndUpFeature.providers.map( + function (provider) { + return { + id: provider.id, + name: provider.name, + }; + } + ); + }; /* * Providers */ @@ -144,6 +154,7 @@ var redirectToThirdPartyLogin = Wrapper.redirectToThirdPartyLogin; var getStateAndOtherInfoFromStorage = Wrapper.getStateAndOtherInfoFromStorage; var getAuthorisationURLWithQueryParamsAndSetState = Wrapper.getAuthorisationURLWithQueryParamsAndSetState; var signInAndUp = Wrapper.signInAndUp; +var getProviders = Wrapper.getProviders; var ThirdpartyComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; exports.ActiveDirectory = componentOverrideContext.ActiveDirectory; @@ -162,6 +173,7 @@ exports.Twitter = componentOverrideContext.Twitter; exports.ThirdpartyComponentsOverrideProvider = ThirdpartyComponentsOverrideProvider; exports.default = Wrapper; exports.getAuthorisationURLWithQueryParamsAndSetState = getAuthorisationURLWithQueryParamsAndSetState; +exports.getProviders = getProviders; exports.getStateAndOtherInfoFromStorage = getStateAndOtherInfoFromStorage; exports.init = init; exports.redirectToThirdPartyLogin = redirectToThirdPartyLogin; diff --git a/lib/build/thirdpartyprebuiltui.js b/lib/build/thirdpartyprebuiltui.js index 5111b1acb..981c6eba8 100644 --- a/lib/build/thirdpartyprebuiltui.js +++ b/lib/build/thirdpartyprebuiltui.js @@ -356,7 +356,7 @@ var SignInAndUpCallbackTheme = function (props) { var defaultTranslationsThirdParty = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { THIRD_PARTY_PROVIDER_DEFAULT_BTN_START: "Continue with ", THIRD_PARTY_PROVIDER_DEFAULT_BTN_END: "", @@ -790,6 +790,7 @@ var ThirdPartyPreBuiltUI = /** @class */ (function (_super) { ThirdPartyPreBuiltUI.instance = undefined; return; }; + ThirdPartyPreBuiltUI.languageTranslations = defaultTranslationsThirdParty; ThirdPartyPreBuiltUI.SignInAndUpCallback = function (prop) { return ThirdPartyPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("signinupcallback", prop); }; diff --git a/lib/build/totp-shared.js b/lib/build/totp-shared.js index 29b83dcc2..3b854f1fe 100644 --- a/lib/build/totp-shared.js +++ b/lib/build/totp-shared.js @@ -243,21 +243,28 @@ var TOTP = /** @class */ (function (_super) { ); return TOTP.instance; }, - webJS: TOTPWebJS__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; + webJS: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var init = TOTPWebJS__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; + }, }, - }, - } - ) - ), + } + ) + ); + return init.apply(void 0, args); + }, }; }; TOTP.getInstance = function () { diff --git a/lib/build/totpprebuiltui.js b/lib/build/totpprebuiltui.js index ea7b9e292..4747fca21 100644 --- a/lib/build/totpprebuiltui.js +++ b/lib/build/totpprebuiltui.js @@ -3635,7 +3635,7 @@ function getErrorString(error, state, t) { var defaultTranslationsTOTP = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { TOTP_SHOW_SECRET_START: "Unable to scan? Use a", TOTP_SHOW_SECRET_LINK: "secret key", @@ -4275,6 +4275,7 @@ var TOTPPreBuiltUI = /** @class */ (function (_super) { TOTPPreBuiltUI.instance = undefined; return; }; + TOTPPreBuiltUI.languageTranslations = defaultTranslationsTOTP; TOTPPreBuiltUI.MFATOTP = function (props) { return TOTPPreBuiltUI.getInstanceOrInitAndGetInstance().getFeatureComponent("mfaTOTP", props); }; diff --git a/lib/build/translation/translationHelpers.d.ts b/lib/build/translation/translationHelpers.d.ts index d115ae204..20463e123 100644 --- a/lib/build/translation/translationHelpers.d.ts +++ b/lib/build/translation/translationHelpers.d.ts @@ -23,3 +23,6 @@ export declare class TranslationController implements TranslationControlEventSou } export declare function saveCurrentLanguage(language: string, cookieDomain: string | undefined): Promise; export declare function getCurrentLanguageFromCookie(): Promise; +export declare const getTranslationFunction: ( + ...stores: TranslationStore[] +) => (key: T, replacements?: Record) => string; diff --git a/lib/build/types.d.ts b/lib/build/types.d.ts index 7fbbdb1ae..6707d51a4 100644 --- a/lib/build/types.d.ts +++ b/lib/build/types.d.ts @@ -307,8 +307,10 @@ export declare type SuperTokensPlugin = { version?: string; compatibleAuthReactSDKVersions?: string | string[]; compatibleWebJSSDKVersions?: string | string[]; + init?: (config: SuperTokensPublicConfig, allPlugins: SuperTokensPublicPlugin[], sdkVersion: string) => void; dependencies?: ( - pluginsAbove: Pick[], + config: SuperTokensPublicConfig, + pluginsAbove: SuperTokensPublicPlugin[], sdkVersion: string ) => | { @@ -325,9 +327,39 @@ export declare type SuperTokensPlugin = { }; }; generalAuthRecipeComponentOverrides?: AuthRecipeComponentOverrideMap; - routeHandlers?: PluginRouteHandler[]; - config?: ( - config: Omit - ) => Omit | undefined; + routeHandlers?: + | (( + config: SuperTokensPublicConfig, + allPlugins: SuperTokensPublicPlugin[], + sdkVersion: string + ) => + | { + status: "OK"; + routeHandlers: PluginRouteHandler[]; + } + | { + status: "ERROR"; + message: string; + }) + | PluginRouteHandler[]; + config?: (config: SuperTokensPublicConfig) => Omit | undefined; + exports?: Record; +}; +export declare const nonPublicConfigProperties: readonly ["experimental"]; +export declare type NonPublicConfigPropertiesType = (typeof nonPublicConfigProperties)[number]; +export declare type SuperTokensConfigWithNormalisedAppInfo = Omit & { + appInfo: NormalisedAppInfo; +}; +export declare type SuperTokensPublicPlugin = Pick< + SuperTokensPlugin, + "id" | "version" | "exports" | "compatibleAuthReactSDKVersions" | "compatibleWebJSSDKVersions" +> & { + initialized: boolean; +}; +export declare type SuperTokensPublicConfig = Omit< + Omit, + "appInfo" +> & { + appInfo: NormalisedAppInfo; }; export {}; diff --git a/lib/build/ui-entry.js b/lib/build/ui-entry.js index 1c6b8e41e..0627f628a 100644 --- a/lib/build/ui-entry.js +++ b/lib/build/ui-entry.js @@ -39,3 +39,4 @@ exports.canHandleRoute = uiEntry.canHandleRoute; exports.default = uiEntry.UI; exports.getRoutingComponent = uiEntry.getRoutingComponent; exports.getSuperTokensRoutesForReactRouterDom = uiEntry.getSuperTokensRoutesForReactRouterDom; +exports.languageTranslations = uiEntry.languageTranslations; diff --git a/lib/build/ui/index.d.ts b/lib/build/ui/index.d.ts index a0fdce802..1343c1eef 100644 --- a/lib/build/ui/index.d.ts +++ b/lib/build/ui/index.d.ts @@ -11,6 +11,30 @@ import type { PropsWithChildren } from "react"; declare class UI { private static reactRouterDom; private static reactRouterDomIsV6?; + static languageTranslations: { + en: { + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; + }; static getSuperTokensRoutesForReactRouterDom( reactRouterDom: any, preBuiltUiClassList?: PreBuiltRecipes, @@ -58,6 +82,30 @@ declare class UI { }> >; } +declare const languageTranslations: { + en: { + AUTH_PAGE_HEADER_TITLE_SIGN_IN_AND_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN: string; + AUTH_PAGE_HEADER_TITLE_SIGN_UP: string; + AUTH_PAGE_HEADER_TITLE_SIGN_IN_UP_TO_APP: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_SIGN_UP_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_IN_END: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_START: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_SIGN_IN_LINK: string; + AUTH_PAGE_HEADER_SUBTITLE_SIGN_UP_END: string; + AUTH_PAGE_FOOTER_START: string; + AUTH_PAGE_FOOTER_TOS: string; + AUTH_PAGE_FOOTER_AND: string; + AUTH_PAGE_FOOTER_PP: string; + AUTH_PAGE_FOOTER_END: string; + DIVIDER_OR: string; + BRANDING_POWERED_BY_START: string; + BRANDING_POWERED_BY_END: string; + SOMETHING_WENT_WRONG_ERROR: string; + SOMETHING_WENT_WRONG_ERROR_RELOAD: string; + }; +}; declare const getSuperTokensRoutesForReactRouterDom: typeof UI.getSuperTokensRoutesForReactRouterDom; declare const canHandleRoute: typeof UI.canHandleRoute; declare const getRoutingComponent: typeof UI.getRoutingComponent; @@ -70,6 +118,7 @@ declare const AuthPage: ( ) => import("react/jsx-runtime").JSX.Element; export default UI; export { + languageTranslations, getSuperTokensRoutesForReactRouterDom, canHandleRoute, getRoutingComponent, diff --git a/lib/build/utils.d.ts b/lib/build/utils.d.ts index 89ef28619..912985c94 100644 --- a/lib/build/utils.d.ts +++ b/lib/build/utils.d.ts @@ -11,7 +11,11 @@ import type { NormalisedAppInfo, NormalisedFormField, NormalisedGetRedirectionURLContext, + SuperTokensPlugin, + SuperTokensPublicConfig, + SuperTokensPublicPlugin, UserContext, + SuperTokensConfigWithNormalisedAppInfo, } from "./types"; export declare function getRecipeIdFromSearch(search: string): string | null; export declare function clearQueryParams(paramNames: string[]): void; @@ -92,3 +96,5 @@ export declare const handleCallAPI: ({ generalError?: STGeneralError | undefined; fetchError?: Response | undefined; }>; +export declare function getPublicPlugin(plugin: SuperTokensPlugin): SuperTokensPublicPlugin; +export declare function getPublicConfig(config: SuperTokensConfigWithNormalisedAppInfo): SuperTokensPublicConfig; diff --git a/lib/build/webauthnprebuiltui.js b/lib/build/webauthnprebuiltui.js index 7a6ca3d31..a989570c5 100644 --- a/lib/build/webauthnprebuiltui.js +++ b/lib/build/webauthnprebuiltui.js @@ -605,7 +605,7 @@ function PasskeyRecoverAccountWithTokenTheme(props) { var defaultTranslationsWebauthn = { en: genericComponentOverrideContext.__assign( - genericComponentOverrideContext.__assign({}, uiEntry.defaultTranslationsCommon.en), + genericComponentOverrideContext.__assign({}, genericComponentOverrideContext.defaultTranslationsCommon.en), { WEBAUTHN_EMAIL_CONTINUE_BUTTON: "CONTINUE", WEBAUTHN_SIGN_UP_LABEL: "Email", diff --git a/lib/ts/index.ts b/lib/ts/index.ts index a62f611fe..baa511dc9 100644 --- a/lib/ts/index.ts +++ b/lib/ts/index.ts @@ -21,6 +21,7 @@ import SuperTokens from "./superTokens"; import { useTranslation } from "./translation/translationContext"; import { useUserContext } from "./usercontext"; import { getNormalisedUserContext } from "./utils"; +import { getTranslationFunction } from "./translation/translationHelpers"; import type { TranslationStore } from "./translation/translationHelpers"; import type { Navigate, SuperTokensConfig, UserContext } from "./types"; @@ -58,8 +59,16 @@ export default class SuperTokensAPIWrapper { }); }; + static isRecipeInitialized(recipeId: string) { + return SuperTokens.getInstanceOrThrow() + .recipeList.map((recipe) => recipe.recipeID) + .includes(recipeId); + } + static useTranslation = useTranslation; + static getTranslationFunction = getTranslationFunction; + static useUserContext = useUserContext; } @@ -67,7 +76,14 @@ export const init = SuperTokensAPIWrapper.init; export const changeLanguage = SuperTokensAPIWrapper.changeLanguage; export const loadTranslation = SuperTokensAPIWrapper.loadTranslation; export const redirectToAuth = SuperTokensAPIWrapper.redirectToAuth; +export const isRecipeInitialized = SuperTokensAPIWrapper.isRecipeInitialized; + +// these need to be exported so other developers are able to build on top of them +// when devs only used the sdk to build their own apps, there was no (real) need for these to be exported. +export type { SuperTokensConfig, SuperTokensPublicConfig, SuperTokensPublicPlugin, SuperTokensPlugin } from "./types"; +export type { TranslationStore } from "./translation/translationHelpers"; export { SuperTokensWrapper } from "./components/supertokensWrapper"; export { useTranslation } from "./translation/translationContext"; +export { getTranslationFunction } from "./translation/translationHelpers"; export { useUserContext } from "./usercontext"; diff --git a/lib/ts/recipe/emailpassword/components/library/formBase.tsx b/lib/ts/recipe/emailpassword/components/library/formBase.tsx index 9d11b6f6e..ced3f6704 100644 --- a/lib/ts/recipe/emailpassword/components/library/formBase.tsx +++ b/lib/ts/recipe/emailpassword/components/library/formBase.tsx @@ -288,6 +288,7 @@ export const FormBase: React.FC> = (props) => { } } } catch (e) { + console.error(e); props.onError("SOMETHING_WENT_WRONG_ERROR"); } finally { setIsLoading(false); diff --git a/lib/ts/recipe/emailpassword/prebuiltui.tsx b/lib/ts/recipe/emailpassword/prebuiltui.tsx index 7f06cb707..57823ca82 100644 --- a/lib/ts/recipe/emailpassword/prebuiltui.tsx +++ b/lib/ts/recipe/emailpassword/prebuiltui.tsx @@ -21,6 +21,7 @@ import type { AuthComponent } from "../../types"; export class EmailPasswordPreBuiltUI extends RecipeRouter { static instance?: EmailPasswordPreBuiltUI; languageTranslations = defaultTranslationsEmailPassword; + static languageTranslations = defaultTranslationsEmailPassword; constructor(public readonly recipeInstance: EmailPassword) { super(); diff --git a/lib/ts/recipe/emailpassword/recipe.tsx b/lib/ts/recipe/emailpassword/recipe.tsx index 367b0186b..58e6b2c25 100644 --- a/lib/ts/recipe/emailpassword/recipe.tsx +++ b/lib/ts/recipe/emailpassword/recipe.tsx @@ -36,7 +36,6 @@ import type { UserInput, } from "./types"; import type { RecipeInitResult, NormalisedConfigWithAppInfoAndRecipeID, WebJSRecipeInterface } from "../../types"; -import type { NormalisedAppInfo } from "../../types"; import type RecipeModule from "../recipeModule"; /* @@ -80,7 +79,7 @@ export default class EmailPassword extends AuthRecipe< return { recipeID: EmailPassword.RECIPE_ID, authReact: ( - appInfo: NormalisedAppInfo + appInfo ): RecipeModule< GetRedirectionURLContext, PreAndPostAPIHookAction, @@ -94,17 +93,20 @@ export default class EmailPassword extends AuthRecipe< }); return EmailPassword.instance; }, - webJS: EmailPasswordWebJS.init({ - ...normalisedConfig, - override: { - functions: (originalImpl, builder) => { - const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: (...args) => { + const init = EmailPasswordWebJS.init({ + ...normalisedConfig, // plugins are applied by webjs + override: { + functions: (originalImpl, builder) => { + const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - }), + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/emailverification/prebuiltui.tsx b/lib/ts/recipe/emailverification/prebuiltui.tsx index 95ae83f60..6c095d714 100644 --- a/lib/ts/recipe/emailverification/prebuiltui.tsx +++ b/lib/ts/recipe/emailverification/prebuiltui.tsx @@ -20,6 +20,7 @@ import type { AuthComponent } from "../../types"; export class EmailVerificationPreBuiltUI extends RecipeRouter { static instance?: EmailVerificationPreBuiltUI; languageTranslations = defaultTranslationsEmailVerification; + static languageTranslations = defaultTranslationsEmailVerification; constructor(public readonly recipeInstance: EmailVerificationRecipe) { super(); diff --git a/lib/ts/recipe/emailverification/recipe.tsx b/lib/ts/recipe/emailverification/recipe.tsx index fbc87984f..7152b1c4b 100644 --- a/lib/ts/recipe/emailverification/recipe.tsx +++ b/lib/ts/recipe/emailverification/recipe.tsx @@ -94,17 +94,20 @@ export default class EmailVerification extends RecipeModule< }); return EmailVerification.instance; }, - webJS: EmailVerificationWebJS.init({ - ...normalisedConfig, - override: { - functions: (originalImpl, builder) => { - const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: (...args) => { + const init = EmailVerificationWebJS.init({ + ...normalisedConfig, // plugins are applied by webjs + override: { + functions: (originalImpl, builder) => { + const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - }), + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/multifactorauth/index.ts b/lib/ts/recipe/multifactorauth/index.ts index 6db618485..0c50a9b35 100644 --- a/lib/ts/recipe/multifactorauth/index.ts +++ b/lib/ts/recipe/multifactorauth/index.ts @@ -87,6 +87,12 @@ export default class Wrapper { }); } + static getSecondaryFactors(input: { userContext?: UserContext }) { + return MultiFactorAuthRecipe.getInstanceOrThrow().getSecondaryFactors( + getNormalisedUserContext(input.userContext) + ); + } + static ComponentsOverrideProvider = RecipeComponentsOverrideContextProvider; } @@ -94,6 +100,7 @@ const init = Wrapper.init; const resyncSessionAndFetchMFAInfo = Wrapper.resyncSessionAndFetchMFAInfo; const redirectToFactor = Wrapper.redirectToFactor; const redirectToFactorChooser = Wrapper.redirectToFactorChooser; +const getSecondaryFactors = Wrapper.getSecondaryFactors; const MultiFactorAuthComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; const MultiFactorAuthClaim = MultiFactorAuthRecipe.MultiFactorAuthClaim; @@ -102,6 +109,7 @@ export { resyncSessionAndFetchMFAInfo, redirectToFactor, redirectToFactorChooser, + getSecondaryFactors, MultiFactorAuthComponentsOverrideProvider, GetRedirectionURLContext, PreAPIHookContext as PreAPIHookContext, diff --git a/lib/ts/recipe/multifactorauth/prebuiltui.tsx b/lib/ts/recipe/multifactorauth/prebuiltui.tsx index a9ec9baf5..b84788991 100644 --- a/lib/ts/recipe/multifactorauth/prebuiltui.tsx +++ b/lib/ts/recipe/multifactorauth/prebuiltui.tsx @@ -19,6 +19,7 @@ import type { AuthComponent } from "../../types"; export class MultiFactorAuthPreBuiltUI extends RecipeRouter { static instance?: MultiFactorAuthPreBuiltUI; languageTranslations = defaultTranslationsMultiFactorAuth; + static languageTranslations = defaultTranslationsMultiFactorAuth; constructor(public readonly recipeInstance: MultiFactorAuthRecipe) { super(); diff --git a/lib/ts/recipe/multifactorauth/recipe.tsx b/lib/ts/recipe/multifactorauth/recipe.tsx index 349cd5e9b..879f3e4a1 100644 --- a/lib/ts/recipe/multifactorauth/recipe.tsx +++ b/lib/ts/recipe/multifactorauth/recipe.tsx @@ -56,7 +56,6 @@ import type { UserContext, WebJSRecipeInterface, } from "../../types"; -import type { NormalisedAppInfo } from "../../types"; export default class MultiFactorAuth extends RecipeModule< GetRedirectionURLContext, @@ -105,7 +104,7 @@ export default class MultiFactorAuth extends RecipeModule< return { recipeID: MultiFactorAuth.RECIPE_ID, authReact: ( - appInfo: NormalisedAppInfo + appInfo ): RecipeModule< GetRedirectionURLContext, PreAndPostAPIHookAction, @@ -119,17 +118,20 @@ export default class MultiFactorAuth extends RecipeModule< }); return MultiFactorAuth.instance; }, - webJS: MultiFactorAuthWebJS.init({ - ...normalisedConfig, - override: { - functions: (originalImpl, builder) => { - const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: (...args) => { + const init = MultiFactorAuthWebJS.init({ + ...normalisedConfig, + override: { + functions: (originalImpl, builder) => { + const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - }), + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/multitenancy/recipe.ts b/lib/ts/recipe/multitenancy/recipe.ts index 815464a3a..7bbec8c1a 100644 --- a/lib/ts/recipe/multitenancy/recipe.ts +++ b/lib/ts/recipe/multitenancy/recipe.ts @@ -35,7 +35,6 @@ import type { WebJSRecipeInterface, UserContext, } from "../../types"; -import type { NormalisedAppInfo } from "../../types"; import type AuthRecipe from "../authRecipe"; /* @@ -100,9 +99,10 @@ export default class Multitenancy extends BaseRecipeModule { static init(config?: UserInput): RecipeInitResult { const normalisedConfig = normaliseMultitenancyConfig(config); + return { recipeID: Multitenancy.RECIPE_ID, - authReact: (appInfo: NormalisedAppInfo): BaseRecipeModule => { + authReact: (appInfo): BaseRecipeModule => { Multitenancy.instance = new Multitenancy({ ...normalisedConfig, appInfo, @@ -110,9 +110,12 @@ export default class Multitenancy extends BaseRecipeModule { }); return Multitenancy.instance; }, - webJS: MultitenancyWebJS.init({ - ...normalisedConfig, - }), + webJS: (...args) => { + const init = MultitenancyWebJS.init({ + ...normalisedConfig, + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/oauth2provider/prebuiltui.tsx b/lib/ts/recipe/oauth2provider/prebuiltui.tsx index 3f88e7e71..dbf4756b0 100644 --- a/lib/ts/recipe/oauth2provider/prebuiltui.tsx +++ b/lib/ts/recipe/oauth2provider/prebuiltui.tsx @@ -19,6 +19,7 @@ import type { AuthComponent } from "../../types"; export class OAuth2ProviderPreBuiltUI extends RecipeRouter { static instance?: OAuth2ProviderPreBuiltUI; languageTranslations = defaultTranslationsOAuth2Provider; + static languageTranslations = defaultTranslationsOAuth2Provider; constructor(public readonly recipeInstance: OAuth2ProviderRecipe) { super(); diff --git a/lib/ts/recipe/oauth2provider/recipe.ts b/lib/ts/recipe/oauth2provider/recipe.ts index fd371b9e3..ce6919f67 100644 --- a/lib/ts/recipe/oauth2provider/recipe.ts +++ b/lib/ts/recipe/oauth2provider/recipe.ts @@ -34,7 +34,6 @@ import type { UserInput, } from "./types"; import type { RecipeInitResult, NormalisedConfigWithAppInfoAndRecipeID, WebJSRecipeInterface } from "../../types"; -import type { NormalisedAppInfo } from "../../types"; /* * Class. @@ -61,10 +60,11 @@ export default class OAuth2Provider extends RecipeModule< config?: UserInput ): RecipeInitResult { const normalisedConfig = normaliseOAuth2Config(config); + return { recipeID: OAuth2Provider.RECIPE_ID, authReact: ( - appInfo: NormalisedAppInfo + appInfo ): RecipeModule< GetRedirectionURLContext, PreAndPostAPIHookAction, @@ -78,17 +78,20 @@ export default class OAuth2Provider extends RecipeModule< }); return OAuth2Provider.instance; }, - webJS: OAuth2WebJS.init({ - ...normalisedConfig, - override: { - functions: (originalImpl, builder) => { - const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: (...args) => { + const init = OAuth2WebJS.init({ + ...normalisedConfig, + override: { + functions: (originalImpl, builder) => { + const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - }), + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/passwordless/prebuiltui.tsx b/lib/ts/recipe/passwordless/prebuiltui.tsx index 9143ba4f9..93ef14a92 100644 --- a/lib/ts/recipe/passwordless/prebuiltui.tsx +++ b/lib/ts/recipe/passwordless/prebuiltui.tsx @@ -33,8 +33,8 @@ import type { AuthComponent } from "../../types"; export class PasswordlessPreBuiltUI extends RecipeRouter { static instance?: PasswordlessPreBuiltUI; - languageTranslations = defaultTranslationsPasswordless; + static languageTranslations = defaultTranslationsPasswordless; constructor(public readonly recipeInstance: Passwordless) { super(); diff --git a/lib/ts/recipe/passwordless/recipe.tsx b/lib/ts/recipe/passwordless/recipe.tsx index cc484c6b6..d8fec6ed1 100644 --- a/lib/ts/recipe/passwordless/recipe.tsx +++ b/lib/ts/recipe/passwordless/recipe.tsx @@ -39,7 +39,6 @@ import type { UserInput, } from "./types"; import type { RecipeInitResult, NormalisedConfigWithAppInfoAndRecipeID, WebJSRecipeInterface } from "../../types"; -import type { NormalisedAppInfo } from "../../types"; import type RecipeModule from "../recipeModule"; export const otpPhoneFactor = { @@ -108,7 +107,7 @@ export default class Passwordless extends AuthRecipe< return { recipeID: Passwordless.RECIPE_ID, authReact: ( - appInfo: NormalisedAppInfo + appInfo ): RecipeModule< GetRedirectionURLContext, PreAndPostAPIHookAction, @@ -122,17 +121,20 @@ export default class Passwordless extends AuthRecipe< }); return Passwordless.instance; }, - webJS: PasswordlessWebJS.init({ - ...normalisedConfig, - override: { - functions: (originalImpl, builder) => { - const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: (...args) => { + const init = PasswordlessWebJS.init({ + ...normalisedConfig, + override: { + functions: (originalImpl, builder) => { + const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - }), + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/session/prebuiltui.tsx b/lib/ts/recipe/session/prebuiltui.tsx index c60443de5..88c88366a 100644 --- a/lib/ts/recipe/session/prebuiltui.tsx +++ b/lib/ts/recipe/session/prebuiltui.tsx @@ -15,6 +15,7 @@ import type { AuthComponent } from "../../types"; export class SessionPreBuiltUI extends RecipeRouter { static instance?: SessionPreBuiltUI; languageTranslations = defaultTranslationsSession; + static languageTranslations = defaultTranslationsSession; constructor(public readonly recipeInstance: Session) { super(); diff --git a/lib/ts/recipe/session/recipe.tsx b/lib/ts/recipe/session/recipe.tsx index ada99d673..12dfc98f4 100644 --- a/lib/ts/recipe/session/recipe.tsx +++ b/lib/ts/recipe/session/recipe.tsx @@ -41,7 +41,6 @@ import type { NormalisedSessionConfig } from "./types"; import type { RecipeEventWithSessionContext, InputType, SessionContextUpdate } from "./types"; import type { Navigate, - NormalisedAppInfo, NormalisedConfigWithAppInfoAndRecipeID, NormalisedGetRedirectionURLContext, RecipeInitResult, @@ -307,7 +306,7 @@ export default class Session extends RecipeModule => { + authReact: (appInfo): RecipeModule => { Session.instance = new Session({ ...normalisedConfig, appInfo, @@ -315,33 +314,36 @@ export default class Session extends RecipeModule { - if (normalisedConfig.onHandleEvent !== undefined) { - normalisedConfig.onHandleEvent(event); - } - - void Session.getInstanceOrThrow().notifyListeners(event); - }, - preAPIHook: async (context) => { - const response = { - ...context, - requestInit: { - ...context.requestInit, - headers: { - ...context.requestInit.headers, - rid: Session.RECIPE_ID, + webJS: (...args) => { + const init = SessionWebJS.init({ + ...normalisedConfig, + onHandleEvent: (event) => { + if (normalisedConfig.onHandleEvent !== undefined) { + normalisedConfig.onHandleEvent(event); + } + + void Session.getInstanceOrThrow().notifyListeners(event); + }, + preAPIHook: async (context) => { + const response = { + ...context, + requestInit: { + ...context.requestInit, + headers: { + ...context.requestInit.headers, + rid: Session.RECIPE_ID, + }, }, - }, - }; - if (normalisedConfig.preAPIHook === undefined) { - return response; - } else { - return normalisedConfig.preAPIHook(context); - } - }, - }), + }; + if (normalisedConfig.preAPIHook === undefined) { + return response; + } else { + return normalisedConfig.preAPIHook(context); + } + }, + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/thirdparty/index.ts b/lib/ts/recipe/thirdparty/index.ts index 7ef82cf3a..3bdd99860 100644 --- a/lib/ts/recipe/thirdparty/index.ts +++ b/lib/ts/recipe/thirdparty/index.ts @@ -121,6 +121,13 @@ export default class Wrapper { }); } + static getProviders(): { id: string; name: string }[] { + return ThirdParty.getInstanceOrThrow().config.signInAndUpFeature.providers.map((provider) => ({ + id: provider.id, + name: provider.name, + })); + } + /* * Providers */ @@ -146,6 +153,7 @@ const redirectToThirdPartyLogin = Wrapper.redirectToThirdPartyLogin; const getStateAndOtherInfoFromStorage = Wrapper.getStateAndOtherInfoFromStorage; const getAuthorisationURLWithQueryParamsAndSetState = Wrapper.getAuthorisationURLWithQueryParamsAndSetState; const signInAndUp = Wrapper.signInAndUp; +const getProviders = Wrapper.getProviders; const ThirdpartyComponentsOverrideProvider = Wrapper.ComponentsOverrideProvider; export { @@ -166,6 +174,7 @@ export { getStateAndOtherInfoFromStorage, getAuthorisationURLWithQueryParamsAndSetState, signInAndUp, + getProviders, redirectToThirdPartyLogin, ThirdpartyComponentsOverrideProvider, signOut, diff --git a/lib/ts/recipe/thirdparty/prebuiltui.tsx b/lib/ts/recipe/thirdparty/prebuiltui.tsx index 229caa691..7c0a9eab3 100644 --- a/lib/ts/recipe/thirdparty/prebuiltui.tsx +++ b/lib/ts/recipe/thirdparty/prebuiltui.tsx @@ -21,6 +21,7 @@ import type { AuthComponent } from "../../types"; export class ThirdPartyPreBuiltUI extends RecipeRouter { static instance?: ThirdPartyPreBuiltUI; languageTranslations = defaultTranslationsThirdParty; + static languageTranslations = defaultTranslationsThirdParty; constructor(public readonly recipeInstance: ThirdParty) { super(); diff --git a/lib/ts/recipe/thirdparty/recipe.tsx b/lib/ts/recipe/thirdparty/recipe.tsx index a01c14f16..c5dde5d12 100644 --- a/lib/ts/recipe/thirdparty/recipe.tsx +++ b/lib/ts/recipe/thirdparty/recipe.tsx @@ -36,7 +36,6 @@ import type { UserInput, } from "./types"; import type { RecipeInitResult, NormalisedConfigWithAppInfoAndRecipeID, WebJSRecipeInterface } from "../../types"; -import type { NormalisedAppInfo } from "../../types"; import type RecipeModule from "../recipeModule"; /* @@ -78,10 +77,11 @@ export default class ThirdParty extends AuthRecipe< config?: UserInput ): RecipeInitResult { const normalisedConfig = normaliseThirdPartyConfig(config); + return { recipeID: ThirdParty.RECIPE_ID, authReact: ( - appInfo: NormalisedAppInfo + appInfo ): RecipeModule< GetRedirectionURLContext, PreAndPostAPIHookAction, @@ -95,17 +95,23 @@ export default class ThirdParty extends AuthRecipe< }); return ThirdParty.instance; }, - webJS: ThirdpartyWebJS.init({ - ...normalisedConfig, - override: { - functions: (originalImpl, builder) => { - const functions = getFunctionOverrides(ThirdParty.RECIPE_ID, normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: (...args) => { + const init = ThirdpartyWebJS.init({ + ...normalisedConfig, + override: { + functions: (originalImpl, builder) => { + const functions = getFunctionOverrides( + ThirdParty.RECIPE_ID, + normalisedConfig.onHandleEvent + ); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - }), + }); + return init(...args); + }, }; } diff --git a/lib/ts/recipe/totp/prebuiltui.tsx b/lib/ts/recipe/totp/prebuiltui.tsx index da75a8fb5..a8e0559dc 100644 --- a/lib/ts/recipe/totp/prebuiltui.tsx +++ b/lib/ts/recipe/totp/prebuiltui.tsx @@ -19,6 +19,7 @@ import type { AuthComponent } from "../../types"; export class TOTPPreBuiltUI extends RecipeRouter { static instance?: TOTPPreBuiltUI; languageTranslations = defaultTranslationsTOTP; + static languageTranslations = defaultTranslationsTOTP; constructor(public readonly recipeInstance: TOTPRecipe) { super(); diff --git a/lib/ts/recipe/totp/recipe.tsx b/lib/ts/recipe/totp/recipe.tsx index 568a9a287..020c6dbc7 100644 --- a/lib/ts/recipe/totp/recipe.tsx +++ b/lib/ts/recipe/totp/recipe.tsx @@ -37,7 +37,6 @@ import type { PreAndPostAPIHookAction, } from "./types"; import type { NormalisedConfigWithAppInfoAndRecipeID, RecipeInitResult, WebJSRecipeInterface } from "../../types"; -import type { NormalisedAppInfo } from "../../types"; export const totpFactor = { id: FactorIds.TOTP, @@ -80,7 +79,7 @@ export default class TOTP extends RecipeModule< return { recipeID: TOTP.RECIPE_ID, authReact: ( - appInfo: NormalisedAppInfo + appInfo ): RecipeModule< GetRedirectionURLContext, PreAndPostAPIHookAction, @@ -94,17 +93,20 @@ export default class TOTP extends RecipeModule< }); return TOTP.instance; }, - webJS: TOTPWebJS.init({ - ...normalisedConfig, - override: { - functions: (originalImpl, builder) => { - const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); - builder.override(functions); - builder.override(normalisedConfig.override.functions); - return originalImpl; + webJS: (...args) => { + const init = TOTPWebJS.init({ + ...normalisedConfig, + override: { + functions: (originalImpl, builder) => { + const functions = getFunctionOverrides(normalisedConfig.onHandleEvent); + builder.override(functions); + builder.override(normalisedConfig.override.functions); + return originalImpl; + }, }, - }, - }), + }); + return init(...args); + }, }; } diff --git a/lib/ts/superTokens.tsx b/lib/ts/superTokens.tsx index adf1cd01f..0bd8f80a7 100644 --- a/lib/ts/superTokens.tsx +++ b/lib/ts/superTokens.tsx @@ -32,6 +32,8 @@ import { getDefaultCookieScope, getNormalisedUserContext, getOriginOfPage, + getPublicConfig, + getPublicPlugin, getTenantIdFromQueryParams, isTest, normaliseCookieScopeOrThrowError, @@ -56,6 +58,7 @@ import type { SuperTokensPlugin, AllRecipeConfigs, PluginRouteHandler, + SuperTokensPublicPlugin, } from "./types"; /* @@ -73,6 +76,8 @@ export default class SuperTokens { * Instance Attributes. */ appInfo: NormalisedAppInfo; + // give access to plugins through the instance + pluginList: SuperTokensPublicPlugin[] = []; languageTranslations: { defaultLanguage: string; userTranslationStore: TranslationStore; @@ -96,6 +101,7 @@ export default class SuperTokens { */ constructor(config: SuperTokensConfig, plugins: SuperTokensPlugin[]) { 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" @@ -107,20 +113,49 @@ export default class SuperTokens { for (const plugin of plugins) { if (plugin.overrideMap !== undefined) { for (const t of Object.keys(plugin.overrideMap) as (keyof AllRecipeConfigs)[]) { - if (plugin.overrideMap[t]?.components) { - this.componentOverrides[t] = { - ...this.componentOverrides[t], - ...(plugin.overrideMap[t]?.components as AllRecipeComponentOverrides[typeof t]), - }; - } + this.componentOverrides[t] = { + ...this.componentOverrides[t], + ...((plugin.overrideMap[t]?.components as AllRecipeComponentOverrides[typeof t]) ?? {}), + }; } } + this.componentOverrides.authRecipe = { ...(this.componentOverrides.authRecipe ?? {}), ...(plugin.generalAuthRecipeComponentOverrides ?? {}), }; - if (plugin.routeHandlers) { - this.pluginRouteHandlers.push(...plugin.routeHandlers); + } + + this.pluginList = plugins.map(getPublicPlugin); + + const publicConfig = getPublicConfig({ + ...config, + appInfo: this.appInfo, + }); + // iterated separately so we can pass the instance plugins as reference so they always have access to the latest + for (let pluginIndex = 0; pluginIndex < this.pluginList.length; pluginIndex += 1) { + const pluginInit = plugins[pluginIndex].init; + if (pluginInit && !this.pluginList[pluginIndex].initialized) { + PostSuperTokensInitCallbacks.addPostInitCallback(() => { + pluginInit(publicConfig, this.pluginList, package_version); + this.pluginList[pluginIndex].initialized = true; + }); + } + + const pluginRouteHandlers = plugins[pluginIndex].routeHandlers; + if (pluginRouteHandlers) { + let handlers: PluginRouteHandler[] = []; + if (typeof pluginRouteHandlers === "function") { + const result = pluginRouteHandlers(publicConfig, this.pluginList, package_version); + if (result.status === "ERROR") { + throw new Error(result.message); + } + handlers = result.routeHandlers; + } else { + handlers = pluginRouteHandlers; + } + + this.pluginRouteHandlers.push(...handlers); } } @@ -137,7 +172,6 @@ export default class SuperTokens { }; const enableDebugLogs = Boolean(config?.enableDebugLogs); - if (enableDebugLogs) { enableLogging(); } @@ -174,6 +208,12 @@ export default class SuperTokens { ? config.recipeList : config.recipeList.concat(Multitenancy.init({})); + const normalisedAppInfo = normaliseInputAppInfoOrThrowError(config.appInfo); + const publicConfig = getPublicConfig({ + ...config, + appInfo: normalisedAppInfo, + }); + const finalPluginList: SuperTokensPlugin[] = []; if (config.experimental?.plugins) { for (const plugin of config.experimental.plugins) { @@ -183,11 +223,20 @@ export default class SuperTokens { : [plugin.compatibleAuthReactSDKVersions]; if (!versionContraints.includes(package_version)) { // TODO: better checks - throw new Error("Plugin version mismatch"); + throw new Error( + `Plugin version mismatch. Version ${package_version} not found in compatible versions: ${versionContraints.join( + ", " + )}` + ); } } + if (plugin.dependencies) { - const result = plugin.dependencies(finalPluginList, package_version); + const result = plugin.dependencies( + publicConfig, + finalPluginList.map(getPublicPlugin), + package_version + ); if (result.status === "ERROR") { throw new Error(result.message); } @@ -195,13 +244,26 @@ export default class SuperTokens { finalPluginList.push(...result.pluginsToAdd); } } + finalPluginList.push(plugin); } } + const duplicatePluginIds = finalPluginList.filter((plugin, index) => + finalPluginList.some((elem, idx) => elem.id === plugin.id && idx !== index) + ); + if (duplicatePluginIds.length > 0) { + throw new Error(`Duplicate plugin IDs: ${duplicatePluginIds.map((plugin) => plugin.id).join(", ")}`); + } + for (const plugin of finalPluginList) { if (plugin.config) { - config = { ...config, ...plugin.config(config) }; + const pluginConfig = plugin.config(getPublicConfig({ ...config, appInfo: normalisedAppInfo })) || {}; + + // @ts-expect-error we don't want to override the appInfo and we can't make sure the plugin won't return it + delete pluginConfig.appInfo; + + config = { ...config, ...pluginConfig }; } } diff --git a/lib/ts/translation/translationHelpers.ts b/lib/ts/translation/translationHelpers.ts index b3e6a09f2..2f1180088 100644 --- a/lib/ts/translation/translationHelpers.ts +++ b/lib/ts/translation/translationHelpers.ts @@ -1,4 +1,6 @@ -import { getCookieValue, setFrontendCookie } from "../utils"; +import { getCookieValue, setFrontendCookie, mergeObjects } from "../utils"; +import SuperTokens from "../superTokens"; +import { defaultTranslationsCommon } from "./translations"; // language -> key -> copy export type TranslationStore = Record>; @@ -70,3 +72,66 @@ export async function getCurrentLanguageFromCookie(): Promise { return null; } } + +export const getTranslationFunction = ( + ...stores: TranslationStore[] +): ((key: T, replacements?: Record) => string) => { + const { translationEventSource, userTranslationFunc, defaultLanguage, userTranslationStore } = + SuperTokens.getInstanceOrThrow().languageTranslations; + + let _store: TranslationStore = [defaultTranslationsCommon, ...stores, userTranslationStore].reduce( + mergeObjects, + {} + ); + const getStore = () => _store; + const setStore = (newStore: TranslationStore) => { + _store = newStore; + }; + + let _language = defaultLanguage; + const getLanguage = () => _language; + const setLanguage = (lang: string) => { + _language = lang; + }; + + const changeHandler: TranslationEventHandler<"LanguageChange"> = (_eventName, detail) => { + setLanguage(detail); + }; + const loadHandler: TranslationEventHandler<"TranslationLoaded"> = (_eventName, detail) => { + setStore(mergeObjects(_store, detail)); + }; + + translationEventSource.off("LanguageChange", changeHandler); + translationEventSource.off("TranslationLoaded", loadHandler); + + translationEventSource.on("LanguageChange", changeHandler); + translationEventSource.on("TranslationLoaded", loadHandler); + + getCurrentLanguageFromCookie().then((cookieLanguage) => { + if (cookieLanguage) setLanguage(cookieLanguage); + }); + + const translate = (key: string, replacements: Record = {}) => { + if (userTranslationFunc) { + return userTranslationFunc(key); + } + + if (getLanguage() !== undefined) { + const res = getStore()[getLanguage()] && getStore()[getLanguage()][key]; + const fallback = getStore()[defaultLanguage] && getStore()[defaultLanguage][key]; + + if (res === undefined) { + if (fallback !== undefined) { + return fallback; + } + return key; + } + + return res.replace(/{(\w+)}/g, (match, p1) => replacements[p1] || match); + } + + throw new Error("Should never come here"); + }; + + return translate; +}; diff --git a/lib/ts/types.ts b/lib/ts/types.ts index 3c3b120db..3cb0b7ab3 100644 --- a/lib/ts/types.ts +++ b/lib/ts/types.ts @@ -533,12 +533,14 @@ export type PluginRouteHandler = { // TODO: this should probably derive from the web-js version export type SuperTokensPlugin = { - id: string; // TODO: validate that no two plugins have the same id + id: string; version?: string; compatibleAuthReactSDKVersions?: string | string[]; // match the syntax of the engines field in package.json compatibleWebJSSDKVersions?: string | string[]; // match the syntax of the engines field in package.json + init?: (config: SuperTokensPublicConfig, allPlugins: SuperTokensPublicPlugin[], sdkVersion: string) => void; dependencies?: ( - pluginsAbove: Pick[], + config: SuperTokensPublicConfig, + pluginsAbove: SuperTokensPublicPlugin[], sdkVersion: string ) => { status: "OK"; pluginsToAdd?: SuperTokensPlugin[] } | { status: "ERROR"; message: string }; overrideMap?: { @@ -547,8 +549,30 @@ export type SuperTokensPlugin = { }; }; generalAuthRecipeComponentOverrides?: AuthRecipeComponentOverrideMap; - routeHandlers?: PluginRouteHandler[]; - config?: ( - config: Omit - ) => Omit | undefined; + routeHandlers?: + | (( + config: SuperTokensPublicConfig, + allPlugins: SuperTokensPublicPlugin[], + sdkVersion: string + ) => { status: "OK"; routeHandlers: PluginRouteHandler[] } | { status: "ERROR"; message: string }) + | PluginRouteHandler[]; + + config?: (config: SuperTokensPublicConfig) => Omit | undefined; + exports?: Record; +}; + +export const nonPublicConfigProperties = ["experimental"] as const; + +export type NonPublicConfigPropertiesType = (typeof nonPublicConfigProperties)[number]; + +export type SuperTokensConfigWithNormalisedAppInfo = Omit & { + appInfo: NormalisedAppInfo; +}; +export type SuperTokensPublicPlugin = Pick< + SuperTokensPlugin, + "id" | "version" | "exports" | "compatibleAuthReactSDKVersions" | "compatibleWebJSSDKVersions" +> & { initialized: boolean }; + +export type SuperTokensPublicConfig = Omit, "appInfo"> & { + appInfo: NormalisedAppInfo; }; diff --git a/lib/ts/ui/index.tsx b/lib/ts/ui/index.tsx index 58baa3e9e..b2314dcb5 100644 --- a/lib/ts/ui/index.tsx +++ b/lib/ts/ui/index.tsx @@ -17,11 +17,14 @@ import type { PreBuiltRecipes, ReactRouterDomWithCustomHistory } from "./types"; import type { AuthPageProps } from "../recipe/authRecipe/components/feature/authPage/authPage"; import type { AuthPageThemeProps } from "../recipe/authRecipe/types"; import type { PropsWithChildren } from "react"; +import { defaultTranslationsCommon } from "../translation/translations"; class UI { private static reactRouterDom: ReactRouterDomWithCustomHistory; private static reactRouterDomIsV6?: boolean; + static languageTranslations = defaultTranslationsCommon; + static getSuperTokensRoutesForReactRouterDom( reactRouterDom: any, preBuiltUiClassList: PreBuiltRecipes = [], @@ -136,6 +139,7 @@ class UI { static AuthRecipeComponentsOverrideContextProvider = AuthRecipeComponentsOverrideContextProvider; } +const languageTranslations = UI.languageTranslations; const getSuperTokensRoutesForReactRouterDom = UI.getSuperTokensRoutesForReactRouterDom; const canHandleRoute = UI.canHandleRoute; const getRoutingComponent = UI.getRoutingComponent; @@ -143,6 +147,7 @@ const AuthPage = UI.AuthPage; export default UI; export { + languageTranslations, getSuperTokensRoutesForReactRouterDom, canHandleRoute, getRoutingComponent, diff --git a/lib/ts/utils.ts b/lib/ts/utils.ts index d631a14eb..91ede8727 100644 --- a/lib/ts/utils.ts +++ b/lib/ts/utils.ts @@ -36,8 +36,14 @@ import type { NormalisedAppInfo, NormalisedFormField, NormalisedGetRedirectionURLContext, + SuperTokensPlugin, + SuperTokensPublicConfig, + SuperTokensPublicPlugin, UserContext, + NonPublicConfigPropertiesType, + SuperTokensConfigWithNormalisedAppInfo, } from "./types"; +import { nonPublicConfigProperties } from "./types"; /* * getRecipeIdFromPath @@ -590,3 +596,28 @@ export const handleCallAPI = async ({ fetchError, }; }; + +export function getPublicPlugin(plugin: SuperTokensPlugin): SuperTokensPublicPlugin { + return { + id: plugin.id, + initialized: plugin.init ? false : true, // since the init method is optional, we default to true + version: plugin.version, + exports: plugin.exports, + compatibleAuthReactSDKVersions: plugin.compatibleAuthReactSDKVersions, + compatibleWebJSSDKVersions: plugin.compatibleWebJSSDKVersions, + }; +} + +export function getPublicConfig(config: SuperTokensConfigWithNormalisedAppInfo): SuperTokensPublicConfig { + const configKeys = Object.keys(config) as (keyof SuperTokensConfigWithNormalisedAppInfo)[]; + + const publicConfig = configKeys.reduce((acc, key) => { + if (nonPublicConfigProperties.includes(key as NonPublicConfigPropertiesType)) { + return acc; + } else { + return { ...acc, [key]: config[key] }; + } + }, {} as SuperTokensPublicConfig); + + return publicConfig; +} diff --git a/package-lock.json b/package-lock.json index ccdb3f4e2..ad454e9aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "supertokens-auth-react", - "version": "0.49.1", + "version": "0.49.1-canary-plugins.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "supertokens-auth-react", - "version": "0.49.1", + "version": "0.49.1-canary-plugins.0", "license": "Apache-2.0", "dependencies": { "@simplewebauthn/types": "^12.0.0", @@ -106,7 +106,7 @@ "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0", - "supertokens-web-js": "^0.15" + "supertokens-web-js": "^0.15.0" } }, "eslint": { diff --git a/package.json b/package.json index 5f85f4aa2..ba4df9222 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "supertokens-auth-react", - "version": "0.49.1", + "version": "0.49.1-canary-plugins.0", "description": "ReactJS SDK that provides login functionality with SuperTokens.", "main": "./index.js", "engines": { @@ -101,7 +101,7 @@ "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0", - "supertokens-web-js": "^0.15" + "supertokens-web-js": "^0.15.0" }, "scripts": { "init": "bash ./init.sh", diff --git a/rollup.config.mjs b/rollup.config.mjs index f01ab01bf..129049d52 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -49,6 +49,7 @@ export default [ importCssString(), visualizer(), ], + cache: false, output: [ { dir: "lib/build",