keycloakify 9.3.0-rc.0 → 9.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +1 -11
  2. package/bin/constants.d.ts +1 -0
  3. package/bin/constants.js +2 -1
  4. package/bin/constants.js.map +1 -1
  5. package/bin/download-builtin-keycloak-theme.js +28 -1
  6. package/bin/download-builtin-keycloak-theme.js.map +1 -1
  7. package/bin/keycloakify/BuildOptions.d.ts +2 -0
  8. package/bin/keycloakify/BuildOptions.js +8 -60
  9. package/bin/keycloakify/BuildOptions.js.map +1 -1
  10. package/bin/keycloakify/generateFtl/generateFtl.js +1 -1
  11. package/bin/keycloakify/generateFtl/generateFtl.js.map +1 -1
  12. package/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.js +17 -4
  13. package/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.js.map +1 -1
  14. package/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.d.ts +1 -0
  15. package/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.js +9 -2
  16. package/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.js.map +1 -1
  17. package/bin/keycloakify/generateTheme/generateTheme.d.ts +1 -0
  18. package/bin/keycloakify/generateTheme/generateTheme.js +18 -4
  19. package/bin/keycloakify/generateTheme/generateTheme.js.map +1 -1
  20. package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.d.ts +0 -11
  21. package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.js +13 -27
  22. package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.js.map +1 -1
  23. package/bin/promptKeycloakVersion.js +2 -0
  24. package/bin/promptKeycloakVersion.js.map +1 -1
  25. package/login/lib/useGetClassName.js +1 -1
  26. package/login/lib/useGetClassName.js.map +1 -1
  27. package/login/pages/LoginOtp.js +5 -43
  28. package/login/pages/LoginOtp.js.map +1 -1
  29. package/package.json +3 -17
  30. package/src/bin/constants.ts +1 -0
  31. package/src/bin/download-builtin-keycloak-theme.ts +45 -0
  32. package/src/bin/keycloakify/BuildOptions.ts +5 -13
  33. package/src/bin/keycloakify/generateFtl/generateFtl.ts +1 -1
  34. package/src/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.ts +17 -3
  35. package/src/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.ts +11 -2
  36. package/src/bin/keycloakify/generateTheme/generateTheme.ts +31 -7
  37. package/src/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.ts +10 -24
  38. package/src/bin/promptKeycloakVersion.ts +2 -0
  39. package/src/login/lib/useGetClassName.ts +1 -1
  40. package/src/login/pages/LoginOtp.tsx +64 -94
  41. package/src/tsconfig.json +1 -1
  42. package/src/vite-plugin/index.ts +0 -1
  43. package/src/vite-plugin/tsconfig.json +0 -12
  44. package/src/vite-plugin/vite-plugin.ts +0 -31
  45. package/vite-plugin/index.d.ts +0 -1
  46. package/vite-plugin/index.js +0 -18
  47. package/vite-plugin/index.js.map +0 -1
  48. package/vite-plugin/tsconfig.tsbuildinfo +0 -1
  49. package/vite-plugin/vite-plugin.d.ts +0 -2
  50. package/vite-plugin/vite-plugin.js +0 -49
  51. package/vite-plugin/vite-plugin.js.map +0 -1
