keycloakify 10.0.0-rc.37 → 10.0.0-rc.39

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 (307) hide show
  1. package/account/Fallback.d.ts +1 -2
  2. package/account/Fallback.js.map +1 -1
  3. package/account/KcContext/KcContext.d.ts +6 -6
  4. package/account/KcContext/getKcContextMock.d.ts +9 -9
  5. package/account/KcContext/getKcContextMock.js +3 -3
  6. package/account/KcContext/getKcContextMock.js.map +1 -1
  7. package/account/Template.d.ts +1 -2
  8. package/account/Template.js +7 -6
  9. package/account/Template.js.map +1 -1
  10. package/account/TemplateProps.d.ts +1 -3
  11. package/account/i18n/i18n.d.ts +9 -4
  12. package/account/i18n/i18n.js +132 -87
  13. package/account/i18n/i18n.js.map +1 -1
  14. package/account/i18n/index.d.ts +9 -2
  15. package/account/i18n/index.js +5 -1
  16. package/account/i18n/index.js.map +1 -1
  17. package/account/lib/kcClsx.d.ts +9 -0
  18. package/account/lib/{useGetClassName.js → kcClsx.js} +3 -3
  19. package/account/lib/kcClsx.js.map +1 -0
  20. package/account/pages/Account.d.ts +1 -2
  21. package/account/pages/Account.js +9 -7
  22. package/account/pages/Account.js.map +1 -1
  23. package/account/pages/Applications.d.ts +1 -2
  24. package/account/pages/Applications.js +7 -7
  25. package/account/pages/Applications.js.map +1 -1
  26. package/account/pages/FederatedIdentity.d.ts +1 -2
  27. package/account/pages/FederatedIdentity.js +4 -3
  28. package/account/pages/FederatedIdentity.js.map +1 -1
  29. package/account/pages/Log.d.ts +1 -2
  30. package/account/pages/Log.js +6 -5
  31. package/account/pages/Log.js.map +1 -1
  32. package/account/pages/PageProps.d.ts +2 -4
  33. package/account/pages/Password.d.ts +1 -2
  34. package/account/pages/Password.js +10 -9
  35. package/account/pages/Password.js.map +1 -1
  36. package/account/pages/Sessions.d.ts +1 -2
  37. package/account/pages/Sessions.js +6 -6
  38. package/account/pages/Sessions.js.map +1 -1
  39. package/account/pages/Totp.d.ts +1 -2
  40. package/account/pages/Totp.js +6 -5
  41. package/account/pages/Totp.js.map +1 -1
  42. package/bin/193.index.js +13 -13
  43. package/bin/{430.index.js → 214.index.js} +161 -2
  44. package/bin/3.index.js +165 -149
  45. package/bin/322.index.js +595 -0
  46. package/bin/453.index.js +3 -3
  47. package/bin/526.index.js +42 -632
  48. package/bin/538.index.js +563 -0
  49. package/bin/932.index.js +7 -7
  50. package/bin/{890.index.js → 941.index.js} +2 -159
  51. package/bin/944.index.js +621 -0
  52. package/bin/961.index.js +5 -5
  53. package/bin/97.index.js +3 -3
  54. package/bin/{314.index.js → 98.index.js} +217 -48
  55. package/bin/main.js +20 -8
  56. package/lib/getKcClsx.d.ts +11 -0
  57. package/lib/getKcClsx.js +55 -0
  58. package/lib/getKcClsx.js.map +1 -0
  59. package/login/Fallback.d.ts +2 -2
  60. package/login/Fallback.js.map +1 -1
  61. package/login/KcContext/KcContext.d.ts +6 -6
  62. package/login/KcContext/getKcContextMock.d.ts +9 -9
  63. package/login/KcContext/getKcContextMock.js +3 -3
  64. package/login/KcContext/getKcContextMock.js.map +1 -1
  65. package/login/Template.d.ts +1 -2
  66. package/login/Template.js +10 -9
  67. package/login/Template.js.map +1 -1
  68. package/login/TemplateProps.d.ts +1 -3
  69. package/login/UserProfileFormFields.d.ts +6 -5
  70. package/login/UserProfileFormFields.js +35 -36
  71. package/login/UserProfileFormFields.js.map +1 -1
  72. package/login/i18n/i18n.d.ts +9 -4
  73. package/login/i18n/i18n.js +136 -91
  74. package/login/i18n/i18n.js.map +1 -1
  75. package/login/i18n/index.d.ts +9 -2
  76. package/login/i18n/index.js +5 -1
  77. package/login/i18n/index.js.map +1 -1
  78. package/login/lib/kcClsx.d.ts +9 -0
  79. package/login/lib/{useGetClassName.js → kcClsx.js} +3 -3
  80. package/login/lib/kcClsx.js.map +1 -0
  81. package/login/lib/useUserProfileForm.d.ts +9 -6
  82. package/login/lib/useUserProfileForm.js +7 -5
  83. package/login/lib/useUserProfileForm.js.map +1 -1
  84. package/login/pages/Code.d.ts +1 -2
  85. package/login/pages/Code.js +6 -5
  86. package/login/pages/Code.js.map +1 -1
  87. package/login/pages/DeleteAccountConfirm.d.ts +1 -2
  88. package/login/pages/DeleteAccountConfirm.js +7 -7
  89. package/login/pages/DeleteAccountConfirm.js.map +1 -1
  90. package/login/pages/DeleteCredential.d.ts +1 -2
  91. package/login/pages/DeleteCredential.js +6 -6
  92. package/login/pages/DeleteCredential.js.map +1 -1
  93. package/login/pages/Error.d.ts +1 -2
  94. package/login/pages/Error.js +4 -3
  95. package/login/pages/Error.js.map +1 -1
  96. package/login/pages/FrontchannelLogout.d.ts +1 -2
  97. package/login/pages/FrontchannelLogout.js +4 -3
  98. package/login/pages/FrontchannelLogout.js.map +1 -1
  99. package/login/pages/IdpReviewUserProfile.d.ts +2 -2
  100. package/login/pages/IdpReviewUserProfile.js +6 -6
  101. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  102. package/login/pages/Info.d.ts +1 -2
  103. package/login/pages/Info.js +4 -3
  104. package/login/pages/Info.js.map +1 -1
  105. package/login/pages/Login.d.ts +1 -2
  106. package/login/pages/Login.js +10 -8
  107. package/login/pages/Login.js.map +1 -1
  108. package/login/pages/LoginConfigTotp.d.ts +1 -2
  109. package/login/pages/LoginConfigTotp.js +8 -7
  110. package/login/pages/LoginConfigTotp.js.map +1 -1
  111. package/login/pages/LoginIdpLinkConfirm.d.ts +1 -2
  112. package/login/pages/LoginIdpLinkConfirm.js +6 -6
  113. package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
  114. package/login/pages/LoginIdpLinkEmail.d.ts +1 -2
  115. package/login/pages/LoginIdpLinkEmail.js +4 -3
  116. package/login/pages/LoginIdpLinkEmail.js.map +1 -1
  117. package/login/pages/LoginOauth2DeviceVerifyUserCode.d.ts +1 -2
  118. package/login/pages/LoginOauth2DeviceVerifyUserCode.js +6 -6
  119. package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -1
  120. package/login/pages/LoginOauthGrant.d.ts +1 -2
  121. package/login/pages/LoginOauthGrant.js +7 -7
  122. package/login/pages/LoginOauthGrant.js.map +1 -1
  123. package/login/pages/LoginOtp.d.ts +1 -2
  124. package/login/pages/LoginOtp.js +6 -6
  125. package/login/pages/LoginOtp.js.map +1 -1
  126. package/login/pages/LoginPageExpired.d.ts +1 -2
  127. package/login/pages/LoginPageExpired.js +4 -3
  128. package/login/pages/LoginPageExpired.js.map +1 -1
  129. package/login/pages/LoginPassword.d.ts +1 -2
  130. package/login/pages/LoginPassword.js +9 -7
  131. package/login/pages/LoginPassword.js.map +1 -1
  132. package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +1 -2
  133. package/login/pages/LoginRecoveryAuthnCodeConfig.js +9 -7
  134. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  135. package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +1 -2
  136. package/login/pages/LoginRecoveryAuthnCodeInput.js +6 -6
  137. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  138. package/login/pages/LoginResetOtp.d.ts +1 -2
  139. package/login/pages/LoginResetOtp.js +6 -6
  140. package/login/pages/LoginResetOtp.js.map +1 -1
  141. package/login/pages/LoginResetPassword.d.ts +1 -2
  142. package/login/pages/LoginResetPassword.js +7 -7
  143. package/login/pages/LoginResetPassword.js.map +1 -1
  144. package/login/pages/LoginUpdatePassword.d.ts +1 -2
  145. package/login/pages/LoginUpdatePassword.js +10 -9
  146. package/login/pages/LoginUpdatePassword.js.map +1 -1
  147. package/login/pages/LoginUpdateProfile.d.ts +2 -2
  148. package/login/pages/LoginUpdateProfile.js +7 -12
  149. package/login/pages/LoginUpdateProfile.js.map +1 -1
  150. package/login/pages/LoginUsername.d.ts +1 -2
  151. package/login/pages/LoginUsername.js +8 -7
  152. package/login/pages/LoginUsername.js.map +1 -1
  153. package/login/pages/LoginVerifyEmail.d.ts +1 -2
  154. package/login/pages/LoginVerifyEmail.js +4 -3
  155. package/login/pages/LoginVerifyEmail.js.map +1 -1
  156. package/login/pages/LoginX509Info.d.ts +1 -2
  157. package/login/pages/LoginX509Info.js +6 -6
  158. package/login/pages/LoginX509Info.js.map +1 -1
  159. package/login/pages/LogoutConfirm.d.ts +1 -2
  160. package/login/pages/LogoutConfirm.js +6 -6
  161. package/login/pages/LogoutConfirm.js.map +1 -1
  162. package/login/pages/PageProps.d.ts +2 -4
  163. package/login/pages/Register.d.ts +2 -2
  164. package/login/pages/Register.js +8 -16
  165. package/login/pages/Register.js.map +1 -1
  166. package/login/pages/SamlPostForm.d.ts +1 -2
  167. package/login/pages/SamlPostForm.js +4 -3
  168. package/login/pages/SamlPostForm.js.map +1 -1
  169. package/login/pages/SelectAuthenticator.d.ts +1 -2
  170. package/login/pages/SelectAuthenticator.js +6 -9
  171. package/login/pages/SelectAuthenticator.js.map +1 -1
  172. package/login/pages/Terms.d.ts +1 -2
  173. package/login/pages/Terms.js +6 -6
  174. package/login/pages/Terms.js.map +1 -1
  175. package/login/pages/UpdateEmail.d.ts +2 -2
  176. package/login/pages/UpdateEmail.js +8 -12
  177. package/login/pages/UpdateEmail.js.map +1 -1
  178. package/login/pages/WebauthnAuthenticate.d.ts +1 -2
  179. package/login/pages/WebauthnAuthenticate.js +13 -12
  180. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  181. package/login/pages/WebauthnError.d.ts +1 -2
  182. package/login/pages/WebauthnError.js +7 -7
  183. package/login/pages/WebauthnError.js.map +1 -1
  184. package/login/pages/WebauthnRegister.d.ts +1 -2
  185. package/login/pages/WebauthnRegister.js +9 -8
  186. package/login/pages/WebauthnRegister.js.map +1 -1
  187. package/package.json +27 -22
  188. package/src/account/Fallback.tsx +1 -2
  189. package/src/account/KcContext/KcContext.ts +7 -7
  190. package/src/account/KcContext/getKcContextMock.ts +13 -24
  191. package/src/account/Template.tsx +8 -8
  192. package/src/account/TemplateProps.ts +1 -6
  193. package/src/account/i18n/i18n.tsx +204 -125
  194. package/src/account/i18n/index.ts +10 -2
  195. package/src/account/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
  196. package/src/account/pages/Account.tsx +15 -21
  197. package/src/account/pages/Applications.tsx +8 -9
  198. package/src/account/pages/FederatedIdentity.tsx +5 -5
  199. package/src/account/pages/Log.tsx +8 -8
  200. package/src/account/pages/PageProps.ts +2 -4
  201. package/src/account/pages/Password.tsx +13 -16
  202. package/src/account/pages/Sessions.tsx +9 -10
  203. package/src/account/pages/Totp.tsx +19 -28
  204. package/src/bin/add-story.ts +3 -3
  205. package/src/bin/copy-keycloak-resources-to-public.ts +3 -3
  206. package/src/bin/download-keycloak-default-theme.ts +5 -5
  207. package/src/bin/eject-page.ts +3 -3
  208. package/src/bin/initialize-email-theme.ts +5 -5
  209. package/src/bin/keycloakify/buildJars/buildJar.ts +14 -14
  210. package/src/bin/keycloakify/buildJars/buildJars.ts +8 -8
  211. package/src/bin/keycloakify/buildJars/generatePom.ts +9 -9
  212. package/src/bin/keycloakify/generateFtl/generateFtl.ts +12 -12
  213. package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +7 -7
  214. package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +2 -66
  215. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +9 -9
  216. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +30 -24
  217. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +8 -8
  218. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +9 -9
  219. package/src/bin/keycloakify/keycloakify.ts +11 -11
  220. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +6 -6
  221. package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +7 -7
  222. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +10 -10
  223. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +13 -13
  224. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +11 -11
  225. package/src/bin/main.ts +17 -2
  226. package/src/bin/shared/{buildOptions.ts → buildContext.ts} +65 -51
  227. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +12 -12
  228. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +7 -7
  229. package/src/bin/shared/downloadKeycloakStaticResources.ts +7 -7
  230. package/src/bin/shared/generateKcGenTs.ts +61 -0
  231. package/src/bin/shared/getThemeSrcDirPath.ts +3 -3
  232. package/src/bin/start-keycloak/appBuild.ts +11 -11
  233. package/src/bin/start-keycloak/keycloakifyBuild.ts +7 -7
  234. package/src/bin/start-keycloak/start-keycloak.ts +34 -22
  235. package/src/bin/tools/escapeStringForPropertiesFile.ts +64 -0
  236. package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +3 -3
  237. package/src/bin/update-kc-gen.ts +13 -0
  238. package/src/lib/getKcClsx.ts +89 -0
  239. package/src/login/Fallback.tsx +2 -2
  240. package/src/login/KcContext/KcContext.ts +7 -7
  241. package/src/login/KcContext/getKcContextMock.ts +13 -24
  242. package/src/login/Template.tsx +36 -37
  243. package/src/login/TemplateProps.ts +1 -6
  244. package/src/login/UserProfileFormFields.tsx +67 -84
  245. package/src/login/i18n/i18n.tsx +208 -129
  246. package/src/login/i18n/index.ts +10 -2
  247. package/src/login/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
  248. package/src/login/lib/useUserProfileForm.tsx +29 -21
  249. package/src/login/pages/Code.tsx +10 -8
  250. package/src/login/pages/DeleteAccountConfirm.tsx +9 -10
  251. package/src/login/pages/DeleteCredential.tsx +11 -10
  252. package/src/login/pages/Error.tsx +5 -5
  253. package/src/login/pages/FrontchannelLogout.tsx +7 -5
  254. package/src/login/pages/IdpReviewUserProfile.tsx +18 -21
  255. package/src/login/pages/Info.tsx +7 -5
  256. package/src/login/pages/Login.tsx +34 -53
  257. package/src/login/pages/LoginConfigTotp.tsx +30 -38
  258. package/src/login/pages/LoginIdpLinkConfirm.tsx +10 -21
  259. package/src/login/pages/LoginIdpLinkEmail.tsx +5 -5
  260. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.tsx +19 -24
  261. package/src/login/pages/LoginOauthGrant.tsx +14 -21
  262. package/src/login/pages/LoginOtp.tsx +29 -33
  263. package/src/login/pages/LoginPageExpired.tsx +5 -5
  264. package/src/login/pages/LoginPassword.tsx +23 -33
  265. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +21 -25
  266. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +21 -25
  267. package/src/login/pages/LoginResetOtp.tsx +21 -25
  268. package/src/login/pages/LoginResetPassword.tsx +21 -25
  269. package/src/login/pages/LoginUpdatePassword.tsx +42 -52
  270. package/src/login/pages/LoginUpdateProfile.tsx +29 -30
  271. package/src/login/pages/LoginUsername.tsx +23 -35
  272. package/src/login/pages/LoginVerifyEmail.tsx +7 -5
  273. package/src/login/pages/LoginX509Info.tsx +27 -36
  274. package/src/login/pages/LogoutConfirm.tsx +11 -17
  275. package/src/login/pages/PageProps.ts +2 -4
  276. package/src/login/pages/Register.tsx +27 -46
  277. package/src/login/pages/SamlPostForm.tsx +5 -5
  278. package/src/login/pages/SelectAuthenticator.tsx +24 -26
  279. package/src/login/pages/Terms.tsx +9 -16
  280. package/src/login/pages/UpdateEmail.tsx +29 -33
  281. package/src/login/pages/WebauthnAuthenticate.tsx +26 -32
  282. package/src/login/pages/WebauthnError.tsx +11 -22
  283. package/src/login/pages/WebauthnRegister.tsx +20 -28
  284. package/src/tools/clsx.ts +6 -48
  285. package/src/tools/clsx_withTransform.ts +55 -0
  286. package/src/vite-plugin/vite-plugin.ts +29 -21
  287. package/tools/clsx.d.ts +3 -2
  288. package/tools/clsx.js +5 -41
  289. package/tools/clsx.js.map +1 -1
  290. package/tools/clsx_withTransform.d.ts +5 -0
  291. package/tools/clsx_withTransform.js +43 -0
  292. package/tools/clsx_withTransform.js.map +1 -0
  293. package/vite-plugin/index.js +243 -102
  294. package/vite-plugin/vite-plugin.d.ts +3 -3
  295. package/account/lib/useGetClassName.d.ts +0 -7
  296. package/account/lib/useGetClassName.js.map +0 -1
  297. package/bin/795.index.js +0 -1197
  298. package/lib/isStorybook.d.ts +0 -1
  299. package/lib/isStorybook.js +0 -3
  300. package/lib/isStorybook.js.map +0 -1
  301. package/lib/useGetClassName.d.ts +0 -10
  302. package/lib/useGetClassName.js +0 -14
  303. package/lib/useGetClassName.js.map +0 -1
  304. package/login/lib/useGetClassName.d.ts +0 -7
  305. package/login/lib/useGetClassName.js.map +0 -1
  306. package/src/lib/isStorybook.ts +0 -3
  307. package/src/lib/useGetClassName.ts +0 -27
