keycloakify 9.6.7 → 10.0.0-rc.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 (417) hide show
  1. package/account/Template.js +34 -14
  2. package/account/Template.js.map +1 -1
  3. package/account/i18n/baseMessages/de.d.ts +1 -1
  4. package/account/i18n/baseMessages/de.js +1 -1
  5. package/account/i18n/baseMessages/de.js.map +1 -1
  6. package/account/i18n/baseMessages/en.d.ts +2 -0
  7. package/account/i18n/baseMessages/en.js +2 -0
  8. package/account/i18n/baseMessages/en.js.map +1 -1
  9. package/account/i18n/baseMessages/es.d.ts +230 -0
  10. package/account/i18n/baseMessages/es.js +231 -1
  11. package/account/i18n/baseMessages/es.js.map +1 -1
  12. package/account/i18n/baseMessages/index.d.ts +353 -407
  13. package/account/i18n/baseMessages/index.js +1 -0
  14. package/account/i18n/baseMessages/index.js.map +1 -1
  15. package/account/i18n/baseMessages/pl.d.ts +115 -1
  16. package/account/i18n/baseMessages/pl.js +115 -1
  17. package/account/i18n/baseMessages/pl.js.map +1 -1
  18. package/account/i18n/baseMessages/tr.d.ts +1 -1
  19. package/account/i18n/baseMessages/tr.js +1 -1
  20. package/account/i18n/baseMessages/tr.js.map +1 -1
  21. package/account/i18n/baseMessages/uk.d.ts +337 -0
  22. package/account/i18n/baseMessages/uk.js +342 -0
  23. package/account/i18n/baseMessages/uk.js.map +1 -0
  24. package/account/i18n/baseMessages/zh-CN.d.ts +10 -0
  25. package/account/i18n/baseMessages/zh-CN.js +10 -0
  26. package/account/i18n/baseMessages/zh-CN.js.map +1 -1
  27. package/bin/constants.d.ts +0 -1
  28. package/bin/constants.js +1 -2
  29. package/bin/constants.js.map +1 -1
  30. package/bin/keycloakify/buildJars/buildJar.d.ts +14 -0
  31. package/bin/keycloakify/buildJars/buildJar.js +224 -0
  32. package/bin/keycloakify/buildJars/buildJar.js.map +1 -0
  33. package/bin/keycloakify/buildJars/buildJars.d.ts +10 -0
  34. package/bin/keycloakify/buildJars/buildJars.js +95 -0
  35. package/bin/keycloakify/buildJars/buildJars.js.map +1 -0
  36. package/bin/keycloakify/buildJars/extensionVersions.d.ts +12 -0
  37. package/bin/keycloakify/buildJars/extensionVersions.js +7 -0
  38. package/bin/keycloakify/buildJars/extensionVersions.js.map +1 -0
  39. package/bin/keycloakify/buildJars/generatePom.d.ts +13 -0
  40. package/bin/keycloakify/buildJars/generatePom.js +95 -0
  41. package/bin/keycloakify/buildJars/generatePom.js.map +1 -0
  42. package/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.d.ts +6 -0
  43. package/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.js +35 -0
  44. package/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.js.map +1 -0
  45. package/bin/keycloakify/buildJars/index.d.ts +1 -0
  46. package/bin/keycloakify/buildJars/index.js +18 -0
  47. package/bin/keycloakify/buildJars/index.js.map +1 -0
  48. package/bin/keycloakify/buildOptions/UserProvidedBuildOptions.d.ts +0 -8
  49. package/bin/keycloakify/buildOptions/UserProvidedBuildOptions.js +1 -3
  50. package/bin/keycloakify/buildOptions/UserProvidedBuildOptions.js.map +1 -1
  51. package/bin/keycloakify/buildOptions/buildOptions.d.ts +0 -2
  52. package/bin/keycloakify/buildOptions/buildOptions.js +3 -5
  53. package/bin/keycloakify/buildOptions/buildOptions.js.map +1 -1
  54. package/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +105 -234
  55. package/bin/keycloakify/generateFtl/generateFtl.js +17 -39
  56. package/bin/keycloakify/generateFtl/generateFtl.js.map +1 -1
  57. package/bin/keycloakify/generateFtl/pageId.d.ts +1 -1
  58. package/bin/keycloakify/generateFtl/pageId.js +11 -3
  59. package/bin/keycloakify/generateFtl/pageId.js.map +1 -1
  60. package/bin/keycloakify/generateStartKeycloakTestingContainer.d.ts +0 -1
  61. package/bin/keycloakify/generateStartKeycloakTestingContainer.js +3 -6
  62. package/bin/keycloakify/generateStartKeycloakTestingContainer.js.map +1 -1
  63. package/bin/keycloakify/generateTheme/bringInAccountV1.d.ts +1 -1
  64. package/bin/keycloakify/generateTheme/bringInAccountV1.js +5 -9
  65. package/bin/keycloakify/generateTheme/bringInAccountV1.js.map +1 -1
  66. package/bin/keycloakify/generateTheme/generateSrcMainResources.d.ts +21 -0
  67. package/bin/keycloakify/generateTheme/generateSrcMainResources.js +340 -0
  68. package/bin/keycloakify/generateTheme/generateSrcMainResources.js.map +1 -0
  69. package/bin/keycloakify/generateTheme/generateTheme.d.ts +5 -13
  70. package/bin/keycloakify/generateTheme/generateTheme.js +30 -293
  71. package/bin/keycloakify/generateTheme/generateTheme.js.map +1 -1
  72. package/bin/keycloakify/generateTheme/generateThemeVariants.d.ts +5 -0
  73. package/bin/keycloakify/generateTheme/generateThemeVariants.js +67 -0
  74. package/bin/keycloakify/generateTheme/generateThemeVariants.js.map +1 -0
  75. package/bin/keycloakify/generateTheme/readFieldNameUsage.js +53 -18
  76. package/bin/keycloakify/generateTheme/readFieldNameUsage.js.map +1 -1
  77. package/bin/keycloakify/keycloakify.js +28 -104
  78. package/bin/keycloakify/keycloakify.js.map +1 -1
  79. package/lib/useGetClassName.js +2 -2
  80. package/lib/useGetClassName.js.map +1 -1
  81. package/login/Fallback.d.ts +7 -1
  82. package/login/Fallback.js +32 -8
  83. package/login/Fallback.js.map +1 -1
  84. package/login/Template.js +76 -20
  85. package/login/Template.js.map +1 -1
  86. package/login/TemplateProps.d.ts +4 -2
  87. package/login/UserProfileFormFields.d.ts +22 -0
  88. package/login/UserProfileFormFields.js +327 -0
  89. package/login/UserProfileFormFields.js.map +1 -0
  90. package/login/i18n/baseMessages/ar.d.ts +3 -0
  91. package/login/i18n/baseMessages/ar.js +3 -0
  92. package/login/i18n/baseMessages/ar.js.map +1 -1
  93. package/login/i18n/baseMessages/ca.d.ts +1 -0
  94. package/login/i18n/baseMessages/ca.js +1 -0
  95. package/login/i18n/baseMessages/ca.js.map +1 -1
  96. package/login/i18n/baseMessages/cs.d.ts +3 -0
  97. package/login/i18n/baseMessages/cs.js +3 -0
  98. package/login/i18n/baseMessages/cs.js.map +1 -1
  99. package/login/i18n/baseMessages/da.d.ts +1 -0
  100. package/login/i18n/baseMessages/da.js +1 -0
  101. package/login/i18n/baseMessages/da.js.map +1 -1
  102. package/login/i18n/baseMessages/de.d.ts +1 -0
  103. package/login/i18n/baseMessages/de.js +1 -0
  104. package/login/i18n/baseMessages/de.js.map +1 -1
  105. package/login/i18n/baseMessages/el.d.ts +1 -0
  106. package/login/i18n/baseMessages/el.js +1 -0
  107. package/login/i18n/baseMessages/el.js.map +1 -1
  108. package/login/i18n/baseMessages/en.d.ts +7 -0
  109. package/login/i18n/baseMessages/en.js +23 -16
  110. package/login/i18n/baseMessages/en.js.map +1 -1
  111. package/login/i18n/baseMessages/es.d.ts +239 -0
  112. package/login/i18n/baseMessages/es.js +240 -1
  113. package/login/i18n/baseMessages/es.js.map +1 -1
  114. package/login/i18n/baseMessages/fa.d.ts +1 -0
  115. package/login/i18n/baseMessages/fa.js +1 -0
  116. package/login/i18n/baseMessages/fa.js.map +1 -1
  117. package/login/i18n/baseMessages/fi.d.ts +1 -0
  118. package/login/i18n/baseMessages/fi.js +1 -0
  119. package/login/i18n/baseMessages/fi.js.map +1 -1
  120. package/login/i18n/baseMessages/fr.d.ts +1 -0
  121. package/login/i18n/baseMessages/fr.js +2 -1
  122. package/login/i18n/baseMessages/fr.js.map +1 -1
  123. package/login/i18n/baseMessages/hu.d.ts +1 -0
  124. package/login/i18n/baseMessages/hu.js +1 -0
  125. package/login/i18n/baseMessages/hu.js.map +1 -1
  126. package/login/i18n/baseMessages/index.d.ts +211 -416
  127. package/login/i18n/baseMessages/index.js +1 -0
  128. package/login/i18n/baseMessages/index.js.map +1 -1
  129. package/login/i18n/baseMessages/it.d.ts +1 -0
  130. package/login/i18n/baseMessages/it.js +1 -0
  131. package/login/i18n/baseMessages/it.js.map +1 -1
  132. package/login/i18n/baseMessages/ja.d.ts +1 -0
  133. package/login/i18n/baseMessages/ja.js +1 -0
  134. package/login/i18n/baseMessages/ja.js.map +1 -1
  135. package/login/i18n/baseMessages/lt.d.ts +1 -0
  136. package/login/i18n/baseMessages/lt.js +1 -0
  137. package/login/i18n/baseMessages/lt.js.map +1 -1
  138. package/login/i18n/baseMessages/lv.d.ts +1 -0
  139. package/login/i18n/baseMessages/lv.js +1 -0
  140. package/login/i18n/baseMessages/lv.js.map +1 -1
  141. package/login/i18n/baseMessages/nl.d.ts +1 -0
  142. package/login/i18n/baseMessages/nl.js +1 -0
  143. package/login/i18n/baseMessages/nl.js.map +1 -1
  144. package/login/i18n/baseMessages/no.d.ts +1 -0
  145. package/login/i18n/baseMessages/no.js +1 -0
  146. package/login/i18n/baseMessages/no.js.map +1 -1
  147. package/login/i18n/baseMessages/pl.d.ts +1 -0
  148. package/login/i18n/baseMessages/pl.js +1 -0
  149. package/login/i18n/baseMessages/pl.js.map +1 -1
  150. package/login/i18n/baseMessages/pt-BR.d.ts +1 -0
  151. package/login/i18n/baseMessages/pt-BR.js +1 -0
  152. package/login/i18n/baseMessages/pt-BR.js.map +1 -1
  153. package/login/i18n/baseMessages/ru.d.ts +1 -0
  154. package/login/i18n/baseMessages/ru.js +1 -0
  155. package/login/i18n/baseMessages/ru.js.map +1 -1
  156. package/login/i18n/baseMessages/sk.d.ts +2 -0
  157. package/login/i18n/baseMessages/sk.js +3 -1
  158. package/login/i18n/baseMessages/sk.js.map +1 -1
  159. package/login/i18n/baseMessages/sv.d.ts +1 -0
  160. package/login/i18n/baseMessages/sv.js +1 -0
  161. package/login/i18n/baseMessages/sv.js.map +1 -1
  162. package/login/i18n/baseMessages/th.d.ts +1 -0
  163. package/login/i18n/baseMessages/th.js +1 -0
  164. package/login/i18n/baseMessages/th.js.map +1 -1
  165. package/login/i18n/baseMessages/tr.d.ts +1 -0
  166. package/login/i18n/baseMessages/tr.js +1 -0
  167. package/login/i18n/baseMessages/tr.js.map +1 -1
  168. package/login/i18n/baseMessages/uk.d.ts +433 -0
  169. package/login/i18n/baseMessages/uk.js +438 -0
  170. package/login/i18n/baseMessages/uk.js.map +1 -0
  171. package/login/i18n/baseMessages/zh-CN.d.ts +273 -3
  172. package/login/i18n/baseMessages/zh-CN.js +325 -55
  173. package/login/i18n/baseMessages/zh-CN.js.map +1 -1
  174. package/login/i18n/i18n.d.ts +4 -0
  175. package/login/i18n/i18n.js +6 -2
  176. package/login/i18n/i18n.js.map +1 -1
  177. package/login/kcContext/KcContext.d.ts +181 -105
  178. package/login/kcContext/KcContext.js +1 -1
  179. package/login/kcContext/KcContext.js.map +1 -1
  180. package/login/kcContext/createGetKcContext.js +3 -9
  181. package/login/kcContext/createGetKcContext.js.map +1 -1
  182. package/login/kcContext/kcContextMocks.d.ts +1 -1
  183. package/login/kcContext/kcContextMocks.js +92 -198
  184. package/login/kcContext/kcContextMocks.js.map +1 -1
  185. package/login/lib/useDownloadTerms.d.ts +4 -1
  186. package/login/lib/useDownloadTerms.js +9 -4
  187. package/login/lib/useDownloadTerms.js.map +1 -1
  188. package/login/lib/useGetClassName.js +112 -73
  189. package/login/lib/useGetClassName.js.map +1 -1
  190. package/login/lib/useUserProfileForm.d.ts +74 -0
  191. package/login/lib/useUserProfileForm.js +868 -0
  192. package/login/lib/useUserProfileForm.js.map +1 -0
  193. package/login/pages/{UpdateUserProfile.d.ts → Code.d.ts} +2 -2
  194. package/login/pages/Code.js +13 -0
  195. package/login/pages/Code.js.map +1 -0
  196. package/login/pages/DeleteAccountConfirm.d.ts +7 -0
  197. package/login/pages/DeleteAccountConfirm.js +14 -0
  198. package/login/pages/DeleteAccountConfirm.js.map +1 -0
  199. package/login/pages/{RegisterUserProfile.d.ts → DeleteCredential.d.ts} +2 -2
  200. package/login/pages/DeleteCredential.js +14 -0
  201. package/login/pages/DeleteCredential.js.map +1 -0
  202. package/login/pages/Error.js +2 -2
  203. package/login/pages/Error.js.map +1 -1
  204. package/login/pages/FrontchannelLogout.d.ts +7 -0
  205. package/login/pages/FrontchannelLogout.js +14 -0
  206. package/login/pages/FrontchannelLogout.js.map +1 -0
  207. package/login/pages/IdpReviewUserProfile.d.ts +8 -2
  208. package/login/pages/IdpReviewUserProfile.js +3 -4
  209. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  210. package/login/pages/Info.js +14 -1
  211. package/login/pages/Info.js.map +1 -1
  212. package/login/pages/Login.js +24 -38
  213. package/login/pages/Login.js.map +1 -1
  214. package/login/pages/LoginConfigTotp.js +8 -1
  215. package/login/pages/LoginConfigTotp.js.map +1 -1
  216. package/login/pages/{LoginDeviceVerifyUserCode.d.ts → LoginOauth2DeviceVerifyUserCode.d.ts} +1 -1
  217. package/login/pages/{LoginDeviceVerifyUserCode.js → LoginOauth2DeviceVerifyUserCode.js} +2 -2
  218. package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -0
  219. package/login/pages/LoginOauthGrant.js +3 -2
  220. package/login/pages/LoginOauthGrant.js.map +1 -1
  221. package/login/pages/LoginOtp.js +4 -6
  222. package/login/pages/LoginOtp.js.map +1 -1
  223. package/login/pages/LoginPageExpired.js +1 -1
  224. package/login/pages/LoginPageExpired.js.map +1 -1
  225. package/login/pages/LoginPassword.d.ts +1 -1
  226. package/login/pages/LoginPassword.js +18 -11
  227. package/login/pages/LoginPassword.js.map +1 -1
  228. package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +7 -0
  229. package/login/pages/LoginRecoveryAuthnCodeConfig.js +147 -0
  230. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -0
  231. package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +7 -0
  232. package/login/pages/LoginRecoveryAuthnCodeInput.js +14 -0
  233. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -0
  234. package/login/pages/LoginResetOtp.d.ts +7 -0
  235. package/login/pages/LoginResetOtp.js +15 -0
  236. package/login/pages/LoginResetOtp.js.map +1 -0
  237. package/login/pages/LoginResetPassword.js +4 -3
  238. package/login/pages/LoginResetPassword.js.map +1 -1
  239. package/login/pages/LoginUpdatePassword.js +21 -3
  240. package/login/pages/LoginUpdatePassword.js.map +1 -1
  241. package/login/pages/LoginUpdateProfile.d.ts +8 -2
  242. package/login/pages/LoginUpdateProfile.js +11 -5
  243. package/login/pages/LoginUpdateProfile.js.map +1 -1
  244. package/login/pages/LoginUsername.js +11 -35
  245. package/login/pages/LoginUsername.js.map +1 -1
  246. package/login/pages/LoginVerifyEmail.js +1 -1
  247. package/login/pages/LoginVerifyEmail.js.map +1 -1
  248. package/login/pages/LoginX509Info.d.ts +7 -0
  249. package/login/pages/LoginX509Info.js +14 -0
  250. package/login/pages/LoginX509Info.js.map +1 -0
  251. package/login/pages/LogoutConfirm.js +1 -1
  252. package/login/pages/LogoutConfirm.js.map +1 -1
  253. package/login/pages/Register.d.ts +8 -2
  254. package/login/pages/Register.js +26 -4
  255. package/login/pages/Register.js.map +1 -1
  256. package/login/pages/SamlPostForm.js +1 -1
  257. package/login/pages/SamlPostForm.js.map +1 -1
  258. package/login/pages/SelectAuthenticator.js +5 -21
  259. package/login/pages/SelectAuthenticator.js.map +1 -1
  260. package/login/pages/Terms.js +4 -6
  261. package/login/pages/Terms.js.map +1 -1
  262. package/login/pages/UpdateEmail.d.ts +8 -2
  263. package/login/pages/UpdateEmail.js +16 -5
  264. package/login/pages/UpdateEmail.js.map +1 -1
  265. package/login/pages/WebauthnAuthenticate.js +121 -83
  266. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  267. package/login/pages/WebauthnError.d.ts +7 -0
  268. package/login/pages/WebauthnError.js +21 -0
  269. package/login/pages/WebauthnError.js.map +1 -0
  270. package/login/pages/WebauthnRegister.d.ts +7 -0
  271. package/login/pages/WebauthnRegister.js +193 -0
  272. package/login/pages/WebauthnRegister.js.map +1 -0
  273. package/package.json +138 -43
  274. package/src/account/Template.tsx +41 -14
  275. package/src/account/i18n/baseMessages/de.ts +1 -1
  276. package/src/account/i18n/baseMessages/en.ts +2 -0
  277. package/src/account/i18n/baseMessages/es.ts +231 -1
  278. package/src/account/i18n/baseMessages/index.ts +1 -0
  279. package/src/account/i18n/baseMessages/pl.ts +115 -1
  280. package/src/account/i18n/baseMessages/tr.ts +1 -1
  281. package/src/account/i18n/baseMessages/uk.ts +343 -0
  282. package/src/account/i18n/baseMessages/zh-CN.ts +10 -0
  283. package/src/bin/constants.ts +0 -1
  284. package/src/bin/keycloakify/buildJars/buildJar.ts +174 -0
  285. package/src/bin/keycloakify/buildJars/buildJars.ts +62 -0
  286. package/src/bin/keycloakify/buildJars/extensionVersions.ts +16 -0
  287. package/src/bin/keycloakify/buildJars/generatePom.ts +86 -0
  288. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +37 -0
  289. package/src/bin/keycloakify/buildJars/index.ts +1 -0
  290. package/src/bin/keycloakify/buildOptions/UserProvidedBuildOptions.ts +1 -5
  291. package/src/bin/keycloakify/buildOptions/buildOptions.ts +1 -5
  292. package/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +105 -234
  293. package/src/bin/keycloakify/generateFtl/generateFtl.ts +15 -31
  294. package/src/bin/keycloakify/generateFtl/pageId.ts +11 -3
  295. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +4 -8
  296. package/src/bin/keycloakify/generateTheme/bringInAccountV1.ts +5 -11
  297. package/src/bin/keycloakify/generateTheme/generateSrcMainResources.ts +267 -0
  298. package/src/bin/keycloakify/generateTheme/generateTheme.ts +22 -309
  299. package/src/bin/keycloakify/generateTheme/generateThemeVariants.ts +50 -0
  300. package/src/bin/keycloakify/generateTheme/readFieldNameUsage.ts +31 -8
  301. package/src/bin/keycloakify/keycloakify.ts +23 -56
  302. package/src/lib/useGetClassName.ts +2 -2
  303. package/src/login/Fallback.tsx +39 -9
  304. package/src/login/Template.tsx +160 -61
  305. package/src/login/TemplateProps.ts +113 -63
  306. package/src/login/UserProfileFormFields.tsx +750 -0
  307. package/src/login/i18n/baseMessages/ar.ts +3 -0
  308. package/src/login/i18n/baseMessages/ca.ts +1 -0
  309. package/src/login/i18n/baseMessages/cs.ts +3 -0
  310. package/src/login/i18n/baseMessages/da.ts +1 -0
  311. package/src/login/i18n/baseMessages/de.ts +1 -0
  312. package/src/login/i18n/baseMessages/el.ts +1 -0
  313. package/src/login/i18n/baseMessages/en.ts +23 -16
  314. package/src/login/i18n/baseMessages/es.ts +240 -1
  315. package/src/login/i18n/baseMessages/fa.ts +1 -0
  316. package/src/login/i18n/baseMessages/fi.ts +1 -0
  317. package/src/login/i18n/baseMessages/fr.ts +2 -1
  318. package/src/login/i18n/baseMessages/hu.ts +1 -0
  319. package/src/login/i18n/baseMessages/index.ts +1 -0
  320. package/src/login/i18n/baseMessages/it.ts +1 -0
  321. package/src/login/i18n/baseMessages/ja.ts +1 -0
  322. package/src/login/i18n/baseMessages/lt.ts +1 -0
  323. package/src/login/i18n/baseMessages/lv.ts +1 -0
  324. package/src/login/i18n/baseMessages/nl.ts +1 -0
  325. package/src/login/i18n/baseMessages/no.ts +1 -0
  326. package/src/login/i18n/baseMessages/pl.ts +1 -0
  327. package/src/login/i18n/baseMessages/pt-BR.ts +1 -0
  328. package/src/login/i18n/baseMessages/ru.ts +1 -0
  329. package/src/login/i18n/baseMessages/sk.ts +3 -1
  330. package/src/login/i18n/baseMessages/sv.ts +1 -0
  331. package/src/login/i18n/baseMessages/th.ts +1 -0
  332. package/src/login/i18n/baseMessages/tr.ts +1 -0
  333. package/src/login/i18n/baseMessages/uk.ts +439 -0
  334. package/src/login/i18n/baseMessages/zh-CN.ts +325 -55
  335. package/src/login/i18n/i18n.tsx +6 -2
  336. package/src/login/kcContext/KcContext.ts +216 -103
  337. package/src/login/kcContext/createGetKcContext.ts +11 -19
  338. package/src/login/kcContext/kcContextMocks.ts +165 -226
  339. package/src/login/lib/useDownloadTerms.ts +15 -7
  340. package/src/login/lib/useGetClassName.ts +112 -83
  341. package/src/login/lib/useUserProfileForm.tsx +1227 -0
  342. package/src/login/pages/Code.tsx +35 -0
  343. package/src/login/pages/DeleteAccountConfirm.tsx +53 -0
  344. package/src/login/pages/DeleteCredential.tsx +45 -0
  345. package/src/login/pages/Error.tsx +2 -2
  346. package/src/login/pages/FrontchannelLogout.tsx +41 -0
  347. package/src/login/pages/IdpReviewUserProfile.tsx +15 -5
  348. package/src/login/pages/Info.tsx +29 -19
  349. package/src/login/pages/Login.tsx +156 -117
  350. package/src/login/pages/LoginConfigTotp.tsx +26 -1
  351. package/src/login/pages/{LoginDeviceVerifyUserCode.tsx → LoginOauth2DeviceVerifyUserCode.tsx} +3 -1
  352. package/src/login/pages/LoginOauthGrant.tsx +38 -2
  353. package/src/login/pages/LoginOtp.tsx +73 -65
  354. package/src/login/pages/LoginPageExpired.tsx +1 -1
  355. package/src/login/pages/LoginPassword.tsx +77 -28
  356. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +260 -0
  357. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +73 -0
  358. package/src/login/pages/LoginResetOtp.tsx +70 -0
  359. package/src/login/pages/LoginResetPassword.tsx +11 -4
  360. package/src/login/pages/LoginUpdatePassword.tsx +120 -81
  361. package/src/login/pages/LoginUpdateProfile.tsx +41 -115
  362. package/src/login/pages/LoginUsername.tsx +93 -101
  363. package/src/login/pages/LoginVerifyEmail.tsx +14 -8
  364. package/src/login/pages/LoginX509Info.tsx +94 -0
  365. package/src/login/pages/LogoutConfirm.tsx +2 -2
  366. package/src/login/pages/Register.tsx +83 -131
  367. package/src/login/pages/SamlPostForm.tsx +1 -1
  368. package/src/login/pages/SelectAuthenticator.tsx +29 -52
  369. package/src/login/pages/Terms.tsx +4 -7
  370. package/src/login/pages/UpdateEmail.tsx +69 -54
  371. package/src/login/pages/WebauthnAuthenticate.tsx +205 -165
  372. package/src/login/pages/WebauthnError.tsx +66 -0
  373. package/src/login/pages/WebauthnRegister.tsx +285 -0
  374. package/src/tools/formatNumber.ts +48 -0
  375. package/src/tools/useInsertLinkTags.ts +82 -0
  376. package/src/tools/useInsertScriptTags.ts +106 -0
  377. package/src/tools/useSetClassName.ts +21 -0
  378. package/tools/formatNumber.d.ts +1 -0
  379. package/tools/formatNumber.js +37 -0
  380. package/tools/formatNumber.js.map +1 -0
  381. package/tools/useInsertLinkTags.d.ts +7 -0
  382. package/tools/useInsertLinkTags.js +57 -0
  383. package/tools/useInsertLinkTags.js.map +1 -0
  384. package/tools/useInsertScriptTags.d.ts +20 -0
  385. package/tools/useInsertScriptTags.js +75 -0
  386. package/tools/useInsertScriptTags.js.map +1 -0
  387. package/tools/useSetClassName.d.ts +4 -0
  388. package/tools/useSetClassName.js +16 -0
  389. package/tools/useSetClassName.js.map +1 -0
  390. package/vite-plugin/tsconfig.tsbuildinfo +1 -1
  391. package/bin/keycloakify/generatePom.d.ts +0 -12
  392. package/bin/keycloakify/generatePom.js +0 -59
  393. package/bin/keycloakify/generatePom.js.map +0 -1
  394. package/lib/usePrepareTemplate.d.ts +0 -11
  395. package/lib/usePrepareTemplate.js +0 -80
  396. package/lib/usePrepareTemplate.js.map +0 -1
  397. package/login/lib/useFormValidation.d.ts +0 -47
  398. package/login/lib/useFormValidation.js +0 -316
  399. package/login/lib/useFormValidation.js.map +0 -1
  400. package/login/pages/LoginDeviceVerifyUserCode.js.map +0 -1
  401. package/login/pages/RegisterUserProfile.js +0 -18
  402. package/login/pages/RegisterUserProfile.js.map +0 -1
  403. package/login/pages/UpdateUserProfile.js +0 -17
  404. package/login/pages/UpdateUserProfile.js.map +0 -1
  405. package/login/pages/shared/UserProfileFormFields.d.ts +0 -18
  406. package/login/pages/shared/UserProfileFormFields.js +0 -58
  407. package/login/pages/shared/UserProfileFormFields.js.map +0 -1
  408. package/src/bin/keycloakify/generatePom.ts +0 -70
  409. package/src/lib/usePrepareTemplate.ts +0 -113
  410. package/src/login/lib/useFormValidation.tsx +0 -474
  411. package/src/login/pages/RegisterUserProfile.tsx +0 -72
  412. package/src/login/pages/UpdateUserProfile.tsx +0 -82
  413. package/src/login/pages/shared/UserProfileFormFields.tsx +0 -177
  414. package/src/tools/headInsert.ts +0 -73
  415. package/tools/headInsert.d.ts +0 -12
  416. package/tools/headInsert.js +0 -50
  417. package/tools/headInsert.js.map +0 -1