@@ -81,7 +81,7 @@ export const { useGetClassName } = createUseClassName({
81
81
  "kcAuthenticatorWebAuthnClass": "fa fa-key list-view-pf-icon-lg",
82
82
  "kcAuthenticatorWebAuthnPasswordlessClass": "fa fa-key list-view-pf-icon-lg",
83
83
  //css classes for the OTP Login Form
84
- "kcSelectOTPListClass": "card-pf card-pf-view card-pf-view-select card-pf-view-single-select",
84
+ "kcSelectOTPListClass": "card-pf card-pf-view card-pf-view-select card-pf-view-single-select col-xs-12",
85
85
  "kcSelectOTPListItemClass": "card-pf-body card-pf-top-element",
86
86
  "kcAuthenticatorOtpCircleClass": "fa fa-mobile card-pf-icon-circle",
87
87
  "kcSelectOTPItemHeadingClass": "card-pf-title text-center",
@@ -1 +1 @@
1
- {"version":3,"file":"useGetClassName.js","sourceRoot":"","sources":["../../src/login/lib/useGetClassName.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useGetClassName.js","sourceRoot":"","sources":["../../src/login/lib/useGetClassName.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect } from "react";
3
- import { headInsert } from "../../tools/headInsert";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
4
2
  import { clsx } from "../../tools/clsx";
5
3
  import { useGetClassName } from "../../login/lib/useGetClassName";
6
4
  export default function LoginOtp(props) {
@@ -11,45 +9,9 @@ export default function LoginOtp(props) {
11
9
  });
12
10
  const { otpLogin, url } = kcContext;
13
11
  const { msg, msgStr } = i18n;
14
- useEffect(() => {
15
- let isCleanedUp = false;
16
- const { prLoaded, remove } = headInsert({
17
- "type": "javascript",
18
- "src": `${kcContext.url.resourcesCommonPath}/node_modules/jquery/dist/jquery.min.js`
19
- });
20
- (async () => {
21
- await prLoaded;
22
- if (isCleanedUp) {
23
- return;
24
- }
25
- evaluateInlineScript();
26
- })();
27
- return () => {
28
- isCleanedUp = true;
29
- remove();
30
- };
31
- }, []);
32
- return (_jsx(Template, Object.assign({}, { kcContext, i18n, doUseDefaultCss, classes }, { headerNode: msg("doLogIn") }, { children: _jsxs("form", Object.assign({ id: "kc-otp-login-form", className: getClassName("kcFormClass"), action: url.loginAction, method: "post" }, { children: [otpLogin.userOtpCredentials.length > 1 && (_jsx("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: _jsx("div", Object.assign({ className: getClassName("kcInputWrapperClass") }, { children: otpLogin.userOtpCredentials.map(otpCredential => (_jsxs("div", Object.assign({ className: getClassName("kcSelectOTPListClass") }, { children: [_jsx("input", { type: "hidden", value: "${otpCredential.id}" }), _jsxs("div", Object.assign({ className: getClassName("kcSelectOTPListItemClass") }, { children: [_jsx("span", { className: getClassName("kcAuthenticatorOtpCircleClass") }), _jsx("h2", Object.assign({ className: getClassName("kcSelectOTPItemHeadingClass") }, { children: otpCredential.userLabel }))] }))] }), otpCredential.id))) })) }))), _jsxs("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: [_jsx("div", Object.assign({ className: getClassName("kcLabelWrapperClass") }, { children: _jsx("label", Object.assign({ htmlFor: "otp", className: getClassName("kcLabelClass") }, { children: msg("loginOtpOneTime") })) })), _jsx("div", Object.assign({ className: getClassName("kcInputWrapperClass") }, { children: _jsx("input", { id: "otp", name: "otp", autoComplete: "off", type: "text", className: getClassName("kcInputClass"), autoFocus: true }) }))] })), _jsxs("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: [_jsx("div", Object.assign({ id: "kc-form-options", className: getClassName("kcFormOptionsClass") }, { children: _jsx("div", { className: getClassName("kcFormOptionsWrapperClass") }) })), _jsx("div", Object.assign({ id: "kc-form-buttons", className: getClassName("kcFormButtonsClass") }, { children: _jsx("input", { className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonBlockClass"), getClassName("kcButtonLargeClass")), name: "login", id: "kc-login", type: "submit", value: msgStr("doLogIn") }) }))] }))] })) })));
33
- }
34
- function evaluateInlineScript() {
35
- $(document).ready(function () {
36
- // Card Single Select
37
- $(".card-pf-view-single-select").click(function () {
38
- if ($(this).hasClass("active")) {
39
- $(this).removeClass("active");
40
- $(this).children().removeAttr("name");
41
- }
42
- else {
43
- $(".card-pf-view-single-select").removeClass("active");
44
- $(".card-pf-view-single-select").children().removeAttr("name");
45
- $(this).addClass("active");
46
- $(this).children().attr("name", "selectedCredentialId");
47
- }
48
- });
49
- var defaultCred = $(".card-pf-view-single-select")[0];
50
- if (defaultCred) {
51
- defaultCred.click();
52
- }
53
- });
12
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: `
13
+ input[type="radio"]:checked~label.kcSelectOTPListClass{
14
+ border: 2px solid #39a5dc;
15
+ }` }), _jsx(Template, Object.assign({}, { kcContext, i18n, doUseDefaultCss, classes }, { headerNode: msg("doLogIn") }, { children: _jsxs("form", Object.assign({ id: "kc-otp-login-form", className: getClassName("kcFormClass"), action: url.loginAction, method: "post" }, { children: [otpLogin.userOtpCredentials.length > 1 && (_jsx("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: _jsx("div", Object.assign({ className: getClassName("kcInputWrapperClass") }, { children: otpLogin.userOtpCredentials.map((otpCredential, index) => (_jsxs("div", { children: [_jsx("input", { id: `kc-otp-credential-${index}`, name: "selectedCredentialId", type: "radio", value: otpCredential.id, style: { display: "none" } }), _jsx("label", Object.assign({ htmlFor: `kc-otp-credential-${index}`, className: getClassName("kcSelectOTPListClass") }, { children: _jsxs("div", Object.assign({ className: getClassName("kcSelectOTPListItemClass") }, { children: [_jsx("span", { className: getClassName("kcAuthenticatorOtpCircleClass") }), _jsx("h2", Object.assign({ className: getClassName("kcSelectOTPItemHeadingClass") }, { children: otpCredential.userLabel }))] })) }), otpCredential.id)] }, otpCredential.id))) })) }))), _jsxs("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: [_jsx("div", Object.assign({ className: getClassName("kcLabelWrapperClass") }, { children: _jsx("label", Object.assign({ htmlFor: "otp", className: getClassName("kcLabelClass") }, { children: msg("loginOtpOneTime") })) })), _jsx("div", Object.assign({ className: getClassName("kcInputWrapperClass") }, { children: _jsx("input", { id: "otp", name: "otp", autoComplete: "off", type: "text", className: getClassName("kcInputClass"), autoFocus: true }) }))] })), _jsxs("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: [_jsx("div", Object.assign({ id: "kc-form-options", className: getClassName("kcFormOptionsClass") }, { children: _jsx("div", { className: getClassName("kcFormOptionsWrapperClass") }) })), _jsx("div", Object.assign({ id: "kc-form-buttons", className: getClassName("kcFormButtonsClass") }, { children: _jsx("input", { className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonBlockClass"), getClassName("kcButtonLargeClass")), name: "login", id: "kc-login", type: "submit", value: msgStr("doLogIn") }) }))] }))] })) }))] }));
54
16
  }
