diff --git a/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts b/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts index 7cd26108..d55c0257 100644 --- a/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts +++ b/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts @@ -10,7 +10,7 @@ import { generateFtlFilesCodeFactory, pageIds } from "./generateFtl"; import { builtinThemesUrl } from "../install-builtin-keycloak-themes"; import { downloadAndUnzip } from "../tools/downloadAndUnzip"; import * as child_process from "child_process"; -import { resourcesCommonPath, resourcesPath, subDirOfPublicDirBasename } from "../../lib/kcContextMocks/urlResourcesPath"; +import { resourcesCommonPath, resourcesPath, subDirOfPublicDirBasename } from "../../lib/getKcContext/kcContextMocks/urlResourcesPath"; import { isInside } from "../tools/isInside"; diff --git a/src/lib/components/Error.tsx b/src/lib/components/Error.tsx index ad5b83fd..880b2009 100644 --- a/src/lib/components/Error.tsx +++ b/src/lib/components/Error.tsx @@ -3,10 +3,10 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; import { assert } from "../tools/assert"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; -export const Error = memo(({ kcContext, ...props }: { kcContext: KcContext.Error; } & KcProps) => { +export const Error = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Error; } & KcProps) => { const { msg } = useKcMessage(); diff --git a/src/lib/components/Info.tsx b/src/lib/components/Info.tsx index 6784adee..8b672ea0 100644 --- a/src/lib/components/Info.tsx +++ b/src/lib/components/Info.tsx @@ -3,10 +3,10 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; import { assert } from "../tools/assert"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; -export const Info = memo(({ kcContext, ...props }: { kcContext: KcContext.Info; } & KcProps) => { +export const Info = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Info; } & KcProps) => { const { msg } = useKcMessage(); diff --git a/src/lib/components/KcApp.tsx b/src/lib/components/KcApp.tsx index c92f23e2..81b0e0ba 100644 --- a/src/lib/components/KcApp.tsx +++ b/src/lib/components/KcApp.tsx @@ -1,6 +1,6 @@ import { memo } from "react"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import type { KcProps } from "./KcProps"; import { Login } from "./Login"; import { Register } from "./Register"; @@ -13,7 +13,7 @@ import { LoginOtp } from "./LoginOtp"; import { LoginUpdateProfile } from "./LoginUpdateProfile"; import { LoginIdpLinkConfirm } from "./LoginIdpLinkConfirm"; -export const KcApp = memo(({ kcContext, ...props }: { kcContext: KcContext; } & KcProps) => { +export const KcApp = memo(({ kcContext, ...props }: { kcContext: KcContextBase; } & KcProps) => { switch (kcContext.pageId) { case "login.ftl": return ; case "register.ftl": return ; diff --git a/src/lib/components/Login.tsx b/src/lib/components/Login.tsx index 39331ead..ff3ebb9a 100644 --- a/src/lib/components/Login.tsx +++ b/src/lib/components/Login.tsx @@ -2,12 +2,12 @@ import { useState, memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; import { cx } from "tss-react"; import { useConstCallback } from "powerhooks"; -export const Login = memo(({ kcContext, ...props }: { kcContext: KcContext.Login; } & KcProps) => { +export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Login; } & KcProps) => { const { msg, msgStr } = useKcMessage(); diff --git a/src/lib/components/LoginIdpLinkConfirm.tsx b/src/lib/components/LoginIdpLinkConfirm.tsx index 89448741..e4f1752d 100644 --- a/src/lib/components/LoginIdpLinkConfirm.tsx +++ b/src/lib/components/LoginIdpLinkConfirm.tsx @@ -2,11 +2,11 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; import { cx } from "tss-react"; -export const LoginIdpLinkConfirm = memo(({ kcContext, ...props }: { kcContext: KcContext.LoginIdpLinkConfirm; } & KcProps) => { +export const LoginIdpLinkConfirm = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginIdpLinkConfirm; } & KcProps) => { const { msg } = useKcMessage(); diff --git a/src/lib/components/LoginOtp.tsx b/src/lib/components/LoginOtp.tsx index f4472bb6..1561db6e 100644 --- a/src/lib/components/LoginOtp.tsx +++ b/src/lib/components/LoginOtp.tsx @@ -3,13 +3,13 @@ import { useEffect, memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; import { appendHead } from "../tools/appendHead"; import { join as pathJoin } from "path"; import { cx } from "tss-react"; -export const LoginOtp = memo(({ kcContext, ...props }: { kcContext: KcContext.LoginOtp; } & KcProps) => { +export const LoginOtp = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginOtp; } & KcProps) => { const { otpLogin, url } = kcContext; diff --git a/src/lib/components/LoginResetPassword.tsx b/src/lib/components/LoginResetPassword.tsx index 043c5785..1ffdac4f 100644 --- a/src/lib/components/LoginResetPassword.tsx +++ b/src/lib/components/LoginResetPassword.tsx @@ -2,11 +2,11 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; import { cx } from "tss-react"; -export const LoginResetPassword = memo(({ kcContext, ...props }: { kcContext: KcContext.LoginResetPassword; } & KcProps) => { +export const LoginResetPassword = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginResetPassword; } & KcProps) => { const { msg, msgStr } = useKcMessage(); diff --git a/src/lib/components/LoginUpdateProfile.tsx b/src/lib/components/LoginUpdateProfile.tsx index 11e81eb8..c1f4e347 100644 --- a/src/lib/components/LoginUpdateProfile.tsx +++ b/src/lib/components/LoginUpdateProfile.tsx @@ -1,11 +1,11 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; import { cx } from "tss-react"; -export const LoginUpdateProfile = memo(({ kcContext, ...props }: { kcContext: KcContext.LoginUpdateProfile; } & KcProps) => { +export const LoginUpdateProfile = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginUpdateProfile; } & KcProps) => { const { msg, msgStr } = useKcMessage(); diff --git a/src/lib/components/LoginVerifyEmail.tsx b/src/lib/components/LoginVerifyEmail.tsx index bd4e5f83..0dc89983 100644 --- a/src/lib/components/LoginVerifyEmail.tsx +++ b/src/lib/components/LoginVerifyEmail.tsx @@ -2,10 +2,10 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; -export const LoginVerifyEmail = memo(({ kcContext, ...props }: { kcContext: KcContext.LoginVerifyEmail; } & KcProps) => { +export const LoginVerifyEmail = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginVerifyEmail; } & KcProps) => { const { msg } = useKcMessage(); diff --git a/src/lib/components/Register.tsx b/src/lib/components/Register.tsx index 39040c62..0e543244 100644 --- a/src/lib/components/Register.tsx +++ b/src/lib/components/Register.tsx @@ -1,11 +1,11 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; import { cx } from "tss-react"; -export const Register = memo(({ kcContext, ...props }: { kcContext: KcContext.Register; } & KcProps) => { +export const Register = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Register; } & KcProps) => { const { msg, msgStr } = useKcMessage(); diff --git a/src/lib/components/Template.tsx b/src/lib/components/Template.tsx index c9349bdd..7275f430 100644 --- a/src/lib/components/Template.tsx +++ b/src/lib/components/Template.tsx @@ -3,7 +3,7 @@ import { useReducer, useEffect, memo } from "react"; import type { ReactNode } from "react"; import { useKcMessage } from "../i18n/useKcMessage"; import { useKcLanguageTag } from "../i18n/useKcLanguageTag"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { assert } from "../tools/assert"; import { cx } from "tss-react"; import type { KcLanguageTag } from "../i18n/KcLanguageTag"; @@ -25,7 +25,7 @@ export type TemplateProps = { showUsernameNode?: ReactNode; formNode: ReactNode; infoNode?: ReactNode; -} & { kcContext: KcContext; } & KcTemplateProps; +} & { kcContext: KcContextBase; } & KcTemplateProps; export const Template = memo((props: TemplateProps) => { diff --git a/src/lib/components/Terms.tsx b/src/lib/components/Terms.tsx index 7a36e52b..1fca0d12 100644 --- a/src/lib/components/Terms.tsx +++ b/src/lib/components/Terms.tsx @@ -1,11 +1,11 @@ import { memo } from "react"; import { Template } from "./Template"; import type { KcProps } from "./KcProps"; -import type { KcContext } from "../KcContext"; +import type { KcContextBase } from "../getKcContext/KcContextBase"; import { useKcMessage } from "../i18n/useKcMessage"; import { cx } from "tss-react"; -export const Terms = memo(({ kcContext, ...props }: { kcContext: KcContext.Terms; } & KcProps) => { +export const Terms = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Terms; } & KcProps) => { const { msg, msgStr } = useKcMessage(); diff --git a/src/lib/kcContext.ts b/src/lib/getKcContext/KcContextBase.ts similarity index 86% rename from src/lib/kcContext.ts rename to src/lib/getKcContext/KcContextBase.ts index 76a43195..e3257c8b 100644 --- a/src/lib/kcContext.ts +++ b/src/lib/getKcContext/KcContextBase.ts @@ -1,11 +1,9 @@ -import { ftlValuesGlobalName } from "../bin/build-keycloak-theme/ftlValuesGlobalName"; -import type { PageId } from "../bin/build-keycloak-theme/generateFtl"; -import { id } from "evt/tools/typeSafety/id"; -import type { KcLanguageTag } from "./i18n/KcLanguageTag"; +import type { PageId } from "../../bin/build-keycloak-theme/generateFtl"; +import type { KcLanguageTag } from "../i18n/KcLanguageTag"; import { doExtends } from "evt/tools/typeSafety/doExtends"; -import type { MessageKey } from "./i18n/useKcMessage"; -import type { LanguageLabel } from "./i18n/KcLanguageTag"; +import type { MessageKey } from "../i18n/useKcMessage"; +import type { LanguageLabel } from "../i18n/KcLanguageTag"; type ExtractAfterStartingWith = StrEnum extends `${Prefix}${infer U}` ? U : never; @@ -14,13 +12,13 @@ type ExtractAfterStartingWith = * Some values might be undefined on some pages. * (ex: url.loginAction is undefined on error.ftl) */ -export type KcContext = - KcContext.Login | KcContext.Register | KcContext.Info | - KcContext.Error | KcContext.LoginResetPassword | KcContext.LoginVerifyEmail | - KcContext.Terms | KcContext.LoginOtp | KcContext.LoginUpdateProfile | - KcContext.LoginIdpLinkConfirm; +export type KcContextBase = + KcContextBase.Login | KcContextBase.Register | KcContextBase.Info | + KcContextBase.Error | KcContextBase.LoginResetPassword | KcContextBase.LoginVerifyEmail | + KcContextBase.Terms | KcContextBase.LoginOtp | KcContextBase.LoginUpdateProfile | + KcContextBase.LoginIdpLinkConfirm; -export declare namespace KcContext { +export declare namespace KcContextBase { export type Common = { url: { @@ -207,9 +205,8 @@ export declare namespace KcContext { } -doExtends(); -doExtends(); - -export const kcContext = id((window as any)[ftlValuesGlobalName]); +doExtends(); +doExtends(); + diff --git a/src/lib/getKcContext/getKcContext.ts b/src/lib/getKcContext/getKcContext.ts new file mode 100644 index 00000000..982c2acb --- /dev/null +++ b/src/lib/getKcContext/getKcContext.ts @@ -0,0 +1,28 @@ + +import type { KcContextBase } from "./KcContextBase"; +import { kcContextMocks, kcContextCommonMock } from "./kcContextMocks"; +import { ftlValuesGlobalName } from "../../bin/build-keycloak-theme/ftlValuesGlobalName"; + +export function getKcContext( + params?: { + mockPageId: KcContextBase["pageId"] | KcContextExtended["pageId"] | false; + kcContextExtendedMock?: KcContextExtended[]; + } +): { kcContext: KcContextBase | KcContextExtended & KcContextBase.Common; } { + + const { mockPageId, kcContextExtendedMock } = params ?? { "mockPageId": false }; + + if (typeof mockPageId === "string") { + + return { + "pageId": mockPageId, + ...(kcContextMocks.find(({ pageId }) => pageId === mockPageId) ?? kcContextCommonMock), + ...(kcContextExtendedMock?.find(({ pageId }) => pageId === mockPageId) ?? {}) + } as any; + + } + + return (window as any)[ftlValuesGlobalName]; + +} + diff --git a/src/lib/getKcContext/index.ts b/src/lib/getKcContext/index.ts new file mode 100644 index 00000000..caff0977 --- /dev/null +++ b/src/lib/getKcContext/index.ts @@ -0,0 +1,2 @@ +export type { KcContextBase } from "./KcContextBase"; +export { getKcContext } from "./getKcContext"; \ No newline at end of file diff --git a/src/lib/kcContextMocks/index.ts b/src/lib/getKcContext/kcContextMocks/index.ts similarity index 100% rename from src/lib/kcContextMocks/index.ts rename to src/lib/getKcContext/kcContextMocks/index.ts diff --git a/src/lib/getKcContext/kcContextMocks/kcContextMocks.ts b/src/lib/getKcContext/kcContextMocks/kcContextMocks.ts new file mode 100644 index 00000000..d9775cbf --- /dev/null +++ b/src/lib/getKcContext/kcContextMocks/kcContextMocks.ts @@ -0,0 +1,254 @@ + +import type { KcContextBase } from "../KcContextBase"; +import { getEvtKcLanguage } from "../../i18n/useKcLanguageTag"; +import { getKcLanguageTagLabel } from "../../i18n/KcLanguageTag"; +//NOTE: Aside because we want to be able to import them from node +import { resourcesCommonPath, resourcesPath } from "./urlResourcesPath"; +import { id } from "tsafe/id"; + +export const kcContextCommonMock: KcContextBase.Common = { + "url": { + "loginAction": "#", + "resourcesPath": `${process.env["PUBLIC_URL"]}/${resourcesPath}`, + "resourcesCommonPath": `${process.env["PUBLIC_URL"]}/${resourcesCommonPath}`, + "loginRestartFlowUrl": "/auth/realms/myrealm/login-actions/restart?client_id=account&tab_id=HoAx28ja4xg", + "loginUrl": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg", + }, + "realm": { + "displayName": "myrealm", + "displayNameHtml": "myrealm", + "internationalizationEnabled": true, + "registrationEmailAsUsername": true, + }, + "locale": { + "supported": [ + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=de", + "languageTag": "de" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=no", + "languageTag": "no" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ru", + "languageTag": "ru" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sv", + "languageTag": "sv" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pt-BR", + "languageTag": "pt-BR" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=lt", + "languageTag": "lt" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=en", + "languageTag": "en" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=it", + "languageTag": "it" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=fr", + "languageTag": "fr" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=zh-CN", + "languageTag": "zh-CN" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=es", + "languageTag": "es" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=cs", + "languageTag": "cs" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ja", + "languageTag": "ja" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sk", + "languageTag": "sk" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pl", + "languageTag": "pl" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ca", + "languageTag": "ca" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=nl", + "languageTag": "nl" + }, + { + "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=tr", + "languageTag": "tr" + } + ], + "current": null as any + }, + "auth": { + "showUsername": false, + "showResetCredentials": false, + "showTryAnotherWayLink": false + }, + "scripts": [], + "message": { + "type": "success", + "summary": "This is a test message" + }, + "isAppInitiatedAction": false, +}; + +Object.defineProperty( + kcContextCommonMock.locale!, + "current", + { + "get": () => getKcLanguageTagLabel(getEvtKcLanguage().state), + "enumerable": true + } +); + +const loginUrl = { + ...kcContextCommonMock.url, + "loginResetCredentialsUrl": "/auth/realms/myrealm/login-actions/reset-credentials?client_id=account&tab_id=HoAx28ja4xg", + "registrationUrl": "/auth/realms/myrealm/login-actions/registration?client_id=account&tab_id=HoAx28ja4xg" +}; + +export const kcContextMocks: KcContextBase[] = [ + id({ + ...kcContextCommonMock, + "pageId": "login.ftl", + "url": loginUrl, + "realm": { + ...kcContextCommonMock.realm, + "loginWithEmailAllowed": true, + "rememberMe": true, + "password": true, + "resetPasswordAllowed": true, + "registrationAllowed": true + }, + "auth": kcContextCommonMock.auth!, + "social": { + "displayInfo": true + }, + "usernameEditDisabled": false, + "login": { + "rememberMe": false + }, + "registrationDisabled": false, + + }), + id({ + ...kcContextCommonMock, + "pageId": "register.ftl", + "url": { + ...loginUrl, + "registrationAction": "http://localhost:8080/auth/realms/myrealm/login-actions/registration?session_code=gwZdUeO7pbYpFTRxiIxRg_QtzMbtFTKrNu6XW_f8asM&execution=12146ce0-b139-4bbd-b25b-0eccfee6577e&client_id=account&tab_id=uS8lYfebLa0" + }, + "messagesPerField": { + "printIfExists": (...[, x]) => x + }, + "scripts": [], + "isAppInitiatedAction": false, + "register": { + "formData": {} + }, + "passwordRequired": true, + "recaptchaRequired": false, + "authorizedMailDomains": [ + "example.com", + "another-example.com", + "*.yet-another-example.com", + "*.example.com", + "hello-world.com" + ], + "social": { + "displayInfo": true + }, + + }), + id({ + ...kcContextCommonMock, + "pageId": "info.ftl", + "messageHeader": "", + "requiredActions": undefined, + "skipLink": false, + "actionUri": "#", + "client": { + "baseUrl": "#" + } + + }), + id({ + ...kcContextCommonMock, + "pageId": "error.ftl", + "client": { + "baseUrl": "#" + } + }), + id({ + ...kcContextCommonMock, + "pageId": "login-reset-password.ftl", + "realm": { + ...kcContextCommonMock.realm, + "loginWithEmailAllowed": false + } + + }), + id({ + ...kcContextCommonMock, + "pageId": "login-verify-email.ftl" + }), + id({ + ...kcContextCommonMock, + "pageId": "terms.ftl" + + }), + id({ + ...kcContextCommonMock, + "pageId": "login-otp.ftl", + "otpLogin": { + "userOtpCredentials": [ + { + "id": "id1", + "userLabel": "label1" + }, + { + "id": "id2", + "userLabel": "label2" + } + ] + } + + }), + id({ + ...kcContextCommonMock, + "pageId": "login-update-profile.ftl", + "user": { + "editUsernameAllowed": true, + "username": "anUsername", + "email": "foo@example.com", + "firstName": "aFirstName", + "lastName": "aLastName" + }, + "messagesPerField": { + "printIfExists": () => undefined + } + }), + id({ + ...kcContextCommonMock, + "pageId": "login-idp-link-confirm.ftl", + "idpAlias": "FranceConnect" + }) +]; diff --git a/src/lib/kcContextMocks/urlResourcesPath.ts b/src/lib/getKcContext/kcContextMocks/urlResourcesPath.ts similarity index 100% rename from src/lib/kcContextMocks/urlResourcesPath.ts rename to src/lib/getKcContext/kcContextMocks/urlResourcesPath.ts diff --git a/src/lib/i18n/useKcLanguageTag.ts b/src/lib/i18n/useKcLanguageTag.ts index 1fa972dc..46a2fa98 100644 --- a/src/lib/i18n/useKcLanguageTag.ts +++ b/src/lib/i18n/useKcLanguageTag.ts @@ -1,8 +1,10 @@ import { createUseGlobalState } from "powerhooks"; -import { kcContext } from "../KcContext"; +import { getKcContext } from "../getKcContext"; import { getBestMatchAmongKcLanguageTag } from "./KcLanguageTag"; +const { kcContext } = getKcContext(); + //export const { useKcLanguageTag, evtKcLanguageTag } = createUseGlobalState( const wrap = createUseGlobalState( "kcLanguageTag", diff --git a/src/lib/index.ts b/src/lib/index.ts index 7c588925..de8a3af9 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1,4 +1,4 @@ -export * from "./KcContext"; +export * from "./getKcContext"; export * from "./i18n/KcLanguageTag"; export * from "./i18n/useKcLanguageTag"; @@ -17,5 +17,3 @@ export * from "./keycloakJsAdapter"; export * from "./tools/assert"; - -export * as kcContextMocks from "./kcContextMocks"; \ No newline at end of file diff --git a/src/lib/kcContextMocks/kcContextMocks.ts b/src/lib/kcContextMocks/kcContextMocks.ts deleted file mode 100644 index 7917ea5e..00000000 --- a/src/lib/kcContextMocks/kcContextMocks.ts +++ /dev/null @@ -1,252 +0,0 @@ - -import type { KcContext } from "../KcContext"; -import { getEvtKcLanguage } from "../i18n/useKcLanguageTag"; -import { getKcLanguageTagLabel } from "../i18n/KcLanguageTag"; -//NOTE: Aside because we want to be able to import them from node -import { resourcesCommonPath, resourcesPath } from "./urlResourcesPath"; - -const kcCommonContext: KcContext.Common = { - "url": { - "loginAction": "#", - "resourcesPath": `${process.env["PUBLIC_URL"]}/${resourcesPath}`, - "resourcesCommonPath": `${process.env["PUBLIC_URL"]}/${resourcesCommonPath}`, - "loginRestartFlowUrl": "/auth/realms/myrealm/login-actions/restart?client_id=account&tab_id=HoAx28ja4xg", - "loginUrl": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg", - }, - "realm": { - "displayName": "myrealm", - "displayNameHtml": "myrealm", - "internationalizationEnabled": true, - "registrationEmailAsUsername": true, - }, - "locale": { - "supported": [ - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=de", - "languageTag": "de" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=no", - "languageTag": "no" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ru", - "languageTag": "ru" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sv", - "languageTag": "sv" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pt-BR", - "languageTag": "pt-BR" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=lt", - "languageTag": "lt" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=en", - "languageTag": "en" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=it", - "languageTag": "it" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=fr", - "languageTag": "fr" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=zh-CN", - "languageTag": "zh-CN" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=es", - "languageTag": "es" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=cs", - "languageTag": "cs" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ja", - "languageTag": "ja" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sk", - "languageTag": "sk" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pl", - "languageTag": "pl" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ca", - "languageTag": "ca" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=nl", - "languageTag": "nl" - }, - { - "url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=tr", - "languageTag": "tr" - } - ], - "current": null as any - }, - "auth": { - "showUsername": false, - "showResetCredentials": false, - "showTryAnotherWayLink": false - }, - "scripts": [], - "message": { - "type": "success", - "summary": "This is a test message" - }, - "isAppInitiatedAction": false, -}; - -Object.defineProperty( - kcCommonContext.locale!, - "current", - { - "get": () => getKcLanguageTagLabel(getEvtKcLanguage().state), - "enumerable": true - } -); - -export const kcLoginContext: KcContext.Login = { - ...kcCommonContext, - "pageId": "login.ftl", - "url": { - ...kcCommonContext.url, - "loginResetCredentialsUrl": "/auth/realms/myrealm/login-actions/reset-credentials?client_id=account&tab_id=HoAx28ja4xg", - "registrationUrl": "/auth/realms/myrealm/login-actions/registration?client_id=account&tab_id=HoAx28ja4xg" - }, - "realm": { - ...kcCommonContext.realm, - "loginWithEmailAllowed": true, - "rememberMe": true, - "password": true, - "resetPasswordAllowed": true, - "registrationAllowed": true - }, - "auth": kcCommonContext.auth!, - "social": { - "displayInfo": true - }, - "usernameEditDisabled": false, - "login": { - "rememberMe": false - }, - "registrationDisabled": false, -}; - -export const kcRegisterContext: KcContext.Register = { - ...kcCommonContext, - "url": { - ...kcLoginContext.url, - "registrationAction": "http://localhost:8080/auth/realms/myrealm/login-actions/registration?session_code=gwZdUeO7pbYpFTRxiIxRg_QtzMbtFTKrNu6XW_f8asM&execution=12146ce0-b139-4bbd-b25b-0eccfee6577e&client_id=account&tab_id=uS8lYfebLa0" - }, - "messagesPerField": { - "printIfExists": (...[, x]) => x - }, - "scripts": [], - "isAppInitiatedAction": false, - "pageId": "register.ftl", - "register": { - "formData": {} - }, - "passwordRequired": true, - "recaptchaRequired": false, - "authorizedMailDomains": [ - "example.com", - "another-example.com", - "*.yet-another-example.com", - "*.example.com", - "hello-world.com" - ], - "social": { - "displayInfo": true - }, -}; - -export const kcInfoContext: KcContext.Info = { - ...kcCommonContext, - "pageId": "info.ftl", - "messageHeader": "", - "requiredActions": undefined, - "skipLink": false, - "actionUri": "#", - "client": { - "baseUrl": "#" - } -}; - -export const kcErrorContext: KcContext.Error = { - ...kcCommonContext, - "pageId": "error.ftl", - "client": { - "baseUrl": "#" - } -}; - -export const kcLoginResetPasswordContext: KcContext.LoginResetPassword = { - ...kcCommonContext, - "pageId": "login-reset-password.ftl", - "realm": { - ...kcCommonContext.realm, - "loginWithEmailAllowed": false - } -}; - -export const kcLoginVerifyEmailContext: KcContext.LoginVerifyEmail = { - ...kcCommonContext, - "pageId": "login-verify-email.ftl" -}; - -export const kcTermsContext: KcContext.Terms = { - ...kcCommonContext, - "pageId": "terms.ftl" -}; - -export const kcLoginOtpContext: KcContext.LoginOtp = { - ...kcCommonContext, - "pageId": "login-otp.ftl", - "otpLogin": { - "userOtpCredentials": [ - { - "id": "id1", - "userLabel": "label1" - }, - { - "id": "id2", - "userLabel": "label2" - } - ] - } -}; - -export const kcLoginUpdateProfileContext: KcContext.LoginUpdateProfile = { - ...kcCommonContext, - "pageId": "login-update-profile.ftl", - "user": { - "editUsernameAllowed": true, - "username": "anUsername", - "email": "foo@example.com", - "firstName": "aFirstName", - "lastName": "aLastName" - }, - "messagesPerField": { - "printIfExists": () => undefined - } -}; - -export const kcLoginIdpLinkConfirmContext: KcContext.LoginIdpLinkConfirm ={ - ...kcCommonContext, - "pageId": "login-idp-link-confirm.ftl", - "idpAlias": "FranceConnect" -};