keycloakify 10.0.0-rc.10 → 10.0.0-rc.101

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 (822) hide show
  1. package/PUBLIC_URL.d.ts +1 -1
  2. package/PUBLIC_URL.js +3 -3
  3. package/PUBLIC_URL.js.map +1 -1
  4. package/README.md +8 -6
  5. package/account/DefaultPage.d.ts +5 -0
  6. package/account/{Fallback.js → DefaultPage.js} +3 -3
  7. package/account/DefaultPage.js.map +1 -0
  8. package/account/{kcContext → KcContext}/KcContext.d.ts +13 -0
  9. package/account/KcContext/KcContext.js.map +1 -0
  10. package/account/KcContext/getKcContextMock.d.ts +24 -0
  11. package/account/KcContext/getKcContextMock.js +28 -0
  12. package/account/KcContext/getKcContextMock.js.map +1 -0
  13. package/account/KcContext/index.d.ts +2 -0
  14. package/account/KcContext/index.js +2 -0
  15. package/account/KcContext/index.js.map +1 -0
  16. package/account/{kcContext → KcContext}/kcContextMocks.d.ts +1 -1
  17. package/account/KcContext/kcContextMocks.js +143 -0
  18. package/account/KcContext/kcContextMocks.js.map +1 -0
  19. package/account/Template.d.ts +2 -2
  20. package/account/Template.js +14 -12
  21. package/account/Template.js.map +1 -1
  22. package/account/TemplateProps.d.ts +3 -5
  23. package/account/i18n/baseMessages/ar.d.ts +2 -0
  24. package/account/i18n/baseMessages/ar.js +3 -1
  25. package/account/i18n/baseMessages/ar.js.map +1 -1
  26. package/account/i18n/baseMessages/ca.d.ts +2 -0
  27. package/account/i18n/baseMessages/ca.js +3 -1
  28. package/account/i18n/baseMessages/ca.js.map +1 -1
  29. package/account/i18n/baseMessages/cs.d.ts +2 -0
  30. package/account/i18n/baseMessages/cs.js +3 -1
  31. package/account/i18n/baseMessages/cs.js.map +1 -1
  32. package/account/i18n/baseMessages/da.d.ts +2 -0
  33. package/account/i18n/baseMessages/da.js +3 -1
  34. package/account/i18n/baseMessages/da.js.map +1 -1
  35. package/account/i18n/baseMessages/de.d.ts +2 -0
  36. package/account/i18n/baseMessages/de.js +3 -1
  37. package/account/i18n/baseMessages/de.js.map +1 -1
  38. package/account/i18n/baseMessages/el.d.ts +2 -0
  39. package/account/i18n/baseMessages/el.js +3 -1
  40. package/account/i18n/baseMessages/el.js.map +1 -1
  41. package/account/i18n/baseMessages/en.d.ts +2 -0
  42. package/account/i18n/baseMessages/en.js +3 -1
  43. package/account/i18n/baseMessages/en.js.map +1 -1
  44. package/account/i18n/baseMessages/es.d.ts +2 -0
  45. package/account/i18n/baseMessages/es.js +3 -1
  46. package/account/i18n/baseMessages/es.js.map +1 -1
  47. package/account/i18n/baseMessages/fa.d.ts +2 -0
  48. package/account/i18n/baseMessages/fa.js +3 -1
  49. package/account/i18n/baseMessages/fa.js.map +1 -1
  50. package/account/i18n/baseMessages/fi.d.ts +2 -0
  51. package/account/i18n/baseMessages/fi.js +3 -1
  52. package/account/i18n/baseMessages/fi.js.map +1 -1
  53. package/account/i18n/baseMessages/fr.d.ts +2 -0
  54. package/account/i18n/baseMessages/fr.js +3 -1
  55. package/account/i18n/baseMessages/fr.js.map +1 -1
  56. package/account/i18n/baseMessages/hu.d.ts +2 -0
  57. package/account/i18n/baseMessages/hu.js +3 -1
  58. package/account/i18n/baseMessages/hu.js.map +1 -1
  59. package/account/i18n/baseMessages/index.d.ts +18 -0
  60. package/account/i18n/baseMessages/index.js.map +1 -1
  61. package/account/i18n/baseMessages/it.d.ts +2 -0
  62. package/account/i18n/baseMessages/it.js +3 -1
  63. package/account/i18n/baseMessages/it.js.map +1 -1
  64. package/account/i18n/baseMessages/ja.d.ts +2 -0
  65. package/account/i18n/baseMessages/ja.js +3 -1
  66. package/account/i18n/baseMessages/ja.js.map +1 -1
  67. package/account/i18n/baseMessages/lt.d.ts +2 -0
  68. package/account/i18n/baseMessages/lt.js +3 -1
  69. package/account/i18n/baseMessages/lt.js.map +1 -1
  70. package/account/i18n/baseMessages/lv.d.ts +2 -0
  71. package/account/i18n/baseMessages/lv.js +3 -1
  72. package/account/i18n/baseMessages/lv.js.map +1 -1
  73. package/account/i18n/baseMessages/nl.d.ts +2 -0
  74. package/account/i18n/baseMessages/nl.js +3 -1
  75. package/account/i18n/baseMessages/nl.js.map +1 -1
  76. package/account/i18n/baseMessages/no.d.ts +2 -0
  77. package/account/i18n/baseMessages/no.js +3 -1
  78. package/account/i18n/baseMessages/no.js.map +1 -1
  79. package/account/i18n/baseMessages/pl.d.ts +2 -0
  80. package/account/i18n/baseMessages/pl.js +3 -1
  81. package/account/i18n/baseMessages/pl.js.map +1 -1
  82. package/account/i18n/baseMessages/pt-BR.d.ts +2 -0
  83. package/account/i18n/baseMessages/pt-BR.js +3 -1
  84. package/account/i18n/baseMessages/pt-BR.js.map +1 -1
  85. package/account/i18n/baseMessages/ru.d.ts +2 -0
  86. package/account/i18n/baseMessages/ru.js +3 -1
  87. package/account/i18n/baseMessages/ru.js.map +1 -1
  88. package/account/i18n/baseMessages/sk.d.ts +2 -0
  89. package/account/i18n/baseMessages/sk.js +3 -1
  90. package/account/i18n/baseMessages/sk.js.map +1 -1
  91. package/account/i18n/baseMessages/sv.d.ts +2 -0
  92. package/account/i18n/baseMessages/sv.js +3 -1
  93. package/account/i18n/baseMessages/sv.js.map +1 -1
  94. package/account/i18n/baseMessages/th.d.ts +2 -0
  95. package/account/i18n/baseMessages/th.js +3 -1
  96. package/account/i18n/baseMessages/th.js.map +1 -1
  97. package/account/i18n/baseMessages/tr.d.ts +2 -0
  98. package/account/i18n/baseMessages/tr.js +3 -1
  99. package/account/i18n/baseMessages/tr.js.map +1 -1
  100. package/account/i18n/baseMessages/uk.d.ts +2 -0
  101. package/account/i18n/baseMessages/uk.js +3 -1
  102. package/account/i18n/baseMessages/uk.js.map +1 -1
  103. package/account/i18n/baseMessages/zh-CN.d.ts +2 -0
  104. package/account/i18n/baseMessages/zh-CN.js +3 -1
  105. package/account/i18n/baseMessages/zh-CN.js.map +1 -1
  106. package/account/i18n/i18n.d.ts +34 -36
  107. package/account/i18n/i18n.js +117 -98
  108. package/account/i18n/i18n.js.map +1 -1
  109. package/account/i18n/index.d.ts +4 -1
  110. package/account/i18n/index.js +1 -1
  111. package/account/i18n/index.js.map +1 -1
  112. package/account/i18n/useI18n.d.ts +13 -0
  113. package/account/i18n/useI18n.js +26 -0
  114. package/account/i18n/useI18n.js.map +1 -0
  115. package/account/index.d.ts +3 -7
  116. package/account/index.js +1 -5
  117. package/account/index.js.map +1 -1
  118. package/account/lib/kcClsx.d.ts +9 -0
  119. package/account/lib/kcClsx.js +19 -0
  120. package/account/lib/kcClsx.js.map +1 -0
  121. package/account/pages/Account.d.ts +1 -1
  122. package/account/pages/Account.js +7 -6
  123. package/account/pages/Account.js.map +1 -1
  124. package/account/pages/Applications.d.ts +1 -1
  125. package/account/pages/Applications.js +8 -9
  126. package/account/pages/Applications.js.map +1 -1
  127. package/account/pages/FederatedIdentity.d.ts +3 -3
  128. package/account/pages/FederatedIdentity.js +1 -1
  129. package/account/pages/FederatedIdentity.js.map +1 -1
  130. package/account/pages/Log.d.ts +1 -1
  131. package/account/pages/Log.js +3 -3
  132. package/account/pages/Log.js.map +1 -1
  133. package/account/pages/PageProps.d.ts +4 -6
  134. package/account/pages/Password.d.ts +1 -1
  135. package/account/pages/Password.js +16 -13
  136. package/account/pages/Password.js.map +1 -1
  137. package/account/pages/Sessions.d.ts +1 -1
  138. package/account/pages/Sessions.js +3 -4
  139. package/account/pages/Sessions.js.map +1 -1
  140. package/account/pages/Totp.d.ts +1 -1
  141. package/account/pages/Totp.js +9 -10
  142. package/account/pages/Totp.js.map +1 -1
  143. package/bin/180.index.js +4664 -0
  144. package/bin/193.index.js +160 -0
  145. package/bin/266.index.js +806 -0
  146. package/bin/304.index.js +1108 -0
  147. package/bin/31.index.js +804 -0
  148. package/bin/36.index.js +9980 -0
  149. package/bin/430.index.js +1349 -0
  150. package/bin/440.index.js +1466 -0
  151. package/bin/453.index.js +769 -0
  152. package/bin/490.index.js +75195 -0
  153. package/bin/525.index.js +41826 -0
  154. package/bin/526.index.js +996 -0
  155. package/bin/538.index.js +108 -0
  156. package/bin/720.index.js +243 -0
  157. package/bin/877.index.js +275 -0
  158. package/bin/893.index.js +713 -0
  159. package/bin/932.index.js +269 -0
  160. package/bin/966.index.js +4232 -0
  161. package/bin/97.index.js +677 -0
  162. package/bin/main.js +9456 -141122
  163. package/bin/shared/KeycloakVersionRange.d.ts +5 -0
  164. package/bin/shared/KeycloakVersionRange.js.map +1 -0
  165. package/bin/shared/buildContext.d.ts +74 -0
  166. package/bin/shared/buildContext.js.map +1 -0
  167. package/bin/shared/constants.d.ts +18 -0
  168. package/bin/shared/constants.js +59 -0
  169. package/bin/shared/constants.js.map +1 -0
  170. package/bin/shared/copyKeycloakResourcesToPublic.d.ts +8 -0
  171. package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -0
  172. package/bin/shared/downloadKeycloakDefaultTheme.d.ts +11 -0
  173. package/bin/shared/downloadKeycloakDefaultTheme.js.map +1 -0
  174. package/bin/shared/downloadKeycloakStaticResources.d.ts +9 -0
  175. package/bin/shared/downloadKeycloakStaticResources.js.map +1 -0
  176. package/bin/shared/generateKcGenTs.d.ts +12 -0
  177. package/bin/shared/generateKcGenTs.js.map +1 -0
  178. package/bin/shared/metaInfKeycloakThemes.d.ts +13 -0
  179. package/bin/shared/metaInfKeycloakThemes.js.map +1 -0
  180. package/bin/shared/promptKeycloakVersion.d.ts +7 -0
  181. package/bin/shared/promptKeycloakVersion.js.map +1 -0
  182. package/lib/BASE_URL.js.map +1 -1
  183. package/lib/getKcClsx.d.ts +11 -0
  184. package/lib/getKcClsx.js +55 -0
  185. package/lib/getKcClsx.js.map +1 -0
  186. package/login/{Fallback.d.ts → DefaultPage.d.ts} +7 -6
  187. package/login/{Fallback.js → DefaultPage.js} +2 -2
  188. package/login/DefaultPage.js.map +1 -0
  189. package/login/{kcContext → KcContext}/KcContext.d.ts +36 -17
  190. package/login/KcContext/KcContext.js.map +1 -0
  191. package/login/KcContext/getKcContextMock.d.ts +24 -0
  192. package/login/KcContext/getKcContextMock.js +28 -0
  193. package/login/KcContext/getKcContextMock.js.map +1 -0
  194. package/login/KcContext/index.d.ts +2 -0
  195. package/login/KcContext/index.js +2 -0
  196. package/login/KcContext/index.js.map +1 -0
  197. package/login/{kcContext → KcContext}/kcContextMocks.d.ts +1 -1
  198. package/login/KcContext/kcContextMocks.js +334 -0
  199. package/login/KcContext/kcContextMocks.js.map +1 -0
  200. package/login/Template.d.ts +2 -2
  201. package/login/Template.js +31 -25
  202. package/login/Template.js.map +1 -1
  203. package/login/TemplateProps.d.ts +3 -6
  204. package/login/UserProfileFormFields.d.ts +3 -20
  205. package/login/UserProfileFormFields.js +78 -122
  206. package/login/UserProfileFormFields.js.map +1 -1
  207. package/login/UserProfileFormFieldsProps.d.ts +24 -0
  208. package/login/UserProfileFormFieldsProps.js +2 -0
  209. package/login/UserProfileFormFieldsProps.js.map +1 -0
  210. package/login/i18n/baseMessages/ar.d.ts +9 -0
  211. package/login/i18n/baseMessages/ar.js +11 -2
  212. package/login/i18n/baseMessages/ar.js.map +1 -1
  213. package/login/i18n/baseMessages/ca.d.ts +10 -1
  214. package/login/i18n/baseMessages/ca.js +12 -3
  215. package/login/i18n/baseMessages/ca.js.map +1 -1
  216. package/login/i18n/baseMessages/cs.d.ts +9 -0
  217. package/login/i18n/baseMessages/cs.js +11 -2
  218. package/login/i18n/baseMessages/cs.js.map +1 -1
  219. package/login/i18n/baseMessages/da.d.ts +9 -0
  220. package/login/i18n/baseMessages/da.js +11 -2
  221. package/login/i18n/baseMessages/da.js.map +1 -1
  222. package/login/i18n/baseMessages/de.d.ts +9 -0
  223. package/login/i18n/baseMessages/de.js +11 -2
  224. package/login/i18n/baseMessages/de.js.map +1 -1
  225. package/login/i18n/baseMessages/el.d.ts +9 -1
  226. package/login/i18n/baseMessages/el.js +11 -3
  227. package/login/i18n/baseMessages/el.js.map +1 -1
  228. package/login/i18n/baseMessages/en.d.ts +10 -1
  229. package/login/i18n/baseMessages/en.js +12 -3
  230. package/login/i18n/baseMessages/en.js.map +1 -1
  231. package/login/i18n/baseMessages/es.d.ts +10 -1
  232. package/login/i18n/baseMessages/es.js +12 -3
  233. package/login/i18n/baseMessages/es.js.map +1 -1
  234. package/login/i18n/baseMessages/fa.d.ts +9 -1
  235. package/login/i18n/baseMessages/fa.js +11 -3
  236. package/login/i18n/baseMessages/fa.js.map +1 -1
  237. package/login/i18n/baseMessages/fi.d.ts +9 -0
  238. package/login/i18n/baseMessages/fi.js +11 -2
  239. package/login/i18n/baseMessages/fi.js.map +1 -1
  240. package/login/i18n/baseMessages/fr.d.ts +9 -0
  241. package/login/i18n/baseMessages/fr.js +11 -2
  242. package/login/i18n/baseMessages/fr.js.map +1 -1
  243. package/login/i18n/baseMessages/hu.d.ts +10 -1
  244. package/login/i18n/baseMessages/hu.js +12 -3
  245. package/login/i18n/baseMessages/hu.js.map +1 -1
  246. package/login/i18n/baseMessages/index.d.ts +109 -2
  247. package/login/i18n/baseMessages/index.js.map +1 -1
  248. package/login/i18n/baseMessages/it.d.ts +9 -0
  249. package/login/i18n/baseMessages/it.js +11 -2
  250. package/login/i18n/baseMessages/it.js.map +1 -1
  251. package/login/i18n/baseMessages/ja.d.ts +9 -0
  252. package/login/i18n/baseMessages/ja.js +11 -2
  253. package/login/i18n/baseMessages/ja.js.map +1 -1
  254. package/login/i18n/baseMessages/lt.d.ts +9 -0
  255. package/login/i18n/baseMessages/lt.js +11 -2
  256. package/login/i18n/baseMessages/lt.js.map +1 -1
  257. package/login/i18n/baseMessages/lv.d.ts +9 -0
  258. package/login/i18n/baseMessages/lv.js +11 -2
  259. package/login/i18n/baseMessages/lv.js.map +1 -1
  260. package/login/i18n/baseMessages/nl.d.ts +9 -0
  261. package/login/i18n/baseMessages/nl.js +11 -2
  262. package/login/i18n/baseMessages/nl.js.map +1 -1
  263. package/login/i18n/baseMessages/no.d.ts +9 -0
  264. package/login/i18n/baseMessages/no.js +11 -2
  265. package/login/i18n/baseMessages/no.js.map +1 -1
  266. package/login/i18n/baseMessages/pl.d.ts +9 -0
  267. package/login/i18n/baseMessages/pl.js +11 -2
  268. package/login/i18n/baseMessages/pl.js.map +1 -1
  269. package/login/i18n/baseMessages/pt-BR.d.ts +9 -0
  270. package/login/i18n/baseMessages/pt-BR.js +11 -2
  271. package/login/i18n/baseMessages/pt-BR.js.map +1 -1
  272. package/login/i18n/baseMessages/ru.d.ts +9 -0
  273. package/login/i18n/baseMessages/ru.js +11 -2
  274. package/login/i18n/baseMessages/ru.js.map +1 -1
  275. package/login/i18n/baseMessages/sk.d.ts +9 -0
  276. package/login/i18n/baseMessages/sk.js +11 -2
  277. package/login/i18n/baseMessages/sk.js.map +1 -1
  278. package/login/i18n/baseMessages/sv.d.ts +9 -0
  279. package/login/i18n/baseMessages/sv.js +11 -2
  280. package/login/i18n/baseMessages/sv.js.map +1 -1
  281. package/login/i18n/baseMessages/th.d.ts +9 -0
  282. package/login/i18n/baseMessages/th.js +11 -2
  283. package/login/i18n/baseMessages/th.js.map +1 -1
  284. package/login/i18n/baseMessages/tr.d.ts +9 -0
  285. package/login/i18n/baseMessages/tr.js +11 -2
  286. package/login/i18n/baseMessages/tr.js.map +1 -1
  287. package/login/i18n/baseMessages/uk.d.ts +9 -0
  288. package/login/i18n/baseMessages/uk.js +11 -2
  289. package/login/i18n/baseMessages/uk.js.map +1 -1
  290. package/login/i18n/baseMessages/zh-CN.d.ts +10 -1
  291. package/login/i18n/baseMessages/zh-CN.js +12 -3
  292. package/login/i18n/baseMessages/zh-CN.js.map +1 -1
  293. package/login/i18n/i18n.d.ts +38 -38
  294. package/login/i18n/i18n.js +139 -99
  295. package/login/i18n/i18n.js.map +1 -1
  296. package/login/i18n/index.d.ts +4 -1
  297. package/login/i18n/index.js +1 -1
  298. package/login/i18n/index.js.map +1 -1
  299. package/login/i18n/useI18n.d.ts +13 -0
  300. package/login/i18n/useI18n.js +26 -0
  301. package/login/i18n/useI18n.js.map +1 -0
  302. package/login/index.d.ts +3 -8
  303. package/login/index.js +1 -6
  304. package/login/index.js.map +1 -1
  305. package/login/lib/kcClsx.d.ts +9 -0
  306. package/login/lib/kcClsx.js +130 -0
  307. package/login/lib/kcClsx.js.map +1 -0
  308. package/login/lib/useUserProfileForm.d.ts +20 -8
  309. package/login/lib/useUserProfileForm.js +404 -295
  310. package/login/lib/useUserProfileForm.js.map +1 -1
  311. package/login/pages/Code.d.ts +1 -1
  312. package/login/pages/Code.js +3 -3
  313. package/login/pages/Code.js.map +1 -1
  314. package/login/pages/DeleteAccountConfirm.d.ts +1 -1
  315. package/login/pages/DeleteAccountConfirm.js +7 -4
  316. package/login/pages/DeleteAccountConfirm.js.map +1 -1
  317. package/login/pages/DeleteCredential.d.ts +1 -1
  318. package/login/pages/DeleteCredential.js +3 -4
  319. package/login/pages/DeleteCredential.js.map +1 -1
  320. package/login/pages/Error.d.ts +1 -1
  321. package/login/pages/Error.js +1 -1
  322. package/login/pages/Error.js.map +1 -1
  323. package/login/pages/FrontchannelLogout.d.ts +1 -1
  324. package/login/pages/FrontchannelLogout.js +1 -1
  325. package/login/pages/FrontchannelLogout.js.map +1 -1
  326. package/login/pages/IdpReviewUserProfile.d.ts +4 -3
  327. package/login/pages/IdpReviewUserProfile.js +4 -5
  328. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  329. package/login/pages/Info.d.ts +1 -1
  330. package/login/pages/Info.js +18 -8
  331. package/login/pages/Info.js.map +1 -1
  332. package/login/pages/Login.d.ts +1 -1
  333. package/login/pages/Login.js +12 -8
  334. package/login/pages/Login.js.map +1 -1
  335. package/login/pages/LoginConfigTotp.d.ts +1 -1
  336. package/login/pages/LoginConfigTotp.js +10 -7
  337. package/login/pages/LoginConfigTotp.js.map +1 -1
  338. package/login/pages/LoginIdpLinkConfirm.d.ts +1 -1
  339. package/login/pages/LoginIdpLinkConfirm.js +3 -4
  340. package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
  341. package/login/pages/LoginIdpLinkEmail.d.ts +2 -2
  342. package/login/pages/LoginIdpLinkEmail.js +1 -1
  343. package/login/pages/LoginIdpLinkEmail.js.map +1 -1
  344. package/login/pages/LoginOauth2DeviceVerifyUserCode.d.ts +3 -3
  345. package/login/pages/LoginOauth2DeviceVerifyUserCode.js +3 -4
  346. package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -1
  347. package/login/pages/LoginOauthGrant.d.ts +3 -3
  348. package/login/pages/LoginOauthGrant.js +4 -5
  349. package/login/pages/LoginOauthGrant.js.map +1 -1
  350. package/login/pages/LoginOtp.d.ts +1 -1
  351. package/login/pages/LoginOtp.js +5 -4
  352. package/login/pages/LoginOtp.js.map +1 -1
  353. package/login/pages/LoginPageExpired.d.ts +1 -1
  354. package/login/pages/LoginPageExpired.js +1 -1
  355. package/login/pages/LoginPageExpired.js.map +1 -1
  356. package/login/pages/LoginPassword.d.ts +1 -1
  357. package/login/pages/LoginPassword.js +9 -7
  358. package/login/pages/LoginPassword.js.map +1 -1
  359. package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +1 -1
  360. package/login/pages/LoginRecoveryAuthnCodeConfig.js +16 -16
  361. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  362. package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +1 -1
  363. package/login/pages/LoginRecoveryAuthnCodeInput.js +5 -4
  364. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  365. package/login/pages/LoginResetOtp.d.ts +1 -1
  366. package/login/pages/LoginResetOtp.js +3 -4
  367. package/login/pages/LoginResetOtp.js.map +1 -1
  368. package/login/pages/LoginResetPassword.d.ts +1 -1
  369. package/login/pages/LoginResetPassword.js +6 -5
  370. package/login/pages/LoginResetPassword.js.map +1 -1
  371. package/login/pages/LoginUpdatePassword.d.ts +1 -1
  372. package/login/pages/LoginUpdatePassword.js +12 -9
  373. package/login/pages/LoginUpdatePassword.js.map +1 -1
  374. package/login/pages/LoginUpdateProfile.d.ts +4 -3
  375. package/login/pages/LoginUpdateProfile.js +5 -9
  376. package/login/pages/LoginUpdateProfile.js.map +1 -1
  377. package/login/pages/LoginUsername.d.ts +1 -1
  378. package/login/pages/LoginUsername.js +5 -5
  379. package/login/pages/LoginUsername.js.map +1 -1
  380. package/login/pages/LoginVerifyEmail.d.ts +1 -1
  381. package/login/pages/LoginVerifyEmail.js +1 -1
  382. package/login/pages/LoginVerifyEmail.js.map +1 -1
  383. package/login/pages/LoginX509Info.d.ts +1 -1
  384. package/login/pages/LoginX509Info.js +3 -4
  385. package/login/pages/LoginX509Info.js.map +1 -1
  386. package/login/pages/LogoutConfirm.d.ts +1 -1
  387. package/login/pages/LogoutConfirm.js +3 -4
  388. package/login/pages/LogoutConfirm.js.map +1 -1
  389. package/login/pages/PageProps.d.ts +3 -5
  390. package/login/pages/Register.d.ts +4 -3
  391. package/login/pages/Register.js +9 -19
  392. package/login/pages/Register.js.map +1 -1
  393. package/login/pages/SamlPostForm.d.ts +1 -1
  394. package/login/pages/SamlPostForm.js +2 -2
  395. package/login/pages/SamlPostForm.js.map +1 -1
  396. package/login/pages/SelectAuthenticator.d.ts +2 -2
  397. package/login/pages/SelectAuthenticator.js +3 -7
  398. package/login/pages/SelectAuthenticator.js.map +1 -1
  399. package/login/pages/Terms.d.ts +2 -2
  400. package/login/pages/Terms.js +3 -10
  401. package/login/pages/Terms.js.map +1 -1
  402. package/login/pages/UpdateEmail.d.ts +3 -2
  403. package/login/pages/UpdateEmail.js +6 -10
  404. package/login/pages/UpdateEmail.js.map +1 -1
  405. package/login/pages/WebauthnAuthenticate.d.ts +1 -1
  406. package/login/pages/WebauthnAuthenticate.js +25 -22
  407. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  408. package/login/pages/WebauthnError.d.ts +1 -1
  409. package/login/pages/WebauthnError.js +4 -5
  410. package/login/pages/WebauthnError.js.map +1 -1
  411. package/login/pages/WebauthnRegister.d.ts +1 -1
  412. package/login/pages/WebauthnRegister.js +16 -17
  413. package/login/pages/WebauthnRegister.js.map +1 -1
  414. package/package.json +418 -315
  415. package/src/PUBLIC_URL.ts +3 -3
  416. package/src/account/{Fallback.tsx → DefaultPage.tsx} +5 -5
  417. package/src/account/{kcContext → KcContext}/KcContext.ts +24 -2
  418. package/src/account/KcContext/getKcContextMock.ts +69 -0
  419. package/src/account/KcContext/index.ts +2 -0
  420. package/src/account/KcContext/kcContextMocks.ts +190 -0
  421. package/src/account/Template.tsx +20 -17
  422. package/src/account/TemplateProps.ts +4 -5
  423. package/src/account/i18n/baseMessages/ar.ts +3 -1
  424. package/src/account/i18n/baseMessages/ca.ts +3 -1
  425. package/src/account/i18n/baseMessages/cs.ts +3 -1
  426. package/src/account/i18n/baseMessages/da.ts +3 -1
  427. package/src/account/i18n/baseMessages/de.ts +3 -1
  428. package/src/account/i18n/baseMessages/el.ts +3 -1
  429. package/src/account/i18n/baseMessages/en.ts +3 -1
  430. package/src/account/i18n/baseMessages/es.ts +3 -1
  431. package/src/account/i18n/baseMessages/fa.ts +3 -1
  432. package/src/account/i18n/baseMessages/fi.ts +3 -1
  433. package/src/account/i18n/baseMessages/fr.ts +3 -1
  434. package/src/account/i18n/baseMessages/hu.ts +3 -1
  435. package/src/account/i18n/baseMessages/it.ts +3 -1
  436. package/src/account/i18n/baseMessages/ja.ts +3 -1
  437. package/src/account/i18n/baseMessages/lt.ts +3 -1
  438. package/src/account/i18n/baseMessages/lv.ts +3 -1
  439. package/src/account/i18n/baseMessages/nl.ts +3 -1
  440. package/src/account/i18n/baseMessages/no.ts +3 -1
  441. package/src/account/i18n/baseMessages/pl.ts +3 -1
  442. package/src/account/i18n/baseMessages/pt-BR.ts +3 -1
  443. package/src/account/i18n/baseMessages/ru.ts +3 -1
  444. package/src/account/i18n/baseMessages/sk.ts +3 -1
  445. package/src/account/i18n/baseMessages/sv.ts +3 -1
  446. package/src/account/i18n/baseMessages/th.ts +3 -1
  447. package/src/account/i18n/baseMessages/tr.ts +3 -1
  448. package/src/account/i18n/baseMessages/uk.ts +3 -1
  449. package/src/account/i18n/baseMessages/zh-CN.ts +3 -1
  450. package/src/account/i18n/i18n.tsx +202 -144
  451. package/src/account/i18n/index.ts +4 -1
  452. package/src/account/i18n/useI18n.ts +44 -0
  453. package/src/account/index.ts +3 -10
  454. package/src/account/lib/kcClsx.ts +25 -0
  455. package/src/account/pages/Account.tsx +12 -18
  456. package/src/account/pages/Applications.tsx +8 -10
  457. package/src/account/pages/FederatedIdentity.tsx +3 -3
  458. package/src/account/pages/Log.tsx +5 -5
  459. package/src/account/pages/PageProps.ts +4 -6
  460. package/src/account/pages/Password.tsx +17 -19
  461. package/src/account/pages/Sessions.tsx +5 -6
  462. package/src/account/pages/Totp.tsx +32 -42
  463. package/src/bin/add-story.ts +105 -0
  464. package/src/bin/copy-keycloak-resources-to-public.ts +3 -6
  465. package/src/bin/eject-page.ts +256 -0
  466. package/src/bin/initialize-email-theme.ts +30 -26
  467. package/src/bin/keycloakify/buildJars/buildJar.ts +138 -77
  468. package/src/bin/keycloakify/buildJars/buildJars.ts +35 -31
  469. package/src/bin/keycloakify/buildJars/extensionVersions.ts +3 -2
  470. package/src/bin/keycloakify/buildJars/generatePom.ts +19 -11
  471. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +42 -10
  472. package/src/bin/keycloakify/generateFtl/generateFtl.ts +74 -48
  473. package/src/bin/keycloakify/generateFtl/{ftl_object_to_js_code_declaring_an_object.ftl → kcContextDeclarationTemplate.ftl} +233 -194
  474. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +89 -0
  475. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +192 -0
  476. package/src/bin/keycloakify/generateResources/generateResources.ts +42 -0
  477. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +300 -0
  478. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +70 -0
  479. package/src/bin/keycloakify/generateResources/index.ts +1 -0
  480. package/src/bin/keycloakify/{generateSrcMainResources → generateResources}/readExtraPageNames.ts +21 -7
  481. package/src/bin/keycloakify/generateResources/readFieldNameUsage.ts +91 -0
  482. package/src/bin/keycloakify/keycloakify.ts +50 -16
  483. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +42 -46
  484. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +15 -12
  485. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +31 -16
  486. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +53 -18
  487. package/src/bin/main.ts +99 -44
  488. package/src/bin/shared/KeycloakVersionRange.ts +4 -2
  489. package/src/bin/shared/buildContext.ts +868 -0
  490. package/src/bin/shared/constants.ts +10 -4
  491. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +32 -21
  492. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +277 -0
  493. package/src/bin/shared/downloadKeycloakStaticResources.ts +30 -26
  494. package/src/bin/shared/generateKcGenTs.ts +68 -0
  495. package/src/bin/shared/metaInfKeycloakThemes.ts +25 -19
  496. package/src/bin/shared/promptKeycloakVersion.ts +39 -15
  497. package/src/bin/start-keycloak/appBuild.ts +180 -0
  498. package/src/bin/start-keycloak/index.ts +1 -0
  499. package/src/bin/start-keycloak/keycloakifyBuild.ts +43 -0
  500. package/src/bin/start-keycloak/myrealm-realm-18.json +2155 -0
  501. package/src/bin/start-keycloak/myrealm-realm-19.json +2186 -0
  502. package/src/bin/start-keycloak/myrealm-realm-20.json +2197 -0
  503. package/src/bin/start-keycloak/myrealm-realm-21.json +2201 -0
  504. package/src/bin/start-keycloak/myrealm-realm-23.json +2155 -0
  505. package/src/bin/start-keycloak/myrealm-realm-24.json +2318 -0
  506. package/src/bin/start-keycloak/myrealm-realm-25.json +2400 -0
  507. package/src/bin/start-keycloak/start-keycloak.ts +451 -0
  508. package/src/bin/tools/SemVer.ts +32 -13
  509. package/src/bin/tools/String.prototype.replaceAll.ts +9 -2
  510. package/src/bin/tools/assertNoPnpmDlx.ts +15 -0
  511. package/src/bin/tools/crawl.ts +4 -1
  512. package/src/bin/tools/crc32.ts +42 -24
  513. package/src/bin/tools/downloadAndExtractArchive.ts +254 -0
  514. package/src/bin/tools/escapeStringForPropertiesFile.ts +64 -0
  515. package/src/bin/tools/extractArchive.ts +140 -0
  516. package/src/bin/tools/fetchProxyOptions.ts +76 -53
  517. package/src/bin/tools/getAbsoluteAndInOsFormatPath.ts +10 -2
  518. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +8 -2
  519. package/src/bin/tools/octokit-addons/listTags.ts +15 -4
  520. package/src/bin/tools/partitionPromiseSettledResults.ts +12 -3
  521. package/src/bin/tools/readThisNpmPackageVersion.ts +5 -1
  522. package/src/bin/tools/transformCodebase.ts +29 -10
  523. package/src/bin/tools/trimIndent.ts +4 -1
  524. package/src/bin/tsconfig.json +4 -3
  525. package/src/bin/update-kc-gen.ts +13 -0
  526. package/src/lib/getKcClsx.ts +89 -0
  527. package/src/login/{Fallback.tsx → DefaultPage.tsx} +7 -6
  528. package/src/login/{kcContext → KcContext}/KcContext.ts +58 -30
  529. package/src/login/KcContext/getKcContextMock.ts +69 -0
  530. package/src/login/KcContext/index.ts +8 -0
  531. package/src/login/KcContext/kcContextMocks.ts +583 -0
  532. package/src/login/Template.tsx +69 -92
  533. package/src/login/TemplateProps.ts +3 -7
  534. package/src/login/UserProfileFormFields.tsx +126 -211
  535. package/src/login/UserProfileFormFieldsProps.tsx +22 -0
  536. package/src/login/i18n/baseMessages/ar.ts +11 -2
  537. package/src/login/i18n/baseMessages/ca.ts +12 -3
  538. package/src/login/i18n/baseMessages/cs.ts +11 -2
  539. package/src/login/i18n/baseMessages/da.ts +11 -2
  540. package/src/login/i18n/baseMessages/de.ts +11 -2
  541. package/src/login/i18n/baseMessages/el.ts +11 -3
  542. package/src/login/i18n/baseMessages/en.ts +12 -3
  543. package/src/login/i18n/baseMessages/es.ts +12 -3
  544. package/src/login/i18n/baseMessages/fa.ts +11 -3
  545. package/src/login/i18n/baseMessages/fi.ts +11 -2
  546. package/src/login/i18n/baseMessages/fr.ts +11 -2
  547. package/src/login/i18n/baseMessages/hu.ts +12 -3
  548. package/src/login/i18n/baseMessages/it.ts +11 -2
  549. package/src/login/i18n/baseMessages/ja.ts +11 -2
  550. package/src/login/i18n/baseMessages/lt.ts +11 -2
  551. package/src/login/i18n/baseMessages/lv.ts +11 -2
  552. package/src/login/i18n/baseMessages/nl.ts +11 -2
  553. package/src/login/i18n/baseMessages/no.ts +11 -2
  554. package/src/login/i18n/baseMessages/pl.ts +11 -2
  555. package/src/login/i18n/baseMessages/pt-BR.ts +11 -2
  556. package/src/login/i18n/baseMessages/ru.ts +11 -2
  557. package/src/login/i18n/baseMessages/sk.ts +11 -2
  558. package/src/login/i18n/baseMessages/sv.ts +11 -2
  559. package/src/login/i18n/baseMessages/th.ts +11 -2
  560. package/src/login/i18n/baseMessages/tr.ts +11 -2
  561. package/src/login/i18n/baseMessages/uk.ts +11 -2
  562. package/src/login/i18n/baseMessages/zh-CN.ts +12 -3
  563. package/src/login/i18n/i18n.tsx +240 -145
  564. package/src/login/i18n/index.ts +4 -1
  565. package/src/login/i18n/useI18n.ts +44 -0
  566. package/src/login/index.ts +3 -11
  567. package/src/login/lib/kcClsx.ts +143 -0
  568. package/src/login/lib/useUserProfileForm.tsx +487 -351
  569. package/src/login/pages/Code.tsx +8 -5
  570. package/src/login/pages/DeleteAccountConfirm.tsx +15 -10
  571. package/src/login/pages/DeleteCredential.tsx +9 -7
  572. package/src/login/pages/Error.tsx +10 -3
  573. package/src/login/pages/FrontchannelLogout.tsx +6 -3
  574. package/src/login/pages/IdpReviewUserProfile.tsx +20 -21
  575. package/src/login/pages/Info.tsx +30 -13
  576. package/src/login/pages/Login.tsx +51 -59
  577. package/src/login/pages/LoginConfigTotp.tsx +49 -43
  578. package/src/login/pages/LoginIdpLinkConfirm.tsx +7 -18
  579. package/src/login/pages/LoginIdpLinkEmail.tsx +9 -3
  580. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.tsx +24 -23
  581. package/src/login/pages/LoginOauthGrant.tsx +14 -20
  582. package/src/login/pages/LoginOtp.tsx +34 -32
  583. package/src/login/pages/LoginPageExpired.tsx +2 -2
  584. package/src/login/pages/LoginPassword.tsx +29 -34
  585. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +34 -34
  586. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +26 -24
  587. package/src/login/pages/LoginResetOtp.tsx +19 -22
  588. package/src/login/pages/LoginResetPassword.tsx +28 -26
  589. package/src/login/pages/LoginUpdatePassword.tsx +55 -55
  590. package/src/login/pages/LoginUpdateProfile.tsx +32 -30
  591. package/src/login/pages/LoginUsername.tsx +23 -34
  592. package/src/login/pages/LoginVerifyEmail.tsx +5 -2
  593. package/src/login/pages/LoginX509Info.tsx +24 -33
  594. package/src/login/pages/LogoutConfirm.tsx +8 -14
  595. package/src/login/pages/PageProps.ts +3 -5
  596. package/src/login/pages/Register.tsx +54 -54
  597. package/src/login/pages/SamlPostForm.tsx +3 -3
  598. package/src/login/pages/SelectAuthenticator.tsx +23 -24
  599. package/src/login/pages/Terms.tsx +14 -24
  600. package/src/login/pages/UpdateEmail.tsx +30 -33
  601. package/src/login/pages/WebauthnAuthenticate.tsx +40 -44
  602. package/src/login/pages/WebauthnError.tsx +15 -19
  603. package/src/login/pages/WebauthnRegister.tsx +28 -37
  604. package/src/tools/Array.prototype.every.ts +4 -1
  605. package/src/tools/ExtractAfterStartingWith.ts +4 -0
  606. package/src/tools/LazyOrNot.ts +3 -1
  607. package/src/tools/Object.fromEntries.ts +23 -0
  608. package/src/tools/StatefulObservable/README.md +16 -0
  609. package/src/tools/StatefulObservable/StatefulObservable.ts +58 -0
  610. package/src/tools/StatefulObservable/hooks/index.ts +2 -0
  611. package/src/tools/StatefulObservable/hooks/useObservable.ts +25 -0
  612. package/src/tools/StatefulObservable/hooks/useRerenderOnChange.ts +19 -0
  613. package/src/tools/StatefulObservable/index.ts +2 -0
  614. package/src/tools/ValueOf.ts +2 -0
  615. package/src/tools/clsx.ts +6 -42
  616. package/src/tools/clsx_withTransform.ts +55 -0
  617. package/src/tools/deepAssign.ts +57 -19
  618. package/src/tools/formatNumber.ts +7 -3
  619. package/src/tools/structuredCloneButFunctions.ts +24 -0
  620. package/src/tools/useConstCallback.ts +3 -1
  621. package/src/tools/useInsertLinkTags.ts +78 -74
  622. package/src/tools/useInsertScriptTags.ts +69 -73
  623. package/src/tools/useOnFirstMount.ts +18 -0
  624. package/src/tools/useSetClassName.ts +4 -1
  625. package/src/vite-plugin/vite-plugin.ts +73 -37
  626. package/stories/account/pages/Account.stories.tsx +18 -0
  627. package/stories/account/pages/Applications.stories.tsx +80 -0
  628. package/stories/account/pages/FederatedIdentity.stories.tsx +38 -0
  629. package/stories/account/pages/Log.stories.tsx +356 -0
  630. package/stories/account/pages/Password.stories.tsx +28 -0
  631. package/stories/account/pages/Sessions.stories.tsx +59 -0
  632. package/stories/account/pages/Totp.stories.tsx +182 -0
  633. package/stories/login/pages/Code.stories.tsx +18 -0
  634. package/stories/login/pages/DeleteAccountConfirm.stories.tsx +18 -0
  635. package/stories/login/pages/DeleteCredential.stories.tsx +18 -0
  636. package/stories/login/pages/Error.stories.tsx +28 -0
  637. package/stories/login/pages/FrontchannelLogout.stories.tsx +18 -0
  638. package/stories/login/pages/IdpReviewUserProfile.stories.tsx +18 -0
  639. package/stories/login/pages/Info.stories.tsx +52 -0
  640. package/stories/login/pages/Login.stories.tsx +221 -0
  641. package/stories/login/pages/LoginConfigTotp.stories.tsx +43 -0
  642. package/stories/login/pages/LoginDeviceVerifyUserCode.stories.tsx +18 -0
  643. package/stories/login/pages/LoginIdpLinkConfirm.stories.tsx +18 -0
  644. package/stories/login/pages/LoginIdpLinkEmail.stories.tsx +18 -0
  645. package/stories/login/pages/LoginOauth2DeviceVerifyUserCode.stories.tsx +18 -0
  646. package/stories/login/pages/LoginOauthGrant.stories.tsx +18 -0
  647. package/stories/login/pages/LoginOtp.stories.tsx +18 -0
  648. package/stories/login/pages/LoginPageExpired.stories.tsx +18 -0
  649. package/stories/login/pages/LoginPassword.stories.tsx +18 -0
  650. package/stories/login/pages/LoginRecoveryAuthnCodeConfig.stories.tsx +18 -0
  651. package/stories/login/pages/LoginRecoveryAuthnCodeInput.stories.tsx +18 -0
  652. package/stories/login/pages/LoginResetOtp.stories.tsx +18 -0
  653. package/stories/login/pages/LoginResetPassword.stories.tsx +31 -0
  654. package/stories/login/pages/LoginUpdatePassword.stories.tsx +18 -0
  655. package/stories/login/pages/LoginUpdateProfile.stories.tsx +18 -0
  656. package/stories/login/pages/LoginUsername.stories.tsx +31 -0
  657. package/stories/login/pages/LoginVerifyEmail.stories.tsx +30 -0
  658. package/stories/login/pages/LoginX509Info.stories.tsx +18 -0
  659. package/stories/login/pages/LogoutConfirm.stories.tsx +18 -0
  660. package/stories/login/pages/Register.stories.tsx +185 -0
  661. package/stories/login/pages/SamlPostForm.stories.tsx +18 -0
  662. package/stories/login/pages/SelectAuthenticator.stories.tsx +43 -0
  663. package/stories/login/pages/Terms.stories.tsx +43 -0
  664. package/stories/login/pages/UpdateEmail.stories.tsx +18 -0
  665. package/stories/login/pages/WebauthnAuthenticate.stories.tsx +18 -0
  666. package/stories/login/pages/WebauthnError.stories.tsx +18 -0
  667. package/stories/login/pages/WebauthnRegister.stories.tsx +18 -0
  668. package/tools/Array.prototype.every.js +2 -1
  669. package/tools/Array.prototype.every.js.map +1 -1
  670. package/tools/ExtractAfterStartingWith.d.ts +1 -0
  671. package/tools/ExtractAfterStartingWith.js +2 -0
  672. package/tools/ExtractAfterStartingWith.js.map +1 -0
  673. package/tools/HTMLElement.prototype.prepend.js.map +1 -1
  674. package/tools/Object.fromEntries.d.ts +1 -0
  675. package/tools/Object.fromEntries.js +17 -0
  676. package/tools/Object.fromEntries.js.map +1 -0
  677. package/tools/StatefulObservable/StatefulObservable.d.ts +8 -0
  678. package/tools/StatefulObservable/StatefulObservable.js +36 -0
  679. package/tools/StatefulObservable/StatefulObservable.js.map +1 -0
  680. package/tools/StatefulObservable/hooks/index.d.ts +2 -0
  681. package/tools/StatefulObservable/hooks/index.js +3 -0
  682. package/tools/StatefulObservable/hooks/index.js.map +1 -0
  683. package/tools/StatefulObservable/hooks/useObservable.d.ts +8 -0
  684. package/tools/StatefulObservable/hooks/useObservable.js +17 -0
  685. package/tools/StatefulObservable/hooks/useObservable.js.map +1 -0
  686. package/tools/StatefulObservable/hooks/useRerenderOnChange.d.ts +5 -0
  687. package/tools/StatefulObservable/hooks/useRerenderOnChange.js +14 -0
  688. package/tools/StatefulObservable/hooks/useRerenderOnChange.js.map +1 -0
  689. package/tools/StatefulObservable/index.d.ts +2 -0
  690. package/tools/StatefulObservable/index.js +3 -0
  691. package/tools/StatefulObservable/index.js.map +1 -0
  692. package/tools/ValueOf.d.ts +2 -0
  693. package/tools/ValueOf.js +2 -0
  694. package/tools/ValueOf.js.map +1 -0
  695. package/tools/clsx.d.ts +3 -2
  696. package/tools/clsx.js +5 -41
  697. package/tools/clsx.js.map +1 -1
  698. package/tools/clsx_withTransform.d.ts +5 -0
  699. package/tools/clsx_withTransform.js +43 -0
  700. package/tools/clsx_withTransform.js.map +1 -0
  701. package/tools/deepAssign.d.ts +1 -0
  702. package/tools/deepAssign.js +41 -16
  703. package/tools/deepAssign.js.map +1 -1
  704. package/tools/formatNumber.js +2 -1
  705. package/tools/formatNumber.js.map +1 -1
  706. package/tools/structuredCloneButFunctions.d.ts +7 -0
  707. package/tools/structuredCloneButFunctions.js +19 -0
  708. package/tools/structuredCloneButFunctions.js.map +1 -0
  709. package/tools/useConstCallback.js.map +1 -1
  710. package/tools/useInsertLinkTags.d.ts +11 -6
  711. package/tools/useInsertLinkTags.js +53 -52
  712. package/tools/useInsertLinkTags.js.map +1 -1
  713. package/tools/useInsertScriptTags.d.ts +15 -6
  714. package/tools/useInsertScriptTags.js +56 -61
  715. package/tools/useInsertScriptTags.js.map +1 -1
  716. package/tools/useOnFirstMount.d.ts +2 -0
  717. package/tools/useOnFirstMount.js +15 -0
  718. package/tools/useOnFirstMount.js.map +1 -0
  719. package/tools/useSetClassName.js.map +1 -1
  720. package/vite-plugin/index.d.ts +1 -0
  721. package/vite-plugin/index.js +53377 -0
  722. package/vite-plugin/vite-plugin.d.ts +5 -0
  723. package/account/Fallback.d.ts +0 -5
  724. package/account/Fallback.js.map +0 -1
  725. package/account/kcContext/KcContext.js.map +0 -1
  726. package/account/kcContext/createGetKcContext.d.ts +0 -19
  727. package/account/kcContext/createGetKcContext.js +0 -73
  728. package/account/kcContext/createGetKcContext.js.map +0 -1
  729. package/account/kcContext/getKcContext.d.ts +0 -13
  730. package/account/kcContext/getKcContext.js +0 -13
  731. package/account/kcContext/getKcContext.js.map +0 -1
  732. package/account/kcContext/getKcContextFromWindow.d.ts +0 -8
  733. package/account/kcContext/getKcContextFromWindow.js +0 -5
  734. package/account/kcContext/getKcContextFromWindow.js.map +0 -1
  735. package/account/kcContext/index.d.ts +0 -1
  736. package/account/kcContext/index.js +0 -2
  737. package/account/kcContext/index.js.map +0 -1
  738. package/account/kcContext/kcContextMocks.js +0 -215
  739. package/account/kcContext/kcContextMocks.js.map +0 -1
  740. package/account/lib/useGetClassName.d.ts +0 -7
  741. package/account/lib/useGetClassName.js +0 -19
  742. package/account/lib/useGetClassName.js.map +0 -1
  743. package/lib/isStorybook.d.ts +0 -1
  744. package/lib/isStorybook.js +0 -2
  745. package/lib/isStorybook.js.map +0 -1
  746. package/lib/useGetClassName.d.ts +0 -10
  747. package/lib/useGetClassName.js +0 -14
  748. package/lib/useGetClassName.js.map +0 -1
  749. package/login/Fallback.js.map +0 -1
  750. package/login/kcContext/KcContext.js.map +0 -1
  751. package/login/kcContext/createGetKcContext.d.ts +0 -19
  752. package/login/kcContext/createGetKcContext.js +0 -109
  753. package/login/kcContext/createGetKcContext.js.map +0 -1
  754. package/login/kcContext/getKcContext.d.ts +0 -13
  755. package/login/kcContext/getKcContext.js +0 -13
  756. package/login/kcContext/getKcContext.js.map +0 -1
  757. package/login/kcContext/getKcContextFromWindow.d.ts +0 -8
  758. package/login/kcContext/getKcContextFromWindow.js +0 -5
  759. package/login/kcContext/getKcContextFromWindow.js.map +0 -1
  760. package/login/kcContext/index.d.ts +0 -1
  761. package/login/kcContext/index.js +0 -2
  762. package/login/kcContext/index.js.map +0 -1
  763. package/login/kcContext/kcContextMocks.js +0 -390
  764. package/login/kcContext/kcContextMocks.js.map +0 -1
  765. package/login/lib/useDownloadTerms.d.ts +0 -17
  766. package/login/lib/useDownloadTerms.js +0 -32
  767. package/login/lib/useDownloadTerms.js.map +0 -1
  768. package/login/lib/useGetClassName.d.ts +0 -7
  769. package/login/lib/useGetClassName.js +0 -130
  770. package/login/lib/useGetClassName.js.map +0 -1
  771. package/src/account/kcContext/createGetKcContext.ts +0 -108
  772. package/src/account/kcContext/getKcContext.ts +0 -21
  773. package/src/account/kcContext/getKcContextFromWindow.ts +0 -11
  774. package/src/account/kcContext/index.ts +0 -1
  775. package/src/account/kcContext/kcContextMocks.ts +0 -260
  776. package/src/account/lib/useGetClassName.ts +0 -20
  777. package/src/bin/download-builtin-keycloak-theme.ts +0 -30
  778. package/src/bin/eject-keycloak-page.ts +0 -126
  779. package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +0 -79
  780. package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +0 -179
  781. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +0 -32
  782. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +0 -261
  783. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +0 -56
  784. package/src/bin/keycloakify/generateSrcMainResources/index.ts +0 -1
  785. package/src/bin/keycloakify/generateSrcMainResources/readFieldNameUsage.ts +0 -56
  786. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +0 -60
  787. package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +0 -24
  788. package/src/bin/shared/buildOptions.ts +0 -277
  789. package/src/bin/shared/downloadAndUnzip.ts +0 -203
  790. package/src/bin/shared/downloadBuiltinKeycloakTheme.ts +0 -264
  791. package/src/bin/shared/getJarFileBasename.ts +0 -9
  792. package/src/bin/shared/getThemeSrcDirPath.ts +0 -47
  793. package/src/bin/start-keycloak.ts +0 -236
  794. package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +0 -27
  795. package/src/bin/tools/unzip.ts +0 -141
  796. package/src/lib/isStorybook.ts +0 -1
  797. package/src/lib/useGetClassName.ts +0 -18
  798. package/src/login/kcContext/createGetKcContext.ts +0 -159
  799. package/src/login/kcContext/getKcContext.ts +0 -21
  800. package/src/login/kcContext/getKcContextFromWindow.ts +0 -11
  801. package/src/login/kcContext/index.ts +0 -1
  802. package/src/login/kcContext/kcContextMocks.ts +0 -630
  803. package/src/login/lib/useDownloadTerms.ts +0 -57
  804. package/src/login/lib/useGetClassName.ts +0 -132
  805. package/src/tools/AndByDiscriminatingKey.ts +0 -25
  806. package/src/tools/Markdown.ts +0 -3
  807. package/src/tools/deepClone.ts +0 -17
  808. package/src/tools/memoize.ts +0 -55
  809. package/tools/AndByDiscriminatingKey.d.ts +0 -5
  810. package/tools/AndByDiscriminatingKey.js +0 -2
  811. package/tools/AndByDiscriminatingKey.js.map +0 -1
  812. package/tools/Markdown.d.ts +0 -2
  813. package/tools/Markdown.js +0 -3
  814. package/tools/Markdown.js.map +0 -1
  815. package/tools/deepClone.d.ts +0 -2
  816. package/tools/deepClone.js +0 -14
  817. package/tools/deepClone.js.map +0 -1
  818. package/tools/memoize.d.ts +0 -7
  819. package/tools/memoize.js +0 -38
  820. package/tools/memoize.js.map +0 -1
  821. /package/account/{kcContext → KcContext}/KcContext.js +0 -0
  822. /package/login/{kcContext → KcContext}/KcContext.js +0 -0