55
17
  //# sourceMappingURL=LoginOtp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginOtp.js","sourceRoot":"","sources":["../../src/login/pages/LoginOtp.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LoginOtp.js","sourceRoot":"","sources":["../../src/login/pages/LoginOtp.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keycloakify",
3
- "version": "9.3.0-rc.0",
3
+ "version": "9.3.1",
4
4
  "description": "Create Keycloak themes using React",
5
5
  "repository": {
6
6
  "type": "git",
@@ -212,9 +212,6 @@
212
212
  "src/tools/useConst.ts",
213
213
  "src/tools/useConstCallback.ts",
214
214
  "src/tsconfig.json",
215
- "src/vite-plugin/index.ts",
216
- "src/vite-plugin/tsconfig.json",
217
- "src/vite-plugin/vite-plugin.ts",
218
215
  "account/Fallback.d.ts",
219
216
  "account/Fallback.js",
220
217
  "account/Fallback.js.map",
@@ -895,9 +892,6 @@
895
892
  "src/tools/useConst.ts",
896
893
  "src/tools/useConstCallback.ts",
897
894
  "src/tsconfig.json",
898
- "src/vite-plugin/index.ts",
899
- "src/vite-plugin/tsconfig.json",
900
- "src/vite-plugin/vite-plugin.ts",
901
895
  "tools/AndByDiscriminatingKey.d.ts",
902
896
  "tools/AndByDiscriminatingKey.js",
903
897
  "tools/AndByDiscriminatingKey.js.map",
@@ -945,14 +939,7 @@
945
939
  "tools/useConst.js.map",
946
940
  "tools/useConstCallback.d.ts",
947
941
  "tools/useConstCallback.js",
948
- "tools/useConstCallback.js.map",
949
- "vite-plugin/index.d.ts",
950
- "vite-plugin/index.js",
951
- "vite-plugin/index.js.map",
952
- "vite-plugin/tsconfig.tsbuildinfo",
953
- "vite-plugin/vite-plugin.d.ts",
954
- "vite-plugin/vite-plugin.js",
955
- "vite-plugin/vite-plugin.js.map"
942
+ "tools/useConstCallback.js.map"
956
943
  ],