@@ -0,0 +1,86 @@
1
+ import { assert } from "tsafe/assert";
2
+ import type { BuildOptions } from "../buildOptions";
3
+ import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions";
4
+
5
+ export type BuildOptionsLike = {
6
+ groupId: string;
7
+ artifactId: string;
8
+ themeVersion: string;
9
+ };
10
+
11
+ assert<BuildOptions extends BuildOptionsLike ? true : false>();
12
+
13
+ export function generatePom(params: {
14
+ keycloakAccountV1Version: KeycloakAccountV1Version;
15
+ keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion;
16
+ buildOptions: BuildOptionsLike;
17
+ }) {
18
+ const { keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, buildOptions } = params;
19
+
20
+ const { pomFileCode } = (function generatePomFileCode(): {
21
+ pomFileCode: string;
22
+ } {
23
+ const pomFileCode = [
24
+ `<?xml version="1.0"?>`,
25
+ `<project xmlns="http://maven.apache.org/POM/4.0.0"`,
26
+ ` xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"`,
27
+ ` xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">`,
28
+ ` <modelVersion>4.0.0</modelVersion>`,
29
+ ` <groupId>${buildOptions.groupId}</groupId>`,
30
+ ` <artifactId>${buildOptions.artifactId}</artifactId>`,
31
+ ` <version>${buildOptions.themeVersion}</version>`,
32
+ ` <name>${buildOptions.artifactId}</name>`,
33
+ ` <description />`,
34
+ ` <packaging>jar</packaging>`,
35
+ ` <properties>`,
36
+ ` <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>`,
37
+ ` </properties>`,
38
+ ...(keycloakAccountV1Version !== null && keycloakThemeAdditionalInfoExtensionVersion !== null
39
+ ? [
40
+ ` <build>`,
41
+ ` <plugins>`,
42
+ ` <plugin>`,
43
+ ` <groupId>org.apache.maven.plugins</groupId>`,
44
+ ` <artifactId>maven-shade-plugin</artifactId>`,
45
+ ` <version>3.5.1</version>`,
46
+ ` <executions>`,
47
+ ` <execution>`,
48
+ ` <phase>package</phase>`,
49
+ ` <goals>`,
50
+ ` <goal>shade</goal>`,
51
+ ` </goals>`,
52
+ ` </execution>`,
53
+ ` </executions>`,
54
+ ` </plugin>`,
55
+ ` </plugins>`,
56
+ ` </build>`,
57
+ ` <dependencies>`,
58
+ ...(keycloakAccountV1Version !== null
59
+ ? [
60
+ ` <dependency>`,
61
+ ` <groupId>io.phasetwo.keycloak</groupId>`,
62
+ ` <artifactId>keycloak-account-v1</artifactId>`,
63
+ ` <version>${keycloakAccountV1Version}</version>`,
64
+ ` </dependency>`
65
+ ]
66
+ : []),
67
+ ...(keycloakThemeAdditionalInfoExtensionVersion !== null
68
+ ? [
69
+ ` <dependency>`,
70
+ ` <groupId>dev.jcputney</groupId>`,
71
+ ` <artifactId>keycloak-theme-additional-info-extension</artifactId>`,
72
+ ` <version>${keycloakThemeAdditionalInfoExtensionVersion}</version>`,
73
+ ` </dependency>`
74
+ ]
75
+ : []),
76
+ ` </dependencies>`
77
+ ]
78
+ : []),
79
+ `</project>`
80
+ ].join("\n");
81
+
82
+ return { pomFileCode };
83
+ })();
84
+
85
+ return { pomFileCode };
86
+ }
@@ -0,0 +1,37 @@
1
+ import { assert, type Equals } from "tsafe/assert";
2
+ import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions";
3
+
4
+ export function getKeycloakVersionRangeForJar(params: {
5
+ doesImplementAccountTheme: boolean;
6
+ keycloakAccountV1Version: KeycloakAccountV1Version;
7
+ keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion;
8
+ }): string | undefined {
9
+ const { keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, doesImplementAccountTheme } = params;
10
+
11
+ switch (keycloakAccountV1Version) {
12
+ case null:
13
+ switch (keycloakThemeAdditionalInfoExtensionVersion) {
14
+ case null:
15
+ return doesImplementAccountTheme ? "21-and-below" : "21-and-below";
16
+ case "1.1.5":
17
+ return doesImplementAccountTheme ? undefined : "22-and-above";
18
+ }
19
+ assert<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(false);
20
+ case "0.3":
21
+ switch (keycloakThemeAdditionalInfoExtensionVersion) {
22
+ case null:
23
+ return doesImplementAccountTheme ? undefined : undefined;
24
+ case "1.1.5":
25
+ return doesImplementAccountTheme ? "23" : undefined;
26
+ }
27
+ assert<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(false);
28
+ case "0.4":
29
+ switch (keycloakThemeAdditionalInfoExtensionVersion) {
30
+ case null:
31
+ return doesImplementAccountTheme ? undefined : undefined;
32
+ case "1.1.5":
33
+ return doesImplementAccountTheme ? "24-and-above" : undefined;
34
+ }
35
+ assert<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(false);
36
+ }
37
+ }
@@ -0,0 +1 @@
1
+ export * from "./buildJars";
@@ -4,22 +4,18 @@ export type UserProvidedBuildOptions = {
4
4
  extraThemeProperties?: string[];
5
5
  artifactId?: string;
6
6
  groupId?: string;
7
- doCreateJar?: boolean;
8
7
  loginThemeResourcesFromKeycloakVersion?: string;
9
8
  reactAppBuildDirPath?: string;
10
9
  keycloakifyBuildDirPath?: string;
11
10
  themeName?: string | string[];
12
- doBuildRetrocompatAccountTheme?: boolean;
13
11
  };
