From 78517164d489231894e87fdcc072b395b849b8fb Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 13 May 2024 00:40:16 +0200 Subject: [PATCH] Done with multi target build --- src/bin/keycloakify/buildJars/buildJar.ts | 115 ++++++++++++++++-- src/bin/keycloakify/buildJars/buildJars.ts | 13 +- src/bin/keycloakify/buildJars/generatePom.ts | 10 +- .../generateStartKeycloakTestingContainer.ts | 7 +- .../generateTheme/bringInAccountV1.ts | 7 +- 5 files changed, 118 insertions(+), 34 deletions(-) diff --git a/src/bin/keycloakify/buildJars/buildJar.ts b/src/bin/keycloakify/buildJars/buildJar.ts index 981fcc20..9ae7ae9f 100644 --- a/src/bin/keycloakify/buildJars/buildJar.ts +++ b/src/bin/keycloakify/buildJars/buildJar.ts @@ -1,21 +1,116 @@ -import { assert, type Equals } from "tsafe/assert"; -import { exclude } from "tsafe/exclude"; +import { assert } from "tsafe/assert"; import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions"; +import { join as pathJoin } from "path"; +import { transformCodebase } from "../../tools/transformCodebase"; +import type { BuildOptions } from "../buildOptions"; +import * as fs from "fs/promises"; +import { accountV1ThemeName } from "../../constants"; +import { generatePom, BuildOptionsLike as BuildOptionsLike_generatePom } from "./generatePom"; +import { existsSync } from "fs"; +import { isInside } from "../../tools/isInside"; +import child_process from "child_process"; + +export type BuildOptionsLike = BuildOptionsLike_generatePom & { + keycloakifyBuildDirPath: string; + themeNames: string[]; + artifactId: string; + themeVersion: string; +}; + +assert(); export async function buildJar(params: { jarFileBasename: string; keycloakAccountV1Version: KeycloakAccountV1Version; keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion; - buildOptions: { - keycloakifyBuildDirPath: string; - }; + buildOptions: BuildOptionsLike; }): Promise { - { - const { pomFileCode } = generatePom({ buildOptions }); + const { jarFileBasename, keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, buildOptions } = params; - fs.writeFileSync(pathJoin(buildOptions.keycloakifyBuildDirPath, "pom.xml"), Buffer.from(pomFileCode, "utf8")); + const keycloakifyBuildTmpDirPath = pathJoin(buildOptions.keycloakifyBuildDirPath, "..", jarFileBasename.replace(".jar", "")); + + { + if (!existsSync(buildOptions.keycloakifyBuildDirPath)) { + await fs.mkdir(buildOptions.keycloakifyBuildDirPath, { "recursive": true }); + } + + await fs.writeFile(pathJoin(buildOptions.keycloakifyBuildDirPath, ".gitignore"), Buffer.from("*", "utf8")); } - child_process.execSync("mvn clean install", { "cwd": buildOptions.keycloakifyBuildDirPath }); - // TODO: Implement + { + const srcMainResourcesRelativeDirPath = pathJoin("src", "main", "resources"); + + const keycloakThemesJsonFilePath = pathJoin(srcMainResourcesRelativeDirPath, "META-INF", "keycloak-themes.json"); + + const themePropertiesFilePathSet = new Set( + ...buildOptions.themeNames.map(themeName => pathJoin(srcMainResourcesRelativeDirPath, "themes", themeName, "account", "theme.properties")) + ); + + const accountV1RelativeDirPath = pathJoin(srcMainResourcesRelativeDirPath, "themes", accountV1ThemeName); + + transformCodebase({ + "srcDirPath": buildOptions.keycloakifyBuildDirPath, + "destDirPath": keycloakifyBuildTmpDirPath, + "transformSourceCode": + keycloakAccountV1Version !== null + ? undefined + : ({ fileRelativePath, sourceCode }) => { + if (fileRelativePath === keycloakThemesJsonFilePath) { + const keycloakThemesJsonParsed = JSON.parse(sourceCode.toString("utf8")) as { + themes: { name: string; types: string[] }[]; + }; + + keycloakThemesJsonParsed.themes = keycloakThemesJsonParsed.themes.filter(({ name }) => name !== accountV1ThemeName); + + return { "modifiedSourceCode": Buffer.from(JSON.stringify(keycloakThemesJsonParsed, null, 2), "utf8") }; + } + + if (isInside({ "dirPath": "target", "filePath": fileRelativePath })) { + return undefined; + } + + if (isInside({ "dirPath": accountV1RelativeDirPath, "filePath": fileRelativePath })) { + return undefined; + } + + if (themePropertiesFilePathSet.has(fileRelativePath)) { + return { + "modifiedSourceCode": Buffer.from( + sourceCode.toString("utf8").replace(`parent=${accountV1ThemeName}`, "parent=keycloak"), + "utf8" + ) + }; + } + + return { "modifiedSourceCode": sourceCode }; + } + }); + } + + { + const { pomFileCode } = generatePom({ + buildOptions, + keycloakAccountV1Version, + keycloakThemeAdditionalInfoExtensionVersion + }); + + await fs.writeFile(pathJoin(buildOptions.keycloakifyBuildDirPath, "pom.xml"), Buffer.from(pomFileCode, "utf8")); + } + + await new Promise((resolve, reject) => + child_process.exec("mvn clean install", { "cwd": keycloakifyBuildTmpDirPath }, error => { + if (error !== null) { + reject(error); + return; + } + resolve(); + }) + ); + + await fs.rename( + pathJoin(keycloakifyBuildTmpDirPath, "target", `${buildOptions.artifactId}-${buildOptions.themeVersion}.jar`), + pathJoin(buildOptions.keycloakifyBuildDirPath, jarFileBasename) + ); + + await fs.rm(keycloakifyBuildTmpDirPath, { "recursive": true }); } diff --git a/src/bin/keycloakify/buildJars/buildJars.ts b/src/bin/keycloakify/buildJars/buildJars.ts index f4c1ed44..4e6707d6 100644 --- a/src/bin/keycloakify/buildJars/buildJars.ts +++ b/src/bin/keycloakify/buildJars/buildJars.ts @@ -2,13 +2,18 @@ import { assert } from "tsafe/assert"; import { exclude } from "tsafe/exclude"; import { keycloakAccountV1Versions, keycloakThemeAdditionalInfoExtensionVersions } from "./extensionVersions"; import { getKeycloakVersionRangeForJar } from "./getKeycloakVersionRangeForJar"; -import { buildJar } from "./buildJar"; +import { buildJar, BuildOptionsLike as BuildOptionsLike_buildJar } from "./buildJar"; +import type { BuildOptions } from "../buildOptions"; + +export type BuildOptionsLike = BuildOptionsLike_buildJar & { + keycloakifyBuildDirPath: string; +}; + +assert(); export async function buildJars(params: { doesImplementAccountTheme: boolean; - buildOptions: { - keycloakifyBuildDirPath: string; - }; + buildOptions: BuildOptionsLike; }): Promise<{ lastJarFileBasename: string }> { const { doesImplementAccountTheme, buildOptions } = params; diff --git a/src/bin/keycloakify/buildJars/generatePom.ts b/src/bin/keycloakify/buildJars/generatePom.ts index 8faea660..b0ab93c3 100644 --- a/src/bin/keycloakify/buildJars/generatePom.ts +++ b/src/bin/keycloakify/buildJars/generatePom.ts @@ -1,24 +1,18 @@ import { assert } from "tsafe/assert"; -import { Reflect } from "tsafe/Reflect"; import type { BuildOptions } from "../buildOptions"; import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions"; -type BuildOptionsLike = { +export type BuildOptionsLike = { groupId: string; artifactId: string; themeVersion: string; }; -{ - const buildOptions = Reflect(); - - assert(); -} +assert(); export function generatePom(params: { keycloakAccountV1Version: KeycloakAccountV1Version; keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion; - buildOptions: BuildOptionsLike; }) { const { keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, buildOptions } = params; diff --git a/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts b/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts index 90f73c08..0aeb1800 100644 --- a/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +++ b/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts @@ -1,18 +1,13 @@ import * as fs from "fs"; import { join as pathJoin, relative as pathRelative, basename as pathBasename } from "path"; import { assert } from "tsafe/assert"; -import { Reflect } from "tsafe/Reflect"; import type { BuildOptions } from "./buildOptions"; export type BuildOptionsLike = { keycloakifyBuildDirPath: string; }; -{ - const buildOptions = Reflect(); - - assert(); -} +assert(); generateStartKeycloakTestingContainer.basename = "start_keycloak_testing_container.sh"; diff --git a/src/bin/keycloakify/generateTheme/bringInAccountV1.ts b/src/bin/keycloakify/generateTheme/bringInAccountV1.ts index d8cfafc2..d76adaef 100644 --- a/src/bin/keycloakify/generateTheme/bringInAccountV1.ts +++ b/src/bin/keycloakify/generateTheme/bringInAccountV1.ts @@ -1,7 +1,6 @@ import * as fs from "fs"; import { join as pathJoin } from "path"; import { assert } from "tsafe/assert"; -import { Reflect } from "tsafe/Reflect"; import type { BuildOptions } from "../buildOptions"; import { resources_common, lastKeycloakVersionWithAccountV1, accountV1ThemeName } from "../../constants"; import { downloadBuiltinKeycloakTheme } from "../../download-builtin-keycloak-theme"; @@ -13,11 +12,7 @@ type BuildOptionsLike = { npmWorkspaceRootDirPath: string; }; -{ - const buildOptions = Reflect(); - - assert(); -} +assert(); export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike; srcMainResourcesDirPath: string }) { const { buildOptions, srcMainResourcesDirPath } = params;