#287 Refacror
This commit is contained in:
parent
0b16df7731
commit
53e38336fb
@ -4,7 +4,7 @@ import { downloadAndUnzip } from "./tools/downloadAndUnzip";
|
|||||||
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
||||||
import { getCliOptions } from "./tools/cliOptions";
|
import { getCliOptions } from "./tools/cliOptions";
|
||||||
import { getLogger } from "./tools/logger";
|
import { getLogger } from "./tools/logger";
|
||||||
import { getKeycloakBuildPath } from "./keycloakify/build-paths";
|
import { readBuildOptions } from "./keycloakify/BuildOptions";
|
||||||
|
|
||||||
export async function downloadBuiltinKeycloakTheme(params: { keycloakVersion: string; destDirPath: string; isSilent: boolean }) {
|
export async function downloadBuiltinKeycloakTheme(params: { keycloakVersion: string; destDirPath: string; isSilent: boolean }) {
|
||||||
const { keycloakVersion, destDirPath } = params;
|
const { keycloakVersion, destDirPath } = params;
|
||||||
@ -25,7 +25,17 @@ async function main() {
|
|||||||
const logger = getLogger({ isSilent });
|
const logger = getLogger({ isSilent });
|
||||||
const { keycloakVersion } = await promptKeycloakVersion();
|
const { keycloakVersion } = await promptKeycloakVersion();
|
||||||
|
|
||||||
const destDirPath = pathJoin(getKeycloakBuildPath(), "src", "main", "resources", "theme");
|
const destDirPath = pathJoin(
|
||||||
|
readBuildOptions({
|
||||||
|
"isSilent": true,
|
||||||
|
"isExternalAssetsCliParamProvided": false,
|
||||||
|
"projectDirPath": process.cwd()
|
||||||
|
}).keycloakifyBuildDirPath,
|
||||||
|
"src",
|
||||||
|
"main",
|
||||||
|
"resources",
|
||||||
|
"theme"
|
||||||
|
);
|
||||||
|
|
||||||
logger.log(`Downloading builtins theme of Keycloak ${keycloakVersion} here ${destDirPath}`);
|
logger.log(`Downloading builtins theme of Keycloak ${keycloakVersion} here ${destDirPath}`);
|
||||||
|
|
||||||
|
@ -16,10 +16,10 @@ import { existsSync } from "fs";
|
|||||||
import { join as pathJoin, relative as pathRelative } from "path";
|
import { join as pathJoin, relative as pathRelative } from "path";
|
||||||
import { kebabCaseToCamelCase } from "./tools/kebabCaseToSnakeCase";
|
import { kebabCaseToCamelCase } from "./tools/kebabCaseToSnakeCase";
|
||||||
import { assert, Equals } from "tsafe/assert";
|
import { assert, Equals } from "tsafe/assert";
|
||||||
import { getThemeSrcDirPath } from "./keycloakify/build-paths";
|
import { getThemeSrcDirPath } from "./getSrcDirPath";
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const projectRootDir = getProjectRoot();
|
const projectDirPath = getProjectRoot();
|
||||||
|
|
||||||
console.log("Select a theme type");
|
console.log("Select a theme type");
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ import { getThemeSrcDirPath } from "./keycloakify/build-paths";
|
|||||||
|
|
||||||
const pageBasename = capitalize(kebabCaseToCamelCase(pageId)).replace(/ftl$/, "tsx");
|
const pageBasename = capitalize(kebabCaseToCamelCase(pageId)).replace(/ftl$/, "tsx");
|
||||||
|
|
||||||
const { themeSrcDirPath } = getThemeSrcDirPath();
|
const { themeSrcDirPath } = getThemeSrcDirPath({ "projectDirPath": projectDirPath });
|
||||||
|
|
||||||
if (themeSrcDirPath === undefined) {
|
if (themeSrcDirPath === undefined) {
|
||||||
throw new Error("Couldn't locate your theme sources");
|
throw new Error("Couldn't locate your theme sources");
|
||||||
@ -65,7 +65,7 @@ import { getThemeSrcDirPath } from "./keycloakify/build-paths";
|
|||||||
process.exit(-1);
|
process.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
writeFile(targetFilePath, await readFile(pathJoin(projectRootDir, "src", themeType, "pages", pageBasename)));
|
writeFile(targetFilePath, await readFile(pathJoin(projectDirPath, "src", themeType, "pages", pageBasename)));
|
||||||
|
|
||||||
console.log(`${pathRelative(process.cwd(), targetFilePath)} created`);
|
console.log(`${pathRelative(process.cwd(), targetFilePath)} created`);
|
||||||
})();
|
})();
|
||||||
|
43
src/bin/getSrcDirPath.ts
Normal file
43
src/bin/getSrcDirPath.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import * as fs from "fs";
|
||||||
|
import { exclude } from "tsafe";
|
||||||
|
import { crawl } from "./tools/crawl";
|
||||||
|
import { join as pathJoin } from "path";
|
||||||
|
|
||||||
|
const themeSrcDirBasename = "keycloak-theme";
|
||||||
|
|
||||||
|
export function getThemeSrcDirPath(params: { projectDirPath: string }) {
|
||||||
|
const { projectDirPath } = params;
|
||||||
|
|
||||||
|
const srcDirPath = pathJoin(projectDirPath, "src");
|
||||||
|
|
||||||
|
const themeSrcDirPath: string | undefined = crawl(srcDirPath)
|
||||||
|
.map(fileRelativePath => {
|
||||||
|
const split = fileRelativePath.split(themeSrcDirBasename);
|
||||||
|
|
||||||
|
if (split.length !== 2) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pathJoin(srcDirPath, split[0] + themeSrcDirBasename);
|
||||||
|
})
|
||||||
|
.filter(exclude(undefined))[0];
|
||||||
|
|
||||||
|
if (themeSrcDirPath === undefined) {
|
||||||
|
if (fs.existsSync(pathJoin(srcDirPath, "login")) || fs.existsSync(pathJoin(srcDirPath, "account"))) {
|
||||||
|
return { "themeSrcDirPath": srcDirPath };
|
||||||
|
}
|
||||||
|
return { "themeSrcDirPath": undefined };
|
||||||
|
}
|
||||||
|
|
||||||
|
return { themeSrcDirPath };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getEmailThemeSrcDirPath(params: { projectDirPath: string }) {
|
||||||
|
const { projectDirPath } = params;
|
||||||
|
|
||||||
|
const { themeSrcDirPath } = getThemeSrcDirPath({ projectDirPath });
|
||||||
|
|
||||||
|
const emailThemeSrcDirPath = themeSrcDirPath === undefined ? undefined : pathJoin(themeSrcDirPath, "email");
|
||||||
|
|
||||||
|
return { emailThemeSrcDirPath };
|
||||||
|
}
|
@ -7,13 +7,15 @@ import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
|||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { getCliOptions } from "./tools/cliOptions";
|
import { getCliOptions } from "./tools/cliOptions";
|
||||||
import { getLogger } from "./tools/logger";
|
import { getLogger } from "./tools/logger";
|
||||||
import { getEmailThemeSrcDirPath } from "./keycloakify/build-paths";
|
import { getEmailThemeSrcDirPath } from "./getSrcDirPath";
|
||||||
|
|
||||||
export async function main() {
|
export async function main() {
|
||||||
const { isSilent } = getCliOptions(process.argv.slice(2));
|
const { isSilent } = getCliOptions(process.argv.slice(2));
|
||||||
const logger = getLogger({ isSilent });
|
const logger = getLogger({ isSilent });
|
||||||
|
|
||||||
const { emailThemeSrcDirPath } = getEmailThemeSrcDirPath();
|
const { emailThemeSrcDirPath } = getEmailThemeSrcDirPath({
|
||||||
|
"projectDirPath": process.cwd()
|
||||||
|
});
|
||||||
|
|
||||||
if (emailThemeSrcDirPath === undefined) {
|
if (emailThemeSrcDirPath === undefined) {
|
||||||
logger.warn("Couldn't locate your theme source directory");
|
logger.warn("Couldn't locate your theme source directory");
|
||||||
|
@ -4,7 +4,8 @@ import { parse as urlParse } from "url";
|
|||||||
import { typeGuard } from "tsafe/typeGuard";
|
import { typeGuard } from "tsafe/typeGuard";
|
||||||
import { symToStr } from "tsafe/symToStr";
|
import { symToStr } from "tsafe/symToStr";
|
||||||
import { bundlers, getParsedPackageJson, type Bundler } from "./parsedPackageJson";
|
import { bundlers, getParsedPackageJson, type Bundler } from "./parsedPackageJson";
|
||||||
import { getAppInputPath, getKeycloakBuildPath } from "./build-paths";
|
import * as fs from "fs";
|
||||||
|
import { join as pathJoin, sep as pathSep } from "path";
|
||||||
|
|
||||||
/** Consolidated build option gathered form CLI arguments and config in package.json */
|
/** Consolidated build option gathered form CLI arguments and config in package.json */
|
||||||
export type BuildOptions = BuildOptions.Standalone | BuildOptions.ExternalAssets;
|
export type BuildOptions = BuildOptions.Standalone | BuildOptions.ExternalAssets;
|
||||||
@ -21,10 +22,10 @@ export namespace BuildOptions {
|
|||||||
artifactId: string;
|
artifactId: string;
|
||||||
bundler: Bundler;
|
bundler: Bundler;
|
||||||
keycloakVersionDefaultAssets: string;
|
keycloakVersionDefaultAssets: string;
|
||||||
// Directory of your built react project. Defaults to {cwd}/build
|
/** Directory of your built react project. Defaults to {cwd}/build */
|
||||||
appInputPath: string;
|
reactAppBuildDirPath: string;
|
||||||
// Directory that keycloakify outputs to. Defaults to {cwd}/build_keycloak
|
/** Directory that keycloakify outputs to. Defaults to {cwd}/build_keycloak */
|
||||||
keycloakBuildPath: string;
|
keycloakifyBuildDirPath: string;
|
||||||
customUserAttributes: string[];
|
customUserAttributes: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -52,10 +53,10 @@ export namespace BuildOptions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function readBuildOptions(params: { CNAME: string | undefined; isExternalAssetsCliParamProvided: boolean; isSilent: boolean }): BuildOptions {
|
export function readBuildOptions(params: { projectDirPath: string; isExternalAssetsCliParamProvided: boolean; isSilent: boolean }): BuildOptions {
|
||||||
const { CNAME, isExternalAssetsCliParamProvided, isSilent } = params;
|
const { projectDirPath, isExternalAssetsCliParamProvided, isSilent } = params;
|
||||||
|
|
||||||
const parsedPackageJson = getParsedPackageJson();
|
const parsedPackageJson = getParsedPackageJson({ projectDirPath });
|
||||||
|
|
||||||
const url = (() => {
|
const url = (() => {
|
||||||
const { homepage } = parsedPackageJson;
|
const { homepage } = parsedPackageJson;
|
||||||
@ -66,6 +67,16 @@ export function readBuildOptions(params: { CNAME: string | undefined; isExternal
|
|||||||
url = new URL(homepage);
|
url = new URL(homepage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CNAME = (() => {
|
||||||
|
const cnameFilePath = pathJoin(projectDirPath, "public", "CNAME");
|
||||||
|
|
||||||
|
if (!fs.existsSync(cnameFilePath)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fs.readFileSync(cnameFilePath).toString("utf8");
|
||||||
|
})();
|
||||||
|
|
||||||
if (CNAME !== undefined) {
|
if (CNAME !== undefined) {
|
||||||
url = new URL(`https://${CNAME.replace(/\s+$/, "")}`);
|
url = new URL(`https://${CNAME.replace(/\s+$/, "")}`);
|
||||||
}
|
}
|
||||||
@ -134,8 +145,40 @@ export function readBuildOptions(params: { CNAME: string | undefined; isExternal
|
|||||||
extraThemeProperties,
|
extraThemeProperties,
|
||||||
isSilent,
|
isSilent,
|
||||||
"keycloakVersionDefaultAssets": keycloakVersionDefaultAssets ?? "11.0.3",
|
"keycloakVersionDefaultAssets": keycloakVersionDefaultAssets ?? "11.0.3",
|
||||||
appInputPath: getAppInputPath(),
|
"reactAppBuildDirPath": (() => {
|
||||||
keycloakBuildPath: getKeycloakBuildPath(),
|
let { reactAppBuildDirPath = undefined } = parsedPackageJson.keycloakify ?? {};
|
||||||
|
|
||||||
|
if (reactAppBuildDirPath === undefined) {
|
||||||
|
return pathJoin(projectDirPath, "build");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pathSep === "\\") {
|
||||||
|
reactAppBuildDirPath = reactAppBuildDirPath.replace(/\//g, pathSep);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reactAppBuildDirPath.startsWith(`.${pathSep}`)) {
|
||||||
|
return pathJoin(projectDirPath, reactAppBuildDirPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return reactAppBuildDirPath;
|
||||||
|
})(),
|
||||||
|
"keycloakifyBuildDirPath": (() => {
|
||||||
|
let { keycloakifyBuildDirPath = undefined } = parsedPackageJson.keycloakify ?? {};
|
||||||
|
|
||||||
|
if (keycloakifyBuildDirPath === undefined) {
|
||||||
|
return pathJoin(projectDirPath, "build_keycloak");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pathSep === "\\") {
|
||||||
|
keycloakifyBuildDirPath = keycloakifyBuildDirPath.replace(/\//g, pathSep);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keycloakifyBuildDirPath.startsWith(`.${pathSep}`)) {
|
||||||
|
return pathJoin(projectDirPath, keycloakifyBuildDirPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return keycloakifyBuildDirPath;
|
||||||
|
})(),
|
||||||
"customUserAttributes": keycloakify.customUserAttributes ?? []
|
"customUserAttributes": keycloakify.customUserAttributes ?? []
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
import * as fs from "fs";
|
|
||||||
import { exclude } from "tsafe";
|
|
||||||
import { crawl } from "../tools/crawl";
|
|
||||||
import { pathJoin } from "../tools/pathJoin";
|
|
||||||
import { getParsedPackageJson } from "./parsedPackageJson";
|
|
||||||
|
|
||||||
const DEFAULT_APP_INPUT_PATH = "build";
|
|
||||||
|
|
||||||
const DEFAULT_KEYCLOAK_BUILD_PATH = "build_keycloak";
|
|
||||||
|
|
||||||
const THEME_SRC_DIR_BASENAME = "keycloak-theme";
|
|
||||||
|
|
||||||
export const getReactProjectDirPath = () => process.cwd();
|
|
||||||
|
|
||||||
export const getCnamePath = () => pathJoin(getReactProjectDirPath(), "public", "CNAME");
|
|
||||||
|
|
||||||
const parseAppInputPath = (path?: string) => {
|
|
||||||
if (!path) {
|
|
||||||
return pathJoin(process.cwd(), DEFAULT_APP_INPUT_PATH);
|
|
||||||
} else if (path.startsWith("./")) {
|
|
||||||
return pathJoin(process.cwd(), path.replace("./", ""));
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
};
|
|
||||||
|
|
||||||
const parseKeycloakBuildPath = (path?: string) => {
|
|
||||||
if (!path) {
|
|
||||||
return pathJoin(process.cwd(), DEFAULT_KEYCLOAK_BUILD_PATH);
|
|
||||||
} else if (path.startsWith("./")) {
|
|
||||||
return pathJoin(process.cwd(), path.replace("./", ""));
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getAppInputPath = () => {
|
|
||||||
return parseAppInputPath(getParsedPackageJson().keycloakify?.appInputPath);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getKeycloakBuildPath = () => {
|
|
||||||
return parseKeycloakBuildPath(getParsedPackageJson().keycloakify?.keycloakBuildPath);
|
|
||||||
};
|
|
||||||
export const getThemeSrcDirPath = () => {
|
|
||||||
const srcDirPath = pathJoin(getReactProjectDirPath(), "src");
|
|
||||||
|
|
||||||
const themeSrcDirPath: string | undefined = crawl(srcDirPath)
|
|
||||||
.map(fileRelativePath => {
|
|
||||||
const split = fileRelativePath.split(THEME_SRC_DIR_BASENAME);
|
|
||||||
|
|
||||||
if (split.length !== 2) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pathJoin(srcDirPath, split[0] + THEME_SRC_DIR_BASENAME);
|
|
||||||
})
|
|
||||||
.filter(exclude(undefined))[0];
|
|
||||||
if (themeSrcDirPath === undefined) {
|
|
||||||
if (fs.existsSync(pathJoin(srcDirPath, "login")) || fs.existsSync(pathJoin(srcDirPath, "account"))) {
|
|
||||||
return { "themeSrcDirPath": srcDirPath };
|
|
||||||
}
|
|
||||||
return { "themeSrcDirPath": undefined };
|
|
||||||
}
|
|
||||||
|
|
||||||
return { themeSrcDirPath };
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getEmailThemeSrcDirPath = () => {
|
|
||||||
const { themeSrcDirPath } = getThemeSrcDirPath();
|
|
||||||
|
|
||||||
const emailThemeSrcDirPath = themeSrcDirPath === undefined ? undefined : pathJoin(themeSrcDirPath, "email");
|
|
||||||
|
|
||||||
return { emailThemeSrcDirPath };
|
|
||||||
};
|
|
@ -10,32 +10,25 @@ import { getCliOptions } from "../tools/cliOptions";
|
|||||||
import jar from "../tools/jar";
|
import jar from "../tools/jar";
|
||||||
import { assert } from "tsafe/assert";
|
import { assert } from "tsafe/assert";
|
||||||
import { Equals } from "tsafe";
|
import { Equals } from "tsafe";
|
||||||
import { getEmailThemeSrcDirPath } from "./build-paths";
|
import { getEmailThemeSrcDirPath } from "../getSrcDirPath";
|
||||||
import { getCnamePath, getAppInputPath, getKeycloakBuildPath, getReactProjectDirPath } from "./build-paths";
|
|
||||||
|
|
||||||
export async function main() {
|
export async function main() {
|
||||||
const { isSilent, hasExternalAssets } = getCliOptions(process.argv.slice(2));
|
const { isSilent, hasExternalAssets } = getCliOptions(process.argv.slice(2));
|
||||||
const logger = getLogger({ isSilent });
|
const logger = getLogger({ isSilent });
|
||||||
logger.log("🔏 Building the keycloak theme...⌚");
|
logger.log("🔏 Building the keycloak theme...⌚");
|
||||||
|
|
||||||
|
const projectDirPath = process.cwd();
|
||||||
|
|
||||||
const buildOptions = readBuildOptions({
|
const buildOptions = readBuildOptions({
|
||||||
"CNAME": (() => {
|
projectDirPath,
|
||||||
const cnameFilePath = getCnamePath();
|
|
||||||
|
|
||||||
if (!fs.existsSync(cnameFilePath)) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fs.readFileSync(cnameFilePath).toString("utf8");
|
|
||||||
})(),
|
|
||||||
"isExternalAssetsCliParamProvided": hasExternalAssets,
|
"isExternalAssetsCliParamProvided": hasExternalAssets,
|
||||||
"isSilent": isSilent
|
"isSilent": isSilent
|
||||||
});
|
});
|
||||||
|
|
||||||
const { doBundlesEmailTemplate } = await generateKeycloakThemeResources({
|
const { doBundlesEmailTemplate } = await generateKeycloakThemeResources({
|
||||||
keycloakThemeBuildingDirPath: buildOptions.keycloakBuildPath,
|
keycloakThemeBuildingDirPath: buildOptions.keycloakifyBuildDirPath,
|
||||||
"emailThemeSrcDirPath": (() => {
|
"emailThemeSrcDirPath": (() => {
|
||||||
const { emailThemeSrcDirPath } = getEmailThemeSrcDirPath();
|
const { emailThemeSrcDirPath } = getEmailThemeSrcDirPath({ projectDirPath });
|
||||||
|
|
||||||
if (emailThemeSrcDirPath === undefined || !fs.existsSync(emailThemeSrcDirPath)) {
|
if (emailThemeSrcDirPath === undefined || !fs.existsSync(emailThemeSrcDirPath)) {
|
||||||
return;
|
return;
|
||||||
@ -43,13 +36,13 @@ export async function main() {
|
|||||||
|
|
||||||
return emailThemeSrcDirPath;
|
return emailThemeSrcDirPath;
|
||||||
})(),
|
})(),
|
||||||
"reactAppBuildDirPath": getAppInputPath(),
|
"reactAppBuildDirPath": buildOptions.reactAppBuildDirPath,
|
||||||
buildOptions,
|
buildOptions,
|
||||||
"keycloakVersion": buildOptions.keycloakVersionDefaultAssets
|
"keycloakVersion": buildOptions.keycloakVersionDefaultAssets
|
||||||
});
|
});
|
||||||
|
|
||||||
const { jarFilePath } = generateJavaStackFiles({
|
const { jarFilePath } = generateJavaStackFiles({
|
||||||
keycloakThemeBuildingDirPath: buildOptions.keycloakBuildPath,
|
keycloakThemeBuildingDirPath: buildOptions.keycloakifyBuildDirPath,
|
||||||
doBundlesEmailTemplate,
|
doBundlesEmailTemplate,
|
||||||
buildOptions
|
buildOptions
|
||||||
});
|
});
|
||||||
@ -61,7 +54,7 @@ export async function main() {
|
|||||||
case "keycloakify":
|
case "keycloakify":
|
||||||
logger.log("🫶 Let keycloakify do its thang");
|
logger.log("🫶 Let keycloakify do its thang");
|
||||||
await jar({
|
await jar({
|
||||||
"rootPath": pathJoin(buildOptions.keycloakBuildPath, "src", "main", "resources"),
|
"rootPath": pathJoin(buildOptions.keycloakifyBuildDirPath, "src", "main", "resources"),
|
||||||
"version": buildOptions.version,
|
"version": buildOptions.version,
|
||||||
"groupId": buildOptions.groupId,
|
"groupId": buildOptions.groupId,
|
||||||
"artifactId": buildOptions.artifactId,
|
"artifactId": buildOptions.artifactId,
|
||||||
@ -70,7 +63,7 @@ export async function main() {
|
|||||||
break;
|
break;
|
||||||
case "mvn":
|
case "mvn":
|
||||||
logger.log("🫙 Run maven to deliver a jar");
|
logger.log("🫙 Run maven to deliver a jar");
|
||||||
child_process.execSync("mvn package", { "cwd": buildOptions.keycloakBuildPath });
|
child_process.execSync("mvn package", { "cwd": buildOptions.keycloakifyBuildDirPath });
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert<Equals<typeof buildOptions.bundler, never>>(false);
|
assert<Equals<typeof buildOptions.bundler, never>>(false);
|
||||||
@ -80,7 +73,7 @@ export async function main() {
|
|||||||
const containerKeycloakVersion = "20.0.1";
|
const containerKeycloakVersion = "20.0.1";
|
||||||
|
|
||||||
generateStartKeycloakTestingContainer({
|
generateStartKeycloakTestingContainer({
|
||||||
keycloakThemeBuildingDirPath: buildOptions.keycloakBuildPath,
|
keycloakThemeBuildingDirPath: buildOptions.keycloakifyBuildDirPath,
|
||||||
"keycloakVersion": containerKeycloakVersion,
|
"keycloakVersion": containerKeycloakVersion,
|
||||||
buildOptions
|
buildOptions
|
||||||
});
|
});
|
||||||
@ -88,7 +81,7 @@ export async function main() {
|
|||||||
logger.log(
|
logger.log(
|
||||||
[
|
[
|
||||||
"",
|
"",
|
||||||
`✅ Your keycloak theme has been generated and bundled into ./${pathRelative(getReactProjectDirPath(), jarFilePath)} 🚀`,
|
`✅ Your keycloak theme has been generated and bundled into .${pathSep}${pathRelative(projectDirPath, jarFilePath)} 🚀`,
|
||||||
`It is to be placed in "/opt/keycloak/providers" in the container running a quay.io/keycloak/keycloak Docker image.`,
|
`It is to be placed in "/opt/keycloak/providers" in the container running a quay.io/keycloak/keycloak Docker image.`,
|
||||||
"",
|
"",
|
||||||
//TODO: Restore when we find a good Helm chart for Keycloak.
|
//TODO: Restore when we find a good Helm chart for Keycloak.
|
||||||
@ -123,8 +116,8 @@ export async function main() {
|
|||||||
`To test your theme locally you can spin up a Keycloak ${containerKeycloakVersion} container image with the theme pre loaded by running:`,
|
`To test your theme locally you can spin up a Keycloak ${containerKeycloakVersion} container image with the theme pre loaded by running:`,
|
||||||
"",
|
"",
|
||||||
`👉 $ .${pathSep}${pathRelative(
|
`👉 $ .${pathSep}${pathRelative(
|
||||||
getReactProjectDirPath(),
|
projectDirPath,
|
||||||
pathJoin(getKeycloakBuildPath(), generateStartKeycloakTestingContainer.basename)
|
pathJoin(buildOptions.keycloakifyBuildDirPath, generateStartKeycloakTestingContainer.basename)
|
||||||
)} 👈`,
|
)} 👈`,
|
||||||
"",
|
"",
|
||||||
`Test with different Keycloak versions by editing the .sh file. see available versions here: https://quay.io/repository/keycloak/keycloak?tab=tags`,
|
`Test with different Keycloak versions by editing the .sh file. see available versions here: https://quay.io/repository/keycloak/keycloak?tab=tags`,
|
||||||
|
@ -4,10 +4,9 @@ import type { Equals } from "tsafe";
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { pathJoin } from "../tools/pathJoin";
|
import { pathJoin } from "../tools/pathJoin";
|
||||||
|
|
||||||
const reactProjectDirPath = process.cwd();
|
|
||||||
export const bundlers = ["mvn", "keycloakify", "none"] as const;
|
export const bundlers = ["mvn", "keycloakify", "none"] as const;
|
||||||
export type Bundler = (typeof bundlers)[number];
|
export type Bundler = (typeof bundlers)[number];
|
||||||
type ParsedPackageJson = {
|
export type ParsedPackageJson = {
|
||||||
name: string;
|
name: string;
|
||||||
version: string;
|
version: string;
|
||||||
homepage?: string;
|
homepage?: string;
|
||||||
@ -22,8 +21,8 @@ type ParsedPackageJson = {
|
|||||||
groupId?: string;
|
groupId?: string;
|
||||||
bundler?: Bundler;
|
bundler?: Bundler;
|
||||||
keycloakVersionDefaultAssets?: string;
|
keycloakVersionDefaultAssets?: string;
|
||||||
appInputPath?: string;
|
reactAppBuildDirPath?: string;
|
||||||
keycloakBuildPath?: string;
|
keycloakifyBuildDirPath?: string;
|
||||||
customUserAttributes?: string[];
|
customUserAttributes?: string[];
|
||||||
themeName?: string;
|
themeName?: string;
|
||||||
};
|
};
|
||||||
@ -44,8 +43,8 @@ const zParsedPackageJson = z.object({
|
|||||||
"groupId": z.string().optional(),
|
"groupId": z.string().optional(),
|
||||||
"bundler": z.enum(bundlers).optional(),
|
"bundler": z.enum(bundlers).optional(),
|
||||||
"keycloakVersionDefaultAssets": z.string().optional(),
|
"keycloakVersionDefaultAssets": z.string().optional(),
|
||||||
"appInputPath": z.string().optional(),
|
"reactAppBuildDirPath": z.string().optional(),
|
||||||
"keycloakBuildPath": z.string().optional(),
|
"keycloakifyBuildDirPath": z.string().optional(),
|
||||||
"customUserAttributes": z.array(z.string()).optional(),
|
"customUserAttributes": z.array(z.string()).optional(),
|
||||||
"themeName": z.string().optional()
|
"themeName": z.string().optional()
|
||||||
})
|
})
|
||||||
@ -55,8 +54,11 @@ const zParsedPackageJson = z.object({
|
|||||||
assert<Equals<ReturnType<(typeof zParsedPackageJson)["parse"]>, ParsedPackageJson>>();
|
assert<Equals<ReturnType<(typeof zParsedPackageJson)["parse"]>, ParsedPackageJson>>();
|
||||||
|
|
||||||
let parsedPackageJson: undefined | ReturnType<(typeof zParsedPackageJson)["parse"]>;
|
let parsedPackageJson: undefined | ReturnType<(typeof zParsedPackageJson)["parse"]>;
|
||||||
export const getParsedPackageJson = () => {
|
export function getParsedPackageJson(params: { projectDirPath: string }) {
|
||||||
if (parsedPackageJson) return parsedPackageJson;
|
const { projectDirPath } = params;
|
||||||
parsedPackageJson = zParsedPackageJson.parse(JSON.parse(fs.readFileSync(pathJoin(reactProjectDirPath, "package.json")).toString("utf8")));
|
if (parsedPackageJson) {
|
||||||
return parsedPackageJson;
|
return parsedPackageJson;
|
||||||
};
|
}
|
||||||
|
parsedPackageJson = zParsedPackageJson.parse(JSON.parse(fs.readFileSync(pathJoin(projectDirPath, "package.json")).toString("utf8")));
|
||||||
|
return parsedPackageJson;
|
||||||
|
}
|
||||||
|
@ -4,8 +4,8 @@ import { join as pathJoin } from "path";
|
|||||||
import { downloadAndUnzip } from "keycloakify/bin/tools/downloadAndUnzip";
|
import { downloadAndUnzip } from "keycloakify/bin/tools/downloadAndUnzip";
|
||||||
import { main as initializeEmailTheme } from "keycloakify/bin/initialize-email-theme";
|
import { main as initializeEmailTheme } from "keycloakify/bin/initialize-email-theme";
|
||||||
import { it, describe, afterAll, beforeAll, beforeEach, vi } from "vitest";
|
import { it, describe, afterAll, beforeAll, beforeEach, vi } from "vitest";
|
||||||
import { getKeycloakBuildPath } from "keycloakify/bin/keycloakify/build-paths";
|
|
||||||
import { downloadBuiltinKeycloakTheme } from "keycloakify/bin/download-builtin-keycloak-theme";
|
import { downloadBuiltinKeycloakTheme } from "keycloakify/bin/download-builtin-keycloak-theme";
|
||||||
|
import { readBuildOptions } from "keycloakify/bin/keycloakify/BuildOptions";
|
||||||
|
|
||||||
export const sampleReactProjectDirPath = pathJoin(getProjectRoot(), "sample_react_project");
|
export const sampleReactProjectDirPath = pathJoin(getProjectRoot(), "sample_react_project");
|
||||||
|
|
||||||
@ -33,7 +33,6 @@ describe("Sample Project", () => {
|
|||||||
// Monkey patching the cwd to the app location for the duration of this test
|
// Monkey patching the cwd to the app location for the duration of this test
|
||||||
process.cwd = () => sampleReactProjectDirPath;
|
process.cwd = () => sampleReactProjectDirPath;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(() => {
|
afterAll(() => {
|
||||||
fs.rmSync(sampleReactProjectDirPath, { "recursive": true });
|
fs.rmSync(sampleReactProjectDirPath, { "recursive": true });
|
||||||
process.cwd = nativeCwd;
|
process.cwd = nativeCwd;
|
||||||
@ -52,7 +51,17 @@ describe("Sample Project", () => {
|
|||||||
await setupSampleReactProject(sampleReactProjectDirPath);
|
await setupSampleReactProject(sampleReactProjectDirPath);
|
||||||
await initializeEmailTheme();
|
await initializeEmailTheme();
|
||||||
|
|
||||||
const destDirPath = pathJoin(getKeycloakBuildPath(), "src", "main", "resources", "theme");
|
const destDirPath = pathJoin(
|
||||||
|
readBuildOptions({
|
||||||
|
"isExternalAssetsCliParamProvided": false,
|
||||||
|
"isSilent": true,
|
||||||
|
"projectDirPath": process.cwd()
|
||||||
|
}).keycloakifyBuildDirPath,
|
||||||
|
"src",
|
||||||
|
"main",
|
||||||
|
"resources",
|
||||||
|
"theme"
|
||||||
|
);
|
||||||
await downloadBuiltinKeycloakTheme({ destDirPath, keycloakVersion: "11.0.3", isSilent: false });
|
await downloadBuiltinKeycloakTheme({ destDirPath, keycloakVersion: "11.0.3", isSilent: false });
|
||||||
},
|
},
|
||||||
{ timeout: 90000 }
|
{ timeout: 90000 }
|
||||||
@ -62,14 +71,24 @@ describe("Sample Project", () => {
|
|||||||
async () => {
|
async () => {
|
||||||
parsedPackageJson = {
|
parsedPackageJson = {
|
||||||
"keycloakify": {
|
"keycloakify": {
|
||||||
"appInputPath": "./custom_input/build",
|
"reactAppBuildDirPath": "./custom_input/build",
|
||||||
"keycloakBuildDir": "./custom_output"
|
"keycloakBuildDir": "./custom_output"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await setupSampleReactProject(pathJoin(sampleReactProjectDirPath, "custom_input"));
|
await setupSampleReactProject(pathJoin(sampleReactProjectDirPath, "custom_input"));
|
||||||
await initializeEmailTheme();
|
await initializeEmailTheme();
|
||||||
|
|
||||||
const destDirPath = pathJoin(getKeycloakBuildPath(), "src", "main", "resources", "theme");
|
const destDirPath = pathJoin(
|
||||||
|
readBuildOptions({
|
||||||
|
"isExternalAssetsCliParamProvided": false,
|
||||||
|
"isSilent": true,
|
||||||
|
"projectDirPath": process.cwd()
|
||||||
|
}).keycloakifyBuildDirPath,
|
||||||
|
"src",
|
||||||
|
"main",
|
||||||
|
"resources",
|
||||||
|
"theme"
|
||||||
|
);
|
||||||
await downloadBuiltinKeycloakTheme({ destDirPath, keycloakVersion: "11.0.3", isSilent: false });
|
await downloadBuiltinKeycloakTheme({ destDirPath, keycloakVersion: "11.0.3", isSilent: false });
|
||||||
},
|
},
|
||||||
{ timeout: 90000 }
|
{ timeout: 90000 }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user