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"
-};