Done with multi target build
This commit is contained in:
parent
3ad694d4de
commit
78517164d4
@ -1,21 +1,116 @@
|
|||||||
import { assert, type Equals } from "tsafe/assert";
|
import { assert } from "tsafe/assert";
|
||||||
import { exclude } from "tsafe/exclude";
|
|
||||||
import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions";
|
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<BuildOptions extends BuildOptionsLike ? true : false>();
|
||||||
|
|
||||||
export async function buildJar(params: {
|
export async function buildJar(params: {
|
||||||
jarFileBasename: string;
|
jarFileBasename: string;
|
||||||
keycloakAccountV1Version: KeycloakAccountV1Version;
|
keycloakAccountV1Version: KeycloakAccountV1Version;
|
||||||
keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion;
|
keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion;
|
||||||
buildOptions: {
|
buildOptions: BuildOptionsLike;
|
||||||
keycloakifyBuildDirPath: string;
|
|
||||||
};
|
|
||||||
}): Promise<void> {
|
}): Promise<void> {
|
||||||
{
|
const { jarFileBasename, keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, buildOptions } = params;
|
||||||
const { pomFileCode } = generatePom({ buildOptions });
|
|
||||||
|
|
||||||
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<void>((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 });
|
||||||
}
|
}
|
||||||
|
@ -2,13 +2,18 @@ import { assert } from "tsafe/assert";
|
|||||||
import { exclude } from "tsafe/exclude";
|
import { exclude } from "tsafe/exclude";
|
||||||
import { keycloakAccountV1Versions, keycloakThemeAdditionalInfoExtensionVersions } from "./extensionVersions";
|
import { keycloakAccountV1Versions, keycloakThemeAdditionalInfoExtensionVersions } from "./extensionVersions";
|
||||||
import { getKeycloakVersionRangeForJar } from "./getKeycloakVersionRangeForJar";
|
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<BuildOptions extends BuildOptionsLike ? true : false>();
|
||||||
|
|
||||||
export async function buildJars(params: {
|
export async function buildJars(params: {
|
||||||
doesImplementAccountTheme: boolean;
|
doesImplementAccountTheme: boolean;
|
||||||
buildOptions: {
|
buildOptions: BuildOptionsLike;
|
||||||
keycloakifyBuildDirPath: string;
|
|
||||||
};
|
|
||||||
}): Promise<{ lastJarFileBasename: string }> {
|
}): Promise<{ lastJarFileBasename: string }> {
|
||||||
const { doesImplementAccountTheme, buildOptions } = params;
|
const { doesImplementAccountTheme, buildOptions } = params;
|
||||||
|
|
||||||
|
@ -1,24 +1,18 @@
|
|||||||
import { assert } from "tsafe/assert";
|
import { assert } from "tsafe/assert";
|
||||||
import { Reflect } from "tsafe/Reflect";
|
|
||||||
import type { BuildOptions } from "../buildOptions";
|
import type { BuildOptions } from "../buildOptions";
|
||||||
import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions";
|
import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions";
|
||||||
|
|
||||||
type BuildOptionsLike = {
|
export type BuildOptionsLike = {
|
||||||
groupId: string;
|
groupId: string;
|
||||||
artifactId: string;
|
artifactId: string;
|
||||||
themeVersion: string;
|
themeVersion: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
assert<BuildOptions extends BuildOptionsLike ? true : false>();
|
||||||
const buildOptions = Reflect<BuildOptions>();
|
|
||||||
|
|
||||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
|
||||||
}
|
|
||||||
|
|
||||||
export function generatePom(params: {
|
export function generatePom(params: {
|
||||||
keycloakAccountV1Version: KeycloakAccountV1Version;
|
keycloakAccountV1Version: KeycloakAccountV1Version;
|
||||||
keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion;
|
keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion;
|
||||||
|
|
||||||
buildOptions: BuildOptionsLike;
|
buildOptions: BuildOptionsLike;
|
||||||
}) {
|
}) {
|
||||||
const { keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, buildOptions } = params;
|
const { keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, buildOptions } = params;
|
||||||
|
@ -1,18 +1,13 @@
|
|||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { join as pathJoin, relative as pathRelative, basename as pathBasename } from "path";
|
import { join as pathJoin, relative as pathRelative, basename as pathBasename } from "path";
|
||||||
import { assert } from "tsafe/assert";
|
import { assert } from "tsafe/assert";
|
||||||
import { Reflect } from "tsafe/Reflect";
|
|
||||||
import type { BuildOptions } from "./buildOptions";
|
import type { BuildOptions } from "./buildOptions";
|
||||||
|
|
||||||
export type BuildOptionsLike = {
|
export type BuildOptionsLike = {
|
||||||
keycloakifyBuildDirPath: string;
|
keycloakifyBuildDirPath: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
assert<BuildOptions extends BuildOptionsLike ? true : false>();
|
||||||
const buildOptions = Reflect<BuildOptions>();
|
|
||||||
|
|
||||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
|
||||||
}
|
|
||||||
|
|
||||||
generateStartKeycloakTestingContainer.basename = "start_keycloak_testing_container.sh";
|
generateStartKeycloakTestingContainer.basename = "start_keycloak_testing_container.sh";
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { join as pathJoin } from "path";
|
import { join as pathJoin } from "path";
|
||||||
import { assert } from "tsafe/assert";
|
import { assert } from "tsafe/assert";
|
||||||
import { Reflect } from "tsafe/Reflect";
|
|
||||||
import type { BuildOptions } from "../buildOptions";
|
import type { BuildOptions } from "../buildOptions";
|
||||||
import { resources_common, lastKeycloakVersionWithAccountV1, accountV1ThemeName } from "../../constants";
|
import { resources_common, lastKeycloakVersionWithAccountV1, accountV1ThemeName } from "../../constants";
|
||||||
import { downloadBuiltinKeycloakTheme } from "../../download-builtin-keycloak-theme";
|
import { downloadBuiltinKeycloakTheme } from "../../download-builtin-keycloak-theme";
|
||||||
@ -13,11 +12,7 @@ type BuildOptionsLike = {
|
|||||||
npmWorkspaceRootDirPath: string;
|
npmWorkspaceRootDirPath: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
assert<BuildOptions extends BuildOptionsLike ? true : false>();
|
||||||
const buildOptions = Reflect<BuildOptions>();
|
|
||||||
|
|
||||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike; srcMainResourcesDirPath: string }) {
|
export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike; srcMainResourcesDirPath: string }) {
|
||||||
const { buildOptions, srcMainResourcesDirPath } = params;
|
const { buildOptions, srcMainResourcesDirPath } = params;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user