@@ -1,14 +1,16 @@
1
1
  import "keycloakify/tools/Array.prototype.every";
2
2
  import { useMemo, useReducer, useEffect, Fragment, type Dispatch } from "react";
3
+ import { assert, type Equals } from "tsafe/assert";
3
4
  import { id } from "tsafe/id";
4
- import type { MessageKey } from "keycloakify/login/i18n/i18n";
5
- import type { Attribute, Validators } from "keycloakify/login/kcContext/KcContext";
5
+ import { structuredCloneButFunctions } from "keycloakify/tools/structuredCloneButFunctions";
6
6
  import { useConstCallback } from "keycloakify/tools/useConstCallback";
7
7
  import { emailRegexp } from "keycloakify/tools/emailRegExp";
8
- import type { KcContext, PasswordPolicies } from "keycloakify/login/kcContext/KcContext";
9
- import { assert, type Equals } from "tsafe/assert";
10
8
  import { formatNumber } from "keycloakify/tools/formatNumber";
11
- import { createUseInsertScriptTags } from "keycloakify/tools/useInsertScriptTags";
9
+ import { useInsertScriptTags } from "keycloakify/tools/useInsertScriptTags";
10
+ import type { PasswordPolicies, Attribute, Validators } from "keycloakify/login/KcContext";
11
+ import type { KcContext } from "../KcContext";
12
+ import type { MessageKey } from "keycloakify/login/i18n";
13
+ import { KcContextLike as KcContextLike_i18n } from "keycloakify/login/i18n";
12
14
  import type { I18n } from "../i18n";
