From 1cb5dd461bc621192a3382753e1fb9b2b481dd26 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 22 Mar 2021 19:40:38 +0100 Subject: [PATCH] support homepage with urlPath --- .../build-keycloak-theme/generateFtl/index.ts | 24 ++++++++++++------- .../generateKeycloakThemeResources.ts | 6 +++-- src/bin/build-keycloak-theme/index.ts | 12 +++++++++- .../replaceImportFromStatic.ts | 9 +++---- src/test/generateKeycloakThemeResources.ts | 5 ++-- src/test/replaceImportFromStatic.ts | 2 +- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/bin/build-keycloak-theme/generateFtl/index.ts b/src/bin/build-keycloak-theme/generateFtl/index.ts index 79eddf5d..45543d73 100644 --- a/src/bin/build-keycloak-theme/generateFtl/index.ts +++ b/src/bin/build-keycloak-theme/generateFtl/index.ts @@ -11,9 +11,9 @@ import { objectKeys } from "evt/tools/typeSafety/objectKeys"; export const pageIds = ["login.ftl", "register.ftl", "info.ftl", "error.ftl", "login-reset-password.ftl", "login-verify-email.ftl"] as const; -export type PageId = typeof pageIds[number]; +export type PageId = typeof pageIds[number]; -function loadAdjacentFile(fileBasename: string){ +function loadAdjacentFile(fileBasename: string) { return fs.readFileSync(pathJoin(__dirname, fileBasename)) .toString("utf8"); }; @@ -34,10 +34,11 @@ export function generateFtlFilesCodeFactory( ftlValuesGlobalName: string; cssGlobalsToDefine: Record; indexHtmlCode: string; + urlPathname: string; } ) { - const { ftlValuesGlobalName, cssGlobalsToDefine, indexHtmlCode } = params; + const { ftlValuesGlobalName, cssGlobalsToDefine, indexHtmlCode, urlPathname } = params; const $ = cheerio.load(indexHtmlCode); @@ -60,11 +61,17 @@ export function generateFtlFilesCodeFactory( const href = $(element).attr(attrName); - if (!href?.startsWith("/")) { + if (href === undefined) { return; } - $(element).attr(attrName, "${url.resourcesPath}/build" + href); + $(element).attr( + attrName, + href.replace( + new RegExp(`^${urlPathname.replace(/\//g, "\\/")}`), + "${url.resourcesPath}/build/" + ) + ); }) ); @@ -89,9 +96,10 @@ export function generateFtlFilesCodeFactory( ...(Object.keys(cssGlobalsToDefine).length === 0 ? [] : [ '', '', '' ]), diff --git a/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts b/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts index 54573ddc..b270bc4f 100644 --- a/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts +++ b/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts @@ -16,13 +16,14 @@ import { isInside } from "../tools/isInside"; export function generateKeycloakThemeResources( params: { + urlPathname: string; themeName: string; reactAppBuildDirPath: string; keycloakThemeBuildingDirPath: string; } ) { - const { themeName, reactAppBuildDirPath, keycloakThemeBuildingDirPath } = params; + const { themeName, reactAppBuildDirPath, keycloakThemeBuildingDirPath, urlPathname } = params; const themeDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme", themeName, "login"); @@ -80,7 +81,8 @@ export function generateKeycloakThemeResources( ftlValuesGlobalName, "indexHtmlCode": fs.readFileSync( pathJoin(reactAppBuildDirPath, "index.html") - ).toString("utf8") + ).toString("utf8"), + urlPathname }); pageIds.forEach(pageId => { diff --git a/src/bin/build-keycloak-theme/index.ts b/src/bin/build-keycloak-theme/index.ts index 1226c1c3..390b567b 100644 --- a/src/bin/build-keycloak-theme/index.ts +++ b/src/bin/build-keycloak-theme/index.ts @@ -6,6 +6,7 @@ import type { ParsedPackageJson } from "./generateJavaStackFiles"; import { join as pathJoin, relative as pathRelative, basename as pathBasename } from "path"; import * as child_process from "child_process"; import { generateDebugFiles, containerLaunchScriptBasename } from "./generateDebugFiles"; +import { URL } from "url"; const reactProjectDirPath = process.cwd(); @@ -22,7 +23,16 @@ if (require.main === module) { generateKeycloakThemeResources({ keycloakThemeBuildingDirPath, "reactAppBuildDirPath": pathJoin(reactProjectDirPath, "build"), - "themeName": parsedPackageJson.name + "themeName": parsedPackageJson.name, + "urlPathname": (()=>{ + + const { homepage } = parsedPackageJson; + + return homepage === undefined ? + "/" : + new URL(homepage).pathname.replace(/([^/])$/, "$1/"); + + })() }); const { jarFilePath } = generateJavaStackFiles({ diff --git a/src/bin/build-keycloak-theme/replaceImportFromStatic.ts b/src/bin/build-keycloak-theme/replaceImportFromStatic.ts index 6673e2fb..97260173 100644 --- a/src/bin/build-keycloak-theme/replaceImportFromStatic.ts +++ b/src/bin/build-keycloak-theme/replaceImportFromStatic.ts @@ -11,8 +11,8 @@ export function replaceImportFromStaticInJsCode( const { jsCode, ftlValuesGlobalName } = params; const fixedJsCode = jsCode!.replace( - /"static\//g, - `window.${ftlValuesGlobalName}.url.resourcesPath.replace(/^\\//,"") + "/build/static/` + / [^ ]+"static\//g, + ` window.${ftlValuesGlobalName}.url.resourcesPath + "/build/static/` ); return { fixedJsCode }; @@ -60,12 +60,13 @@ export function replaceImportFromStaticInCssCode( export function generateCssCodeToDefineGlobals( params: { cssGlobalsToDefine: Record; + urlPathname: string; } ): { cssCodeToPrependInHead: string; } { - const { cssGlobalsToDefine } = params; + const { cssGlobalsToDefine, urlPathname } = params; return { "cssCodeToPrependInHead": [ @@ -74,7 +75,7 @@ export function generateCssCodeToDefineGlobals( .map(cssVariableName => [ `--${cssVariableName}:`, cssGlobalsToDefine[cssVariableName] - .replace(/url\(/g, "url(${url.resourcesPath}/build") + .replace(new RegExp(`url\\(${urlPathname.replace(/\//g,"\\/")}`, "g"),"url(${url.resourcesPath}/build/") ].join(" ")) .map(line => ` ${line};`), "}" diff --git a/src/test/generateKeycloakThemeResources.ts b/src/test/generateKeycloakThemeResources.ts index f0835181..b2caed85 100644 --- a/src/test/generateKeycloakThemeResources.ts +++ b/src/test/generateKeycloakThemeResources.ts @@ -9,8 +9,9 @@ import { setupSampleReactProject(); generateKeycloakThemeResources({ - "themeName": "onyxia-ui", + "themeName": "keycloakify-demo-app", "reactAppBuildDirPath": pathJoin(sampleReactProjectDirPath, "build"), - "keycloakThemeBuildingDirPath": pathJoin(sampleReactProjectDirPath, "build_keycloak_theme") + "keycloakThemeBuildingDirPath": pathJoin(sampleReactProjectDirPath, "build_keycloak_theme"), + "urlPathname": "/keycloakify-demo-app/" }); diff --git a/src/test/replaceImportFromStatic.ts b/src/test/replaceImportFromStatic.ts index a4b17b78..396d75d1 100644 --- a/src/test/replaceImportFromStatic.ts +++ b/src/test/replaceImportFromStatic.ts @@ -45,6 +45,6 @@ const { fixedCssCode, cssGlobalsToDefine } = replaceImportFromStaticInCssCode({ console.log({ fixedCssCode, cssGlobalsToDefine }); -const { cssCodeToPrependInHead } = generateCssCodeToDefineGlobals({ cssGlobalsToDefine }); +const { cssCodeToPrependInHead } = generateCssCodeToDefineGlobals({ cssGlobalsToDefine, "urlPathname": "/" }); console.log({ cssCodeToPrependInHead }); \ No newline at end of file