14
12
 
15
13
  export const zUserProvidedBuildOptions = z.object({
16
14
  "extraThemeProperties": z.array(z.string()).optional(),
17
15
  "artifactId": z.string().optional(),
18
16
  "groupId": z.string().optional(),
19
- "doCreateJar": z.boolean().optional(),
20
17
  "loginThemeResourcesFromKeycloakVersion": z.string().optional(),
21
18
  "reactAppBuildDirPath": z.string().optional(),
22
19
  "keycloakifyBuildDirPath": z.string().optional(),
23
- "themeName": z.union([z.string(), z.array(z.string())]).optional(),
24
- "doBuildRetrocompatAccountTheme": z.boolean().optional()
20
+ "themeName": z.union([z.string(), z.array(z.string())]).optional()
25
21
  });
@@ -18,7 +18,6 @@ export type BuildOptions = {
18
18
  extraThemeProperties: string[] | undefined;
19
19
  groupId: string;
20
20
  artifactId: string;
21
- doCreateJar: boolean;
22
21
  loginThemeResourcesFromKeycloakVersion: string;
23
22
  reactAppRootDirPath: string;
24
23
  reactAppBuildDirPath: string;
@@ -30,7 +29,6 @@ export type BuildOptions = {
30
29
  * In this case the urlPathname will be "/my-app/" */
31
30
  urlPathname: string | undefined;
32
31
  assetsDirPath: string;
33
- doBuildRetrocompatAccountTheme: boolean;
34
32
  npmWorkspaceRootDirPath: string;
35
33
  };
36
34
 
@@ -116,8 +114,7 @@ export function readBuildOptions(params: { processArgv: string[] }): BuildOption
116
114
  );
