From 5816f25c3e6e8753a75d9563e7989902b20f4a9d Mon Sep 17 00:00:00 2001 From: garronej Date: Thu, 27 Apr 2023 11:52:02 +0200 Subject: [PATCH] #334 --- src/account/kcContext/KcContext.ts | 16 ++++++++++++++-- src/account/kcContext/createGetKcContext.ts | 4 +--- src/account/kcContext/kcContextMocks.ts | 1 + ...ftl_object_to_js_code_declaring_an_object.ftl | 1 + src/bin/keycloakify/generateFtl/generateFtl.ts | 6 ++++-- .../keycloakify/generateTheme/generateTheme.ts | 3 ++- src/login/kcContext/KcContext.ts | 5 ++++- src/login/kcContext/createGetKcContext.ts | 3 +-- src/login/kcContext/kcContextMocks.ts | 1 + 9 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/account/kcContext/KcContext.ts b/src/account/kcContext/KcContext.ts index a18730a4..6e57c97e 100644 --- a/src/account/kcContext/KcContext.ts +++ b/src/account/kcContext/KcContext.ts @@ -1,4 +1,4 @@ -import type { AccountThemePageId } from "keycloakify/bin/keycloakify/generateFtl"; +import type { AccountThemePageId, ThemeType } from "keycloakify/bin/keycloakify/generateFtl"; import { assert } from "tsafe/assert"; import type { Equals } from "tsafe"; @@ -7,6 +7,7 @@ export type KcContext = KcContext.Password | KcContext.Account; export declare namespace KcContext { export type Common = { keycloakifyVersion: string; + themeType: "account"; locale?: { supported: { url: string; @@ -84,4 +85,15 @@ export declare namespace KcContext { }; } -assert>(); +{ + type Got = KcContext["pageId"]; + type Expected = AccountThemePageId; + + type OnlyInGot = Exclude; + type OnlyInExpected = Exclude; + + assert>(); + assert>(); +} + +assert(); diff --git a/src/account/kcContext/createGetKcContext.ts b/src/account/kcContext/createGetKcContext.ts index 006ef5de..c2063b2b 100644 --- a/src/account/kcContext/createGetKcContext.ts +++ b/src/account/kcContext/createGetKcContext.ts @@ -7,8 +7,6 @@ import { pathBasename } from "keycloakify/tools/pathBasename"; import { resourcesCommonDirPathRelativeToPublicDir } from "keycloakify/bin/mockTestingResourcesPath"; import { symToStr } from "tsafe/symToStr"; import { kcContextMocks, kcContextCommonMock } from "keycloakify/account/kcContext/kcContextMocks"; -import { id } from "tsafe/id"; -import { accountThemePageIds } from "keycloakify/bin/keycloakify/generateFtl/pageId"; export function createGetKcContext(params?: { mockData?: readonly DeepPartial>[]; @@ -87,7 +85,7 @@ export function createGetKcContext(accountThemePageIds).indexOf(realKcContext.pageId) < 0 && !("account" in realKcContext)) { + if (realKcContext.themeType !== "account") { return { "kcContext": undefined as any }; } diff --git a/src/account/kcContext/kcContextMocks.ts b/src/account/kcContext/kcContextMocks.ts index 821f94b5..d6a82495 100644 --- a/src/account/kcContext/kcContextMocks.ts +++ b/src/account/kcContext/kcContextMocks.ts @@ -8,6 +8,7 @@ const PUBLIC_URL = process.env["PUBLIC_URL"] ?? "/"; export const kcContextCommonMock: KcContext.Common = { "keycloakifyVersion": "0.0.0", + "themeType": "account", "url": { "resourcesPath": pathJoin(PUBLIC_URL, resourcesDirPathRelativeToPublicDir), "resourcesCommonPath": pathJoin(PUBLIC_URL, resourcesCommonDirPathRelativeToPublicDir), diff --git a/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl b/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl index ddd73476..3bae6ca8 100644 --- a/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +++ b/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl @@ -121,6 +121,7 @@ out["keycloakifyVersion"] = "KEYCLOAKIFY_VERSION_xEdKd3xEdr"; out["themeVersion"] = "KEYCLOAKIFY_THEME_VERSION_sIgKd3xEdr3dx"; + out["themeType"] = "KEYCLOAKIFY_THEME_TYPE_dExKd3xEdr"; out["pageId"] = "${pageId}"; return out; diff --git a/src/bin/keycloakify/generateFtl/generateFtl.ts b/src/bin/keycloakify/generateFtl/generateFtl.ts index be79ef37..a227e682 100644 --- a/src/bin/keycloakify/generateFtl/generateFtl.ts +++ b/src/bin/keycloakify/generateFtl/generateFtl.ts @@ -55,8 +55,9 @@ export function generateFtlFilesCodeFactory(params: { cssGlobalsToDefine: Record; buildOptions: BuildOptionsLike; keycloakifyVersion: string; + themeType: ThemeType; }) { - const { cssGlobalsToDefine, indexHtmlCode, buildOptions, keycloakifyVersion } = params; + const { cssGlobalsToDefine, indexHtmlCode, buildOptions, keycloakifyVersion, themeType } = params; const $ = cheerio.load(indexHtmlCode); @@ -132,7 +133,8 @@ export function generateFtlFilesCodeFactory(params: { buildOptions.customUserAttributes.length === 0 ? "" : ", " + buildOptions.customUserAttributes.map(name => `"${name}"`).join(", ") ) .replace("KEYCLOAKIFY_VERSION_xEdKd3xEdr", keycloakifyVersion) - .replace("KEYCLOAKIFY_THEME_VERSION_sIgKd3xEdr3dx", buildOptions.themeVersion), + .replace("KEYCLOAKIFY_THEME_VERSION_sIgKd3xEdr3dx", buildOptions.themeVersion) + .replace("KEYCLOAKIFY_THEME_TYPE_dExKd3xEdr", themeType), "": [ "<#if scripts??>", " <#list scripts as script>", diff --git a/src/bin/keycloakify/generateTheme/generateTheme.ts b/src/bin/keycloakify/generateTheme/generateTheme.ts index 839fe198..5ada9e26 100644 --- a/src/bin/keycloakify/generateTheme/generateTheme.ts +++ b/src/bin/keycloakify/generateTheme/generateTheme.ts @@ -141,7 +141,8 @@ export async function generateTheme(params: { "indexHtmlCode": fs.readFileSync(pathJoin(reactAppBuildDirPath, "index.html")).toString("utf8"), "cssGlobalsToDefine": allCssGlobalsToDefine, buildOptions, - keycloakifyVersion + keycloakifyVersion, + themeType }); return generateFtlFilesCode; diff --git a/src/login/kcContext/KcContext.ts b/src/login/kcContext/KcContext.ts index 9766d0ea..50a92bfd 100644 --- a/src/login/kcContext/KcContext.ts +++ b/src/login/kcContext/KcContext.ts @@ -1,4 +1,4 @@ -import type { LoginThemePageId } from "keycloakify/bin/keycloakify/generateFtl"; +import type { LoginThemePageId, ThemeType } from "keycloakify/bin/keycloakify/generateFtl"; import { assert } from "tsafe/assert"; import type { Equals } from "tsafe"; import type { MessageKey } from "../i18n/i18n"; @@ -38,6 +38,7 @@ export type KcContext = export declare namespace KcContext { export type Common = { keycloakifyVersion: string; + themeType: "login"; url: { loginAction: string; resourcesPath: string; @@ -564,3 +565,5 @@ export declare namespace Validators { assert>(); assert>(); } + +assert(); diff --git a/src/login/kcContext/createGetKcContext.ts b/src/login/kcContext/createGetKcContext.ts index e4a96e14..5f0dd6a7 100644 --- a/src/login/kcContext/createGetKcContext.ts +++ b/src/login/kcContext/createGetKcContext.ts @@ -11,7 +11,6 @@ import { pathJoin } from "keycloakify/bin/tools/pathJoin"; import { pathBasename } from "keycloakify/tools/pathBasename"; import { resourcesCommonDirPathRelativeToPublicDir } from "keycloakify/bin/mockTestingResourcesPath"; import { symToStr } from "tsafe/symToStr"; -import { loginThemePageIds } from "keycloakify/bin/keycloakify/generateFtl/pageId"; export function createGetKcContext(params?: { mockData?: readonly DeepPartial>[]; @@ -145,7 +144,7 @@ export function createGetKcContext(loginThemePageIds).indexOf(realKcContext.pageId) < 0 && !("login" in realKcContext)) { + if (realKcContext.themeType !== "login") { return { "kcContext": undefined as any }; } diff --git a/src/login/kcContext/kcContextMocks.ts b/src/login/kcContext/kcContextMocks.ts index 94fdbd71..359df1e9 100644 --- a/src/login/kcContext/kcContextMocks.ts +++ b/src/login/kcContext/kcContextMocks.ts @@ -104,6 +104,7 @@ const attributesByName = Object.fromEntries(attributes.map(attribute => [attribu export const kcContextCommonMock: KcContext.Common = { "keycloakifyVersion": "0.0.0", + "themeType": "login", "url": { "loginAction": "#", "resourcesPath": pathJoin(PUBLIC_URL, resourcesDirPathRelativeToPublicDir),