diff --git a/src/bin/build-keycloak-theme/generateFtl/generateFtl.ts b/src/bin/build-keycloak-theme/generateFtl/generateFtl.ts
new file mode 100644
index 00000000..2ca60ffe
--- /dev/null
+++ b/src/bin/build-keycloak-theme/generateFtl/generateFtl.ts
@@ -0,0 +1,193 @@
+
+
+import cheerio from "cheerio";
+import {
+ replaceImportsFromStaticInJsCode,
+ replaceImportsInInlineCssCode,
+ generateCssCodeToDefineGlobals
+} from "../replaceImportFromStatic";
+import fs from "fs";
+import { join as pathJoin } from "path";
+import { objectKeys } from "evt/tools/typeSafety/objectKeys";
+import { ftlValuesGlobalName } from "../ftlValuesGlobalName";
+
+export const pageIds = [
+ "login.ftl", "register.ftl", "info.ftl",
+ "error.ftl", "login-reset-password.ftl",
+ "login-verify-email.ftl", "terms.ftl",
+ "login-otp.ftl", "login-update-profile.ftl",
+ "login-idp-link-confirm.ftl"
+] as const;
+
+export type PageId = typeof pageIds[number];
+
+function loadAdjacentFile(fileBasename: string) {
+ return fs.readFileSync(pathJoin(__dirname, fileBasename))
+ .toString("utf8");
+};
+
+function loadFtlFile(ftlFileBasename: PageId | "common.ftl") {
+ try {
+
+ return loadAdjacentFile(ftlFileBasename)
+ .match(/^',
+ ' #list>',
+ '#if>'
+ ].join("\n")
+ };
+
+ const pageSpecificCodePlaceholder = "";
+
+ $("head").prepend(
+ [
+ ...(Object.keys(cssGlobalsToDefine).length === 0 ? [] : [
+ '',
+ '',
+ ''
+ ]),
+ ...["Object.deepAssign.js", "String.htmlUnescape.js"].map(
+ fileBasename => [
+ ""
+ ].join("\n")
+ ),
+ '',
+ '',
+ pageSpecificCodePlaceholder,
+ '',
+ objectKeys(ftlCommonPlaceholders)[1]
+ ].join("\n"),
+ );
+
+ const partiallyFixedIndexHtmlCode = $.html();
+
+ function generateFtlFilesCode(
+ params: {
+ pageId: PageId;
+ }
+ ): { ftlCode: string; } {
+
+ const { pageId } = params;
+
+ const $ = cheerio.load(partiallyFixedIndexHtmlCode);
+
+ const ftlPlaceholders = {
+ '{ "x": "kxOlLqMeOed9sdLdIdOxd444" }': loadFtlFile(pageId),
+ ...ftlCommonPlaceholders
+ };
+
+ let ftlCode = $.html()
+ .replace(
+ pageSpecificCodePlaceholder,
+ [
+ ''
+ ].join("\n")
+ );
+
+ objectKeys(ftlPlaceholders)
+ .forEach(id => ftlCode = ftlCode.replace(id, ftlPlaceholders[id]));
+
+ return { ftlCode };
+
+ }
+
+ return { generateFtlFilesCode };
+
+
+}
\ No newline at end of file
diff --git a/src/bin/build-keycloak-theme/generateFtl/index.ts b/src/bin/build-keycloak-theme/generateFtl/index.ts
index 2ca60ffe..de891f55 100644
--- a/src/bin/build-keycloak-theme/generateFtl/index.ts
+++ b/src/bin/build-keycloak-theme/generateFtl/index.ts
@@ -1,193 +1 @@
-
-
-import cheerio from "cheerio";
-import {
- replaceImportsFromStaticInJsCode,
- replaceImportsInInlineCssCode,
- generateCssCodeToDefineGlobals
-} from "../replaceImportFromStatic";
-import fs from "fs";
-import { join as pathJoin } from "path";
-import { objectKeys } from "evt/tools/typeSafety/objectKeys";
-import { ftlValuesGlobalName } from "../ftlValuesGlobalName";
-
-export const pageIds = [
- "login.ftl", "register.ftl", "info.ftl",
- "error.ftl", "login-reset-password.ftl",
- "login-verify-email.ftl", "terms.ftl",
- "login-otp.ftl", "login-update-profile.ftl",
- "login-idp-link-confirm.ftl"
-] as const;
-
-export type PageId = typeof pageIds[number];
-
-function loadAdjacentFile(fileBasename: string) {
- return fs.readFileSync(pathJoin(__dirname, fileBasename))
- .toString("utf8");
-};
-
-function loadFtlFile(ftlFileBasename: PageId | "common.ftl") {
- try {
-
- return loadAdjacentFile(ftlFileBasename)
- .match(/^',
- ' #list>',
- '#if>'
- ].join("\n")
- };
-
- const pageSpecificCodePlaceholder = "";
-
- $("head").prepend(
- [
- ...(Object.keys(cssGlobalsToDefine).length === 0 ? [] : [
- '',
- '',
- ''
- ]),
- ...["Object.deepAssign.js", "String.htmlUnescape.js"].map(
- fileBasename => [
- ""
- ].join("\n")
- ),
- '',
- '',
- pageSpecificCodePlaceholder,
- '',
- objectKeys(ftlCommonPlaceholders)[1]
- ].join("\n"),
- );
-
- const partiallyFixedIndexHtmlCode = $.html();
-
- function generateFtlFilesCode(
- params: {
- pageId: PageId;
- }
- ): { ftlCode: string; } {
-
- const { pageId } = params;
-
- const $ = cheerio.load(partiallyFixedIndexHtmlCode);
-
- const ftlPlaceholders = {
- '{ "x": "kxOlLqMeOed9sdLdIdOxd444" }': loadFtlFile(pageId),
- ...ftlCommonPlaceholders
- };
-
- let ftlCode = $.html()
- .replace(
- pageSpecificCodePlaceholder,
- [
- ''
- ].join("\n")
- );
-
- objectKeys(ftlPlaceholders)
- .forEach(id => ftlCode = ftlCode.replace(id, ftlPlaceholders[id]));
-
- return { ftlCode };
-
- }
-
- return { generateFtlFilesCode };
-
-
-}
\ No newline at end of file
+export * from "./generateFtl";
\ No newline at end of file