117
115
  })(),
118
116
  "artifactId": process.env.KEYCLOAKIFY_ARTIFACT_ID ?? userProvidedBuildOptions.artifactId ?? `${themeNames[0]}-keycloak-theme`,
119
- "doCreateJar": userProvidedBuildOptions.doCreateJar ?? true,
120
- "loginThemeResourcesFromKeycloakVersion": userProvidedBuildOptions.loginThemeResourcesFromKeycloakVersion ?? "11.0.3",
117
+ "loginThemeResourcesFromKeycloakVersion": userProvidedBuildOptions.loginThemeResourcesFromKeycloakVersion ?? "24.0.4",
121
118
  reactAppRootDirPath,
122
119
  reactAppBuildDirPath,
123
120
  "keycloakifyBuildDirPath": (() => {
@@ -187,7 +184,6 @@ export function readBuildOptions(params: { processArgv: string[] }): BuildOption
187
184
 
188
185
  return pathJoin(reactAppBuildDirPath, resolvedViteConfig.assetsDir);
189
186
  })(),
190
- "doBuildRetrocompatAccountTheme": userProvidedBuildOptions.doBuildRetrocompatAccountTheme ?? true,
191
187
  npmWorkspaceRootDirPath
192
188
  };
193
189
  }
@@ -30,30 +30,19 @@
30
30
  <#list fieldNames as fieldName>
