diff --git a/src/bin/keycloakify/generateFtl/generateFtl.ts b/src/bin/keycloakify/generateFtl/generateFtl.ts
index 00d8050b..d01e3939 100644
--- a/src/bin/keycloakify/generateFtl/generateFtl.ts
+++ b/src/bin/keycloakify/generateFtl/generateFtl.ts
@@ -4,7 +4,6 @@ import { generateCssCodeToDefineGlobals } from "../replacers/replaceImportsInCss
import { replaceImportsInInlineCssCode } from "../replacers/replaceImportsInInlineCssCode";
import * as fs from "fs";
import { join as pathJoin } from "path";
-import { objectKeys } from "tsafe/objectKeys";
import type { BuildOptions } from "../buildOptions";
import { assert } from "tsafe/assert";
import { type ThemeType, nameOfTheGlobal, basenameOfTheKeycloakifyResourcesDir, resources_common } from "../../constants";
@@ -96,35 +95,20 @@ export function generateFtlFilesCodeFactory(params: {
}
//FTL is no valid html, we can't insert with cheerio, we put placeholder for injecting later.
- const replaceValueBySearchValue = {
- '{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }': fs
- .readFileSync(pathJoin(__dirname, "ftl_object_to_js_code_declaring_an_object.ftl"))
- .toString("utf8")
- .match(/^',
- " #list>",
- "#if>"
- ].join("\n")
- };
+ const ftlObjectToJsCodeDeclaringAnObject = fs
+ .readFileSync(pathJoin(__dirname, "ftl_object_to_js_code_declaring_an_object.ftl"))
+ .toString("utf8")
+ .match(/^",
- "",
- objectKeys(replaceValueBySearchValue)[1]
- ].join("\n")
- );
+ const ftlObjectToJsCodeDeclaringAnObjectPlaceholder = '{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }';
+
+ $("head").prepend([""].join("\n"));
// Remove part of the document marked as ignored.
{
@@ -159,7 +143,7 @@ export function generateFtlFilesCodeFactory(params: {
let ftlCode = $.html();
Object.entries({
- ...replaceValueBySearchValue,
+ [ftlObjectToJsCodeDeclaringAnObjectPlaceholder]: ftlObjectToJsCodeDeclaringAnObject,
"PAGE_ID_xIgLsPgGId9D8e": pageId
}).map(([searchValue, replaceValue]) => (ftlCode = ftlCode.replace(searchValue, replaceValue)));
diff --git a/src/lib/usePrepareTemplate.ts b/src/lib/usePrepareTemplate.ts
index bca15c35..c264480d 100644
--- a/src/lib/usePrepareTemplate.ts
+++ b/src/lib/usePrepareTemplate.ts
@@ -70,6 +70,21 @@ export function usePrepareTemplate(params: {
setReady();
})();
+ return () => {
+ isUnmounted = true;
+ removeArray.forEach(remove => remove());
+ };
+ }, []);
+
+ useEffect(() => {
+ if (!isReady) {
+ return;
+ }
+
+ let isUnmounted = false;
+
+ const removeArray: (() => void)[] = [];
+
scripts.forEach(script => {
const { remove } = headInsert({
"type": "javascript",
@@ -83,7 +98,7 @@ export function usePrepareTemplate(params: {
isUnmounted = true;
removeArray.forEach(remove => remove());
};
- }, []);
+ }, [isReady]);
useSetClassName({
"target": "html",
diff --git a/src/login/Template.tsx b/src/login/Template.tsx
index bbcdd488..eb20a2f2 100644
--- a/src/login/Template.tsx
+++ b/src/login/Template.tsx
@@ -26,7 +26,7 @@ export default function Template(props: TemplateProps) {
const { msg, msgStr, changeLocale, labelBySupportedLanguageTag, currentLanguageTag } = i18n;
- const { realm, locale, auth, url, message, isAppInitiatedAction, authenticationSession } = kcContext;
+ const { realm, locale, auth, url, message, isAppInitiatedAction, authenticationSession, scripts } = kcContext;
const { isReady } = usePrepareTemplate({
"styles": !doUseDefaultCss
@@ -64,7 +64,17 @@ export default function Template(props: TemplateProps) {
].join("\n")
}
}
- ])
+ ]),
+ ...scripts.map(
+ script =>
+ ({
+ "isModule": false,
+ "source": {
+ "type": "url",
+ "src": script
+ }
+ } as const)
+ )
],
"htmlClassName": getClassName("kcHtmlClass"),
"bodyClassName": getClassName("kcBodyClass"),
diff --git a/src/login/kcContext/kcContextMocks.ts b/src/login/kcContext/kcContextMocks.ts
index ca09bb3a..bd6c89c3 100644
--- a/src/login/kcContext/kcContextMocks.ts
+++ b/src/login/kcContext/kcContextMocks.ts
@@ -421,7 +421,8 @@ export const kcContextMocks = [
"context": "REGISTRATION_PROFILE" as const,
attributes,
attributesByName
- }
+ },
+ "scripts": [...registerCommon.scripts, "https://www.google.com/recaptcha/api.js"]
})
];
})(),