@@ -7,10 +7,10 @@ import { themeTypes } from "./constants";
7
7
  const themeSrcDirBasenames = ["keycloak-theme", "keycloak_theme"];
8
8
 
9
9
  /** Can't catch error, if the directory isn't found, this function will just exit the process with an error message. */
10
- export function getThemeSrcDirPath(params: { reactAppRootDirPath: string }) {
11
- const { reactAppRootDirPath } = params;
10
+ export function getThemeSrcDirPath(params: { projectDirPath: string }) {
11
+ const { projectDirPath } = params;
12
12
 
13
- const srcDirPath = pathJoin(reactAppRootDirPath, "src");
13
+ const srcDirPath = pathJoin(projectDirPath, "src");
14
14
 
15
15
  const themeSrcDirPath: string | undefined = crawl({
16
16
  dirPath: srcDirPath,
@@ -2,26 +2,26 @@ import * as child_process from "child_process";
2
2
  import { Deferred } from "evt/tools/Deferred";
3
3
  import { assert } from "tsafe/assert";
4
4
  import { is } from "tsafe/is";
5
- import type { BuildOptions } from "../shared/buildOptions";
5
+ import type { BuildContext } from "../shared/buildContext";
6
6
  import * as fs from "fs";
7
7
  import { join as pathJoin } from "path";
8
8
 
9
- export type BuildOptionsLike = {
10
- reactAppRootDirPath: string;
9
+ export type BuildContextLike = {
10
+ projectDirPath: string;
11
11
  keycloakifyBuildDirPath: string;
12
12
  bundler: "vite" | "webpack";
13
13
  npmWorkspaceRootDirPath: string;
14
- reactAppBuildDirPath: string;
14
+ projectBuildDirPath: string;
15
15
  };
16
16
 
17
- assert<BuildOptions extends BuildOptionsLike ? true : false>();
17
+ assert<BuildContext extends BuildContextLike ? true : false>();
18
18
 
19
19
  export async function appBuild(params: {
20
- buildOptions: BuildOptionsLike;
20
+ buildContext: BuildContextLike;
21
21
  }): Promise<{ isAppBuildSuccess: boolean }> {
22
- const { buildOptions } = params;
22
+ const { buildContext } = params;
23
23
 
24
- const { bundler } = buildOptions;
24
+ const { bundler } = buildContext;
25
25
 
26
26
  const { command, args, cwd } = (() => {
27
27
  switch (bundler) {
@@ -29,12 +29,12 @@ export async function appBuild(params: {
29
29
  return {
30
30
  command: "npx",
31
31
  args: ["vite", "build"],
32
- cwd: buildOptions.reactAppRootDirPath
32
+ cwd: buildContext.projectDirPath
33
33
  };
34
34
  case "webpack": {
35
35
  for (const dirPath of [
36
- buildOptions.reactAppRootDirPath,
37
- buildOptions.npmWorkspaceRootDirPath
36
+ buildContext.projectDirPath,
37
+ buildContext.npmWorkspaceRootDirPath
38
38
  ]) {
39
39
  try {
40
40
  const parsedPackageJson = JSON.parse(
@@ -2,27 +2,27 @@ import { skipBuildJarsEnvName } from "../shared/constants";
2
2
  import * as child_process from "child_process";
3
3
  import { Deferred } from "evt/tools/Deferred";
4
4
  import { assert } from "tsafe/assert";
5
- import type { BuildOptions } from "../shared/buildOptions";
5
+ import type { BuildContext } from "../shared/buildContext";
6
6
 
7
- export type BuildOptionsLike = {
8
- reactAppRootDirPath: string;
7
+ export type BuildContextLike = {
8
+ projectDirPath: string;
9
9
  keycloakifyBuildDirPath: string;
10
10
  bundler: "vite" | "webpack";
11
11
  npmWorkspaceRootDirPath: string;
12
12
  };
13
13
 
14
- assert<BuildOptions extends BuildOptionsLike ? true : false>();
14
+ assert<BuildContext extends BuildContextLike ? true : false>();
15
15
 
16
16
  export async function keycloakifyBuild(params: {
17
17
  doSkipBuildJars: boolean;
18
- buildOptions: BuildOptionsLike;
18
+ buildContext: BuildContextLike;
19
19
  }): Promise<{ isKeycloakifyBuildSuccess: boolean }> {
20
- const { buildOptions, doSkipBuildJars } = params;
20
+ const { buildContext, doSkipBuildJars } = params;
21
21
 
22
22
  const dResult = new Deferred<{ isSuccess: boolean }>();
23
23
 
24
24
  const child = child_process.spawn("npx", ["keycloakify", "build"], {
25
- cwd: buildOptions.reactAppRootDirPath,
25
+ cwd: buildContext.projectDirPath,
26
26
  env: {
27
27
  ...process.env,
28
28
  ...(doSkipBuildJars ? { [skipBuildJarsEnvName]: "true" } : {})
@@ -1,4 +1,5 @@
1
- import { readBuildOptions } from "../shared/buildOptions";
1
+ import { getBuildContext } from "../shared/buildContext";
2
+ import { exclude } from "tsafe/exclude";
2
3
  import type { CliCommandOptions as CliCommandOptions_common } from "../main";
3
4
  import { promptKeycloakVersion } from "../shared/promptKeycloakVersion";
4
5
  import { readMetaInfKeycloakThemes } from "../shared/metaInfKeycloakThemes";
@@ -80,11 +81,11 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
80
81
 
81
82
  const { cliCommandOptions } = params;
82
83
 
83
- const buildOptions = readBuildOptions({ cliCommandOptions });
84
+ const buildContext = getBuildContext({ cliCommandOptions });
84
85
 
85
86
  {
86
87
  const { isAppBuildSuccess } = await appBuild({
87
- buildOptions
88
+ buildContext
88
89
  });
89
90
 
90
91
  if (!isAppBuildSuccess) {
@@ -98,7 +99,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
98
99
 
99
100
  const { isKeycloakifyBuildSuccess } = await keycloakifyBuild({
100
101
  doSkipBuildJars: false,
101
- buildOptions
102
+ buildContext
102
103
  });
103
104
 
104
105
  if (!isKeycloakifyBuildSuccess) {
@@ -112,7 +113,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
112
113
  }
113
114
 
114
115
  const metaInfKeycloakThemes = readMetaInfKeycloakThemes({
115
- keycloakifyBuildDirPath: buildOptions.keycloakifyBuildDirPath
116
+ keycloakifyBuildDirPath: buildContext.keycloakifyBuildDirPath
116
117
  });
117
118
 
118
119
  const doesImplementAccountTheme = metaInfKeycloakThemes.themes.some(
@@ -138,7 +139,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
138
139
 
139
140
  const { keycloakVersion } = await promptKeycloakVersion({
140
141
  startingFromMajor: 17,
141
- cacheDirPath: buildOptions.cacheDirPath
142
+ cacheDirPath: buildContext.cacheDirPath
142
143
  });
143
144
 
144
145
  console.log(`→ ${keycloakVersion}`);
@@ -259,7 +260,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
259
260
  return pathJoin(dirPath, value);
260
261
  })();
261
262
 
262
- const jarFilePath = pathJoin(buildOptions.keycloakifyBuildDirPath, jarFileBasename);
263
+ const jarFilePath = pathJoin(buildContext.keycloakifyBuildDirPath, jarFileBasename);
263
264
 
264
265
  const { doUseBuiltInAccountV1Theme } = await (async () => {
265
266
  let doUseBuiltInAccountV1Theme = false;
@@ -267,7 +268,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
267
268
  await extractArchive({
268
269
  archiveFilePath: jarFilePath,
269
270
  onArchiveFile: async ({ relativeFilePathInArchive, readFile, earlyExit }) => {
270
- for (const themeName of buildOptions.themeNames) {
271
+ for (const themeName of buildContext.themeNames) {
271
272
  if (
272
273
  relativeFilePathInArchive ===
273
274
  pathJoin("theme", themeName, "account", "theme.properties")
@@ -292,9 +293,9 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
292
293
  const accountThemePropertyPatch = !doUseBuiltInAccountV1Theme
293
294
  ? undefined
294
295
  : () => {
295
- for (const themeName of buildOptions.themeNames) {
296
+ for (const themeName of buildContext.themeNames) {
296
297
  const filePath = pathJoin(
297
- buildOptions.keycloakifyBuildDirPath,
298
+ buildContext.keycloakifyBuildDirPath,
298
299
  "src",
299
300
  "main",
300
301
  "resources",
@@ -346,12 +347,12 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
346
347
  ? ["-e", "JAVA_OPTS=-Dkeycloak.profile=preview"]
347
348
  : []),
348
349
  ...[
349
- ...buildOptions.themeNames,
350
+ ...buildContext.themeNames,
350
351
  ...(doUseBuiltInAccountV1Theme ? [] : [accountV1ThemeName])
351
352
  ]
352
353
  .map(themeName => ({
353
354
  localDirPath: pathJoin(
354
- buildOptions.keycloakifyBuildDirPath,
355
+ buildContext.keycloakifyBuildDirPath,
355
356
  "src",
356
357
  "main",
357
358
  "resources",
@@ -365,6 +366,17 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
365
366
  `${localDirPath}:${containerDirPath}:rw`
366
367
  ])
367
368
  .flat(),
369
+ ...buildContext.environmentVariables
370
+ .map(({ name }) => ({ name, envValue: process.env[name] }))
371
+ .map(({ name, envValue }) =>
372
+ envValue === undefined ? undefined : { name, envValue }
373
+ )
374
+ .filter(exclude(undefined))
375
+ .map(({ name, envValue }) => [
376
+ "--env",
377
+ `${name}='${envValue.replace(/'/g, "'\\''")}'`
378
+ ])
379
+ .flat(),
368
380
  `quay.io/keycloak/keycloak:${keycloakVersion}`,
369
381
  "start-dev",
370
382
  ...(21 <= keycloakMajorVersionNumber && keycloakMajorVersionNumber < 24
@@ -373,7 +385,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
373
385
  ...(realmJsonFilePath === undefined ? [] : ["--import-realm"])
374
386
  ],
375
387
  {
376
- cwd: buildOptions.keycloakifyBuildDirPath
388
+ cwd: buildContext.keycloakifyBuildDirPath
377
389
  }
378
390
  ] as const;
379
391
 
@@ -385,7 +397,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
385
397
 
386
398
  child.on("exit", process.exit);
387
399
 
388
- const srcDirPath = pathJoin(buildOptions.reactAppRootDirPath, "src");
400
+ const srcDirPath = pathJoin(buildContext.projectDirPath, "src");
389
401
 
390
402
  {
391
403
  const handler = async (data: Buffer) => {
@@ -417,7 +429,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
417
429
  `- password: ${chalk.cyan.bold("password123")}`,
418
430
  "",
419
431
  `Watching for changes in ${chalk.bold(
420
- `.${pathSep}${pathRelative(process.cwd(), buildOptions.reactAppRootDirPath)}`
432
+ `.${pathSep}${pathRelative(process.cwd(), buildContext.projectDirPath)}`
421
433
  )}`
422
434
  ].join("\n")
423
435
  );
@@ -431,7 +443,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
431
443
  console.log(chalk.cyan("Detected changes in the theme. Rebuilding ..."));
432
444
 
433
445
  const { isAppBuildSuccess } = await appBuild({
434
- buildOptions
446
+ buildContext
435
447
  });
436
448
 
437
449
  if (!isAppBuildSuccess) {
@@ -440,7 +452,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
440
452
 
441
453
  const { isKeycloakifyBuildSuccess } = await keycloakifyBuild({
442
454
  doSkipBuildJars: true,
443
- buildOptions
455
+ buildContext
444
456
  });
445
457
 
446
458
  if (!isKeycloakifyBuildSuccess) {
@@ -458,11 +470,11 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
458
470
  .watch(
459
471
  [
460
472
  srcDirPath,
461
- buildOptions.publicDirPath,
462
- pathJoin(buildOptions.reactAppRootDirPath, "package.json"),
463
- pathJoin(buildOptions.reactAppRootDirPath, "vite.config.ts"),
464
- pathJoin(buildOptions.reactAppRootDirPath, "vite.config.js"),
465
- pathJoin(buildOptions.reactAppRootDirPath, "index.html"),
473
+ buildContext.publicDirPath,
474
+ pathJoin(buildContext.projectDirPath, "package.json"),
475
+ pathJoin(buildContext.projectDirPath, "vite.config.ts"),
476
+ pathJoin(buildContext.projectDirPath, "vite.config.js"),
477
+ pathJoin(buildContext.projectDirPath, "index.html"),
466
478
  pathJoin(getThisCodebaseRootDirPath(), "src")
467
479
  ],
468
480
  {
@@ -0,0 +1,64 @@
1
+ // Convert a JavaScript string to UTF-16 encoding
2
+ function toUTF16(codePoint: number): string {
3
+ if (codePoint <= 0xffff) {
4
+ // BMP character
5
+ return "\\u" + codePoint.toString(16).padStart(4, "0");
6
+ } else {
7
+ // Non-BMP character
8
+ codePoint -= 0x10000;
9
+ let highSurrogate = (codePoint >> 10) + 0xd800;
10
+ let lowSurrogate = (codePoint % 0x400) + 0xdc00;
11
+ return (
12
+ "\\u" +
13
+ highSurrogate.toString(16).padStart(4, "0") +
14
+ "\\u" +
15
+ lowSurrogate.toString(16).padStart(4, "0")
16
+ );
17
+ }
18
+ }
19
+
20
+ // Escapes special characters for use in a .properties file
21
+ export function escapeStringForPropertiesFile(str: string): string {
22
+ let escapedStr = "";
23
+ for (const char of [...str]) {
24
+ const codePoint = char.codePointAt(0);
25
+ if (!codePoint) continue;
26
+
27
+ switch (char) {
28
+ case "\n":
29
+ escapedStr += "\\n";
30
+ break;
31
+ case "\r":
32
+ escapedStr += "\\r";
33
+ break;
34
+ case "\t":
35
+ escapedStr += "\\t";
36
+ break;
37
+ case "\\":
38
+ escapedStr += "\\\\";
39
+ break;
40
+ case ":":
41
+ escapedStr += "\\:";
42
+ break;
43
+ case "=":
44
+ escapedStr += "\\=";
45
+ break;
46
+ case "#":
47
+ escapedStr += "\\#";
48
+ break;
49
+ case "!":
50
+ escapedStr += "\\!";
51
+ break;
52
+ case "'":
53
+ escapedStr += "''";
54
+ break;
55
+ default:
56
+ if (codePoint > 0x7f) {
57
+ escapedStr += toUTF16(codePoint); // Non-ASCII characters
58
+ } else {
59
+ escapedStr += char; // ASCII character needs no escape
60
+ }
61
+ }
62
+ }
63
+ return escapedStr;
64
+ }
@@ -4,14 +4,14 @@ import { assert } from "tsafe/assert";
4
4
  import * as fs from "fs";
5
5
 
6
6
  export function getNpmWorkspaceRootDirPath(params: {
7
- reactAppRootDirPath: string;
7
+ projectDirPath: string;
8
8
  dependencyExpected: string;
9
9
  }) {
10
- const { reactAppRootDirPath, dependencyExpected } = params;
10
+ const { projectDirPath, dependencyExpected } = params;
11
11
 
12
12
  const npmWorkspaceRootDirPath = (function callee(depth: number): string {
13
13
  const cwd = pathResolve(
14
- pathJoin(...[reactAppRootDirPath, ...Array(depth).fill("..")])
14
+ pathJoin(...[projectDirPath, ...Array(depth).fill("..")])
15
15
  );
16
16
 
17
17
  assert(cwd !== pathSep, "NPM workspace not found");
@@ -0,0 +1,13 @@
1
+ import type { CliCommandOptions } from "./main";
2
+ import { getBuildContext } from "./shared/buildContext";
3
+ import { generateKcGenTs } from "./shared/generateKcGenTs";
4
+
5
+ export async function command(params: { cliCommandOptions: CliCommandOptions }) {
6
+ const { cliCommandOptions } = params;
7
+
8
+ const buildContext = getBuildContext({
9
+ cliCommandOptions
10
+ });
11
+
12
+ await generateKcGenTs({ buildContext });
13
+ }
@@ -0,0 +1,89 @@
1
+ import type { Param0 } from "tsafe";
2
+ import { type CxArg, clsx_withTransform } from "../tools/clsx_withTransform";
3
+ import { clsx } from "../tools/clsx";
4
+ import { assert } from "tsafe/assert";
5
+ import { is } from "tsafe/is";
6
+
7
+ export function createGetKcClsx<ClassKey extends string>(params: {
8
+ defaultClasses: Record<ClassKey, string | undefined>;
9
+ }) {
10
+ const { defaultClasses } = params;
11
+
12
+ function areSameParams(
13
+ params1: Param0<typeof getKcClsx>,
14
+ params2: Param0<typeof getKcClsx>
15
+ ): boolean {
16
+ if (params1.doUseDefaultCss !== params2.doUseDefaultCss) {
17
+ return false;
18
+ }
19
+
20
+ if (params1.classes === params2.classes) {
21
+ return true;
22
+ }
23
+
24
+ if (params1.classes === undefined || params2.classes === undefined) {
25
+ return false;
26
+ }
27
+
28
+ if (Object.keys(params1.classes).length !== Object.keys(params2.classes).length) {
29
+ return false;
30
+ }
31
+
32
+ for (const key in params1.classes) {
33
+ if (params1.classes[key] !== params2.classes[key]) {
34
+ return false;
35
+ }
36
+ }
37
+
38
+ return true;
39
+ }
40
+
41
+ let cache:
42
+ | {
43
+ params: Param0<typeof getKcClsx>;
44
+ result: ReturnType<typeof getKcClsx>;
45
+ }
46
+ | undefined = undefined;
47
+
48
+ function getKcClsx(params: {
49
+ doUseDefaultCss: boolean;
50
+ classes: Partial<Record<ClassKey, string>> | undefined;
51
+ }): { kcClsx: (...args: CxArg<ClassKey>[]) => string } {
52
+ // NOTE: We implement a cache here only so that getClassName can be stable across renders.
53
+ // We don't want to use useConstCallback because we want this to be useable outside of React.
54
+ use_cache: {
55
+ if (cache === undefined) {
56
+ break use_cache;
57
+ }
58
+
59
+ if (!areSameParams(cache.params, params)) {
60
+ break use_cache;
61
+ }
62
+
63
+ return cache.result;
64
+ }
65
+
66
+ const { classes, doUseDefaultCss } = params;
67
+
68
+ function kcClsx(...args: CxArg<ClassKey>[]): string {
69
+ return clsx_withTransform({
70
+ args,
71
+ transform: classKey => {
72
+ assert(is<ClassKey>(classKey));
73
+
74
+ return clsx(
75
+ classKey,
76
+ doUseDefaultCss ? defaultClasses[classKey] : undefined,
77
+ classes?.[classKey]
78
+ );
79
+ }
80
+ });
81
+ }
82
+
83
+ cache = { params, result: { kcClsx } };
84
+
85
+ return { kcClsx };
86
+ }
87
+
88
+ return { getKcClsx };
89
+ }
@@ -3,7 +3,6 @@ import { assert, type Equals } from "tsafe/assert";
3
3
  import type { LazyOrNot } from "keycloakify/tools/LazyOrNot";
4
4
  import type { PageProps } from "keycloakify/login/pages/PageProps";
5
5
  import type { KcContext } from "./KcContext";
6
- import type { I18n } from "./i18n";
7
6
  import type { UserProfileFormFieldsProps } from "keycloakify/login/UserProfileFormFields";
8
7
 
9
8
  const Login = lazy(() => import("keycloakify/login/pages/Login"));
@@ -41,8 +40,9 @@ const LoginResetOtp = lazy(() => import("keycloakify/login/pages/LoginResetOtp")
41
40
  const LoginX509Info = lazy(() => import("keycloakify/login/pages/LoginX509Info"));
42
41
  const WebauthnError = lazy(() => import("keycloakify/login/pages/WebauthnError"));
43
42
 
44
- type FallbackProps = PageProps<KcContext, I18n> & {
43
+ type FallbackProps = PageProps<KcContext> & {
45
44
  UserProfileFormFields: LazyOrNot<(props: UserProfileFormFieldsProps) => JSX.Element>;
45
+ doMakeUserConfirmPassword: boolean;
46
46
  };
47
47
 
48
48
  export default function Fallback(props: FallbackProps) {
@@ -10,20 +10,20 @@ import type { Equals } from "tsafe";
10
10
  import type { MessageKey } from "../i18n/i18n";
11
11
 
12
12
  export type ExtendKcContext<
13
- KcContextExtraProperties extends { properties?: Record<string, string | undefined> },
14
- KcContextExtraPropertiesPerPage extends Record<string, Record<string, unknown>>
13
+ KcContextExtension extends { properties?: Record<string, string | undefined> },
14
+ KcContextExtensionPerPage extends Record<string, Record<string, unknown>>
15
15
  > = ValueOf<{
16
- [PageId in keyof KcContextExtraPropertiesPerPage | KcContext["pageId"]]: Extract<
16
+ [PageId in keyof KcContextExtensionPerPage | KcContext["pageId"]]: Extract<
17
17
  KcContext,
18
18
  { pageId: PageId }
19
19
  > extends never
20
20
  ? KcContext.Common &
21
- KcContextExtraProperties & {
21
+ KcContextExtension & {
22
22
  pageId: PageId;
23
- } & KcContextExtraPropertiesPerPage[PageId]
23
+ } & KcContextExtensionPerPage[PageId]
24
24
  : Extract<KcContext, { pageId: PageId }> &
25
- KcContextExtraProperties &
26
- KcContextExtraPropertiesPerPage[PageId];
25
+ KcContextExtension &
26
+ KcContextExtensionPerPage[PageId];
27
27
  }>;
28
28
 
29
29
  /** Take theses type definition with a grain of salt.
@@ -7,43 +7,32 @@ import { kcContextMocks, kcContextCommonMock } from "./kcContextMocks";
7
7
  import { exclude } from "tsafe/exclude";
8
8
 
9
9
  export function createGetKcContextMock<
10
- KcContextExtraProperties extends { properties?: Record<string, string | undefined> },
11
- KcContextExtraPropertiesPerPage extends Record<
12
- `${string}.ftl`,
13
- Record<string, unknown>
14
- >
10
+ KcContextExtension extends { properties?: Record<string, string | undefined> },
11
+ KcContextExtensionPerPage extends Record<`${string}.ftl`, Record<string, unknown>>
15
12
  >(params: {
16
- kcContextExtraProperties: KcContextExtraProperties;
17
- kcContextExtraPropertiesPerPage: KcContextExtraPropertiesPerPage;
18
- overrides?: DeepPartial<KcContextExtraProperties & KcContextBase.Common>;
13
+ kcContextExtension: KcContextExtension;
14
+ kcContextExtensionPerPage: KcContextExtensionPerPage;
15
+ overrides?: DeepPartial<KcContextExtension & KcContextBase.Common>;
19
16
  overridesPerPage?: {
20
- [PageId in
21
- | LoginThemePageId
22
- | keyof KcContextExtraPropertiesPerPage]?: DeepPartial<
17
+ [PageId in LoginThemePageId | keyof KcContextExtensionPerPage]?: DeepPartial<
23
18
  Extract<
24
- ExtendKcContext<
25
- KcContextExtraProperties,
26
- KcContextExtraPropertiesPerPage
27
- >,
19
+ ExtendKcContext<KcContextExtension, KcContextExtensionPerPage>,
28
20
  { pageId: PageId }
29
21
  >
30
22
  >;
31
23
  };
32
24
  }) {
33
25
  const {
34
- kcContextExtraProperties,
35
- kcContextExtraPropertiesPerPage,
26
+ kcContextExtension,
27
+ kcContextExtensionPerPage,
36
28
  overrides: overrides_global,
37
29
  overridesPerPage: overridesPerPage_global
38
30
  } = params;
39
31
 
40
- type KcContext = ExtendKcContext<
41
- KcContextExtraProperties,
42
- KcContextExtraPropertiesPerPage
43
- >;
32
+ type KcContext = ExtendKcContext<KcContextExtension, KcContextExtensionPerPage>;
44
33
 
45
34
  function getKcContextMock<
46
- PageId extends LoginThemePageId | keyof KcContextExtraPropertiesPerPage
35
+ PageId extends LoginThemePageId | keyof KcContextExtensionPerPage
47
36
  >(params: {
48
37
  pageId: PageId;
49
38
  overrides?: DeepPartial<Extract<KcContext, { pageId: PageId }>>;
@@ -58,8 +47,8 @@ export function createGetKcContextMock<
58
47
  );
59
48
 
60
49
  [
61
- kcContextExtraProperties,
62
- kcContextExtraPropertiesPerPage[pageId],
50
+ kcContextExtension,
51
+ kcContextExtensionPerPage[pageId],
63
52
  overrides_global,
64
53
  overridesPerPage_global?.[pageId],
65
54
  overrides