31
31
  if(fieldName === "${fieldName}" ){
32
32
 
33
- <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 -->
34
- <#if !messagesPerField.existsError??>
33
+ <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
34
+ <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
35
35
 
36
- <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
37
- <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
38
-
39
- <#assign doExistMessageForUsernameOrPassword = "">
36
+ <#assign doExistErrorOnUsernameOrPassword = "">
40
37
 
41
- <#attempt>
42
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('username')>
43
- <#recover>
44
- <#assign doExistMessageForUsernameOrPassword = true>
45
- </#attempt>
46
-
47
- <#if !doExistMessageForUsernameOrPassword>
48
- <#attempt>
49
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('password')>
50
- <#recover>
51
- <#assign doExistMessageForUsernameOrPassword = true>
52
- </#attempt>
53
- </#if>
54
-
55
- return <#if doExistMessageForUsernameOrPassword>text<#else>undefined</#if>;
38
+ <#attempt>
39
+ <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')>
40
+ <#recover>
41
+ <#assign doExistErrorOnUsernameOrPassword = true>
42
+ </#attempt>
56
43
 
44
+ <#if doExistErrorOnUsernameOrPassword>
45
+ return text;
57
46
  <#else>
58
47
 
59
48
  <#assign doExistMessageForField = "">
@@ -70,49 +59,19 @@
70
59
 
71
60
  <#else>
72
61
 
73
- <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
74
- <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
75
-
76
- <#assign doExistErrorOnUsernameOrPassword = "">
77
-
78
- <#attempt>
79
- <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')>
80
- <#recover>
81
- <#assign doExistErrorOnUsernameOrPassword = true>
82
- </#attempt>
83
-
84
- <#if doExistErrorOnUsernameOrPassword>
85
- return text;
86
- <#else>
87
-
88
- <#assign doExistMessageForField = "">
89
-
90
- <#attempt>
91
- <#assign doExistMessageForField = messagesPerField.exists('${fieldName}')>
92
- <#recover>
93
- <#assign doExistMessageForField = true>
94
- </#attempt>
62
+ <#assign doExistMessageForField = "">
95
63
 
96
- return <#if doExistMessageForField>text<#else>undefined</#if>;
64
+ <#attempt>
65
+ <#assign doExistMessageForField = messagesPerField.exists('${fieldName}')>
66
+ <#recover>
67
+ <#assign doExistMessageForField = true>
68
+ </#attempt>
97
69
 
98
- </#if>
99
-
100
- <#else>
101
-
102
- <#assign doExistMessageForField = "">
103
-
104
- <#attempt>
105
- <#assign doExistMessageForField = messagesPerField.exists('${fieldName}')>
106
- <#recover>
107
- <#assign doExistMessageForField = true>
108
- </#attempt>
109
-
110
- return <#if doExistMessageForField>text<#else>undefined</#if>;
111
-
112
- </#if>
70
+ return <#if doExistMessageForField>text<#else>undefined</#if>;
113
71
 
114
72
  </#if>
115
73
 
74
+
116
75
  }