13
15
 
14
16
  export type FormFieldError = {
@@ -64,21 +66,22 @@ export type FormAction =
64
66
  fieldIndex: number | undefined;
65
67
  };
66
68
 
67
- export type KcContextLike = {
68
- messagesPerField: Pick<KcContext.Common["messagesPerField"], "existsError" | "get">;
69
- profile: {
70
- attributes: Attribute[];
71
- html5DataAnnotations?: Record<string, string>;
72
- };
73
- passwordRequired?: boolean;
74
- realm: { registrationEmailAsUsername: boolean };
75
- passwordPolicies?: PasswordPolicies;
76
- url: {
77
- resourcesPath: string;
69
+ export type KcContextLike = KcContextLike_i18n &
70
+ KcContextLike_useGetErrors & {
71
+ profile: {
72
+ attributesByName: Record<string, Attribute>;
73
+ html5DataAnnotations?: Record<string, string>;
74
+ };
75
+ passwordRequired?: boolean;
76
+ realm: { registrationEmailAsUsername: boolean };
77
+ url: {
78
+ resourcesPath: string;
79
+ };
78
80
  };
79
- };
80
81
 
81
- export type ParamsOfUseUserProfileForm = {
82
+ assert<Extract<Extract<KcContext, { profile: unknown }>, { pageId: "register.ftl" }> extends KcContextLike ? true : false>();
83
+
84
+ export type UseUserProfileFormParams = {
82
85
  kcContext: KcContextLike;
83
86
  i18n: I18n;
84
87
  doMakeUserConfirmPassword: boolean;
@@ -102,17 +105,16 @@ namespace internal {
102
105
  };
103
106
  }
104
107
 
105
- const { useInsertScriptTags } = createUseInsertScriptTags();
106
-
107
- export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTypeOfUseUserProfileForm {
108
+ export function useUserProfileForm(params: UseUserProfileFormParams): ReturnTypeOfUseUserProfileForm {
108
109
  const { kcContext, i18n, doMakeUserConfirmPassword } = params;
109
110
 
110
111
  const { insertScriptTags } = useInsertScriptTags({
111
- "scriptTags": Object.keys(kcContext.profile?.html5DataAnnotations ?? {})
112
+ componentOrHookName: "useUserProfileForm",
113
+ scriptTags: Object.keys(kcContext.profile?.html5DataAnnotations ?? {})
112
114
  .filter(key => key !== "kcMultivalued" && key !== "kcNumberFormat") // NOTE: Keycloakify handles it.
113
115
  .map(key => ({
114
- "type": "module",
115
- "src": `${kcContext.url.resourcesPath}/js/${key}.js`
116
+ type: "module",
117
+ src: `${kcContext.url.resourcesPath}/js/${key}.js`
116
118
  }))
117
119
  });
118
120
 
@@ -128,226 +130,251 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
128
130
  const initialState = useMemo((): internal.State => {
129
131
  // NOTE: We don't use te kcContext.profile.attributes directly because
130
132
  // they don't includes the password and password confirm fields and we want to add them.
131
- // Also, we want to polyfill the attributes for older Keycloak version before User Profile was introduced.
132
- // Finally we want to patch the changes made by Keycloak on the attributes format so we have an homogeneous
133
- // attributes format to work with.
134
- const syntheticAttributes = (() => {
135
- const syntheticAttributes: Attribute[] = [];
136
-
137
- const attributes = (() => {
138
- retrocompat_patch: {
139
- if ("profile" in kcContext && "attributes" in kcContext.profile && kcContext.profile.attributes.length !== 0) {
140
- break retrocompat_patch;
141
- }
142
-
143
- if ("register" in kcContext && kcContext.register instanceof Object && "formData" in kcContext.register) {
144
- //NOTE: Handle legacy register.ftl page
145
- return (["firstName", "lastName", "email", "username"] as const)
146
- .filter(name => (name !== "username" ? true : !kcContext.realm.registrationEmailAsUsername))
147
- .map(name =>
148
- id<Attribute>({
149
- "name": name,
150
- "displayName": id<`\${${MessageKey}}`>(`\${${name}}`),
151
- "required": true,
152
- "value": (kcContext.register as any).formData[name] ?? "",
153
- "html5DataAnnotations": {},
154
- "readOnly": false,
155
- "validators": {},
156
- "annotations": {},
157
- "autocomplete": (() => {
158
- switch (name) {
159
- case "email":
160
- return "email";
161
- case "username":
162
- return "username";
163
- default:
164
- return undefined;
165
- }
166
- })()
167
- })
168
- );
169
- }
133
+ // We also want to apply some retro-compatibility and consistency patches.
134
+ const attributes: Attribute[] = (() => {
135
+ mock_user_profile_attributes_for_older_keycloak_versions: {
136
+ if (
137
+ "profile" in kcContext &&
138
+ "attributesByName" in kcContext.profile &&
139
+ Object.keys(kcContext.profile.attributesByName).length !== 0
140
+ ) {
141
+ break mock_user_profile_attributes_for_older_keycloak_versions;
142
+ }
170
143
 
171
- if ("user" in kcContext && kcContext.user instanceof Object) {
172
- //NOTE: Handle legacy login-update-profile.ftl
173
- return (["username", "email", "firstName", "lastName"] as const)
174
- .filter(name => (name !== "username" ? true : (kcContext.user as any).editUsernameAllowed))
175
- .map(name =>
176
- id<Attribute>({
177
- "name": name,
178
- "displayName": id<`\${${MessageKey}}`>(`\${${name}}`),
179
- "required": true,
180
- "value": (kcContext as any).user[name] ?? "",
181
- "html5DataAnnotations": {},
182
- "readOnly": false,
183
- "validators": {},
184
- "annotations": {},
185
- "autocomplete": (() => {
186
- switch (name) {
187
- case "email":
188
- return "email";
189
- case "username":
190
- return "username";
191
- default:
192
- return undefined;
193
- }
194
- })()
195
- })
196
- );
197
- }
144
+ if ("register" in kcContext && kcContext.register instanceof Object && "formData" in kcContext.register) {
145
+ //NOTE: Handle legacy register.ftl page
146
+ return (["firstName", "lastName", "email", "username"] as const)
147
+ .filter(name => (name !== "username" ? true : !kcContext.realm.registrationEmailAsUsername))
148
+ .map(name =>
149
+ id<Attribute>({
150
+ name: name,
151
+ displayName: id<`\${${MessageKey}}`>(`\${${name}}`),
152
+ required: true,
153
+ value: (kcContext.register as any).formData[name] ?? "",
154
+ html5DataAnnotations: {},
155
+ readOnly: false,
156
+ validators: {},
157
+ annotations: {},
158
+ autocomplete: (() => {
159
+ switch (name) {
160
+ case "email":
161
+ return "email";
162
+ case "username":
163
+ return "username";
164
+ default:
165
+ return undefined;
166
+ }
167
+ })()
168
+ })
169
+ );
170
+ }
198
171
 
199
- if ("email" in kcContext && kcContext.email instanceof Object) {
200
- //NOTE: Handle legacy update-email.ftl
201
- return [
172
+ if ("user" in kcContext && kcContext.user instanceof Object) {
173
+ //NOTE: Handle legacy login-update-profile.ftl
174
+ return (["username", "email", "firstName", "lastName"] as const)
175
+ .filter(name => (name !== "username" ? true : (kcContext.user as any).editUsernameAllowed))
176
+ .map(name =>
202
177
  id<Attribute>({
203
- "name": "email",
204
- "displayName": id<`\${${MessageKey}}`>(`\${email}`),
205
- "required": true,
206
- "value": (kcContext.email as any).value ?? "",
207
- "html5DataAnnotations": {},
208
- "readOnly": false,
209
- "validators": {},
210
- "annotations": {},
211
- "autocomplete": "email"
178
+ name: name,
179
+ displayName: id<`\${${MessageKey}}`>(`\${${name}}`),
180
+ required: true,
181
+ value: (kcContext as any).user[name] ?? "",
182
+ html5DataAnnotations: {},
183
+ readOnly: false,
184
+ validators: {},
185
+ annotations: {},
186
+ autocomplete: (() => {
187
+ switch (name) {
188
+ case "email":
189
+ return "email";
190
+ case "username":
191
+ return "username";
192
+ default:
193
+ return undefined;
194
+ }
195
+ })()
212
196
  })
213
- ];
214
- }
197
+ );
198
+ }
215
199
 
216
- assert(false, "Unable to mock user profile from the current kcContext");
200
+ if ("email" in kcContext && kcContext.email instanceof Object) {
201
+ //NOTE: Handle legacy update-email.ftl
202
+ return [
203
+ id<Attribute>({
204
+ name: "email",
205
+ displayName: id<`\${${MessageKey}}`>(`\${email}`),
206
+ required: true,
207
+ value: (kcContext.email as any).value ?? "",
208
+ html5DataAnnotations: {},
209
+ readOnly: false,
210
+ validators: {},
211
+ annotations: {},
212
+ autocomplete: "email"
213
+ })
214
+ ];
217
215
  }
218
216
 
219
- return kcContext.profile.attributes.map(attribute_pre_group_patch => {
220
- if (typeof attribute_pre_group_patch.group === "string" && attribute_pre_group_patch.group !== "") {
221
- const { group, groupDisplayHeader, groupDisplayDescription, groupAnnotations, ...rest } =
222
- attribute_pre_group_patch as Attribute & {
223
- group: string;
224
- groupDisplayHeader?: string;
225
- groupDisplayDescription?: string;
226
- groupAnnotations: Record<string, string>;
227
- };
228
-
229
- return id<Attribute>({
230
- ...rest,
231
- "group": {
232
- "name": group,
233
- "displayHeader": groupDisplayHeader,
234
- "displayDescription": groupDisplayDescription,
235
- "html5DataAnnotations": {}
236
- }
237
- });
238
- }
217
+ assert(false, "Unable to mock user profile from the current kcContext");
218
+ }
239
219
 
240
- return attribute_pre_group_patch;
241
- });
242
- })();
220
+ return Object.values(kcContext.profile.attributesByName).map(structuredCloneButFunctions);
221
+ })();
243
222
 
244
- for (const attribute of attributes) {
245
- syntheticAttributes.push(attribute);
223
+ // Retro-compatibility and consistency patches
224
+ attributes.forEach(attribute => {
225
+ patch_legacy_group: {
226
+ if (typeof attribute.group !== "string") {
227
+ break patch_legacy_group;
228
+ }
246
229
 
247
- add_password_and_password_confirm: {
248
- if (!kcContext.passwordRequired) {
249
- break add_password_and_password_confirm;
250
- }
230
+ const { group, groupDisplayHeader, groupDisplayDescription /*, groupAnnotations*/ } = attribute as Attribute & {
231
+ group: string;
232
+ groupDisplayHeader?: string;
233
+ groupDisplayDescription?: string;
234
+ groupAnnotations: Record<string, string>;
235
+ };
251
236
 
252
- if (attribute.name !== (kcContext.realm.registrationEmailAsUsername ? "email" : "username")) {
253
- // NOTE: We want to add password and password-confirm after the field that identifies the user.
254
- // It's either email or username.
255
- break add_password_and_password_confirm;
256
- }
237
+ delete attribute.group;
238
+ // @ts-expect-error
239
+ delete attribute.groupDisplayHeader;
240
+ // @ts-expect-error
241
+ delete attribute.groupDisplayDescription;
242
+ // @ts-expect-error
243
+ delete attribute.groupAnnotations;
257
244
 
258
- syntheticAttributes.push(
259
- {
260
- "name": "password",
261
- "displayName": id<`\${${MessageKey}}`>("${password}"),
262
- "required": true,
263
- "readOnly": false,
264
- "validators": {},
265
- "annotations": {},
266
- "autocomplete": "new-password",
267
- "html5DataAnnotations": {},
268
- // NOTE: Compat with Keycloak version prior to 24
269
- ...({ "groupAnnotations": {} } as {})
270
- },
271
- {
272
- "name": "password-confirm",
273
- "displayName": id<`\${${MessageKey}}`>("${passwordConfirm}"),
274
- "required": true,
275
- "readOnly": false,
276
- "validators": {},
277
- "annotations": {},
278
- "html5DataAnnotations": {},
279
- "autocomplete": "new-password",
280
- // NOTE: Compat with Keycloak version prior to 24
281
- ...({ "groupAnnotations": {} } as {})
282
- }
283
- );
245
+ if (group === "") {
246
+ break patch_legacy_group;
284
247
  }
248
+
249
+ attribute.group = {
250
+ name: group,
251
+ displayHeader: groupDisplayHeader,
252
+ displayDescription: groupDisplayDescription,
253
+ html5DataAnnotations: {}
254
+ };
285
255
  }
286
256
 
287
- return syntheticAttributes;
288
- })();
257
+ // Attributes with options rendered by default as select inputs
258
+ if (attribute.validators.options !== undefined && attribute.annotations.inputType === undefined) {
259
+ attribute.annotations.inputType = "select";
260
+ }
289
261
 
290
- const initialFormFieldState = (() => {
291
- const out: { attribute: Attribute; valueOrValues: string | string[] }[] = [];
262
+ // Consistency patch on values/value property
263
+ {
264
+ if (getIsMultivaluedSingleField({ attribute })) {
265
+ attribute.multivalued = true;
266
+ }
292
267
 
293
- for (const attribute of syntheticAttributes) {
294
- handle_multi_valued_attribute: {
295
- if (!attribute.multivalued) {
296
- break handle_multi_valued_attribute;
268
+ if (attribute.multivalued) {
269
+ attribute.values ??= attribute.value !== undefined ? [attribute.value] : [];
270
+ delete attribute.value;
271
+ } else {
272
+ attribute.value ??= attribute.values?.[0];
273
+ delete attribute.values;
274
+ }
275
+ }
276
+ });
277
+
278
+ add_password_and_password_confirm: {
279
+ if (!kcContext.passwordRequired) {
280
+ break add_password_and_password_confirm;
281
+ }
282
+
283
+ attributes.forEach((attribute, i) => {
284
+ if (attribute.name !== (kcContext.realm.registrationEmailAsUsername ? "email" : "username")) {
285
+ // NOTE: We want to add password and password-confirm after the field that identifies the user.
286
+ // It's either email or username.
287
+ return;
288
+ }
289
+
290
+ attributes.splice(
291
+ i + 1,
292
+ 0,
293
+ {
294
+ name: "password",
295
+ displayName: id<`\${${MessageKey}}`>("${password}"),
296
+ required: true,
297
+ readOnly: false,
298
+ validators: {},
299
+ annotations: {},
300
+ autocomplete: "new-password",
301
+ html5DataAnnotations: {}
302
+ },
303
+ {
304
+ name: "password-confirm",
305
+ displayName: id<`\${${MessageKey}}`>("${passwordConfirm}"),
306
+ required: true,
307
+ readOnly: false,
308
+ validators: {},
309
+ annotations: {},
310
+ html5DataAnnotations: {},
311
+ autocomplete: "new-password"
297
312
  }
313
+ );
314
+ });
315
+ }
298
316
 
299
- const values = attribute.values ?? [""];
317
+ const initialFormFieldState: {
318
+ attribute: Attribute;
319
+ valueOrValues: string | string[];
320
+ }[] = [];
300
321
 
301
- apply_validator_min_range: {
302
- if (attribute.annotations.inputType?.startsWith("multiselect")) {
303
- break apply_validator_min_range;
304
- }
322
+ for (const attribute of attributes) {
323
+ handle_multi_valued_attribute: {
324
+ if (!attribute.multivalued) {
325
+ break handle_multi_valued_attribute;
326
+ }
305
327
 
306
- const validator = attribute.validators.multivalued;
328
+ const values = attribute.values?.length ? attribute.values : [""];
307
329
 
308
- if (validator === undefined) {
309
- break apply_validator_min_range;
310
- }
330
+ apply_validator_min_range: {
331
+ if (getIsMultivaluedSingleField({ attribute })) {
332
+ break apply_validator_min_range;
333
+ }
311
334
 
312
- const { min: minStr } = validator;
335
+ const validator = attribute.validators.multivalued;
313
336
 
314
- if (minStr === undefined) {
315
- break apply_validator_min_range;
316
- }
337
+ if (validator === undefined) {
338
+ break apply_validator_min_range;
339
+ }
317
340
 
318
- const min = parseInt(`${minStr}`);
341
+ const { min: minStr } = validator;
319
342
 
320
- for (let index = values.length; index < min; index++) {
321
- values.push("");
322
- }
343
+ if (!minStr) {
344
+ break apply_validator_min_range;
323
345
  }
324
346
 
325
- out.push({
326
- attribute,
327
- "valueOrValues": values
328
- });
347
+ const min = parseInt(`${minStr}`);
329
348
 
330
- continue;
349
+ for (let index = values.length; index < min; index++) {
350
+ values.push("");
351
+ }
331
352
  }
332
353
 
333
- out.push({
354
+ initialFormFieldState.push({
334
355
  attribute,
335
- "valueOrValues": attribute.value ?? ""
356
+ valueOrValues: values
336
357
  });
358
+
359
+ continue;
337
360
  }
338
361
 
339
- return out;
340
- })();
362
+ initialFormFieldState.push({
363
+ attribute,
364
+ valueOrValues: attribute.value ?? ""
365
+ });
366
+ }
341
367
 
342
368
  const initialState: internal.State = {
343
- "formFieldStates": initialFormFieldState.map(({ attribute, valueOrValues }) => ({
369
+ formFieldStates: initialFormFieldState.map(({ attribute, valueOrValues }) => ({
344
370
  attribute,
345
- "errors": getErrors({
346
- "attributeName": attribute.name,
347
- "formFieldStates": initialFormFieldState
371
+ errors: getErrors({
372
+ attributeName: attribute.name,
373
+ formFieldStates: initialFormFieldState
348
374
  }),
349
- "hasLostFocusAtLeastOnce": valueOrValues instanceof Array ? valueOrValues.map(() => false) : false,
350
- "valueOrValues": valueOrValues
375
+ hasLostFocusAtLeastOnce:
376
+ valueOrValues instanceof Array && !getIsMultivaluedSingleField({ attribute }) ? valueOrValues.map(() => false) : false,
377
+ valueOrValues: valueOrValues
351
378
  }))
352
379
  };
353
380
 
@@ -369,7 +396,7 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
369
396
 
370
397
  const { kcNumberFormat } = attribute.html5DataAnnotations ?? {};
371
398
 
372
- if (kcNumberFormat === undefined) {
399
+ if (!kcNumberFormat) {
373
400
  break apply_formatters;
374
401
  }
375
402
 
@@ -381,8 +408,8 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
381
408
  }
382
409
 
383
410
  formFieldState.errors = getErrors({
384
- "attributeName": formAction.name,
385
- "formFieldStates": state.formFieldStates
411
+ attributeName: formAction.name,
412
+ formFieldStates: state.formFieldStates
386
413
  });
387
414
 
388
415
  update_password_confirm: {
@@ -395,9 +422,9 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
395
422
  }
396
423
 
397
424
  state = reducer(state, {
398
- "action": "update",
399
- "name": "password-confirm",
400
- "valueOrValues": formAction.valueOrValues
425
+ action: "update",
426
+ name: "password-confirm",
427
+ valueOrValues: formAction.valueOrValues
401
428
  });
402
429
  }
403
430
 
@@ -421,15 +448,15 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
421
448
 
422
449
  const formState: FormState = useMemo(
423
450
  () => ({
424
- "formFieldStates": state.formFieldStates.map(
451
+ formFieldStates: state.formFieldStates.map(
425
452
  ({ errors, hasLostFocusAtLeastOnce: hasLostFocusAtLeastOnceOrArr, attribute, ...valueOrValuesWrap }) => ({
426
- "displayableErrors": errors.filter(error => {
453
+ displayableErrors: errors.filter(error => {
427
454
  const hasLostFocusAtLeastOnce =
428
455
  typeof hasLostFocusAtLeastOnceOrArr === "boolean"
429
456
  ? hasLostFocusAtLeastOnceOrArr
430
457
  : error.fieldIndex !== undefined
431
- ? hasLostFocusAtLeastOnceOrArr[error.fieldIndex]
432
- : hasLostFocusAtLeastOnceOrArr[hasLostFocusAtLeastOnceOrArr.length - 1];
458
+ ? hasLostFocusAtLeastOnceOrArr[error.fieldIndex]
459
+ : hasLostFocusAtLeastOnceOrArr[hasLostFocusAtLeastOnceOrArr.length - 1];
433
460
 
434
461
  switch (error.source.type) {
435
462
  case "server":
@@ -482,7 +509,7 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
482
509
  ...valueOrValuesWrap
483
510
  })
484
511
  ),
485
- "isFormSubmittable": state.formFieldStates.every(({ errors }) => errors.length === 0)
512
+ isFormSubmittable: state.formFieldStates.every(({ errors }) => errors.length === 0)
486
513
  }),
487
514
  [state]
488
515
  );
@@ -493,7 +520,14 @@ export function useUserProfileForm(params: ParamsOfUseUserProfileForm): ReturnTy
493
520
  };
494
521
  }
495
522
 
496
- function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField" | "passwordPolicies">; i18n: I18n }) {
523
+ type KcContextLike_useGetErrors = KcContextLike_i18n & {
524
+ messagesPerField: Pick<KcContext["messagesPerField"], "existsError" | "get">;
525
+ passwordPolicies?: PasswordPolicies;
526
+ };
527
+
528
+ assert<KcContextLike extends KcContextLike_useGetErrors ? true : false>();
529
+
530
+ function useGetErrors(params: { kcContext: KcContextLike_useGetErrors; i18n: I18n }) {
497
531
  const { kcContext, i18n } = params;
498
532
 
499
533
  const { messagesPerField, passwordPolicies } = kcContext;
@@ -501,7 +535,13 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
501
535
  const { msg, msgStr, advancedMsg, advancedMsgStr } = i18n;
502
536
 
503
537
  const getErrors = useConstCallback(
504
- (params: { attributeName: string; formFieldStates: { attribute: Attribute; valueOrValues: string | string[] }[] }): FormFieldError[] => {
538
+ (params: {
539
+ attributeName: string;
540
+ formFieldStates: {
541
+ attribute: Attribute;
542
+ valueOrValues: string | string[];
543
+ }[];
544
+ }): FormFieldError[] => {
505
545
  const { attributeName, formFieldStates } = params;
506
546
 
507
547
  const formFieldState = formFieldStates.find(({ attribute }) => attribute.name === attributeName);
@@ -516,7 +556,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
516
556
  unFormat_number: {
517
557
  const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {};
518
558
 
519
- if (kcNumberUnFormat === undefined) {
559
+ if (!kcNumberUnFormat) {
520
560
  break unFormat_number;
521
561
  }
522
562
 
@@ -534,7 +574,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
534
574
 
535
575
  server_side_error: {
536
576
  if (attribute.multivalued) {
537
- const defaultValues = attribute.values ?? [""];
577
+ const defaultValues = attribute.values?.length ? attribute.values : [""];
538
578
 
539
579
  assert(valueOrValues instanceof Array);
540
580
 
@@ -572,10 +612,17 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
572
612
  return [
573
613
  {
574
614
  errorMessageStr,
575
- "errorMessage": <span key={0}>{errorMessageStr}</span>,
576
- "fieldIndex": undefined,
577
- "source": {
578
- "type": "server"
615
+ errorMessage: (
616
+ <span
617
+ key={0}
618
+ dangerouslySetInnerHTML={{
619
+ __html: errorMessageStr
620
+ }}
621
+ />
622
+ ),
623
+ fieldIndex: undefined,
624
+ source: {
625
+ type: "server"
579
626
  }
580
627
  }
581
628
  ];
@@ -586,7 +633,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
586
633
  break handle_multi_valued_multi_fields;
587
634
  }
588
635
 
589
- if (attribute.annotations.inputType?.startsWith("multiselect")) {
636
+ if (getIsMultivaluedSingleField({ attribute })) {
590
637
  break handle_multi_valued_multi_fields;
591
638
  }
592
639
 
@@ -598,19 +645,19 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
598
645
  .map((...[, index]) => {
599
646
  const specificValueErrors = getErrors({
600
647
  attributeName,
601
- "formFieldStates": formFieldStates.map(formFieldState => {
648
+ formFieldStates: formFieldStates.map(formFieldState => {
602
649
  if (formFieldState.attribute.name === attributeName) {
603
650
  assert(formFieldState.valueOrValues instanceof Array);
604
651
  return {
605
- "attribute": {
652
+ attribute: {
606
653
  ...attribute,
607
- "annotations": {
654
+ annotations: {
608
655
  ...attribute.annotations,
609
- "inputType": undefined
656
+ inputType: undefined
610
657
  },
611
- "multivalued": false
658
+ multivalued: false
612
659
  },
613
- "valueOrValues": formFieldState.valueOrValues[index]
660
+ valueOrValues: formFieldState.valueOrValues[index]
614
661
  };
615
662
  }
616
663
 
@@ -626,7 +673,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
626
673
 
627
674
  return true;
628
675
  })
629
- .map((error): FormFieldError => ({ ...error, "fieldIndex": index }));
676
+ .map(
677
+ (error): FormFieldError => ({
678
+ ...error,
679
+ fieldIndex: index
680
+ })
681
+ );
630
682
  })
631
683
  .reduce((acc, errors) => [...acc, ...errors], []);
632
684
 
@@ -642,12 +694,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
642
694
  const msgArgs = ["error-user-attribute-required"] as const;
643
695
 
644
696
  errors.push({
645
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
646
- "errorMessageStr": msgStr(...msgArgs),
647
- "fieldIndex": undefined,
648
- "source": {
649
- "type": "other",
650
- "rule": "requiredField"
697
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
698
+ errorMessageStr: msgStr(...msgArgs),
699
+ fieldIndex: undefined,
700
+ source: {
701
+ type: "other",
702
+ rule: "requiredField"
651
703
  }
652
704
  });
653
705
  }
@@ -660,7 +712,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
660
712
  break handle_multi_valued_single_field;
661
713
  }
662
714
 
663
- if (!attribute.annotations.inputType?.startsWith("multiselect")) {
715
+ if (!getIsMultivaluedSingleField({ attribute })) {
664
716
  break handle_multi_valued_single_field;
665
717
  }
666
718
 
@@ -674,13 +726,13 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
674
726
 
675
727
  const { min: minStr } = validator;
676
728
 
677
- const min = minStr !== undefined ? parseInt(`${minStr}`) : attribute.required ? 1 : 0;
729
+ const min = minStr ? parseInt(`${minStr}`) : attribute.required ? 1 : 0;
678
730
 
679
731
  assert(!isNaN(min));
680
732
 
681
733
  const { max: maxStr } = validator;
682
734
 
683
- const max = maxStr === undefined ? Infinity : parseInt(`${maxStr}`);
735
+ const max = !maxStr ? Infinity : parseInt(`${maxStr}`);
684
736
 
685
737
  assert(!isNaN(max));
686
738
 
@@ -696,12 +748,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
696
748
 
697
749
  return [
698
750
  {
699
- "errorMessage": <Fragment key={0}>{msg(...msgArgs)}</Fragment>,
700
- "errorMessageStr": msgStr(...msgArgs),
701
- "fieldIndex": undefined,
702
- "source": {
703
- "type": "validator",
704
- "name": validatorName
751
+ errorMessage: <Fragment key={0}>{msg(...msgArgs)}</Fragment>,
752
+ errorMessageStr: msgStr(...msgArgs),
753
+ fieldIndex: undefined,
754
+ source: {
755
+ type: "validator",
756
+ name: validatorName
705
757
  }
706
758
  }
707
759
  ];
@@ -727,7 +779,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
727
779
 
728
780
  const policy = passwordPolicies[policyName];
729
781
 
730
- if (policy === undefined) {
782
+ if (!policy) {
731
783
  break check_password_policy_x;
732
784
  }
733
785
 
@@ -740,12 +792,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
740
792
  const msgArgs = ["invalidPasswordMinLengthMessage", `${minLength}`] as const;
741
793
 
742
794
  errors.push({
743
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
744
- "errorMessageStr": msgStr(...msgArgs),
745
- "fieldIndex": undefined,
746
- "source": {
747
- "type": "passwordPolicy",
748
- "name": policyName
795
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
796
+ errorMessageStr: msgStr(...msgArgs),
797
+ fieldIndex: undefined,
798
+ source: {
799
+ type: "passwordPolicy",
800
+ name: policyName
749
801
  }
750
802
  });
751
803
  }
@@ -755,7 +807,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
755
807
 
756
808
  const policy = passwordPolicies[policyName];
757
809
 
758
- if (policy === undefined) {
810
+ if (!policy) {
759
811
  break check_password_policy_x;
760
812
  }
761
813
 
@@ -768,12 +820,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
768
820
  const msgArgs = ["invalidPasswordMinDigitsMessage", `${minNumberOfDigits}`] as const;
769
821
 
770
822
  errors.push({
771
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
772
- "errorMessageStr": msgStr(...msgArgs),
773
- "fieldIndex": undefined,
774
- "source": {
775
- "type": "passwordPolicy",
776
- "name": policyName
823
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
824
+ errorMessageStr: msgStr(...msgArgs),
825
+ fieldIndex: undefined,
826
+ source: {
827
+ type: "passwordPolicy",
828
+ name: policyName
777
829
  }
778
830
  });
779
831
  }
@@ -783,7 +835,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
783
835
 
784
836
  const policy = passwordPolicies[policyName];
785
837
 
786
- if (policy === undefined) {
838
+ if (!policy) {
787
839
  break check_password_policy_x;
788
840
  }
789
841
 
@@ -798,12 +850,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
798
850
  const msgArgs = ["invalidPasswordMinLowerCaseCharsMessage", `${minNumberOfLowerCaseChar}`] as const;
799
851
 
800
852
  errors.push({
801
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
802
- "errorMessageStr": msgStr(...msgArgs),
803
- "fieldIndex": undefined,
804
- "source": {
805
- "type": "passwordPolicy",
806
- "name": policyName
853
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
854
+ errorMessageStr: msgStr(...msgArgs),
855
+ fieldIndex: undefined,
856
+ source: {
857
+ type: "passwordPolicy",
858
+ name: policyName
807
859
  }
808
860
  });
809
861
  }
@@ -813,7 +865,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
813
865
 
814
866
  const policy = passwordPolicies[policyName];
815
867
 
816
- if (policy === undefined) {
868
+ if (!policy) {
817
869
  break check_password_policy_x;
818
870
  }
819
871
 
@@ -828,12 +880,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
828
880
  const msgArgs = ["invalidPasswordMinUpperCaseCharsMessage", `${minNumberOfUpperCaseChar}`] as const;
829
881
 
830
882
  errors.push({
831
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
832
- "errorMessageStr": msgStr(...msgArgs),
833
- "fieldIndex": undefined,
834
- "source": {
835
- "type": "passwordPolicy",
836
- "name": policyName
883
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
884
+ errorMessageStr: msgStr(...msgArgs),
885
+ fieldIndex: undefined,
886
+ source: {
887
+ type: "passwordPolicy",
888
+ name: policyName
837
889
  }
838
890
  });
839
891
  }
@@ -843,7 +895,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
843
895
 
844
896
  const policy = passwordPolicies[policyName];
845
897
 
846
- if (policy === undefined) {
898
+ if (!policy) {
847
899
  break check_password_policy_x;
848
900
  }
849
901
 
@@ -856,12 +908,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
856
908
  const msgArgs = ["invalidPasswordMinSpecialCharsMessage", `${minNumberOfSpecialChar}`] as const;
857
909
 
858
910
  errors.push({
859
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
860
- "errorMessageStr": msgStr(...msgArgs),
861
- "fieldIndex": undefined,
862
- "source": {
863
- "type": "passwordPolicy",
864
- "name": policyName
911
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
912
+ errorMessageStr: msgStr(...msgArgs),
913
+ fieldIndex: undefined,
914
+ source: {
915
+ type: "passwordPolicy",
916
+ name: policyName
865
917
  }
866
918
  });
867
919
  }
@@ -877,7 +929,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
877
929
 
878
930
  const usernameFormFieldState = formFieldStates.find(formFieldState => formFieldState.attribute.name === "username");
879
931
 
880
- if (usernameFormFieldState === undefined) {
932
+ if (!usernameFormFieldState) {
881
933
  break check_password_policy_x;
882
934
  }
883
935
 
@@ -889,7 +941,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
889
941
  unFormat_number: {
890
942
  const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {};
891
943
 
892
- if (kcNumberUnFormat === undefined) {
944
+ if (!kcNumberUnFormat) {
893
945
  break unFormat_number;
894
946
  }
895
947
 
@@ -899,6 +951,10 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
899
951
  return valueOrValues;
900
952
  })();
901
953
 
954
+ if (usernameValue === "") {
955
+ break check_password_policy_x;
956
+ }
957
+
902
958
  if (value !== usernameValue) {
903
959
  break check_password_policy_x;
904
960
  }
@@ -906,12 +962,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
906
962
  const msgArgs = ["invalidPasswordNotUsernameMessage"] as const;
907
963
 
908
964
  errors.push({
909
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
910
- "errorMessageStr": msgStr(...msgArgs),
911
- "fieldIndex": undefined,
912
- "source": {
913
- "type": "passwordPolicy",
914
- "name": policyName
965
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
966
+ errorMessageStr: msgStr(...msgArgs),
967
+ fieldIndex: undefined,
968
+ source: {
969
+ type: "passwordPolicy",
970
+ name: policyName
915
971
  }
916
972
  });
917
973
  }
@@ -927,7 +983,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
927
983
 
928
984
  const emailFormFieldState = formFieldStates.find(formFieldState => formFieldState.attribute.name === "email");
929
985
 
930
- if (emailFormFieldState === undefined) {
986
+ if (!emailFormFieldState) {
931
987
  break check_password_policy_x;
932
988
  }
933
989
 
@@ -936,6 +992,10 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
936
992
  {
937
993
  const emailValue = emailFormFieldState.valueOrValues;
938
994
 
995
+ if (emailValue === "") {
996
+ break check_password_policy_x;
997
+ }
998
+
939
999
  if (value !== emailValue) {
940
1000
  break check_password_policy_x;
941
1001
  }
@@ -944,12 +1004,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
944
1004
  const msgArgs = ["invalidPasswordNotEmailMessage"] as const;
945
1005
 
946
1006
  errors.push({
947
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
948
- "errorMessageStr": msgStr(...msgArgs),
949
- "fieldIndex": undefined,
950
- "source": {
951
- "type": "passwordPolicy",
952
- "name": policyName
1007
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1008
+ errorMessageStr: msgStr(...msgArgs),
1009
+ fieldIndex: undefined,
1010
+ source: {
1011
+ type: "passwordPolicy",
1012
+ name: policyName
953
1013
  }
954
1014
  });
955
1015
  }
@@ -977,12 +1037,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
977
1037
  const msgArgs = ["invalidPasswordConfirmMessage"] as const;
978
1038
 
979
1039
  errors.push({
980
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
981
- "errorMessageStr": msgStr(...msgArgs),
982
- "fieldIndex": undefined,
983
- "source": {
984
- "type": "other",
985
- "rule": "passwordConfirmMatchesPassword"
1040
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1041
+ errorMessageStr: msgStr(...msgArgs),
1042
+ fieldIndex: undefined,
1043
+ source: {
1044
+ type: "other",
1045
+ rule: "passwordConfirmMatchesPassword"
986
1046
  }
987
1047
  });
988
1048
  }
@@ -1001,12 +1061,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1001
1061
  const msgArgs = ["error-user-attribute-required"] as const;
1002
1062
 
1003
1063
  errors.push({
1004
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1005
- "errorMessageStr": msgStr(...msgArgs),
1006
- "fieldIndex": undefined,
1007
- "source": {
1008
- "type": "other",
1009
- "rule": "requiredField"
1064
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1065
+ errorMessageStr: msgStr(...msgArgs),
1066
+ fieldIndex: undefined,
1067
+ source: {
1068
+ type: "other",
1069
+ rule: "requiredField"
1010
1070
  }
1011
1071
  });
1012
1072
  }
@@ -1016,7 +1076,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1016
1076
 
1017
1077
  const validator = validators[validatorName];
1018
1078
 
1019
- if (validator === undefined) {
1079
+ if (!validator) {
1020
1080
  break validator_x;
1021
1081
  }
1022
1082
 
@@ -1027,28 +1087,28 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1027
1087
  }
1028
1088
 
1029
1089
  const source: FormFieldError.Source = {
1030
- "type": "validator",
1031
- "name": validatorName
1090
+ type: "validator",
1091
+ name: validatorName
1032
1092
  };
1033
1093
 
1034
- if (max !== undefined && value.length > parseInt(`${max}`)) {
1094
+ if (max && value.length > parseInt(`${max}`)) {
1035
1095
  const msgArgs = ["error-invalid-length-too-long", `${max}`] as const;
1036
1096
 
1037
1097
  errors.push({
1038
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1039
- "errorMessageStr": msgStr(...msgArgs),
1040
- "fieldIndex": undefined,
1098
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1099
+ errorMessageStr: msgStr(...msgArgs),
1100
+ fieldIndex: undefined,
1041
1101
  source
1042
1102
  });
1043
1103
  }
1044
1104
 
1045
- if (min !== undefined && value.length < parseInt(`${min}`)) {
1105
+ if (min && value.length < parseInt(`${min}`)) {
1046
1106
  const msgArgs = ["error-invalid-length-too-short", `${min}`] as const;
1047
1107
 
1048
1108
  errors.push({
1049
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1050
- "errorMessageStr": msgStr(...msgArgs),
1051
- "fieldIndex": undefined,
1109
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1110
+ errorMessageStr: msgStr(...msgArgs),
1111
+ fieldIndex: undefined,
1052
1112
  source
1053
1113
  });
1054
1114
  }
@@ -1076,12 +1136,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1076
1136
  const msgArgs = [errorMessageKey ?? id<MessageKey>("shouldMatchPattern"), pattern] as const;
1077
1137
 
1078
1138
  errors.push({
1079
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
1080
- "errorMessageStr": advancedMsgStr(...msgArgs),
1081
- "fieldIndex": undefined,
1082
- "source": {
1083
- "type": "validator",
1084
- "name": validatorName
1139
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
1140
+ errorMessageStr: advancedMsgStr(...msgArgs),
1141
+ fieldIndex: undefined,
1142
+ source: {
1143
+ type: "validator",
1144
+ name: validatorName
1085
1145
  }
1086
1146
  });
1087
1147
  }
@@ -1115,12 +1175,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1115
1175
  const msgArgs = [id<MessageKey>("invalidEmailMessage")] as const;
1116
1176
 
1117
1177
  errors.push({
1118
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1119
- "errorMessageStr": msgStr(...msgArgs),
1120
- "fieldIndex": undefined,
1121
- "source": {
1122
- "type": "validator",
1123
- "name": validatorName
1178
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1179
+ errorMessageStr: msgStr(...msgArgs),
1180
+ fieldIndex: undefined,
1181
+ source: {
1182
+ type: "validator",
1183
+ name: validatorName
1124
1184
  }
1125
1185
  });
1126
1186
  }
@@ -1143,43 +1203,43 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1143
1203
  const intValue = parseInt(value);
1144
1204
 
1145
1205
  const source: FormFieldError.Source = {
1146
- "type": "validator",
1147
- "name": validatorName
1206
+ type: "validator",
1207
+ name: validatorName
1148
1208
  };
1149
1209
 
1150
1210
  if (isNaN(intValue)) {
1151
1211
  const msgArgs = ["mustBeAnInteger"] as const;
1152
1212
 
1153
1213
  errors.push({
1154
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1155
- "errorMessageStr": msgStr(...msgArgs),
1156
- "fieldIndex": undefined,
1214
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1215
+ errorMessageStr: msgStr(...msgArgs),
1216
+ fieldIndex: undefined,
1157
1217
  source
1158
1218
  });
1159
1219
 
1160
1220
  break validator_x;
1161
1221
  }
1162
1222
 
1163
- if (max !== undefined && intValue > parseInt(`${max}`)) {
1223
+ if (max && intValue > parseInt(`${max}`)) {
1164
1224
  const msgArgs = ["error-number-out-of-range-too-big", `${max}`] as const;
1165
1225
 
1166
1226
  errors.push({
1167
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1168
- "errorMessageStr": msgStr(...msgArgs),
1169
- "fieldIndex": undefined,
1227
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1228
+ errorMessageStr: msgStr(...msgArgs),
1229
+ fieldIndex: undefined,
1170
1230
  source
1171
1231
  });
1172
1232
 
1173
1233
  break validator_x;
1174
1234
  }
1175
1235
 
1176
- if (min !== undefined && intValue < parseInt(`${min}`)) {
1236
+ if (min && intValue < parseInt(`${min}`)) {
1177
1237
  const msgArgs = ["error-number-out-of-range-too-small", `${min}`] as const;
1178
1238
 
1179
1239
  errors.push({
1180
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1181
- "errorMessageStr": msgStr(...msgArgs),
1182
- "fieldIndex": undefined,
1240
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1241
+ errorMessageStr: msgStr(...msgArgs),
1242
+ fieldIndex: undefined,
1183
1243
  source
1184
1244
  });
1185
1245
 
@@ -1207,12 +1267,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1207
1267
  const msgArgs = [id<MessageKey>("notAValidOption")] as const;
1208
1268
 
1209
1269
  errors.push({
1210
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
1211
- "errorMessageStr": advancedMsgStr(...msgArgs),
1212
- "fieldIndex": undefined,
1213
- "source": {
1214
- "type": "validator",
1215
- "name": validatorName
1270
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
1271
+ errorMessageStr: advancedMsgStr(...msgArgs),
1272
+ fieldIndex: undefined,
1273
+ source: {
1274
+ type: "validator",
1275
+ name: validatorName
1216
1276
  }
1217
1277
  });
1218
1278
  }
@@ -1225,3 +1285,79 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1225
1285
 
1226
1286
  return { getErrors };
1227
1287
  }
1288
+
1289
+ function getIsMultivaluedSingleField(params: { attribute: Attribute }) {
1290
+ const { attribute } = params;
1291
+
1292
+ return attribute.annotations.inputType?.startsWith("multiselect") ?? false;
1293
+ }
1294
+
1295
+ export function getButtonToDisplayForMultivaluedAttributeField(params: { attribute: Attribute; values: string[]; fieldIndex: number }) {
1296
+ const { attribute, values, fieldIndex } = params;
1297
+
1298
+ const hasRemove = (() => {
1299
+ if (values.length === 1) {
1300
+ return false;
1301
+ }
1302
+
1303
+ const minCount = (() => {
1304
+ const { multivalued } = attribute.validators;
1305
+
1306
+ if (multivalued === undefined) {
1307
+ return undefined;
1308
+ }
1309
+
1310
+ const minStr = multivalued.min;
1311
+
1312
+ if (minStr === undefined) {
1313
+ return undefined;
1314
+ }
1315
+
1316
+ return parseInt(`${minStr}`);
1317
+ })();
1318
+
1319
+ if (minCount === undefined) {
1320
+ return true;
1321
+ }
1322
+
1323
+ if (values.length === minCount) {
1324
+ return false;
1325
+ }
1326
+
1327
+ return true;
1328
+ })();
1329
+
1330
+ const hasAdd = (() => {
1331
+ if (fieldIndex + 1 !== values.length) {
1332
+ return false;
1333
+ }
1334
+
1335
+ const maxCount = (() => {
1336
+ const { multivalued } = attribute.validators;
1337
+
1338
+ if (multivalued === undefined) {
1339
+ return undefined;
1340
+ }
1341
+
1342
+ const maxStr = multivalued.max;
1343
+
1344
+ if (maxStr === undefined) {
1345
+ return undefined;
1346
+ }
1347
+
1348
+ return parseInt(`${maxStr}`);
1349
+ })();
1350
+
1351
+ if (maxCount === undefined) {
1352
+ return false;
1353
+ }
1354
+
1355
+ if (values.length === maxCount) {
1356
+ return false;
1357
+ }
1358
+
1359
+ return true;
1360
+ })();
1361
+
1362
+ return { hasRemove, hasAdd };
1363
+ }