keycloakify 10.0.0-rc.17 → 10.0.0-rc.19

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 (208) hide show
  1. package/PUBLIC_URL.js.map +1 -1
  2. package/account/Template.js +5 -5
  3. package/account/Template.js.map +1 -1
  4. package/account/i18n/i18n.js +37 -29
  5. package/account/i18n/i18n.js.map +1 -1
  6. package/account/kcContext/KcContext.js.map +1 -1
  7. package/account/kcContext/createGetKcContext.js +20 -15
  8. package/account/kcContext/createGetKcContext.js.map +1 -1
  9. package/account/kcContext/getKcContext.js.map +1 -1
  10. package/account/kcContext/getKcContextFromWindow.d.ts +3 -1
  11. package/account/kcContext/getKcContextFromWindow.js.map +1 -1
  12. package/account/kcContext/kcContextMocks.js +148 -144
  13. package/account/kcContext/kcContextMocks.js.map +1 -1
  14. package/account/lib/useGetClassName.js +14 -14
  15. package/account/lib/useGetClassName.js.map +1 -1
  16. package/account/pages/Account.js +1 -1
  17. package/account/pages/Account.js.map +1 -1
  18. package/account/pages/Password.js +7 -7
  19. package/account/pages/Password.js.map +1 -1
  20. package/account/pages/Totp.js +4 -4
  21. package/account/pages/Totp.js.map +1 -1
  22. package/bin/main.js +2265 -2028
  23. package/bin/shared/constants.d.ts +1 -0
  24. package/bin/shared/constants.js +4 -3
  25. package/bin/shared/constants.js.map +1 -1
  26. package/lib/isStorybook.js +2 -1
  27. package/lib/isStorybook.js.map +1 -1
  28. package/lib/useGetClassName.js.map +1 -1
  29. package/login/Template.js +13 -13
  30. package/login/Template.js.map +1 -1
  31. package/login/UserProfileFormFields.js +43 -41
  32. package/login/UserProfileFormFields.js.map +1 -1
  33. package/login/i18n/baseMessages/ca.d.ts +1 -1
  34. package/login/i18n/baseMessages/ca.js +1 -1
  35. package/login/i18n/baseMessages/el.d.ts +0 -1
  36. package/login/i18n/baseMessages/el.js +0 -1
  37. package/login/i18n/baseMessages/el.js.map +1 -1
  38. package/login/i18n/baseMessages/en.d.ts +1 -1
  39. package/login/i18n/baseMessages/en.js +1 -1
  40. package/login/i18n/baseMessages/es.d.ts +1 -1
  41. package/login/i18n/baseMessages/es.js +1 -1
  42. package/login/i18n/baseMessages/fa.d.ts +0 -1
  43. package/login/i18n/baseMessages/fa.js +0 -1
  44. package/login/i18n/baseMessages/fa.js.map +1 -1
  45. package/login/i18n/baseMessages/hu.d.ts +1 -1
  46. package/login/i18n/baseMessages/hu.js +1 -1
  47. package/login/i18n/baseMessages/index.d.ts +1 -2
  48. package/login/i18n/baseMessages/zh-CN.d.ts +1 -1
  49. package/login/i18n/baseMessages/zh-CN.js +1 -1
  50. package/login/i18n/i18n.js +39 -31
  51. package/login/i18n/i18n.js.map +1 -1
  52. package/login/kcContext/KcContext.js.map +1 -1
  53. package/login/kcContext/createGetKcContext.js +30 -22
  54. package/login/kcContext/createGetKcContext.js.map +1 -1
  55. package/login/kcContext/getKcContext.js.map +1 -1
  56. package/login/kcContext/getKcContextFromWindow.d.ts +3 -1
  57. package/login/kcContext/getKcContextFromWindow.js.map +1 -1
  58. package/login/kcContext/kcContextMocks.js +233 -231
  59. package/login/kcContext/kcContextMocks.js.map +1 -1
  60. package/login/lib/useDownloadTerms.js.map +1 -1
  61. package/login/lib/useGetClassName.js +112 -112
  62. package/login/lib/useGetClassName.js.map +1 -1
  63. package/login/lib/useUserProfileForm.js +181 -181
  64. package/login/lib/useUserProfileForm.js.map +1 -1
  65. package/login/pages/DeleteAccountConfirm.js +5 -1
  66. package/login/pages/DeleteAccountConfirm.js.map +1 -1
  67. package/login/pages/FrontchannelLogout.js +1 -1
  68. package/login/pages/FrontchannelLogout.js.map +1 -1
  69. package/login/pages/Login.js.map +1 -1
  70. package/login/pages/LoginRecoveryAuthnCodeConfig.js +3 -3
  71. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  72. package/login/pages/LoginResetPassword.js.map +1 -1
  73. package/login/pages/LoginUsername.js.map +1 -1
  74. package/login/pages/WebauthnAuthenticate.js +11 -8
  75. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  76. package/login/pages/WebauthnRegister.js +7 -7
  77. package/login/pages/WebauthnRegister.js.map +1 -1
  78. package/package.json +232 -226
  79. package/src/PUBLIC_URL.ts +4 -1
  80. package/src/account/Template.tsx +5 -5
  81. package/src/account/TemplateProps.ts +4 -1
  82. package/src/account/i18n/i18n.tsx +40 -30
  83. package/src/account/kcContext/KcContext.ts +4 -1
  84. package/src/account/kcContext/createGetKcContext.ts +48 -22
  85. package/src/account/kcContext/getKcContext.ts +3 -1
  86. package/src/account/kcContext/getKcContextFromWindow.ts +6 -2
  87. package/src/account/kcContext/kcContextMocks.ts +164 -160
  88. package/src/account/lib/useGetClassName.ts +15 -14
  89. package/src/account/pages/Account.tsx +2 -2
  90. package/src/account/pages/Password.tsx +8 -8
  91. package/src/account/pages/Totp.tsx +4 -6
  92. package/src/bin/copy-keycloak-resources-to-public.ts +2 -2
  93. package/src/bin/download-keycloak-default-theme.ts +30 -8
  94. package/src/bin/eject-page.ts +48 -11
  95. package/src/bin/initialize-email-theme.ts +25 -17
  96. package/src/bin/keycloakify/buildJars/buildJar.ts +179 -104
  97. package/src/bin/keycloakify/buildJars/buildJars.ts +35 -16
  98. package/src/bin/keycloakify/buildJars/extensionVersions.ts +2 -1
  99. package/src/bin/keycloakify/buildJars/generatePom.ts +11 -3
  100. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +33 -8
  101. package/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +20 -2
  102. package/src/bin/keycloakify/generateFtl/generateFtl.ts +49 -12
  103. package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +29 -18
  104. package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +35 -12
  105. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +3 -1
  106. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +86 -41
  107. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +39 -15
  108. package/src/bin/keycloakify/generateSrcMainResources/readExtraPageNames.ts +21 -7
  109. package/src/bin/keycloakify/generateSrcMainResources/readFieldNameUsage.ts +34 -7
  110. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +19 -5
  111. package/src/bin/keycloakify/keycloakify.ts +28 -9
  112. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +24 -5
  113. package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +6 -2
  114. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +6 -3
  115. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +24 -6
  116. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +49 -11
  117. package/src/bin/main.ts +78 -41
  118. package/src/bin/shared/KeycloakVersionRange.ts +3 -1
  119. package/src/bin/shared/buildOptions.ts +70 -43
  120. package/src/bin/shared/constants.ts +4 -2
  121. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +27 -13
  122. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +161 -218
  123. package/src/bin/shared/downloadKeycloakStaticResources.ts +25 -21
  124. package/src/bin/shared/getJarFileBasename.ts +3 -1
  125. package/src/bin/shared/getThemeSrcDirPath.ts +5 -2
  126. package/src/bin/shared/metaInfKeycloakThemes.ts +35 -8
  127. package/src/bin/shared/promptKeycloakVersion.ts +33 -14
  128. package/src/bin/start-keycloak/appBuild.ts +128 -0
  129. package/src/bin/start-keycloak/index.ts +1 -0
  130. package/src/bin/start-keycloak/keycloakifyBuild.ts +41 -0
  131. package/src/bin/start-keycloak/myrealm-realm-23.json +2142 -0
  132. package/src/bin/start-keycloak/myrealm-realm-24.json +2318 -0
  133. package/src/bin/start-keycloak/start-keycloak.ts +469 -0
  134. package/src/bin/tools/SemVer.ts +32 -13
  135. package/src/bin/tools/String.prototype.replaceAll.ts +9 -2
  136. package/src/bin/tools/crawl.ts +4 -1
  137. package/src/bin/tools/crc32.ts +42 -24
  138. package/src/bin/tools/downloadAndExtractArchive/downloadAndExtractArchive.ts +262 -0
  139. package/src/bin/tools/downloadAndExtractArchive/fetchProxyOptions.ts +96 -0
  140. package/src/bin/tools/downloadAndExtractArchive/index.ts +1 -0
  141. package/src/bin/tools/extractArchive.ts +132 -0
  142. package/src/bin/tools/fetchProxyOptions.ts +31 -8
  143. package/src/bin/tools/getAbsoluteAndInOsFormatPath.ts +10 -2
  144. package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +18 -5
  145. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +8 -2
  146. package/src/bin/tools/octokit-addons/listTags.ts +15 -4
  147. package/src/bin/tools/partitionPromiseSettledResults.ts +12 -3
  148. package/src/bin/tools/readThisNpmPackageVersion.ts +5 -1
  149. package/src/bin/tools/transformCodebase.ts +29 -10
  150. package/src/bin/tools/trimIndent.ts +4 -1
  151. package/src/lib/isStorybook.ts +3 -1
  152. package/src/lib/useGetClassName.ts +12 -3
  153. package/src/login/Template.tsx +14 -14
  154. package/src/login/TemplateProps.ts +4 -1
  155. package/src/login/UserProfileFormFields.tsx +44 -42
  156. package/src/login/i18n/baseMessages/ca.ts +1 -1
  157. package/src/login/i18n/baseMessages/el.ts +0 -1
  158. package/src/login/i18n/baseMessages/en.ts +1 -1
  159. package/src/login/i18n/baseMessages/es.ts +1 -1
  160. package/src/login/i18n/baseMessages/fa.ts +0 -1
  161. package/src/login/i18n/baseMessages/hu.ts +1 -1
  162. package/src/login/i18n/baseMessages/zh-CN.ts +1 -1
  163. package/src/login/i18n/i18n.tsx +42 -32
  164. package/src/login/kcContext/KcContext.ts +8 -2
  165. package/src/login/kcContext/createGetKcContext.ts +84 -37
  166. package/src/login/kcContext/getKcContext.ts +3 -1
  167. package/src/login/kcContext/getKcContextFromWindow.ts +6 -2
  168. package/src/login/kcContext/kcContextMocks.ts +339 -325
  169. package/src/login/lib/useDownloadTerms.ts +6 -4
  170. package/src/login/lib/useGetClassName.ts +119 -112
  171. package/src/login/lib/useUserProfileForm.tsx +219 -205
  172. package/src/login/pages/DeleteAccountConfirm.tsx +9 -3
  173. package/src/login/pages/FrontchannelLogout.tsx +1 -1
  174. package/src/login/pages/Login.tsx +2 -2
  175. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +3 -3
  176. package/src/login/pages/LoginResetPassword.tsx +2 -2
  177. package/src/login/pages/LoginUsername.tsx +2 -2
  178. package/src/login/pages/WebauthnAuthenticate.tsx +11 -8
  179. package/src/login/pages/WebauthnRegister.tsx +7 -7
  180. package/src/tools/AndByDiscriminatingKey.ts +12 -6
  181. package/src/tools/Array.prototype.every.ts +4 -1
  182. package/src/tools/LazyOrNot.ts +3 -1
  183. package/src/tools/clsx.ts +7 -1
  184. package/src/tools/deepAssign.ts +15 -8
  185. package/src/tools/deepClone.ts +3 -1
  186. package/src/tools/formatNumber.ts +4 -1
  187. package/src/tools/useConstCallback.ts +3 -1
  188. package/src/tools/useInsertLinkTags.ts +20 -7
  189. package/src/tools/useInsertScriptTags.ts +7 -2
  190. package/src/tools/useSetClassName.ts +4 -1
  191. package/src/vite-plugin/vite-plugin.ts +45 -21
  192. package/tools/Array.prototype.every.js +2 -1
  193. package/tools/Array.prototype.every.js.map +1 -1
  194. package/tools/clsx.js.map +1 -1
  195. package/tools/deepAssign.js +9 -7
  196. package/tools/deepAssign.js.map +1 -1
  197. package/tools/deepClone.js.map +1 -1
  198. package/tools/formatNumber.js.map +1 -1
  199. package/tools/useConstCallback.js.map +1 -1
  200. package/tools/useInsertLinkTags.js +5 -4
  201. package/tools/useInsertLinkTags.js.map +1 -1
  202. package/tools/useInsertScriptTags.js +5 -2
  203. package/tools/useInsertScriptTags.js.map +1 -1
  204. package/tools/useSetClassName.js.map +1 -1
  205. package/vite-plugin/index.js +985 -1651
  206. package/src/bin/shared/downloadAndUnzip.ts +0 -203
  207. package/src/bin/start-keycloak.ts +0 -309
  208. package/src/bin/tools/unzip.ts +0 -141