117
76
  </#list>
118
77
 
@@ -120,53 +79,15 @@
120
79
  </#if>
121
80
 
122
81
  },
123
- "existsError": function (fieldName) {
82
+ "existsError": function (){
124
83
 
125
- <#if !messagesPerField?? || !(messagesPerField?is_hash)>
126
- throw new Error("You're not supposed to use messagesPerField.printIfExists in this page");
127
- <#else>
128
- <#list fieldNames as fieldName>
129
- if(fieldName === "${fieldName}" ){
84
+ function existsError_singleFieldName(fieldName) {
130
85
 
131
- <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 -->
132
- <#if !messagesPerField.existsError??>
133
-
134
- <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
135
- <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
136
-
137
- <#assign doExistMessageForUsernameOrPassword = "">
138
-
139
- <#attempt>
140
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('username')>
141
- <#recover>
142
- <#assign doExistMessageForUsernameOrPassword = true>
143
- </#attempt>
144
-
145
- <#if !doExistMessageForUsernameOrPassword>
146
- <#attempt>
147
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('password')>
148
- <#recover>
149
- <#assign doExistMessageForUsernameOrPassword = true>
150
- </#attempt>
151
- </#if>
152
-
153
- return <#if doExistMessageForUsernameOrPassword>true<#else>false</#if>;
154
-
155
- <#else>
156
-
157
- <#assign doExistMessageForField = "">
158
-
159
- <#attempt>
160
- <#assign doExistMessageForField = messagesPerField.exists('${fieldName}')>
161
- <#recover>
162
- <#assign doExistMessageForField = true>
163
- </#attempt>
164
-
165
- return <#if doExistMessageForField>true<#else>false</#if>;
166
-
167
- </#if>
168
-
169
- <#else>
86
+ <#if !messagesPerField?? || !(messagesPerField?is_hash)>
87
+ throw new Error("You're not supposed to use messagesPerField.printIfExists in this page");
88
+ <#else>
89
+ <#list fieldNames as fieldName>
90
+ if(fieldName === "${fieldName}" ){
170
91
 
171
92
  <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
172
93
  <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
@@ -195,14 +116,24 @@
195
116
 
196
117
  </#if>
197
118
 
198
- </#if>
119
+ }
120
+ </#list>
199
121
 
200
- }
201
- </#list>
122
+ throw new Error(fieldName + "is probably runtime generated, see: https://docs.keycloakify.dev/limitations#field-names-cant-be-runtime-generated");
202
123
 
203
- throw new Error(fieldName + "is probably runtime generated, see: https://docs.keycloakify.dev/limitations#field-names-cant-be-runtime-generated");
124
+ </#if>
204
125
 
205
- </#if>
126
+ }
127
+
128
+ for( let i = 0; i < arguments.length; i++ ){
129
+
130
+ if( existsError_singleFieldName(arguments[i]) ){
131
+ return true;
132
+ }
133
+
134
+ }
135
+
136
+ return false;
206
137
 
207
138
  },
208
139
  "get": function (fieldName) {
@@ -214,88 +145,42 @@
214
145
  <#list fieldNames as fieldName>
215
146
  if(fieldName === "${fieldName}" ){
216
147
 
217
- <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 -->
218
- <#if !messagesPerField.existsError??>
148
+ <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
149
+ <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
219
150
 
220
- <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
221
- <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
151
+ <#assign doExistErrorOnUsernameOrPassword = "">
222
152
 
223
- <#assign doExistMessageForUsernameOrPassword = "">
153
+ <#attempt>
154
+ <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')>
155
+ <#recover>
156
+ <#assign doExistErrorOnUsernameOrPassword = true>
157
+ </#attempt>
158
+
159
+ <#if doExistErrorOnUsernameOrPassword>
224
160
 
225
161
  <#attempt>
226
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('username')>
162
+ return "${kcSanitize(msg('invalidUserMessage'))?no_esc}";
227
163
  <#recover>
228
- <#assign doExistMessageForUsernameOrPassword = true>
164
+ return "Invalid username or password.";
229
165
  </#attempt>
230
166
 
231
- <#if !doExistMessageForUsernameOrPassword>
232
- <#attempt>
233
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('password')>
234
- <#recover>
235
- <#assign doExistMessageForUsernameOrPassword = true>
236
- </#attempt>
237
- </#if>
238
-
239
- <#if !doExistMessageForUsernameOrPassword>
240
- return "";
241
- <#else>
242
- <#attempt>
243
- return "${kcSanitize(msg('invalidUserMessage'))?no_esc}";
244
- <#recover>
245
- return "Invalid username or password.";
246
- </#attempt>
247
- </#if>
248
-
249
167
  <#else>
250
168
 
251
169
  <#attempt>
252
170
  return "${messagesPerField.get('${fieldName}')?no_esc}";
253
171
  <#recover>
254
- return "invalid field";
172
+ return "";
255
173
  </#attempt>
256
174
 
257
175
  </#if>
258
176
 
259
177
  <#else>
260
178
 
261
- <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
262
- <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
263
-
264
- <#assign doExistErrorOnUsernameOrPassword = "">
265
-
266
- <#attempt>
267
- <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')>
268
- <#recover>
269
- <#assign doExistErrorOnUsernameOrPassword = true>
270
- </#attempt>
271
-
272
- <#if doExistErrorOnUsernameOrPassword>
273
-
274
- <#attempt>
275
- return "${kcSanitize(msg('invalidUserMessage'))?no_esc}";
276
- <#recover>
277
- return "Invalid username or password.";
278
- </#attempt>
279
-
280
- <#else>
281
-
282
- <#attempt>
283
- return "${messagesPerField.get('${fieldName}')?no_esc}";
284
- <#recover>
285
- return "";
286
- </#attempt>
287
-
288
- </#if>
289
-
290
- <#else>
291
-
292
- <#attempt>
293
- return "${messagesPerField.get('${fieldName}')?no_esc}";
294
- <#recover>
295
- return "invalid field";
296
- </#attempt>
297
-
298
- </#if>
179
+ <#attempt>
180
+ return "${messagesPerField.get('${fieldName}')?no_esc}";
181
+ <#recover>
182
+ return "invalid field";
183
+ </#attempt>
299
184
 
300
185
  </#if>
301
186
 
@@ -315,72 +200,30 @@
315
200
  <#list fieldNames as fieldName>
316
201
  if(fieldName === "${fieldName}" ){
317
202
 
318
- <#-- https://github.com/keycloakify/keycloakify/pull/359 Compat with Keycloak prior v12 -->
319
- <#if !messagesPerField.existsError??>
320
-
321
- <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
322
- <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
323
-
324
- <#assign doExistMessageForUsernameOrPassword = "">
325
-
326
- <#attempt>
327
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('username')>
328
- <#recover>
329
- <#assign doExistMessageForUsernameOrPassword = true>
330
- </#attempt>
331
-
332
- <#if !doExistMessageForUsernameOrPassword>
333
- <#attempt>
334
- <#assign doExistMessageForUsernameOrPassword = messagesPerField.exists('password')>
335
- <#recover>
336
- <#assign doExistMessageForUsernameOrPassword = true>
337
- </#attempt>
338
- </#if>
339
-
340
- return <#if doExistMessageForUsernameOrPassword>true<#else>false</#if>;
341
-
342
- <#else>
343
-
344
- <#assign doExistMessageForField = "">
203
+ <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
204
+ <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
345
205
 
346
- <#attempt>
347
- <#assign doExistMessageForField = messagesPerField.exists('${fieldName}')>
348
- <#recover>
349
- <#assign doExistMessageForField = true>
350
- </#attempt>
206
+ <#assign doExistErrorOnUsernameOrPassword = "">
351
207
 
352
- return <#if doExistMessageForField>true<#else>false</#if>;
208
+ <#attempt>
209
+ <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')>
210
+ <#recover>
211
+ <#assign doExistErrorOnUsernameOrPassword = true>
212
+ </#attempt>
353
213
 
354
- </#if>
214
+ return <#if doExistErrorOnUsernameOrPassword>true<#else>false</#if>;
355
215
 
356
216
  <#else>
357
217
 
358
- <#-- https://github.com/keycloakify/keycloakify/pull/218 -->
359
- <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'>
218
+ <#assign doExistErrorMessageForField = "">
360
219
 
361
- <#assign doExistErrorOnUsernameOrPassword = "">
220
+ <#attempt>
221
+ <#assign doExistErrorMessageForField = messagesPerField.exists('${fieldName}')>
222
+ <#recover>
223
+ <#assign doExistErrorMessageForField = true>
224
+ </#attempt>
362
225
 
363
- <#attempt>
364
- <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')>
365
- <#recover>
366
- <#assign doExistErrorOnUsernameOrPassword = true>
367
- </#attempt>
368
-
369
- return <#if doExistErrorOnUsernameOrPassword>true<#else>false</#if>;
370
-
371
- <#else>
372
-
373
- <#assign doExistErrorMessageForField = "">
374
-
375
- <#attempt>
376
- <#assign doExistErrorMessageForField = messagesPerField.exists('${fieldName}')>
377
- <#recover>
378
- <#assign doExistErrorMessageForField = true>
379
- </#attempt>
380
-
381
- return <#if doExistErrorMessageForField>true<#else>false</#if>;
382
-
383
- </#if>
226
+ return <#if doExistErrorMessageForField>true<#else>false</#if>;
384
227
 
385
228
  </#if>
386
229
 
@@ -390,6 +233,19 @@
390
233
  throw new Error(fieldName + "is probably runtime generated, see: https://docs.keycloakify.dev/limitations#field-names-cant-be-runtime-generated");
391
234
  </#if>
392
235
 
236
+ },
237
+ "getFirstError": function () {
238
+
239
+ for( let i = 0; i < arguments.length; i++ ){
240
+
241
+ const fieldName = arguments[i];
242
+
243
+ if( out.messagesPerField.existsError(fieldName) ){
244
+ return out.messagesPerField.get(fieldName);
245
+ }
246
+
247
+ }
248
+
393
249
  }
394
250
  };
395
251
 
@@ -505,6 +361,10 @@
505
361
  <#-- See: https://github.com/keycloakify/keycloakify/issues/534 -->
506
362
  are_same_path(path, ["login"]) &&
507
363
  key == "password"
364
+ ) || (
365
+ <#-- Remove realmAttributes added by https://github.com/jcputney/keycloak-theme-additional-info-extension for peace of mind. -->
366
+ are_same_path(path, []) &&
367
+ key == "realmAttributes"
508
368
  )
509
369
  >
510
370
  <#local out_seq += ["/*If you need '" + path?join(".") + "." + key + "' on " + pageId + ", please submit an issue to the Keycloakify repo*/"]>
@@ -513,7 +373,7 @@
513
373
 
514
374
  <#-- https://github.com/keycloakify/keycloakify/discussions/406 -->
515
375
  <#if (
516
- ["register.ftl", "info.ftl", "login.ftl", "login-update-password.ftl", "login-oauth2-device-verify-user-code.ftl"]?seq_contains(pageId) &&
376
+ ["register.ftl", "register-user-profile.ftl", "info.ftl", "login.ftl", "login-update-password.ftl", "login-oauth2-device-verify-user-code.ftl"]?seq_contains(pageId) &&
517
377
  key == "attemptedUsername" && are_same_path(path, ["auth"])
518
378
  )>
