keycloakify 10.0.0-rc.97 → 10.0.0

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 (507) hide show
  1. package/PUBLIC_URL.js +2 -2
  2. package/PUBLIC_URL.js.map +1 -1
  3. package/README.md +28 -242
  4. package/account/KcContext/KcContext.d.ts +4 -1
  5. package/account/KcContext/KcContext.js.map +1 -1
  6. package/account/KcContext/kcContextMocks.js +7 -4
  7. package/account/KcContext/kcContextMocks.js.map +1 -1
  8. package/account/Template.js +3 -1
  9. package/account/Template.js.map +1 -1
  10. package/account/i18n/GenericI18n.d.ts +6 -0
  11. package/account/i18n/GenericI18n.js +2 -0
  12. package/account/i18n/GenericI18n.js.map +1 -0
  13. package/account/i18n/i18n.d.ts +24 -30
  14. package/account/i18n/i18n.js +50 -70
  15. package/account/i18n/i18n.js.map +1 -1
  16. package/account/i18n/index.d.ts +4 -3
  17. package/account/i18n/index.js.map +1 -1
  18. package/account/i18n/messages_defaultSet/ar.js.map +1 -0
  19. package/account/i18n/messages_defaultSet/ca.js.map +1 -0
  20. package/account/i18n/messages_defaultSet/cs.js.map +1 -0
  21. package/account/i18n/messages_defaultSet/da.js.map +1 -0
  22. package/account/i18n/messages_defaultSet/de.js.map +1 -0
  23. package/account/i18n/messages_defaultSet/el.js.map +1 -0
  24. package/account/i18n/messages_defaultSet/en.js.map +1 -0
  25. package/account/i18n/messages_defaultSet/es.js.map +1 -0
  26. package/account/i18n/messages_defaultSet/fa.js.map +1 -0
  27. package/account/i18n/messages_defaultSet/fi.js.map +1 -0
  28. package/account/i18n/messages_defaultSet/fr.js.map +1 -0
  29. package/account/i18n/messages_defaultSet/hu.js.map +1 -0
  30. package/account/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  31. package/account/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  32. package/account/i18n/messages_defaultSet/index.js.map +1 -0
  33. package/account/i18n/messages_defaultSet/it.js.map +1 -0
  34. package/account/i18n/messages_defaultSet/ja.js.map +1 -0
  35. package/account/i18n/messages_defaultSet/lt.js.map +1 -0
  36. package/account/i18n/messages_defaultSet/lv.js.map +1 -0
  37. package/account/i18n/messages_defaultSet/nl.js.map +1 -0
  38. package/account/i18n/messages_defaultSet/no.js.map +1 -0
  39. package/account/i18n/messages_defaultSet/pl.js.map +1 -0
  40. package/account/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  41. package/account/i18n/messages_defaultSet/ru.js.map +1 -0
  42. package/account/i18n/messages_defaultSet/sk.js.map +1 -0
  43. package/account/i18n/messages_defaultSet/sv.js.map +1 -0
  44. package/account/i18n/messages_defaultSet/th.js.map +1 -0
  45. package/account/i18n/messages_defaultSet/tr.js.map +1 -0
  46. package/account/i18n/messages_defaultSet/uk.js.map +1 -0
  47. package/account/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  48. package/account/i18n/useI18n.d.ts +6 -5
  49. package/account/i18n/useI18n.js +37 -4
  50. package/account/i18n/useI18n.js.map +1 -1
  51. package/account/pages/Applications.js +1 -1
  52. package/account/pages/Applications.js.map +1 -1
  53. package/account/pages/FederatedIdentity.js +1 -1
  54. package/account/pages/FederatedIdentity.js.map +1 -1
  55. package/account/pages/Totp.js +5 -1
  56. package/account/pages/Totp.js.map +1 -1
  57. package/bin/193.index.js +5 -5
  58. package/bin/{490.index.js → 246.index.js} +22 -4
  59. package/bin/31.index.js +264 -203
  60. package/bin/440.index.js +178 -106
  61. package/bin/453.index.js +59 -7
  62. package/bin/526.index.js +525 -137
  63. package/bin/599.index.js +567 -0
  64. package/bin/{893.index.js → 622.index.js} +239 -231
  65. package/bin/{36.index.js → 678.index.js} +577 -71
  66. package/bin/{180.index.js → 697.index.js} +611 -526
  67. package/bin/743.index.js +70 -0
  68. package/bin/780.index.js +895 -0
  69. package/bin/786.index.js +185 -0
  70. package/bin/932.index.js +740 -52
  71. package/bin/{456.index.js → 941.index.js} +3 -1988
  72. package/bin/97.index.js +29 -7
  73. package/bin/main.js +1994 -8
  74. package/bin/shared/KeycloakVersionRange.d.ts +3 -3
  75. package/bin/shared/buildContext.d.ts +52 -16
  76. package/bin/shared/buildContext.js.map +1 -1
  77. package/bin/shared/constants.d.ts +18 -17
  78. package/bin/shared/constants.js +15 -14
  79. package/bin/shared/constants.js.map +1 -1
  80. package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -1
  81. package/bin/shared/downloadKeycloakDefaultTheme.js.map +1 -1
  82. package/bin/shared/generateKcGenTs.d.ts +3 -0
  83. package/bin/shared/generateKcGenTs.js.map +1 -1
  84. package/bin/shared/getLatestsSemVersionedTag.d.ts +15 -0
  85. package/bin/shared/getLatestsSemVersionedTag.js.map +1 -0
  86. package/bin/shared/promptKeycloakVersion.d.ts +3 -1
  87. package/bin/shared/promptKeycloakVersion.js.map +1 -1
  88. package/lib/getKcClsx.js +2 -1
  89. package/lib/getKcClsx.js.map +1 -1
  90. package/login/KcContext/KcContext.d.ts +10 -11
  91. package/login/KcContext/KcContext.js.map +1 -1
  92. package/login/KcContext/kcContextMocks.js +4 -5
  93. package/login/KcContext/kcContextMocks.js.map +1 -1
  94. package/login/Template.js +13 -7
  95. package/login/Template.js.map +1 -1
  96. package/login/TemplateProps.d.ts +0 -1
  97. package/login/UserProfileFormFields.js +6 -5
  98. package/login/UserProfileFormFields.js.map +1 -1
  99. package/login/i18n/GenericI18n.d.ts +6 -0
  100. package/login/i18n/GenericI18n.js +2 -0
  101. package/login/i18n/GenericI18n.js.map +1 -0
  102. package/login/i18n/i18n.d.ts +22 -32
  103. package/login/i18n/i18n.js +51 -92
  104. package/login/i18n/i18n.js.map +1 -1
  105. package/login/i18n/index.d.ts +4 -3
  106. package/login/i18n/index.js.map +1 -1
  107. package/login/i18n/messages_defaultSet/ar.js.map +1 -0
  108. package/login/i18n/messages_defaultSet/ca.js.map +1 -0
  109. package/login/i18n/messages_defaultSet/cs.js.map +1 -0
  110. package/login/i18n/messages_defaultSet/da.js.map +1 -0
  111. package/login/i18n/messages_defaultSet/de.js.map +1 -0
  112. package/login/i18n/messages_defaultSet/el.js.map +1 -0
  113. package/login/i18n/messages_defaultSet/en.js.map +1 -0
  114. package/login/i18n/messages_defaultSet/es.js.map +1 -0
  115. package/login/i18n/messages_defaultSet/fa.js.map +1 -0
  116. package/login/i18n/messages_defaultSet/fi.js.map +1 -0
  117. package/login/i18n/messages_defaultSet/fr.js.map +1 -0
  118. package/login/i18n/messages_defaultSet/hu.js.map +1 -0
  119. package/login/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  120. package/login/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  121. package/login/i18n/messages_defaultSet/index.js.map +1 -0
  122. package/login/i18n/messages_defaultSet/it.js.map +1 -0
  123. package/login/i18n/messages_defaultSet/ja.js.map +1 -0
  124. package/login/i18n/messages_defaultSet/lt.js.map +1 -0
  125. package/login/i18n/messages_defaultSet/lv.js.map +1 -0
  126. package/login/i18n/messages_defaultSet/nl.js.map +1 -0
  127. package/login/i18n/messages_defaultSet/no.js.map +1 -0
  128. package/login/i18n/messages_defaultSet/pl.js.map +1 -0
  129. package/login/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  130. package/login/i18n/messages_defaultSet/ru.js.map +1 -0
  131. package/login/i18n/messages_defaultSet/sk.js.map +1 -0
  132. package/login/i18n/messages_defaultSet/sv.js.map +1 -0
  133. package/login/i18n/messages_defaultSet/th.js.map +1 -0
  134. package/login/i18n/messages_defaultSet/tr.js.map +1 -0
  135. package/login/i18n/messages_defaultSet/uk.js.map +1 -0
  136. package/login/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  137. package/login/i18n/useI18n.d.ts +6 -5
  138. package/login/i18n/useI18n.js +37 -4
  139. package/login/i18n/useI18n.js.map +1 -1
  140. package/login/lib/useUserProfileForm.d.ts +2 -0
  141. package/login/lib/useUserProfileForm.js +44 -10
  142. package/login/lib/useUserProfileForm.js.map +1 -1
  143. package/login/pages/Error.js +1 -1
  144. package/login/pages/Error.js.map +1 -1
  145. package/login/pages/Info.js +15 -3
  146. package/login/pages/Info.js.map +1 -1
  147. package/login/pages/Login.js +6 -2
  148. package/login/pages/Login.js.map +1 -1
  149. package/login/pages/LoginConfigTotp.js +5 -1
  150. package/login/pages/LoginConfigTotp.js.map +1 -1
  151. package/login/pages/LoginOtp.js +3 -1
  152. package/login/pages/LoginOtp.js.map +1 -1
  153. package/login/pages/LoginPassword.js +3 -1
  154. package/login/pages/LoginPassword.js.map +1 -1
  155. package/login/pages/LoginRecoveryAuthnCodeInput.js +3 -1
  156. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  157. package/login/pages/LoginResetPassword.js +3 -1
  158. package/login/pages/LoginResetPassword.js.map +1 -1
  159. package/login/pages/LoginUpdatePassword.js +5 -1
  160. package/login/pages/LoginUpdatePassword.js.map +1 -1
  161. package/login/pages/Register.js +3 -1
  162. package/login/pages/Register.js.map +1 -1
  163. package/login/pages/SamlPostForm.js +1 -1
  164. package/login/pages/SamlPostForm.js.map +1 -1
  165. package/login/pages/SelectAuthenticator.js +2 -2
  166. package/login/pages/SelectAuthenticator.js.map +1 -1
  167. package/login/pages/WebauthnAuthenticate.js +3 -3
  168. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  169. package/login/pages/WebauthnRegister.js +2 -2
  170. package/package.json +267 -245
  171. package/src/PUBLIC_URL.ts +2 -2
  172. package/src/account/KcContext/KcContext.ts +4 -1
  173. package/src/account/KcContext/kcContextMocks.ts +7 -4
  174. package/src/account/Template.tsx +6 -1
  175. package/src/account/i18n/GenericI18n.tsx +6 -0
  176. package/src/account/i18n/i18n.tsx +91 -129
  177. package/src/account/i18n/index.ts +4 -3
  178. package/src/account/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  179. package/src/account/i18n/useI18n.tsx +95 -0
  180. package/src/account/pages/Applications.tsx +0 -1
  181. package/src/account/pages/FederatedIdentity.tsx +1 -1
  182. package/src/account/pages/Totp.tsx +16 -6
  183. package/src/bin/add-story.ts +42 -10
  184. package/src/bin/eject-page.ts +119 -11
  185. package/src/bin/initialize-account-theme/copyBoilerplate.ts +32 -0
  186. package/src/bin/initialize-account-theme/index.ts +1 -0
  187. package/src/bin/initialize-account-theme/initialize-account-theme.ts +112 -0
  188. package/src/bin/initialize-account-theme/initializeAccountTheme_multiPage.ts +21 -0
  189. package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +152 -0
  190. package/src/bin/initialize-account-theme/src/multi-page/KcContext.ts +12 -0
  191. package/src/bin/initialize-account-theme/src/multi-page/KcPage.tsx +25 -0
  192. package/src/bin/initialize-account-theme/src/multi-page/KcPageStory.tsx +38 -0
  193. package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +5 -0
  194. package/src/bin/initialize-account-theme/src/single-page/KcContext.ts +7 -0
  195. package/src/bin/initialize-account-theme/src/single-page/KcPage.tsx +11 -0
  196. package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +92 -0
  197. package/src/bin/initialize-email-theme.ts +1 -1
  198. package/src/bin/keycloakify/buildJars/buildJar.ts +38 -24
  199. package/src/bin/keycloakify/buildJars/buildJars.ts +6 -3
  200. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +5 -5
  201. package/src/bin/keycloakify/generateFtl/generateFtl.ts +16 -16
  202. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +471 -364
  203. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +7 -7
  204. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +3 -3
  205. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +125 -59
  206. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +2 -2
  207. package/src/bin/keycloakify/generateResources/readExtraPageNames.ts +5 -8
  208. package/src/bin/keycloakify/keycloakify.ts +8 -6
  209. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +41 -27
  210. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +2 -2
  211. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +6 -6
  212. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +4 -4
  213. package/src/bin/main.ts +19 -2
  214. package/src/bin/shared/KeycloakVersionRange.ts +4 -4
  215. package/src/bin/shared/buildContext.ts +360 -251
  216. package/src/bin/shared/constants.ts +19 -17
  217. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +6 -6
  218. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +48 -27
  219. package/src/bin/shared/downloadKeycloakStaticResources.ts +2 -2
  220. package/src/bin/shared/generateKcGenTs.ts +110 -3
  221. package/src/bin/shared/getLatestsSemVersionedTag.ts +201 -0
  222. package/src/bin/shared/promptKeycloakVersion.ts +20 -80
  223. package/src/bin/start-keycloak/appBuild.ts +15 -11
  224. package/src/bin/start-keycloak/keycloakifyBuild.ts +3 -3
  225. package/src/bin/start-keycloak/myrealm-realm-18.json +4 -4
  226. package/src/bin/start-keycloak/myrealm-realm-19.json +4 -4
  227. package/src/bin/start-keycloak/myrealm-realm-20.json +4 -4
  228. package/src/bin/start-keycloak/myrealm-realm-21.json +4 -4
  229. package/src/bin/start-keycloak/myrealm-realm-23.json +3 -3
  230. package/src/bin/start-keycloak/myrealm-realm-24.json +4 -4
  231. package/src/bin/start-keycloak/myrealm-realm-25.json +4 -4
  232. package/src/bin/start-keycloak/start-keycloak.ts +256 -102
  233. package/src/bin/tools/assertNoPnpmDlx.ts +17 -0
  234. package/src/bin/tools/downloadAndExtractArchive.ts +10 -9
  235. package/src/bin/tools/fetchProxyOptions.ts +32 -11
  236. package/src/bin/tools/npmInstall.ts +63 -0
  237. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +3 -2
  238. package/src/bin/tsconfig.json +3 -1
  239. package/src/lib/getKcClsx.ts +2 -2
  240. package/src/login/KcContext/KcContext.ts +10 -28
  241. package/src/login/KcContext/kcContextMocks.ts +5 -6
  242. package/src/login/Template.tsx +32 -54
  243. package/src/login/TemplateProps.ts +0 -1
  244. package/src/login/UserProfileFormFields.tsx +15 -11
  245. package/src/login/i18n/GenericI18n.tsx +6 -0
  246. package/src/login/i18n/i18n.tsx +91 -166
  247. package/src/login/i18n/index.ts +4 -3
  248. package/src/login/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  249. package/src/login/i18n/useI18n.tsx +95 -0
  250. package/src/login/lib/useUserProfileForm.tsx +68 -20
  251. package/src/login/pages/Error.tsx +1 -1
  252. package/src/login/pages/Info.tsx +26 -6
  253. package/src/login/pages/Login.tsx +20 -9
  254. package/src/login/pages/LoginConfigTotp.tsx +16 -6
  255. package/src/login/pages/LoginOtp.tsx +8 -3
  256. package/src/login/pages/LoginPassword.tsx +8 -3
  257. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +8 -3
  258. package/src/login/pages/LoginResetPassword.tsx +8 -3
  259. package/src/login/pages/LoginUpdatePassword.tsx +55 -47
  260. package/src/login/pages/Register.tsx +8 -3
  261. package/src/login/pages/SamlPostForm.tsx +1 -1
  262. package/src/login/pages/SelectAuthenticator.tsx +4 -4
  263. package/src/login/pages/WebauthnAuthenticate.tsx +5 -5
  264. package/src/login/pages/WebauthnRegister.tsx +2 -2
  265. package/src/tools/useInsertLinkTags.ts +9 -1
  266. package/src/tools/useInsertScriptTags.ts +9 -1
  267. package/src/vite-plugin/vite-plugin.ts +15 -13
  268. package/stories/account/pages/Applications.stories.tsx +80 -0
  269. package/stories/account/pages/Log.stories.tsx +1 -0
  270. package/stories/account-spa/index.stories.tsx +94 -0
  271. package/stories/intro/intro.stories.tsx +90 -0
  272. package/stories/login/pages/Info.stories.tsx +7 -2
  273. package/stories/login/pages/Login.stories.tsx +25 -13
  274. package/stories/login/pages/Register.stories.tsx +11 -9
  275. package/stories/login/pages/SelectAuthenticator.stories.tsx +41 -0
  276. package/stories/login/pages/Terms.stories.tsx +6 -2
  277. package/tools/useInsertLinkTags.js +7 -1
  278. package/tools/useInsertLinkTags.js.map +1 -1
  279. package/tools/useInsertScriptTags.js +7 -1
  280. package/tools/useInsertScriptTags.js.map +1 -1
  281. package/vite-plugin/index.js +25820 -25686
  282. package/vite-plugin/vite-plugin.d.ts +6 -4
  283. package/account/i18n/baseMessages/ar.js.map +0 -1
  284. package/account/i18n/baseMessages/ca.js.map +0 -1
  285. package/account/i18n/baseMessages/cs.js.map +0 -1
  286. package/account/i18n/baseMessages/da.js.map +0 -1
  287. package/account/i18n/baseMessages/de.js.map +0 -1
  288. package/account/i18n/baseMessages/el.js.map +0 -1
  289. package/account/i18n/baseMessages/en.js.map +0 -1
  290. package/account/i18n/baseMessages/es.js.map +0 -1
  291. package/account/i18n/baseMessages/fa.js.map +0 -1
  292. package/account/i18n/baseMessages/fi.js.map +0 -1
  293. package/account/i18n/baseMessages/fr.js.map +0 -1
  294. package/account/i18n/baseMessages/hu.js.map +0 -1
  295. package/account/i18n/baseMessages/index.js.map +0 -1
  296. package/account/i18n/baseMessages/it.js.map +0 -1
  297. package/account/i18n/baseMessages/ja.js.map +0 -1
  298. package/account/i18n/baseMessages/lt.js.map +0 -1
  299. package/account/i18n/baseMessages/lv.js.map +0 -1
  300. package/account/i18n/baseMessages/nl.js.map +0 -1
  301. package/account/i18n/baseMessages/no.js.map +0 -1
  302. package/account/i18n/baseMessages/pl.js.map +0 -1
  303. package/account/i18n/baseMessages/pt-BR.js.map +0 -1
  304. package/account/i18n/baseMessages/ru.js.map +0 -1
  305. package/account/i18n/baseMessages/sk.js.map +0 -1
  306. package/account/i18n/baseMessages/sv.js.map +0 -1
  307. package/account/i18n/baseMessages/th.js.map +0 -1
  308. package/account/i18n/baseMessages/tr.js.map +0 -1
  309. package/account/i18n/baseMessages/uk.js.map +0 -1
  310. package/account/i18n/baseMessages/zh-CN.js.map +0 -1
  311. package/bin/538.index.js +0 -108
  312. package/login/i18n/baseMessages/ar.js.map +0 -1
  313. package/login/i18n/baseMessages/ca.js.map +0 -1
  314. package/login/i18n/baseMessages/cs.js.map +0 -1
  315. package/login/i18n/baseMessages/da.js.map +0 -1
  316. package/login/i18n/baseMessages/de.js.map +0 -1
  317. package/login/i18n/baseMessages/el.js.map +0 -1
  318. package/login/i18n/baseMessages/en.js.map +0 -1
  319. package/login/i18n/baseMessages/es.js.map +0 -1
  320. package/login/i18n/baseMessages/fa.js.map +0 -1
  321. package/login/i18n/baseMessages/fi.js.map +0 -1
  322. package/login/i18n/baseMessages/fr.js.map +0 -1
  323. package/login/i18n/baseMessages/hu.js.map +0 -1
  324. package/login/i18n/baseMessages/index.js.map +0 -1
  325. package/login/i18n/baseMessages/it.js.map +0 -1
  326. package/login/i18n/baseMessages/ja.js.map +0 -1
  327. package/login/i18n/baseMessages/lt.js.map +0 -1
  328. package/login/i18n/baseMessages/lv.js.map +0 -1
  329. package/login/i18n/baseMessages/nl.js.map +0 -1
  330. package/login/i18n/baseMessages/no.js.map +0 -1
  331. package/login/i18n/baseMessages/pl.js.map +0 -1
  332. package/login/i18n/baseMessages/pt-BR.js.map +0 -1
  333. package/login/i18n/baseMessages/ru.js.map +0 -1
  334. package/login/i18n/baseMessages/sk.js.map +0 -1
  335. package/login/i18n/baseMessages/sv.js.map +0 -1
  336. package/login/i18n/baseMessages/th.js.map +0 -1
  337. package/login/i18n/baseMessages/tr.js.map +0 -1
  338. package/login/i18n/baseMessages/uk.js.map +0 -1
  339. package/login/i18n/baseMessages/zh-CN.js.map +0 -1
  340. package/src/account/i18n/useI18n.ts +0 -44
  341. package/src/login/i18n/useI18n.ts +0 -44
  342. package/src/tools/ExtractAfterStartingWith.ts +0 -4
  343. package/tools/ExtractAfterStartingWith.d.ts +0 -1
  344. package/tools/ExtractAfterStartingWith.js +0 -2
  345. package/tools/ExtractAfterStartingWith.js.map +0 -1
  346. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  347. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  348. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  349. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  350. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  351. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  352. /package/account/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  353. /package/account/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  354. /package/account/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  355. /package/account/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  356. /package/account/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  357. /package/account/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  358. /package/account/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  359. /package/account/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  360. /package/account/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  361. /package/account/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  362. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  363. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  364. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  365. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  366. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  367. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  368. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  369. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  370. /package/account/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  371. /package/account/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  372. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  373. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  374. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  375. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  376. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  377. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  378. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  379. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  380. /package/account/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  381. /package/account/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  382. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  383. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  384. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  385. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  386. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  387. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  388. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  389. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  390. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  391. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  392. /package/account/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  393. /package/account/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  394. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  395. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  396. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  397. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  398. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  399. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  400. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  401. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  402. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  403. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  404. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  405. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  406. /package/login/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  407. /package/login/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  408. /package/login/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  409. /package/login/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  410. /package/login/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  411. /package/login/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  412. /package/login/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  413. /package/login/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  414. /package/login/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  415. /package/login/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  416. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  417. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  418. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  419. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  420. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  421. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  422. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  423. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  424. /package/login/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  425. /package/login/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  426. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  427. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  428. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  429. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  430. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  431. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  432. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  433. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  434. /package/login/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  435. /package/login/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  436. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  437. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  438. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  439. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  440. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  441. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  442. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  443. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  444. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  445. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  446. /package/login/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  447. /package/login/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  448. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  449. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  450. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  451. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  452. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  453. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  454. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  455. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  456. /package/src/account/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  457. /package/src/account/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  458. /package/src/account/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  459. /package/src/account/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  460. /package/src/account/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  461. /package/src/account/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  462. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  463. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  464. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  465. /package/src/account/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  466. /package/src/account/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  467. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  468. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  469. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  470. /package/src/account/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  471. /package/src/account/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  472. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  473. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  474. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  475. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  476. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  477. /package/src/account/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  478. /package/src/account/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  479. /package/src/account/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  480. /package/src/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
  481. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  482. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  483. /package/src/login/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  484. /package/src/login/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  485. /package/src/login/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  486. /package/src/login/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  487. /package/src/login/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  488. /package/src/login/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  489. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  490. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  491. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  492. /package/src/login/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  493. /package/src/login/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  494. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  495. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  496. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  497. /package/src/login/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  498. /package/src/login/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  499. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  500. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  501. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  502. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  503. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  504. /package/src/login/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  505. /package/src/login/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  506. /package/src/login/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  507. /package/src/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
