import { join as pathJoin, extname as pathExtname, sep as pathSep } from "path"; import { transformCodebase } from "../../tools/transformCodebase"; import type { BuildOptions } from "../../shared/buildOptions"; import { readMetaInfKeycloakThemes, writeMetaInfKeycloakThemes } from "../../shared/metaInfKeycloakThemes"; import { assert } from "tsafe/assert"; export type BuildOptionsLike = { keycloakifyBuildDirPath: string; }; assert(); export function generateSrcMainResourcesForThemeVariant(params: { themeName: string; themeVariantName: string; buildOptions: BuildOptionsLike; }) { const { themeName, themeVariantName, buildOptions } = params; const mainThemeDirPath = pathJoin( buildOptions.keycloakifyBuildDirPath, "src", "main", "resources", "theme", themeName ); transformCodebase({ srcDirPath: mainThemeDirPath, destDirPath: pathJoin(mainThemeDirPath, "..", themeVariantName), transformSourceCode: ({ fileRelativePath, sourceCode }) => { if ( pathExtname(fileRelativePath) === ".ftl" && fileRelativePath.split(pathSep).length === 2 ) { const modifiedSourceCode = Buffer.from( Buffer.from(sourceCode) .toString("utf-8") .replace( `out["themeName"] = "${themeName}";`, `out["themeName"] = "${themeVariantName}";` ), "utf8" ); assert(Buffer.compare(modifiedSourceCode, sourceCode) !== 0); return { modifiedSourceCode }; } return { modifiedSourceCode: sourceCode }; } }); { const updatedMetaInfKeycloakThemes = readMetaInfKeycloakThemes({ keycloakifyBuildDirPath: buildOptions.keycloakifyBuildDirPath }); updatedMetaInfKeycloakThemes.themes.push({ name: themeVariantName, types: (() => { const theme = updatedMetaInfKeycloakThemes.themes.find( ({ name }) => name === themeName ); assert(theme !== undefined); return theme.types; })() }); writeMetaInfKeycloakThemes({ keycloakifyBuildDirPath: buildOptions.keycloakifyBuildDirPath, metaInfKeycloakThemes: updatedMetaInfKeycloakThemes }); } }