519
379
  <#attempt>
@@ -523,7 +383,7 @@
523
383
  <#continue>
524
384
  </#if>
525
385
  <#recover>
526
- <#local out_seq += ["/*Testing if attemptedUsername should be skipped throwed an exception */"]>
386
+ <#local out_seq += ["/*Accessing attemptedUsername throwed an exception */"]>
527
387
  </#attempt>
528
388
  </#if>
529
389
 
@@ -668,12 +528,23 @@
668
528
  <#return '"' + object?datetime?iso_utc + '"'>
669
529
  </#if>
670
530
 
531
+ <#local isNumber = "">
532
+ <#attempt>
533
+ <#local isNumber = object?is_number>
534
+ <#recover>
535
+ <#return "ABORT: Can't test if it's a number">
536
+ </#attempt>
537
+
538
+ <#if isNumber>
539
+ <#return object?c>
540
+ </#if>
541
+
671
542
  <#attempt>
672
543
  <#return '"' + object?js_string + '"'>;
673
544
  <#recover>
674
545
  </#attempt>
675
546
 
676
- <#return "ABORT: Couldn't convert into string non hash, non method, non boolean, non enumerable object">
547
+ <#return "ABORT: Couldn't convert into string non hash, non method, non boolean, non number, non enumerable object">
677
548
 
678
549
  </#function>
679
550
  <#function is_subpath path searchedPath>