@@ -9,7 +9,7 @@ import { formatNumber } from "keycloakify/tools/formatNumber";
9
9
  import { useInsertScriptTags } from "keycloakify/tools/useInsertScriptTags";
10
10
  import type { PasswordPolicies, Attribute, Validators } from "keycloakify/login/KcContext";
11
11
  import type { KcContext } from "../KcContext";
12
- import type { MessageKey } from "keycloakify/login/i18n";
12
+ import type { MessageKey_defaultSet } from "keycloakify/login/i18n";
13
13
  import { KcContextLike as KcContextLike_i18n } from "keycloakify/login/i18n";
14
14
  import type { I18n } from "../i18n";
15
15
 
@@ -59,6 +59,8 @@ export type FormAction =
59
59
  action: "update";
60
60
  name: string;
61
61
  valueOrValues: string | string[];
62
+ /** Default false */
63
+ displayErrorsImmediately?: boolean;
62
64
  }
63
65
  | {
64
66
  action: "focus lost";
@@ -148,7 +150,7 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
148
150
  .map(name =>
149
151
  id<Attribute>({
150
152
  name: name,
151
- displayName: id<`\${${MessageKey}}`>(`\${${name}}`),
153
+ displayName: id<`\${${MessageKey_defaultSet}}`>(`\${${name}}`),
152
154
  required: true,
153
155
  value: (kcContext.register as any).formData[name] ?? "",
154
156
  html5DataAnnotations: {},
@@ -176,7 +178,7 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
176
178
  .map(name =>
177
179
  id<Attribute>({
178
180
  name: name,
179
- displayName: id<`\${${MessageKey}}`>(`\${${name}}`),
181
+ displayName: id<`\${${MessageKey_defaultSet}}`>(`\${${name}}`),
180
182
  required: true,
181
183
  value: (kcContext as any).user[name] ?? "",
182
184
  html5DataAnnotations: {},
@@ -202,7 +204,7 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
202
204
  return [
203
205
  id<Attribute>({
204
206
  name: "email",
205
- displayName: id<`\${${MessageKey}}`>(`\${email}`),
207
+ displayName: id<`\${${MessageKey_defaultSet}}`>(`\${email}`),
206
208
  required: true,
207
209
  value: (kcContext.email as any).value ?? "",
208
210
  html5DataAnnotations: {},
@@ -227,7 +229,7 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
227
229
  break patch_legacy_group;
228
230
  }
229
231
 
230
- const { group, groupDisplayHeader, groupDisplayDescription /*, groupAnnotations*/ } = attribute as Attribute & {
232
+ const { group, groupDisplayHeader, groupDisplayDescription, groupAnnotations } = attribute as Attribute & {
231
233
  group: string;
232
234
  groupDisplayHeader?: string;
233
235
  groupDisplayDescription?: string;
@@ -250,6 +252,7 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
250
252
  name: group,
251
253
  displayHeader: groupDisplayHeader,
252
254
  displayDescription: groupDisplayDescription,
255
+ annotations: groupAnnotations,
253
256
  html5DataAnnotations: {}
254
257
  };
255
258
  }
@@ -292,7 +295,7 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
292
295
  0,
293
296
  {
294
297
  name: "password",
295
- displayName: id<`\${${MessageKey}}`>("${password}"),
298
+ displayName: id<`\${${MessageKey_defaultSet}}`>("${password}"),
296
299
  required: true,
297
300
  readOnly: false,
298
301
  validators: {},
@@ -302,7 +305,7 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
302
305
  },
303
306
  {
304
307
  name: "password-confirm",
305
- displayName: id<`\${${MessageKey}}`>("${passwordConfirm}"),
308
+ displayName: id<`\${${MessageKey_defaultSet}}`>("${passwordConfirm}"),
306
309
  required: true,
307
310
  readOnly: false,
308
311
  validators: {},
@@ -412,6 +415,24 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
412
415
  formFieldStates: state.formFieldStates
413
416
  });
414
417
 
418
+ simulate_focus_lost: {
419
+ const { displayErrorsImmediately = false } = formAction;
420
+
421
+ if (!displayErrorsImmediately) {
422
+ break simulate_focus_lost;
423
+ }
424
+
425
+ for (const fieldIndex of formAction.valueOrValues instanceof Array
426
+ ? formAction.valueOrValues.map((...[, index]) => index)
427
+ : [undefined]) {
428
+ state = reducer(state, {
429
+ action: "focus lost",
430
+ name: formAction.name,
431
+ fieldIndex
432
+ });
433
+ }
434
+ }
435
+
415
436
  update_password_confirm: {
416
437
  if (doMakeUserConfirmPassword) {
417
438
  break update_password_confirm;
@@ -424,7 +445,31 @@ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnType
424
445
  state = reducer(state, {
425
446
  action: "update",
426
447
  name: "password-confirm",
427
- valueOrValues: formAction.valueOrValues
448
+ valueOrValues: formAction.valueOrValues,
449
+ displayErrorsImmediately: formAction.displayErrorsImmediately
450
+ });
451
+ }
452
+
453
+ trigger_password_confirm_validation_on_password_change: {
454
+ if (!doMakeUserConfirmPassword) {
455
+ break trigger_password_confirm_validation_on_password_change;
456
+ }
457
+
458
+ if (formAction.name !== "password") {
459
+ break trigger_password_confirm_validation_on_password_change;
460
+ }
461
+
462
+ state = reducer(state, {
463
+ action: "update",
464
+ name: "password-confirm",
465
+ valueOrValues: (() => {
466
+ const formFieldState = state.formFieldStates.find(({ attribute }) => attribute.name === "password-confirm");
467
+
468
+ assert(formFieldState !== undefined);
469
+
470
+ return formFieldState.valueOrValues;
471
+ })(),
472
+ displayErrorsImmediately: formAction.displayErrorsImmediately
428
473
  });
429
474
  }
430
475
 
@@ -612,7 +657,14 @@ function useGetErrors(params: { kcContext: KcContextLike_useGetErrors; i18n: I18
612
657
  return [
613
658
  {
614
659
  errorMessageStr,
615
- errorMessage: <span key={0}>{errorMessageStr}</span>,
660
+ errorMessage: (
661
+ <span
662
+ key={0}
663
+ dangerouslySetInnerHTML={{
664
+ __html: errorMessageStr
665
+ }}
666
+ />
667
+ ),
616
668
  fieldIndex: undefined,
617
669
  source: {
618
670
  type: "server"
@@ -1126,7 +1178,7 @@ function useGetErrors(params: { kcContext: KcContextLike_useGetErrors; i18n: I18
1126
1178
  break validator_x;
1127
1179
  }
1128
1180
 
1129
- const msgArgs = [errorMessageKey ?? id<MessageKey>("shouldMatchPattern"), pattern] as const;
1181
+ const msgArgs = [errorMessageKey ?? id<MessageKey_defaultSet>("shouldMatchPattern"), pattern] as const;
1130
1182
 
1131
1183
  errors.push({
1132
1184
  errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
@@ -1165,7 +1217,7 @@ function useGetErrors(params: { kcContext: KcContextLike_useGetErrors; i18n: I18
1165
1217
  break validator_x;
1166
1218
  }
1167
1219
 
1168
- const msgArgs = [id<MessageKey>("invalidEmailMessage")] as const;
1220
+ const msgArgs = [id<MessageKey_defaultSet>("invalidEmailMessage")] as const;
1169
1221
 
1170
1222
  errors.push({
1171
1223
  errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
@@ -1257,11 +1309,11 @@ function useGetErrors(params: { kcContext: KcContextLike_useGetErrors; i18n: I18
1257
1309
  break validator_x;
1258
1310
  }
1259
1311
 
1260
- const msgArgs = [id<MessageKey>("notAValidOption")] as const;
1312
+ const msgArgs = [id<MessageKey_defaultSet>("notAValidOption")] as const;
1261
1313
 
1262
1314
  errors.push({
1263
- errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
1264
- errorMessageStr: advancedMsgStr(...msgArgs),
1315
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1316
+ errorMessageStr: msgStr(...msgArgs),
1265
1317
  fieldIndex: undefined,
1266
1318
  source: {
1267
1319
  type: "validator",
@@ -1342,14 +1394,10 @@ export function getButtonToDisplayForMultivaluedAttributeField(params: { attribu
1342
1394
  })();
1343
1395
 
1344
1396
  if (maxCount === undefined) {
1345
- return false;
1346
- }
1347
-
1348
- if (values.length === maxCount) {
1349
- return false;
1397
+ return true;
1350
1398
  }
1351
1399
 
1352
- return true;
1400
+ return values.length !== maxCount;
1353
1401
  })();
1354
1402
 
1355
1403
  return { hasRemove, hasAdd };
@@ -19,7 +19,7 @@ export default function Error(props: PageProps<Extract<KcContext, { pageId: "err
19
19
  headerNode={msg("errorTitle")}
20
20
  >
21
21
  <div id="kc-error-message">
22
- <p className="instruction">{message.summary}</p>
22
+ <p className="instruction" dangerouslySetInnerHTML={{ __html: message.summary }} />
23
23
  {!skipLink && client !== undefined && client.baseUrl !== undefined && (
24
24
  <p>
25
25
  <a id="backToApplication" href={client.baseUrl}>
@@ -5,7 +5,7 @@ import type { I18n } from "../i18n";
5
5
  export default function Info(props: PageProps<Extract<KcContext, { pageId: "info.ftl" }>, I18n>) {
6
6
  const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
7
7
 
8
- const { msgStr, msg } = i18n;
8
+ const { advancedMsgStr, msg } = i18n;
9
9
 
10
10
  const { messageHeader, message, requiredActions, skipLink, pageRedirectUri, actionUri, client } = kcContext;
11
11
 
@@ -16,13 +16,33 @@ export default function Info(props: PageProps<Extract<KcContext, { pageId: "info
16
16
  doUseDefaultCss={doUseDefaultCss}
17
17
  classes={classes}
18
18
  displayMessage={false}
19
- headerNode={messageHeader !== undefined ? <>{messageHeader}</> : <>{message.summary}</>}
19
+ headerNode={
20
+ <span
21
+ dangerouslySetInnerHTML={{
22
+ __html: messageHeader ?? message.summary
23
+ }}
24
+ />
25
+ }
20
26
  >
21
27
  <div id="kc-info-message">
22
- <p className="instruction">
23
- {message.summary}
24
- {requiredActions && <b>{requiredActions.map(requiredAction => msgStr(`requiredAction.${requiredAction}` as const)).join(",")}</b>}
25
- </p>
28
+ <p
29
+ className="instruction"
30
+ dangerouslySetInnerHTML={{
31
+ __html: (() => {
32
+ let html = message.summary;
33
+
34
+ if (requiredActions) {
35
+ html += "<b>";
36
+
37
+ html += requiredActions.map(requiredAction => advancedMsgStr(`requiredAction.${requiredAction}`)).join(", ");
38
+
39
+ html += "</b>";
40
+ }
41
+
42
+ return html;
43
+ })()
44
+ }}
45
+ />
26
46
  {(() => {
27
47
  if (skipLink) {
28
48
  return null;
@@ -60,9 +60,10 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
60
60
  href={p.loginUrl}
61
61
  >
62
62
  {p.iconClasses && <i className={clsx(kcClsx("kcCommonLogoIdP"), p.iconClasses)} aria-hidden="true"></i>}
63
- <span className={clsx(kcClsx("kcFormSocialAccountNameClass"), p.iconClasses && "kc-social-icon-text")}>
64
- {p.displayName}
65
- </span>
63
+ <span
64
+ className={clsx(kcClsx("kcFormSocialAccountNameClass"), p.iconClasses && "kc-social-icon-text")}
65
+ dangerouslySetInnerHTML={{ __html: p.displayName }}
66
+ ></span>
66
67
  </a>
67
68
  </li>
68
69
  ))}
@@ -105,9 +106,14 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
105
106
  aria-invalid={messagesPerField.existsError("username", "password")}
106
107
  />
107
108
  {messagesPerField.existsError("username", "password") && (
108
- <span id="input-error" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
109
- {messagesPerField.getFirstError("username", "password")}
110
- </span>
109
+ <span
110
+ id="input-error"
111
+ className={kcClsx("kcInputErrorMessageClass")}
112
+ aria-live="polite"
113
+ dangerouslySetInnerHTML={{
114
+ __html: messagesPerField.getFirstError("username", "password")
115
+ }}
116
+ />
111
117
  )}
112
118
  </div>
113
119
  )}
@@ -128,9 +134,14 @@ export default function Login(props: PageProps<Extract<KcContext, { pageId: "log
128
134
  />
129
135
  </PasswordWrapper>
130
136
  {usernameHidden && messagesPerField.existsError("username", "password") && (
131
- <span id="input-error" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
132
- {messagesPerField.getFirstError("username", "password")}
133
- </span>
137
+ <span
138
+ id="input-error"
139
+ className={kcClsx("kcInputErrorMessageClass")}
140
+ aria-live="polite"
141
+ dangerouslySetInnerHTML={{
142
+ __html: messagesPerField.getFirstError("username", "password")
143
+ }}
144
+ />
134
145
  )}
135
146
  </div>
136
147
 
@@ -112,9 +112,14 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
112
112
  />
113
113
 
114
114
  {messagesPerField.existsError("totp") && (
115
- <span id="input-error-otp-code" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
116
- {messagesPerField.get("totp")}
117
- </span>
115
+ <span
116
+ id="input-error-otp-code"
117
+ className={kcClsx("kcInputErrorMessageClass")}
118
+ aria-live="polite"
119
+ dangerouslySetInnerHTML={{
120
+ __html: messagesPerField.get("totp")
121
+ }}
122
+ />
118
123
  )}
119
124
  </div>
120
125
  <input type="hidden" id="totpSecret" name="totpSecret" value={totp.totpSecret} />
@@ -138,9 +143,14 @@ export default function LoginConfigTotp(props: PageProps<Extract<KcContext, { pa
138
143
  aria-invalid={messagesPerField.existsError("userLabel")}
139
144
  />
140
145
  {messagesPerField.existsError("userLabel") && (
141
- <span id="input-error-otp-label" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
142
- {messagesPerField.get("userLabel")}
143
- </span>
146
+ <span
147
+ id="input-error-otp-label"
148
+ className={kcClsx("kcInputErrorMessageClass")}
149
+ aria-live="polite"
150
+ dangerouslySetInnerHTML={{
151
+ __html: messagesPerField.get("userLabel")
152
+ }}
153
+ />
144
154
  )}
145
155
  </div>
146
156
  </div>
@@ -70,9 +70,14 @@ export default function LoginOtp(props: PageProps<Extract<KcContext, { pageId: "
70
70
  aria-invalid={messagesPerField.existsError("totp")}
71
71
  />
72
72
  {messagesPerField.existsError("totp") && (
73
- <span id="input-error-otp-code" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
74
- {messagesPerField.get("totp")}
75
- </span>
73
+ <span
74
+ id="input-error-otp-code"
75
+ className={kcClsx("kcInputErrorMessageClass")}
76
+ aria-live="polite"
77
+ dangerouslySetInnerHTML={{
78
+ __html: messagesPerField.get("totp")
79
+ }}
80
+ />
76
81
  )}
77
82
  </div>
78
83
  </div>
@@ -60,9 +60,14 @@ export default function LoginPassword(props: PageProps<Extract<KcContext, { page
60
60
  </PasswordWrapper>
61
61
 
62
62
  {messagesPerField.existsError("password") && (
63
- <span id="input-error-password" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
64
- {messagesPerField.get("password")}
65
- </span>
63
+ <span
64
+ id="input-error-password"
65
+ className={kcClsx("kcInputErrorMessageClass")}
66
+ aria-live="polite"
67
+ dangerouslySetInnerHTML={{
68
+ __html: messagesPerField.get("password")
69
+ }}
70
+ />
66
71
  )}
67
72
  </div>
68
73
  <div className={kcClsx("kcFormGroupClass", "kcFormSettingClass")}>
@@ -43,9 +43,14 @@ export default function LoginRecoveryAuthnCodeInput(props: PageProps<Extract<KcC
43
43
  autoFocus
44
44
  />
45
45
  {messagesPerField.existsError("recoveryCodeInput") && (
46
- <span id="input-error" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
47
- {messagesPerField.get("recoveryCodeInput")}
48
- </span>
46
+ <span
47
+ id="input-error"
48
+ className={kcClsx("kcInputErrorMessageClass")}
49
+ aria-live="polite"
50
+ dangerouslySetInnerHTML={{
51
+ __html: messagesPerField.get("recoveryCodeInput")
52
+ }}
53
+ />
49
54
  )}
50
55
  </div>
51
56
  </div>
@@ -48,9 +48,14 @@ export default function LoginResetPassword(props: PageProps<Extract<KcContext, {
48
48
  aria-invalid={messagesPerField.existsError("username")}
49
49
  />
50
50
  {messagesPerField.existsError("username") && (
51
- <span id="input-error-username" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
52
- {messagesPerField.get("username")}
53
- </span>
51
+ <span
52
+ id="input-error-username"
53
+ className={kcClsx("kcInputErrorMessageClass")}
54
+ aria-live="polite"
55
+ dangerouslySetInnerHTML={{
56
+ __html: messagesPerField.get("username")
57
+ }}
58
+ />
54
59
  )}
55
60
  </div>
56
61
  </div>
@@ -32,25 +32,30 @@ export default function LoginUpdatePassword(props: PageProps<Extract<KcContext,
32
32
  <label htmlFor="password-new" className={kcClsx("kcLabelClass")}>
33
33
  {msg("passwordNew")}
34
34
  </label>
35
- <div className={kcClsx("kcInputWrapperClass")}>
36
- <PasswordWrapper kcClsx={kcClsx} i18n={i18n} passwordInputId="password-new">
37
- <input
38
- type="password"
39
- id="password-new"
40
- name="password-new"
41
- className={kcClsx("kcInputClass")}
42
- autoFocus
43
- autoComplete="new-password"
44
- aria-invalid={messagesPerField.existsError("password", "password-confirm")}
45
- />
46
- </PasswordWrapper>
47
-
48
- {messagesPerField.existsError("password") && (
49
- <span id="input-error-password" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
50
- {messagesPerField.get("password")}
51
- </span>
52
- )}
53
- </div>
35
+ </div>
36
+ <div className={kcClsx("kcInputWrapperClass")}>
37
+ <PasswordWrapper kcClsx={kcClsx} i18n={i18n} passwordInputId="password-new">
38
+ <input
39
+ type="password"
40
+ id="password-new"
41
+ name="password-new"
42
+ className={kcClsx("kcInputClass")}
43
+ autoFocus
44
+ autoComplete="new-password"
45
+ aria-invalid={messagesPerField.existsError("password", "password-confirm")}
46
+ />
47
+ </PasswordWrapper>
48
+
49
+ {messagesPerField.existsError("password") && (
50
+ <span
51
+ id="input-error-password"
52
+ className={kcClsx("kcInputErrorMessageClass")}
53
+ aria-live="polite"
54
+ dangerouslySetInnerHTML={{
55
+ __html: messagesPerField.get("password")
56
+ }}
57
+ />
58
+ )}
54
59
  </div>
55
60
  </div>
56
61
 
@@ -74,37 +79,40 @@ export default function LoginUpdatePassword(props: PageProps<Extract<KcContext,
74
79
  </PasswordWrapper>
75
80
 
76
81
  {messagesPerField.existsError("password-confirm") && (
77
- <span id="input-error-password-confirm" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
78
- {messagesPerField.get("password-confirm")}
79
- </span>
82
+ <span
83
+ id="input-error-password-confirm"
84
+ className={kcClsx("kcInputErrorMessageClass")}
85
+ aria-live="polite"
86
+ dangerouslySetInnerHTML={{
87
+ __html: messagesPerField.get("password-confirm")
88
+ }}
89
+ />
80
90
  )}
81
91
  </div>
82
-
83
- <div className={kcClsx("kcFormGroupClass")}>
84
- <LogoutOtherSessions kcClsx={kcClsx} i18n={i18n} />
85
-
86
- <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
87
- <input
88
- className={kcClsx(
89
- "kcButtonClass",
90
- "kcButtonPrimaryClass",
91
- isAppInitiatedAction && "kcButtonBlockClass",
92
- "kcButtonLargeClass"
93
- )}
94
- type="submit"
95
- value={msgStr("doSubmit")}
96
- />
97
- {isAppInitiatedAction && (
98
- <button
99
- className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
100
- type="submit"
101
- name="cancel-aia"
102
- value="true"
103
- >
104
- {msg("doCancel")}
105
- </button>
92
+ </div>
93
+ <div className={kcClsx("kcFormGroupClass")}>
94
+ <LogoutOtherSessions kcClsx={kcClsx} i18n={i18n} />
95
+ <div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
96
+ <input
97
+ className={kcClsx(
98
+ "kcButtonClass",
99
+ "kcButtonPrimaryClass",
100
+ !isAppInitiatedAction && "kcButtonBlockClass",
101
+ "kcButtonLargeClass"
106
102
  )}
107
- </div>
103
+ type="submit"
104
+ value={msgStr("doSubmit")}
105
+ />
106
+ {isAppInitiatedAction && (
107
+ <button
108
+ className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
109
+ type="submit"
110
+ name="cancel-aia"
111
+ value="true"
112
+ >
113
+ {msg("doCancel")}
114
+ </button>
115
+ )}
108
116
  </div>
109
117
  </div>
110
118
  </form>
@@ -118,9 +118,14 @@ function TermsAcceptance(props: {
118
118
  </div>
119
119
  {messagesPerField.existsError("termsAccepted") && (
120
120
  <div className={kcClsx("kcLabelWrapperClass")}>
121
- <span id="input-error-terms-accepted" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
122
- {messagesPerField.get("termsAccepted")}
123
- </span>
121
+ <span
122
+ id="input-error-terms-accepted"
123
+ className={kcClsx("kcInputErrorMessageClass")}
124
+ aria-live="polite"
125
+ dangerouslySetInnerHTML={{
126
+ __html: messagesPerField.get("termsAccepted")
127
+ }}
128
+ />
124
129
  </div>
125
130
  )}
126
131
  </div>
@@ -18,7 +18,7 @@ export default function SamlPostForm(props: PageProps<Extract<KcContext, { pageI
18
18
  }
19
19
 
20
20
  // Storybook
21
- if (samlPost.url === "") {
21
+ if (samlPost.url === "#") {
22
22
  alert("In a real Keycloak the user would be redirected immediately");
23
23
  return;
24
24
  }
@@ -8,7 +8,7 @@ export default function SelectAuthenticator(props: PageProps<Extract<KcContext,
8
8
  const { url, auth } = kcContext;
9
9
 
10
10
  const { kcClsx } = getKcClsx({ doUseDefaultCss, classes });
11
- const { msg } = i18n;
11
+ const { msg, advancedMsg } = i18n;
12
12
 
13
13
  return (
14
14
  <Template
@@ -30,11 +30,11 @@ export default function SelectAuthenticator(props: PageProps<Extract<KcContext,
30
30
  value={authenticationSelection.authExecId}
31
31
  >
32
32
  <div className={kcClsx("kcSelectAuthListItemIconClass")}>
33
- <i className={kcClsx(authenticationSelection.iconCssClass, "kcSelectAuthListItemIconPropertyClass")} />
33
+ <i className={kcClsx("kcSelectAuthListItemIconPropertyClass", authenticationSelection.iconCssClass)} />
34
34
  </div>
35
35
  <div className={kcClsx("kcSelectAuthListItemBodyClass")}>
36
- <div className={kcClsx("kcSelectAuthListItemHeadingClass")}>{msg(authenticationSelection.displayName)}</div>
37
- <div className={kcClsx("kcSelectAuthListItemDescriptionClass")}>{msg(authenticationSelection.helpText)}</div>
36
+ <div className={kcClsx("kcSelectAuthListItemHeadingClass")}>{advancedMsg(authenticationSelection.displayName)}</div>
37
+ <div className={kcClsx("kcSelectAuthListItemDescriptionClass")}>{advancedMsg(authenticationSelection.helpText)}</div>
38
38
  </div>
39
39
  <div className={kcClsx("kcSelectAuthListItemFillClass")} />
40
40
  <div className={kcClsx("kcSelectAuthListItemArrowClass")}>
@@ -204,13 +204,13 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
204
204
  className={kcClsx("kcSelectAuthListItemDescriptionClass")}
205
205
  >
206
206
  {authenticator.transports.displayNameProperties
207
- .map((nameProperty, i, arr) => ({
208
- nameProperty,
207
+ .map((displayNameProperty, i, arr) => ({
208
+ displayNameProperty,
209
209
  hasNext: i !== arr.length - 1
210
210
  }))
211
- .map(({ nameProperty, hasNext }) => (
212
- <Fragment key={nameProperty}>
213
- <span>{msg(nameProperty)}</span>
211
+ .map(({ displayNameProperty, hasNext }) => (
212
+ <Fragment key={displayNameProperty}>
213
+ {advancedMsg(displayNameProperty)}
214
214
  {hasNext && <span>, </span>}
215
215
  </Fragment>
216
216
  ))}
@@ -153,7 +153,7 @@ export default function WebauthnRegister(props: PageProps<Extract<KcContext, { p
153
153
 
154
154
  function getPubKeyCredParams(signatureAlgorithmsList) {
155
155
  let pubKeyCredParams = [];
156
- if (signatureAlgorithmsList === []) {
156
+ if (signatureAlgorithmsList.length === 0) {
157
157
  pubKeyCredParams.push({type: "public-key", alg: -7});
158
158
  return pubKeyCredParams;
159
159
  }
@@ -184,7 +184,7 @@ export default function WebauthnRegister(props: PageProps<Extract<KcContext, { p
184
184
  }
185
185
 
186
186
  function getTransportsAsString(transportsList) {
187
- if (transportsList === '' || transportsList.constructor !== Array) return "";
187
+ if (transportsList === '' || Array.isArray(transportsList)) return "";
188
188
 
189
189
  let transportsString = "";
190
190