957
944
  "keywords": [
958
945
  "bluehats",
@@ -1006,8 +993,7 @@
1006
993
  "tss-react": "^4.8.2",
1007
994
  "typescript": "^4.9.1-beta",
1008
995
  "vitest": "^0.29.8",
1009
- "zod-to-json-schema": "^3.20.4",
1010
- "vite": "^5.0.12"
996
+ "zod-to-json-schema": "^3.20.4"
1011
997
  },
1012
998
  "dependencies": {
1013
999
  "@babel/generator": "^7.22.9",
@@ -3,6 +3,7 @@ export const resources_common = "resources-common";
3
3
  export const lastKeycloakVersionWithAccountV1 = "21.1.2";
4
4
 
5
5
  export const themeTypes = ["login", "account"] as const;
6
+ export const retrocompatPostfix = "_retrocompat";
6
7
  export const accountV1 = "account-v1";
7
8
 
8
9
  export type ThemeType = (typeof themeTypes)[number];
@@ -27,6 +27,51 @@ export async function downloadBuiltinKeycloakTheme(params: { keycloakVersion: st
27
27
  "preCacheTransform": {
28
28
  "actionCacheId": "npm install and build",
29
29
  "action": async ({ destDirPath }) => {
30
+ fix_account_css: {
31
+ const accountCssFilePath = pathJoin(destDirPath, "keycloak", "account", "resources", "css", "account.css");
32
+
33
+ if (!fs.existsSync(accountCssFilePath)) {
34
+ break fix_account_css;
35
+ }
36
+
37
+ fs.writeFileSync(
38
+ accountCssFilePath,
39
+ Buffer.from(fs.readFileSync(accountCssFilePath).toString("utf8").replace("top: -34px;", "top: -34px !important;"), "utf8")
40
+ );
41
+ }
42
+
43
+ fix_account_topt: {
44
+ const totpFtlFilePath = pathJoin(destDirPath, "base", "account", "totp.ftl");
45
+
46
+ if (!fs.existsSync(totpFtlFilePath)) {
47
+ break fix_account_topt;
48
+ }
49
+
50
+ fs.writeFileSync(
51
+ totpFtlFilePath,
52
+ Buffer.from(
53
+ fs
54
+ .readFileSync(totpFtlFilePath)
55
+ .toString("utf8")
56
+ .replace(
57
+ [
58
+ " <#list totp.policy.supportedApplications as app>",
59
+ " <li>${app}</li>",
60
+ " </#list>"
61
+ ].join("\n"),
62
+ [
63
+ " <#if totp.policy.supportedApplications?has_content>",
64
+ " <#list totp.policy.supportedApplications as app>",
65
+ " <li>${app}</li>",
66
+ " </#list>",
67
+ " </#if>"
68
+ ].join("\n")
69
+ ),
70
+ "utf8"
71
+ )
72
+ );
73
+ }
74
+
30
75
  install_common_node_modules: {
31
76
  const commonResourcesDirPath = pathJoin(destDirPath, "keycloak", "common", "resources");
32
77
 
@@ -3,7 +3,6 @@ import { getParsedPackageJson } from "./parsedPackageJson";
3
3
  import { join as pathJoin } from "path";
4
4
  import parseArgv from "minimist";
5
5
  import { getAbsoluteAndInOsFormatPath } from "../tools/getAbsoluteAndInOsFormatPath";
6
- import * as fs from "fs";
7
6
 
8
7
  /** Consolidated build option gathered form CLI arguments and config in package.json */
9
8
  export type BuildOptions = {
@@ -16,6 +15,7 @@ export type BuildOptions = {
16
15
  doCreateJar: boolean;
17
16
  loginThemeResourcesFromKeycloakVersion: string;
18
17
  reactAppRootDirPath: string;
18
+ /** Directory of your built react project. Defaults to {cwd}/build */
19
19
  reactAppBuildDirPath: string;
20
20
  /** Directory that keycloakify outputs to. Defaults to {cwd}/build_keycloak */
21
21
  keycloakifyBuildDirPath: string;
@@ -24,6 +24,7 @@ export type BuildOptions = {
24
24
  /** If your app is hosted under a subpath, it's the case in CRA if you have "homepage": "https://example.com/my-app" in your package.json
25
25
  * In this case the urlPathname will be "/my-app/" */
26
26
  urlPathname: string | undefined;
27
+ doBuildRetrocompatAccountTheme: boolean;
27
28
  };
28
29
 
29
30
  export function readBuildOptions(params: { reactAppRootDirPath: string; processArgv: string[] }): BuildOptions {
@@ -106,17 +107,7 @@ export function readBuildOptions(params: { reactAppRootDirPath: string; processA
106
107
  });
107
108
  }
108
109
 
109
- for (const name of ["build", "dist"]) {
110
- const out = pathJoin(reactAppRootDirPath, name);
111
-
112
- if (!fs.existsSync(out)) {
113
- continue;
114
- }
115
-
116
- return out;
117
- }
118
-
119
- throw new Error("Please use the reactAppBuildDirPath option to specify the build directory of your react app");
110
+ return pathJoin(reactAppRootDirPath, "build");
120
111
  })(),
121
112
  "keycloakifyBuildDirPath": (() => {
122
113
  const { keycloakifyBuildDirPath } = parsedPackageJson.keycloakify ?? {};
@@ -160,6 +151,7 @@ export function readBuildOptions(params: { reactAppRootDirPath: string; processA
160
151
 
161
152
  const out = url.pathname.replace(/([^/])$/, "$1/");
162
153
  return out === "/" ? undefined : out;
163
- })()
154
+ })(),
155
+ "doBuildRetrocompatAccountTheme": parsedPackageJson.keycloakify?.doBuildRetrocompatAccountTheme ?? true
164
156
  };
165
157
  }
@@ -37,7 +37,7 @@ export function generateFtlFilesCodeFactory(params: {
37
37
 
38
38
  assert(jsCode !== null);
39
39
 
40
- const { fixedJsCode } = replaceImportsFromStaticInJsCode({ jsCode, "bundler": "vite" });
40
+ const { fixedJsCode } = replaceImportsFromStaticInJsCode({ jsCode });
41
41
 
42
42
  $(element).text(fixedJsCode);
43
43
  });
@@ -38,7 +38,21 @@ export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike
38
38
 
39
39
  const commonResourceFilePaths = [
40
40
  "node_modules/patternfly/dist/css/patternfly.min.css",
41
- "node_modules/patternfly/dist/css/patternfly-additions.min.css"
41
+ "node_modules/patternfly/dist/css/patternfly-additions.min.css",
42
+ ...[
43
+ "OpenSans-Light-webfont.woff2",
44
+ "OpenSans-Regular-webfont.woff2",
45
+ "OpenSans-Bold-webfont.woff2",
46
+ "OpenSans-Semibold-webfont.woff2",
47
+ "OpenSans-Bold-webfont.woff",
48
+ "OpenSans-Light-webfont.woff",
49
+ "OpenSans-Regular-webfont.woff",
50
+ "OpenSans-Semibold-webfont.woff",
51
+ "OpenSans-Regular-webfont.ttf",
52
+ "OpenSans-Light-webfont.ttf",
53
+ "OpenSans-Semibold-webfont.ttf",
54
+ "OpenSans-Bold-webfont.ttf"
55
+ ].map(path => `node_modules/patternfly/dist/fonts/${path}`)
42
56
  ];
43
57
 
44
58
  for (const relativeFilePath of commonResourceFilePaths.map(path => pathJoin(...path.split("/")))) {
@@ -49,7 +63,7 @@ export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike
49
63
  fs.cpSync(pathJoin(builtinKeycloakThemeTmpDirPath, "keycloak", "common", "resources", relativeFilePath), destFilePath);
50
64
  }
51
65
 
52
- const resourceFilePaths = ["css/account.css"];
66
+ const resourceFilePaths = ["css/account.css", "img/icon-sidebar-active.png", "img/logo.png"];
53
67
 
54
68
  for (const relativeFilePath of resourceFilePaths.map(path => pathJoin(...path.split("/")))) {
55
69
  const destFilePath = pathJoin(accountV1DirPath, "resources", relativeFilePath);
@@ -69,7 +83,7 @@ export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike
69
83
  "",
70
84
  "locales=ar,ca,cs,da,de,en,es,fr,fi,hu,it,ja,lt,nl,no,pl,pt-BR,ru,sk,sv,tr,zh-CN",
71
85
  "",
72
- "styles=" + [...resourceFilePaths, ...commonResourceFilePaths.map(path => `resources_common/${path}`)].join(" "),
86
+ "styles=" + [...resourceFilePaths, ...commonResourceFilePaths.map(path => `resources-common/${path}`)].join(" "),
73
87
  "",
74
88
  "##### css classes for form buttons",
75
89
  "# main class used for all buttons",
@@ -3,7 +3,7 @@ import { join as pathJoin, dirname as pathDirname } from "path";
3
3
  import { assert } from "tsafe/assert";
4
4
  import { Reflect } from "tsafe/Reflect";
5
5
  import type { BuildOptions } from "../BuildOptions";
6
- import { type ThemeType, accountV1 } from "../../constants";
6
+ import { type ThemeType, retrocompatPostfix, accountV1 } from "../../constants";
7
7
  import { bringInAccountV1 } from "./bringInAccountV1";
8
8
 
9
9
  export type BuildOptionsLike = {
@@ -13,6 +13,7 @@ export type BuildOptionsLike = {
13
13
  cacheDirPath: string;
14
14
  keycloakifyBuildDirPath: string;
15
15
  themeNames: string[];
16
+ doBuildRetrocompatAccountTheme: boolean;
16
17
  };
17
18
 
18
19
  {
@@ -113,7 +114,15 @@ export async function generateJavaStackFiles(params: {
113
114
  "types": Object.entries(implementedThemeTypes)
114
115
  .filter(([, isImplemented]) => isImplemented)
115
116
  .map(([themeType]) => themeType)
116
- }
117
+ },
118
+ ...(!implementedThemeTypes.account || !buildOptions.doBuildRetrocompatAccountTheme
119
+ ? []
120
+ : [
121
+ {
122
+ "name": `${themeName}${retrocompatPostfix}`,
123
+ "types": ["account"]
124
+ }
125
+ ])
117
126
  ])
118
127
  .flat()
119
128
  ]
@@ -1,10 +1,10 @@
1
1
  import { transformCodebase } from "../../tools/transformCodebase";
2
2
  import * as fs from "fs";
3
- import { join as pathJoin, resolve as pathResolve } from "path";
3
+ import { join as pathJoin, basename as pathBasename, resolve as pathResolve } from "path";
4
4
  import { replaceImportsFromStaticInJsCode } from "../replacers/replaceImportsFromStaticInJsCode";
5
5
  import { replaceImportsInCssCode } from "../replacers/replaceImportsInCssCode";
6
6
  import { generateFtlFilesCodeFactory, loginThemePageIds, accountThemePageIds } from "../generateFtl";
7
- import { themeTypes, type ThemeType, lastKeycloakVersionWithAccountV1, keycloak_resources, accountV1 } from "../../constants";
7
+ import { themeTypes, type ThemeType, lastKeycloakVersionWithAccountV1, keycloak_resources, retrocompatPostfix, accountV1 } from "../../constants";
8
8
  import { isInside } from "../../tools/isInside";
9
9
  import type { BuildOptions } from "../BuildOptions";
10
10
  import { assert, type Equals } from "tsafe/assert";
@@ -22,6 +22,7 @@ export type BuildOptionsLike = {
22
22
  keycloakifyBuildDirPath: string;
23
23
  reactAppBuildDirPath: string;
24
24
  cacheDirPath: string;
25
+ doBuildRetrocompatAccountTheme: boolean;
25
26
  };
26
27
 
27
28
  assert<BuildOptions extends BuildOptionsLike ? true : false>();
@@ -35,9 +36,17 @@ export async function generateTheme(params: {
35
36
  }): Promise<void> {
36
37
  const { themeName, themeSrcDirPath, keycloakifySrcDirPath, buildOptions, keycloakifyVersion } = params;
37
38
 
38
- const getThemeTypeDirPath = (params: { themeType: ThemeType | "email" }) => {
39
- const { themeType } = params;
40
- return pathJoin(buildOptions.keycloakifyBuildDirPath, "src", "main", "resources", "theme", themeName, themeType);
39
+ const getThemeTypeDirPath = (params: { themeType: ThemeType | "email"; isRetrocompat?: true }) => {
40
+ const { themeType, isRetrocompat = false } = params;
41
+ return pathJoin(
42
+ buildOptions.keycloakifyBuildDirPath,
43
+ "src",
44
+ "main",
45
+ "resources",
46
+ "theme",
47
+ `${themeName}${isRetrocompat ? retrocompatPostfix : ""}`,
48
+ themeType
49
+ );
41
50
  };
42
51
 
43
52
  let allCssGlobalsToDefine: Record<string, string> = {};
@@ -93,8 +102,7 @@ export async function generateTheme(params: {
93
102
 
94
103
  if (/\.js?$/i.test(filePath)) {
95
104
  const { fixedJsCode } = replaceImportsFromStaticInJsCode({
96
- "jsCode": sourceCode.toString("utf8"),
97
- "bundler": "vite"
105
+ "jsCode": sourceCode.toString("utf8")
98
106
  });
99
107
 
100
108
  return { "modifiedSourceCode": Buffer.from(fixedJsCode, "utf8") };
@@ -193,6 +201,22 @@ export async function generateTheme(params: {
193
201
  "utf8"
194
202
  )
195
203
  );
204
+
205
+ if (themeType === "account" && buildOptions.doBuildRetrocompatAccountTheme) {
206
+ transformCodebase({
207
+ "srcDirPath": themeTypeDirPath,
208
+ "destDirPath": getThemeTypeDirPath({ themeType, "isRetrocompat": true }),
209
+ "transformSourceCode": ({ filePath, sourceCode }) => {
210
+ if (pathBasename(filePath) === "theme.properties") {
211
+ return {
212
+ "modifiedSourceCode": Buffer.from(sourceCode.toString("utf8").replace(`parent=${accountV1}`, "parent=keycloak"), "utf8")
213
+ };
214
+ }
215
+
216
+ return { "modifiedSourceCode": sourceCode };
217
+ }
218
+ });
219
+ }
196
220
  }
197
221
 
198
222
  email: {
@@ -1,32 +1,18 @@
1
1
  import { ftlValuesGlobalName } from "../ftlValuesGlobalName";
2
2
 
3
- export function replaceImportsFromStaticInJsCode(params: { jsCode: string; bundler: "vite" | "webpack" }): { fixedJsCode: string } {
4
- const { jsCode } = params;
5
-
6
- const { fixedJsCode } = (() => {
7
- switch (params.bundler) {
8
- case "vite":
9
- return replaceImportsFromStaticInJsCode_vite({ jsCode });
10
- case "webpack":
11
- return replaceImportsFromStaticInJsCode_webpack({ jsCode });
12
- }
13
- })();
14
-
15
- return { fixedJsCode };
16
- }
17
-
18
- export function replaceImportsFromStaticInJsCode_vite(params: { jsCode: string }): { fixedJsCode: string } {
19
- const { jsCode } = params;
3
+ export function replaceImportsFromStaticInJsCode(params: { jsCode: string }): { fixedJsCode: string } {
4
+ /*
5
+ NOTE:
20
6
 
21
- const fixedJsCode = jsCode.replace(
22
- /\.viteFileDeps = \[(.*)\]/g,
23
- (...args) => `.viteFileDeps = [${args[1]}].map(viteFileDep => window.kcContext.url.resourcesPath.substring(1) + "/build/" + viteFileDep)`
24
- );
7
+ When we have urlOrigin defined it means that
8
+ we are building with --external-assets
9
+ so we have to make sur that the fixed js code will run
10
+ inside and outside keycloak.
25
11
 
26
- return { fixedJsCode };
27
- }
12
+ When urlOrigin isn't defined we can assume the fixedJsCode
13
+ will always run in keycloak context.
14
+ */
28
15
 
29
- export function replaceImportsFromStaticInJsCode_webpack(params: { jsCode: string }): { fixedJsCode: string } {
30
16
  const { jsCode } = params;
31
17
 
32
18
  const getReplaceArgs = (language: "js" | "css"): Parameters<typeof String.prototype.replace> => [
@@ -1,6 +1,7 @@
1
1
  import { getLatestsSemVersionedTagFactory } from "./tools/octokit-addons/getLatestsSemVersionedTag";
2
2
  import { Octokit } from "@octokit/rest";
3
3
  import cliSelect from "cli-select";
4
+ import { lastKeycloakVersionWithAccountV1 } from "./constants";
4
5
 
5
6
  export async function promptKeycloakVersion() {
6
7
  const { getLatestsSemVersionedTag } = (() => {
@@ -26,6 +27,7 @@ export async function promptKeycloakVersion() {
26
27
  "owner": "keycloak",
27
28
  "repo": "keycloak"
28
29
  }).then(arr => arr.map(({ tag }) => tag))),
30
+ lastKeycloakVersionWithAccountV1,
29
31
  "11.0.3"
30
32
  ];
31
33
 
@@ -94,7 +94,7 @@ export const { useGetClassName } = createUseClassName<ClassKey>({
94
94
  "kcAuthenticatorWebAuthnPasswordlessClass": "fa fa-key list-view-pf-icon-lg",
95
95
 
96
96
  //css classes for the OTP Login Form
97
- "kcSelectOTPListClass": "card-pf card-pf-view card-pf-view-select card-pf-view-single-select",
97
+ "kcSelectOTPListClass": "card-pf card-pf-view card-pf-view-select card-pf-view-single-select col-xs-12",
98
98
  "kcSelectOTPListItemClass": "card-pf-body card-pf-top-element",
99
99
  "kcAuthenticatorOtpCircleClass": "fa fa-mobile card-pf-icon-circle",
100
100
  "kcSelectOTPItemHeadingClass": "card-pf-title text-center",