@@ -8,7 +8,10 @@ export type BuildOptionsLike = {
8
8
 
9
9
  assert<BuildOptions extends BuildOptionsLike ? true : false>();
10
10
 
11
- export function replaceImportsInInlineCssCode(params: { cssCode: string; buildOptions: BuildOptionsLike }): {
11
+ export function replaceImportsInInlineCssCode(params: {
12
+ cssCode: string;
13
+ buildOptions: BuildOptionsLike;
14
+ }): {
12
15
  fixedCssCode: string;
13
16
  } {
14
17
  const { cssCode, buildOptions } = params;
@@ -17,7 +20,8 @@ export function replaceImportsInInlineCssCode(params: { cssCode: string; buildOp
17
20
  buildOptions.urlPathname === undefined
18
21
  ? /url\(["']?\/([^/][^)"']+)["']?\)/g
19
22
  : new RegExp(`url\\(["']?${buildOptions.urlPathname}([^)"']+)["']?\\)`, "g"),
20
- (...[, group]) => `url(\${url.resourcesPath}/${basenameOfTheKeycloakifyResourcesDir}/${group})`
23
+ (...[, group]) =>
24
+ `url(\${url.resourcesPath}/${basenameOfTheKeycloakifyResourcesDir}/${group})`
21
25
  );
22
26
 
23
27
  return { fixedCssCode };
@@ -13,7 +13,10 @@ export type BuildOptionsLike = {
13
13
 
14
14
  assert<BuildOptions extends BuildOptionsLike ? true : false>();
15
15
 
16
- export function replaceImportsInJsCode(params: { jsCode: string; buildOptions: BuildOptionsLike }) {
16
+ export function replaceImportsInJsCode(params: {
17
+ jsCode: string;
18
+ buildOptions: BuildOptionsLike;
19
+ }) {
17
20
  const { jsCode, buildOptions } = params;
18
21
 
19
22
  const { fixedJsCode } = (() => {
@@ -22,8 +25,8 @@ export function replaceImportsInJsCode(params: { jsCode: string; buildOptions: B
22
25
  return replaceImportsInJsCode_vite({
23
26
  jsCode,
24
27
  buildOptions,
25
- "basenameOfAssetsFiles": readAssetsDirSync({
26
- "assetsDirPath": params.buildOptions.assetsDirPath
28
+ basenameOfAssetsFiles: readAssetsDirSync({
29
+ assetsDirPath: params.buildOptions.assetsDirPath
27
30
  })
28
31
  });
29
32
  case "webpack":
@@ -1,4 +1,7 @@
1
- import { nameOfTheGlobal, basenameOfTheKeycloakifyResourcesDir } from "../../../shared/constants";
1
+ import {
2
+ nameOfTheGlobal,
3
+ basenameOfTheKeycloakifyResourcesDir
4
+ } from "../../../shared/constants";
2
5
  import { assert } from "tsafe/assert";
3
6
  import type { BuildOptions } from "../../../shared/buildOptions";
4
7
  import * as nodePath from "path";
@@ -20,7 +23,12 @@ export function replaceImportsInJsCode_vite(params: {
20
23
  }): {
21
24
  fixedJsCode: string;
22
25
  } {
23
- const { jsCode, buildOptions, basenameOfAssetsFiles, systemType = nodePath.sep === "/" ? "posix" : "win32" } = params;
26
+ const {
27
+ jsCode,
28
+ buildOptions,
29
+ basenameOfAssetsFiles,
30
+ systemType = nodePath.sep === "/" ? "posix" : "win32"
31
+ } = params;
24
32
 
25
33
  const { relative: pathRelative, sep: pathSep } = nodePath[systemType];
26
34
 
@@ -38,22 +46,32 @@ export function replaceImportsInJsCode_vite(params: {
38
46
  // Replace `Hv=function(e){return"/abcde12345/"+e}` by `Hv=function(e){return"/"+e}`
39
47
  fixedJsCode = fixedJsCode.replace(
40
48
  new RegExp(
41
- `([\\w\\$][\\w\\d\\$]*)=function\\(([\\w\\$][\\w\\d\\$]*)\\)\\{return"${replaceAll(buildOptions.urlPathname, "/", "\\/")}"\\+\\2\\}`,
49
+ `([\\w\\$][\\w\\d\\$]*)=function\\(([\\w\\$][\\w\\d\\$]*)\\)\\{return"${replaceAll(
50
+ buildOptions.urlPathname,
51
+ "/",
52
+ "\\/"
53
+ )}"\\+\\2\\}`,
42
54
  "g"
43
55
  ),
44
- (...[, funcName, paramName]) => `${funcName}=function(${paramName}){return"/"+${paramName}}`
56
+ (...[, funcName, paramName]) =>
57
+ `${funcName}=function(${paramName}){return"/"+${paramName}}`
45
58
  );
46
59
  }
47
60
 
48
61
  replace_javascript_relatives_import_paths: {
49
62
  // Example: "assets/ or "foo/bar/"
50
63
  const staticDir = (() => {
51
- let out = pathRelative(buildOptions.reactAppBuildDirPath, buildOptions.assetsDirPath);
64
+ let out = pathRelative(
65
+ buildOptions.reactAppBuildDirPath,
66
+ buildOptions.assetsDirPath
67
+ );
52
68
 
53
69
  out = replaceAll(out, pathSep, "/") + "/";
54
70
 
55
71
  if (out === "/") {
56
- throw new Error(`The assetsDirPath must be a subdirectory of reactAppBuildDirPath`);
72
+ throw new Error(
73
+ `The assetsDirPath must be a subdirectory of reactAppBuildDirPath`
74
+ );
57
75
  }
58
76
 
59
77
  return out;
@@ -1,4 +1,7 @@
1
- import { nameOfTheGlobal, basenameOfTheKeycloakifyResourcesDir } from "../../../shared/constants";
1
+ import {
2
+ nameOfTheGlobal,
3
+ basenameOfTheKeycloakifyResourcesDir
4
+ } from "../../../shared/constants";
2
5
  import { assert } from "tsafe/assert";
3
6
  import type { BuildOptions } from "../../../shared/buildOptions";
4
7
  import * as nodePath from "path";
@@ -12,10 +15,18 @@ export type BuildOptionsLike = {
12
15
 
13
16
  assert<BuildOptions extends BuildOptionsLike ? true : false>();
14
17
 
15
- export function replaceImportsInJsCode_webpack(params: { jsCode: string; buildOptions: BuildOptionsLike; systemType?: "posix" | "win32" }): {
18
+ export function replaceImportsInJsCode_webpack(params: {
19
+ jsCode: string;
20
+ buildOptions: BuildOptionsLike;
21
+ systemType?: "posix" | "win32";
22
+ }): {
16
23
  fixedJsCode: string;
17
24
  } {
18
- const { jsCode, buildOptions, systemType = nodePath.sep === "/" ? "posix" : "win32" } = params;
25
+ const {
26
+ jsCode,
27
+ buildOptions,
28
+ systemType = nodePath.sep === "/" ? "posix" : "win32"
29
+ } = params;
19
30
 
20
31
  const { relative: pathRelative, sep: pathSep } = nodePath[systemType];
21
32
 
@@ -24,29 +35,51 @@ export function replaceImportsInJsCode_webpack(params: { jsCode: string; buildOp
24
35
  if (buildOptions.urlPathname !== undefined) {
25
36
  // "__esModule",{value:!0})},n.p="/foo-bar/",function(){if("undefined" -> ... n.p="/" ...
26
37
  fixedJsCode = fixedJsCode.replace(
27
- new RegExp(`,([a-zA-Z]\\.[a-zA-Z])="${replaceAll(buildOptions.urlPathname, "/", "\\/")}",`, "g"),
38
+ new RegExp(
39
+ `,([a-zA-Z]\\.[a-zA-Z])="${replaceAll(
40
+ buildOptions.urlPathname,
41
+ "/",
42
+ "\\/"
43
+ )}",`,
44
+ "g"
45
+ ),
28
46
  (...[, assignTo]) => `,${assignTo}="/",`
29
47
  );
30
48
  }
31
49
 
32
50
  // Example: "static/ or "foo/bar/"
33
51
  const staticDir = (() => {
34
- let out = pathRelative(buildOptions.reactAppBuildDirPath, buildOptions.assetsDirPath);
52
+ let out = pathRelative(
53
+ buildOptions.reactAppBuildDirPath,
54
+ buildOptions.assetsDirPath
55
+ );
35
56
 
36
57
  out = replaceAll(out, pathSep, "/") + "/";
37
58
 
38
59
  if (out === "/") {
39
- throw new Error(`The assetsDirPath must be a subdirectory of reactAppBuildDirPath`);
60
+ throw new Error(
61
+ `The assetsDirPath must be a subdirectory of reactAppBuildDirPath`
62
+ );
40
63
  }
41
64
 
42
65
  return out;
43
66
  })();
44
67
 
45
- const getReplaceArgs = (language: "js" | "css"): Parameters<typeof String.prototype.replace> => [
46
- new RegExp(`([a-zA-Z_]+)\\.([a-zA-Z]+)=(function\\(([a-z]+)\\){return|([a-z]+)=>)"${staticDir.replace(/\//g, "\\/")}${language}\\/"`, "g"),
68
+ const getReplaceArgs = (
69
+ language: "js" | "css"
70
+ ): Parameters<typeof String.prototype.replace> => [
71
+ new RegExp(
72
+ `([a-zA-Z_]+)\\.([a-zA-Z]+)=(function\\(([a-z]+)\\){return|([a-z]+)=>)"${staticDir.replace(
73
+ /\//g,
74
+ "\\/"
75
+ )}${language}\\/"`,
76
+ "g"
77
+ ),
47
78
  (...[, n, u, matchedFunction, eForFunction]) => {
48
79
  const isArrowFunction = matchedFunction.includes("=>");
49
- const e = isArrowFunction ? matchedFunction.replace("=>", "").trim() : eForFunction;
80
+ const e = isArrowFunction
81
+ ? matchedFunction.replace("=>", "").trim()
82
+ : eForFunction;
50
83
 
51
84
  return `
52
85
  ${n}[(function(){
@@ -58,7 +91,9 @@ export function replaceImportsInJsCode_webpack(params: { jsCode: string; buildOp
58
91
  });
59
92
  }
60
93
  return "${u}";
61
- })()] = ${isArrowFunction ? `${e} =>` : `function(${e}) { return `} "/${basenameOfTheKeycloakifyResourcesDir}/${staticDir}${language}/"`
94
+ })()] = ${
95
+ isArrowFunction ? `${e} =>` : `function(${e}) { return `
96
+ } "/${basenameOfTheKeycloakifyResourcesDir}/${staticDir}${language}/"`
62
97
  .replace(/\s+/g, " ")
63
98
  .trim();
64
99
  }
@@ -68,7 +103,10 @@ export function replaceImportsInJsCode_webpack(params: { jsCode: string; buildOp
68
103
  .replace(...getReplaceArgs("js"))
69
104
  .replace(...getReplaceArgs("css"))
70
105
  .replace(
71
- new RegExp(`[a-zA-Z]+\\.[a-zA-Z]+\\+"${staticDir.replace(/\//g, "\\/")}`, "g"),
106
+ new RegExp(
107
+ `[a-zA-Z]+\\.[a-zA-Z]+\\+"${staticDir.replace(/\//g, "\\/")}`,
108
+ "g"
109
+ ),
72
110
  `window.${nameOfTheGlobal}.url.resourcesPath + "/${basenameOfTheKeycloakifyResourcesDir}/${staticDir}`
73
111
  );
74
112
 
package/src/bin/main.ts CHANGED
@@ -10,12 +10,12 @@ export type CliCommandOptions = {
10
10
 
11
11
  const program = termost<CliCommandOptions>(
12
12
  {
13
- "name": "keycloakify",
14
- "description": "Keycloakify CLI",
15
- "version": readThisNpmPackageVersion()
13
+ name: "keycloakify",
14
+ description: "Keycloakify CLI",
15
+ version: readThisNpmPackageVersion()
16
16
  },
17
17
  {
18
- "onException": error => {
18
+ onException: error => {
19
19
  console.error(error);
20
20
  process.exit(1);
21
21
  }
@@ -25,8 +25,8 @@ const program = termost<CliCommandOptions>(
25
25
  const optionsKeys: string[] = [];
26
26
 
27
27
  program.option({
28
- "key": "reactAppRootDirPath",
29
- "name": (() => {
28
+ key: "reactAppRootDirPath",
29
+ name: (() => {
30
30
  const long = "project";
31
31
  const short = "p";
32
32
 
@@ -34,19 +34,25 @@ program.option({
34
34
 
35
35
  return { long, short };
36
36
  })(),
37
- "description": [
37
+ description: [
38
38
  `For monorepos, path to the keycloakify project.`,
39
39
  "Example: `npx keycloakify build --project packages/keycloak-theme`",
40
40
  "https://docs.keycloakify.dev/build-options#project-or-p-cli-option"
41
41
  ].join(" "),
42
- "defaultValue": undefined
42
+ defaultValue: undefined
43
43
  });
44
44
 
45
45
  function skip(_context: any, argv: { options: Record<string, unknown> }) {
46
- const unrecognizedOptionKey = Object.keys(argv.options).find(key => !optionsKeys.includes(key));
46
+ const unrecognizedOptionKey = Object.keys(argv.options).find(
47
+ key => !optionsKeys.includes(key)
48
+ );
47
49
 
48
50
  if (unrecognizedOptionKey !== undefined) {
49
- console.error(`keycloakify: Unrecognized option: ${unrecognizedOptionKey.length === 1 ? "-" : "--"}${unrecognizedOptionKey}`);
51
+ console.error(
52
+ `keycloakify: Unrecognized option: ${
53
+ unrecognizedOptionKey.length === 1 ? "-" : "--"
54
+ }${unrecognizedOptionKey}`
55
+ );
50
56
  process.exit(1);
51
57
  }
52
58
 
@@ -55,12 +61,12 @@ function skip(_context: any, argv: { options: Record<string, unknown> }) {
55
61
 
56
62
  program
57
63
  .command({
58
- "name": "build",
59
- "description": "Build the theme (default subcommand)."
64
+ name: "build",
65
+ description: "Build the theme (default subcommand)."
60
66
  })
61
67
  .task({
62
68
  skip,
63
- "handler": async cliCommandOptions => {
69
+ handler: async cliCommandOptions => {
64
70
  const { command } = await import("./keycloakify");
65
71
 
66
72
  await command({ cliCommandOptions });
@@ -68,37 +74,60 @@ program
68
74
  });
69
75
 
70
76
  program
71
- .command<{ port: number; keycloakVersion: string | undefined }>({
72
- "name": "start-keycloak",
73
- "description": "Spin up a pre configured Docker image of Keycloak to test your theme."
77
+ .command<{
78
+ port: number;
79
+ keycloakVersion: string | undefined;
80
+ realmJsonFilePath: string | undefined;
81
+ }>({
82
+ name: "start-keycloak",
83
+ description:
84
+ "Spin up a pre configured Docker image of Keycloak to test your theme."
74
85
  })
75
86
  .option({
76
- "key": "port",
77
- "name": (() => {
87
+ key: "port",
88
+ name: (() => {
78
89
  const name = "port";
79
90
 
80
91
  optionsKeys.push(name);
81
92
 
82
93
  return name;
83
94
  })(),
84
- "description": "Keycloak server port.",
85
- "defaultValue": 8080
95
+ description: ["Keycloak server port.", "Example `--port 8085`"].join(" "),
96
+ defaultValue: 8080
86
97
  })
87
98
  .option({
88
- "key": "keycloakVersion",
89
- "name": (() => {
99
+ key: "keycloakVersion",
100
+ name: (() => {
90
101
  const name = "keycloak-version";
91
102
 
92
103
  optionsKeys.push(name);
93
104
 
94
105
  return name;
95
106
  })(),
96
- "description": "Use a specific version of Keycloak.",
97
- "defaultValue": undefined
107
+ description: [
108
+ "Use a specific version of Keycloak.",
109
+ "Example `--keycloak-version 21.1.1`"
110
+ ].join(" "),
111
+ defaultValue: undefined
112
+ })
113
+ .option({
114
+ key: "realmJsonFilePath",
115
+ name: (() => {
116
+ const name = "import";
117
+
118
+ optionsKeys.push(name);
119
+
120
+ return name;
121
+ })(),
122
+ defaultValue: undefined,
123
+ description: [
124
+ "Import your own realm configuration file",
125
+ "Example `--import path/to/myrealm-realm.json`"
126
+ ].join(" ")
98
127
  })
99
128
  .task({
100
129
  skip,
101
- "handler": async cliCommandOptions => {
130
+ handler: async cliCommandOptions => {
102
131
  const { command } = await import("./start-keycloak");
103
132
 
104
133
  await command({ cliCommandOptions });
@@ -107,12 +136,12 @@ program
107
136
 
108
137
  program
109
138
  .command({
110
- "name": "download-keycloak-default-theme",
111
- "description": "Download the built-in Keycloak theme."
139
+ name: "download-keycloak-default-theme",
140
+ description: "Download the built-in Keycloak theme."
112
141
  })
113
142
  .task({
114
143
  skip,
115
- "handler": async cliCommandOptions => {
144
+ handler: async cliCommandOptions => {
116
145
  const { command } = await import("./download-keycloak-default-theme");
117
146
 
118
147
  await command({ cliCommandOptions });
@@ -121,12 +150,12 @@ program
121
150
 
122
151
  program
123
152
  .command({
124
- "name": "eject-page",
125
- "description": "Eject a Keycloak page."
153
+ name: "eject-page",
154
+ description: "Eject a Keycloak page."
126
155
  })
127
156
  .task({
128
157
  skip,
129
- "handler": async cliCommandOptions => {
158
+ handler: async cliCommandOptions => {
130
159
  const { command } = await import("./eject-page");
131
160
 
132
161
  await command({ cliCommandOptions });
@@ -135,12 +164,12 @@ program
135
164
 
136
165
  program
137
166
  .command({
138
- "name": "initialize-email-theme",
139
- "description": "Initialize an email theme."
167
+ name: "initialize-email-theme",
168
+ description: "Initialize an email theme."
140
169
  })
141
170
  .task({
142
171
  skip,
143
- "handler": async cliCommandOptions => {
172
+ handler: async cliCommandOptions => {
144
173
  const { command } = await import("./initialize-email-theme");
145
174
 
146
175
  await command({ cliCommandOptions });
@@ -149,12 +178,13 @@ program
149
178
 
150
179
  program
151
180
  .command({
152
- "name": "copy-keycloak-resources-to-public",
153
- "description": "(Webpack/Create-React-App only) Copy Keycloak default theme resources to the public directory."
181
+ name: "copy-keycloak-resources-to-public",
182
+ description:
183
+ "(Webpack/Create-React-App only) Copy Keycloak default theme resources to the public directory."
154
184
  })
155
185
  .task({
156
186
  skip,
157
- "handler": async cliCommandOptions => {
187
+ handler: async cliCommandOptions => {
158
188
  const { command } = await import("./copy-keycloak-resources-to-public");
159
189
 
160
190
  await command({ cliCommandOptions });
@@ -165,10 +195,17 @@ program
165
195
  {
166
196
  const [, , ...rest] = process.argv;
167
197
 
168
- if (rest.length === 0 || (rest[0].startsWith("-") && rest[0] !== "--help" && rest[0] !== "-h")) {
169
- const { status } = child_process.spawnSync("npx", ["keycloakify", "build", ...rest], {
170
- "stdio": "inherit"
171
- });
198
+ if (
199
+ rest.length === 0 ||
200
+ (rest[0].startsWith("-") && rest[0] !== "--help" && rest[0] !== "-h")
201
+ ) {
202
+ const { status } = child_process.spawnSync(
203
+ "npx",
204
+ ["keycloakify", "build", ...rest],
205
+ {
206
+ stdio: "inherit"
207
+ }
208
+ );
172
209
 
173
210
  process.exit(status ?? 1);
174
211
  }
@@ -1,4 +1,6 @@
1
- export type KeycloakVersionRange = KeycloakVersionRange.WithAccountTheme | KeycloakVersionRange.WithoutAccountTheme;
1
+ export type KeycloakVersionRange =
2
+ | KeycloakVersionRange.WithAccountTheme
3
+ | KeycloakVersionRange.WithoutAccountTheme;
2
4
 
3
5
  export namespace KeycloakVersionRange {
4
6
  export type WithoutAccountTheme = "21-and-below" | "22-and-above";