keycloakify 10.0.0-rc.8 → 10.0.0-rc.80

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 (824) 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 +2 -3
  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 +12 -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 -35
  107. package/account/i18n/i18n.js +116 -97
  108. package/account/i18n/i18n.js.map +1 -1
  109. package/account/i18n/index.d.ts +5 -1
  110. package/account/i18n/index.js +2 -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 +7 -8
  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 +5 -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/36.index.js +9980 -0
  148. package/bin/430.index.js +1349 -0
  149. package/bin/440.index.js +1455 -0
  150. package/bin/453.index.js +769 -0
  151. package/bin/456.index.js +6200 -0
  152. package/bin/490.index.js +75195 -0
  153. package/bin/525.index.js +41826 -0
  154. package/bin/526.index.js +973 -0
  155. package/bin/538.index.js +108 -0
  156. package/bin/720.index.js +243 -0
  157. package/bin/751.index.js +732 -0
  158. package/bin/837.index.js +794 -0
  159. package/bin/877.index.js +275 -0
  160. package/bin/932.index.js +269 -0
  161. package/bin/97.index.js +676 -0
  162. package/bin/main.js +7679 -146380
  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 +67 -0
  166. package/bin/shared/buildContext.js.map +1 -0
  167. package/bin/shared/constants.d.ts +17 -0
  168. package/bin/shared/constants.js +58 -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 +10 -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 +23 -23
  202. package/login/Template.js.map +1 -1
  203. package/login/TemplateProps.d.ts +3 -5
  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 +10 -1
  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 +11 -2
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -2
  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 +11 -2
  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 +11 -2
  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 +10 -2
  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 +10 -1
  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 +10 -1
  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 +11 -2
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +10 -1
  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 +11 -2
  292. package/login/i18n/baseMessages/zh-CN.js.map +1 -1
  293. package/login/i18n/i18n.d.ts +38 -37
  294. package/login/i18n/i18n.js +132 -99
  295. package/login/i18n/i18n.js.map +1 -1
  296. package/login/i18n/index.d.ts +5 -1
  297. package/login/i18n/index.js +2 -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 -7
  303. package/login/index.js +1 -5
  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/useDownloadTerms.d.ts +15 -5
  309. package/login/lib/useDownloadTerms.js +37 -21
  310. package/login/lib/useDownloadTerms.js.map +1 -1
  311. package/login/lib/useUserProfileForm.d.ts +20 -8
  312. package/login/lib/useUserProfileForm.js +402 -295
  313. package/login/lib/useUserProfileForm.js.map +1 -1
  314. package/login/pages/Code.d.ts +1 -1
  315. package/login/pages/Code.js +3 -3
  316. package/login/pages/Code.js.map +1 -1
  317. package/login/pages/DeleteAccountConfirm.d.ts +1 -1
  318. package/login/pages/DeleteAccountConfirm.js +7 -4
  319. package/login/pages/DeleteAccountConfirm.js.map +1 -1
  320. package/login/pages/DeleteCredential.d.ts +1 -1
  321. package/login/pages/DeleteCredential.js +3 -4
  322. package/login/pages/DeleteCredential.js.map +1 -1
  323. package/login/pages/Error.d.ts +1 -1
  324. package/login/pages/Error.js +1 -1
  325. package/login/pages/Error.js.map +1 -1
  326. package/login/pages/FrontchannelLogout.d.ts +1 -1
  327. package/login/pages/FrontchannelLogout.js +1 -1
  328. package/login/pages/FrontchannelLogout.js.map +1 -1
  329. package/login/pages/IdpReviewUserProfile.d.ts +4 -3
  330. package/login/pages/IdpReviewUserProfile.js +4 -5
  331. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  332. package/login/pages/Info.d.ts +1 -1
  333. package/login/pages/Info.js +5 -7
  334. package/login/pages/Info.js.map +1 -1
  335. package/login/pages/Login.d.ts +1 -1
  336. package/login/pages/Login.js +7 -7
  337. package/login/pages/Login.js.map +1 -1
  338. package/login/pages/LoginConfigTotp.d.ts +1 -1
  339. package/login/pages/LoginConfigTotp.js +6 -7
  340. package/login/pages/LoginConfigTotp.js.map +1 -1
  341. package/login/pages/LoginIdpLinkConfirm.d.ts +1 -1
  342. package/login/pages/LoginIdpLinkConfirm.js +3 -4
  343. package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
  344. package/login/pages/LoginIdpLinkEmail.d.ts +2 -2
  345. package/login/pages/LoginIdpLinkEmail.js +1 -1
  346. package/login/pages/LoginIdpLinkEmail.js.map +1 -1
  347. package/login/pages/LoginOauth2DeviceVerifyUserCode.d.ts +3 -3
  348. package/login/pages/LoginOauth2DeviceVerifyUserCode.js +3 -4
  349. package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -1
  350. package/login/pages/LoginOauthGrant.d.ts +3 -3
  351. package/login/pages/LoginOauthGrant.js +4 -5
  352. package/login/pages/LoginOauthGrant.js.map +1 -1
  353. package/login/pages/LoginOtp.d.ts +1 -1
  354. package/login/pages/LoginOtp.js +3 -4
  355. package/login/pages/LoginOtp.js.map +1 -1
  356. package/login/pages/LoginPageExpired.d.ts +1 -1
  357. package/login/pages/LoginPageExpired.js +1 -1
  358. package/login/pages/LoginPageExpired.js.map +1 -1
  359. package/login/pages/LoginPassword.d.ts +1 -1
  360. package/login/pages/LoginPassword.js +6 -6
  361. package/login/pages/LoginPassword.js.map +1 -1
  362. package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +1 -1
  363. package/login/pages/LoginRecoveryAuthnCodeConfig.js +16 -16
  364. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  365. package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +1 -1
  366. package/login/pages/LoginRecoveryAuthnCodeInput.js +3 -4
  367. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  368. package/login/pages/LoginResetOtp.d.ts +1 -1
  369. package/login/pages/LoginResetOtp.js +3 -4
  370. package/login/pages/LoginResetOtp.js.map +1 -1
  371. package/login/pages/LoginResetPassword.d.ts +1 -1
  372. package/login/pages/LoginResetPassword.js +4 -5
  373. package/login/pages/LoginResetPassword.js.map +1 -1
  374. package/login/pages/LoginUpdatePassword.d.ts +1 -1
  375. package/login/pages/LoginUpdatePassword.js +7 -8
  376. package/login/pages/LoginUpdatePassword.js.map +1 -1
  377. package/login/pages/LoginUpdateProfile.d.ts +4 -3
  378. package/login/pages/LoginUpdateProfile.js +5 -9
  379. package/login/pages/LoginUpdateProfile.js.map +1 -1
  380. package/login/pages/LoginUsername.d.ts +1 -1
  381. package/login/pages/LoginUsername.js +5 -5
  382. package/login/pages/LoginUsername.js.map +1 -1
  383. package/login/pages/LoginVerifyEmail.d.ts +1 -1
  384. package/login/pages/LoginVerifyEmail.js +1 -1
  385. package/login/pages/LoginVerifyEmail.js.map +1 -1
  386. package/login/pages/LoginX509Info.d.ts +1 -1
  387. package/login/pages/LoginX509Info.js +3 -4
  388. package/login/pages/LoginX509Info.js.map +1 -1
  389. package/login/pages/LogoutConfirm.d.ts +1 -1
  390. package/login/pages/LogoutConfirm.js +3 -4
  391. package/login/pages/LogoutConfirm.js.map +1 -1
  392. package/login/pages/PageProps.d.ts +3 -5
  393. package/login/pages/Register.d.ts +4 -3
  394. package/login/pages/Register.js +12 -17
  395. package/login/pages/Register.js.map +1 -1
  396. package/login/pages/SamlPostForm.d.ts +1 -1
  397. package/login/pages/SamlPostForm.js +1 -1
  398. package/login/pages/SamlPostForm.js.map +1 -1
  399. package/login/pages/SelectAuthenticator.d.ts +2 -2
  400. package/login/pages/SelectAuthenticator.js +3 -7
  401. package/login/pages/SelectAuthenticator.js.map +1 -1
  402. package/login/pages/Terms.d.ts +2 -2
  403. package/login/pages/Terms.js +8 -7
  404. package/login/pages/Terms.js.map +1 -1
  405. package/login/pages/UpdateEmail.d.ts +3 -2
  406. package/login/pages/UpdateEmail.js +6 -10
  407. package/login/pages/UpdateEmail.js.map +1 -1
  408. package/login/pages/WebauthnAuthenticate.d.ts +1 -1
  409. package/login/pages/WebauthnAuthenticate.js +25 -22
  410. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  411. package/login/pages/WebauthnError.d.ts +1 -1
  412. package/login/pages/WebauthnError.js +4 -5
  413. package/login/pages/WebauthnError.js.map +1 -1
  414. package/login/pages/WebauthnRegister.d.ts +1 -1
  415. package/login/pages/WebauthnRegister.js +15 -16
  416. package/login/pages/WebauthnRegister.js.map +1 -1
  417. package/package.json +433 -319
  418. package/src/PUBLIC_URL.ts +3 -3
  419. package/src/account/{Fallback.tsx → DefaultPage.tsx} +5 -5
  420. package/src/account/{kcContext → KcContext}/KcContext.ts +24 -2
  421. package/src/account/KcContext/getKcContextMock.ts +69 -0
  422. package/src/account/KcContext/index.ts +2 -0
  423. package/src/account/KcContext/kcContextMocks.ts +190 -0
  424. package/src/account/Template.tsx +14 -16
  425. package/src/account/TemplateProps.ts +4 -5
  426. package/src/account/i18n/baseMessages/ar.ts +3 -1
  427. package/src/account/i18n/baseMessages/ca.ts +3 -1
  428. package/src/account/i18n/baseMessages/cs.ts +3 -1
  429. package/src/account/i18n/baseMessages/da.ts +3 -1
  430. package/src/account/i18n/baseMessages/de.ts +3 -1
  431. package/src/account/i18n/baseMessages/el.ts +3 -1
  432. package/src/account/i18n/baseMessages/en.ts +3 -1
  433. package/src/account/i18n/baseMessages/es.ts +3 -1
  434. package/src/account/i18n/baseMessages/fa.ts +3 -1
  435. package/src/account/i18n/baseMessages/fi.ts +3 -1
  436. package/src/account/i18n/baseMessages/fr.ts +3 -1
  437. package/src/account/i18n/baseMessages/hu.ts +3 -1
  438. package/src/account/i18n/baseMessages/it.ts +3 -1
  439. package/src/account/i18n/baseMessages/ja.ts +3 -1
  440. package/src/account/i18n/baseMessages/lt.ts +3 -1
  441. package/src/account/i18n/baseMessages/lv.ts +3 -1
  442. package/src/account/i18n/baseMessages/nl.ts +3 -1
  443. package/src/account/i18n/baseMessages/no.ts +3 -1
  444. package/src/account/i18n/baseMessages/pl.ts +3 -1
  445. package/src/account/i18n/baseMessages/pt-BR.ts +3 -1
  446. package/src/account/i18n/baseMessages/ru.ts +3 -1
  447. package/src/account/i18n/baseMessages/sk.ts +3 -1
  448. package/src/account/i18n/baseMessages/sv.ts +3 -1
  449. package/src/account/i18n/baseMessages/th.ts +3 -1
  450. package/src/account/i18n/baseMessages/tr.ts +3 -1
  451. package/src/account/i18n/baseMessages/uk.ts +3 -1
  452. package/src/account/i18n/baseMessages/zh-CN.ts +3 -1
  453. package/src/account/i18n/i18n.tsx +201 -142
  454. package/src/account/i18n/index.ts +5 -1
  455. package/src/account/i18n/useI18n.ts +44 -0
  456. package/src/account/index.ts +3 -10
  457. package/src/account/lib/kcClsx.ts +25 -0
  458. package/src/account/pages/Account.tsx +12 -18
  459. package/src/account/pages/Applications.tsx +8 -9
  460. package/src/account/pages/FederatedIdentity.tsx +3 -3
  461. package/src/account/pages/Log.tsx +5 -5
  462. package/src/account/pages/PageProps.ts +4 -6
  463. package/src/account/pages/Password.tsx +17 -19
  464. package/src/account/pages/Sessions.tsx +5 -6
  465. package/src/account/pages/Totp.tsx +18 -38
  466. package/src/bin/add-story.ts +104 -0
  467. package/src/bin/copy-keycloak-resources-to-public.ts +3 -6
  468. package/src/bin/eject-page.ts +256 -0
  469. package/src/bin/initialize-email-theme.ts +30 -26
  470. package/src/bin/keycloakify/buildJars/buildJar.ts +138 -77
  471. package/src/bin/keycloakify/buildJars/buildJars.ts +35 -31
  472. package/src/bin/keycloakify/buildJars/extensionVersions.ts +3 -2
  473. package/src/bin/keycloakify/buildJars/generatePom.ts +19 -11
  474. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +42 -10
  475. package/src/bin/keycloakify/generateFtl/generateFtl.ts +64 -42
  476. package/src/bin/keycloakify/generateFtl/{ftl_object_to_js_code_declaring_an_object.ftl → kcContextDeclarationTemplate.ftl} +232 -193
  477. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +89 -0
  478. package/src/bin/keycloakify/{generateSrcMainResources → generateResources}/generateMessageProperties.ts +47 -53
  479. package/src/bin/keycloakify/generateResources/generateResources.ts +42 -0
  480. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +299 -0
  481. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +70 -0
  482. package/src/bin/keycloakify/generateResources/index.ts +1 -0
  483. package/src/bin/keycloakify/{generateSrcMainResources → generateResources}/readExtraPageNames.ts +21 -7
  484. package/src/bin/keycloakify/{generateSrcMainResources → generateResources}/readFieldNameUsage.ts +34 -7
  485. package/src/bin/keycloakify/keycloakify.ts +50 -16
  486. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +42 -46
  487. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +14 -11
  488. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +31 -16
  489. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +53 -18
  490. package/src/bin/main.ts +96 -44
  491. package/src/bin/shared/KeycloakVersionRange.ts +4 -2
  492. package/src/bin/shared/buildContext.ts +768 -0
  493. package/src/bin/shared/constants.ts +8 -4
  494. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +35 -21
  495. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +276 -0
  496. package/src/bin/shared/downloadKeycloakStaticResources.ts +30 -26
  497. package/src/bin/shared/generateKcGenTs.ts +68 -0
  498. package/src/bin/shared/metaInfKeycloakThemes.ts +25 -19
  499. package/src/bin/shared/promptKeycloakVersion.ts +39 -15
  500. package/src/bin/start-keycloak/appBuild.ts +129 -0
  501. package/src/bin/start-keycloak/index.ts +1 -0
  502. package/src/bin/start-keycloak/keycloakifyBuild.ts +42 -0
  503. package/src/bin/start-keycloak/myrealm-realm-18.json +2155 -0
  504. package/src/bin/start-keycloak/myrealm-realm-19.json +2186 -0
  505. package/src/bin/start-keycloak/myrealm-realm-20.json +2197 -0
  506. package/src/bin/start-keycloak/myrealm-realm-21.json +2201 -0
  507. package/src/bin/start-keycloak/myrealm-realm-23.json +2150 -0
  508. package/src/bin/start-keycloak/myrealm-realm-24.json +2318 -0
  509. package/src/bin/start-keycloak/myrealm-realm-25.json +2400 -0
  510. package/src/bin/start-keycloak/start-keycloak.ts +451 -0
  511. package/src/bin/tools/SemVer.ts +32 -13
  512. package/src/bin/tools/String.prototype.replaceAll.ts +9 -2
  513. package/src/bin/tools/crawl.ts +4 -1
  514. package/src/bin/tools/crc32.ts +42 -24
  515. package/src/bin/tools/downloadAndExtractArchive/downloadAndExtractArchive.ts +262 -0
  516. package/src/bin/tools/{fetchProxyOptions.ts → downloadAndExtractArchive/fetchProxyOptions.ts} +39 -8
  517. package/src/bin/tools/downloadAndExtractArchive/index.ts +1 -0
  518. package/src/bin/tools/escapeStringForPropertiesFile.ts +64 -0
  519. package/src/bin/tools/extractArchive.ts +140 -0
  520. package/src/bin/tools/getAbsoluteAndInOsFormatPath.ts +10 -2
  521. package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +52 -6
  522. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +8 -2
  523. package/src/bin/tools/octokit-addons/listTags.ts +15 -4
  524. package/src/bin/tools/partitionPromiseSettledResults.ts +12 -3
  525. package/src/bin/tools/readThisNpmPackageVersion.ts +5 -1
  526. package/src/bin/tools/transformCodebase.ts +29 -10
  527. package/src/bin/tools/trimIndent.ts +4 -1
  528. package/src/bin/tsconfig.json +4 -3
  529. package/src/bin/update-kc-gen.ts +13 -0
  530. package/src/lib/getKcClsx.ts +89 -0
  531. package/src/login/{Fallback.tsx → DefaultPage.tsx} +7 -6
  532. package/src/login/{kcContext → KcContext}/KcContext.ts +58 -30
  533. package/src/login/KcContext/getKcContextMock.ts +69 -0
  534. package/src/login/KcContext/index.ts +8 -0
  535. package/src/login/KcContext/kcContextMocks.ts +583 -0
  536. package/src/login/Template.tsx +54 -57
  537. package/src/login/TemplateProps.ts +3 -6
  538. package/src/login/UserProfileFormFields.tsx +125 -210
  539. package/src/login/UserProfileFormFieldsProps.tsx +22 -0
  540. package/src/login/i18n/baseMessages/ar.ts +10 -1
  541. package/src/login/i18n/baseMessages/ca.ts +11 -2
  542. package/src/login/i18n/baseMessages/cs.ts +10 -1
  543. package/src/login/i18n/baseMessages/da.ts +10 -1
  544. package/src/login/i18n/baseMessages/de.ts +10 -1
  545. package/src/login/i18n/baseMessages/el.ts +10 -2
  546. package/src/login/i18n/baseMessages/en.ts +11 -2
  547. package/src/login/i18n/baseMessages/es.ts +11 -2
  548. package/src/login/i18n/baseMessages/fa.ts +10 -2
  549. package/src/login/i18n/baseMessages/fi.ts +10 -1
  550. package/src/login/i18n/baseMessages/fr.ts +10 -1
  551. package/src/login/i18n/baseMessages/hu.ts +11 -2
  552. package/src/login/i18n/baseMessages/it.ts +10 -1
  553. package/src/login/i18n/baseMessages/ja.ts +10 -1
  554. package/src/login/i18n/baseMessages/lt.ts +10 -1
  555. package/src/login/i18n/baseMessages/lv.ts +10 -1
  556. package/src/login/i18n/baseMessages/nl.ts +10 -1
  557. package/src/login/i18n/baseMessages/no.ts +10 -1
  558. package/src/login/i18n/baseMessages/pl.ts +10 -1
  559. package/src/login/i18n/baseMessages/pt-BR.ts +10 -1
  560. package/src/login/i18n/baseMessages/ru.ts +10 -1
  561. package/src/login/i18n/baseMessages/sk.ts +10 -1
  562. package/src/login/i18n/baseMessages/sv.ts +10 -1
  563. package/src/login/i18n/baseMessages/th.ts +10 -1
  564. package/src/login/i18n/baseMessages/tr.ts +10 -1
  565. package/src/login/i18n/baseMessages/uk.ts +10 -1
  566. package/src/login/i18n/baseMessages/zh-CN.ts +11 -2
  567. package/src/login/i18n/i18n.tsx +231 -143
  568. package/src/login/i18n/index.ts +5 -1
  569. package/src/login/i18n/useI18n.ts +44 -0
  570. package/src/login/index.ts +3 -10
  571. package/src/login/lib/kcClsx.ts +143 -0
  572. package/src/login/lib/useDownloadTerms.tsx +88 -0
  573. package/src/login/lib/useUserProfileForm.tsx +480 -351
  574. package/src/login/pages/Code.tsx +8 -5
  575. package/src/login/pages/DeleteAccountConfirm.tsx +15 -10
  576. package/src/login/pages/DeleteCredential.tsx +9 -7
  577. package/src/login/pages/Error.tsx +9 -2
  578. package/src/login/pages/FrontchannelLogout.tsx +6 -3
  579. package/src/login/pages/IdpReviewUserProfile.tsx +20 -21
  580. package/src/login/pages/Info.tsx +5 -8
  581. package/src/login/pages/Login.tsx +34 -53
  582. package/src/login/pages/LoginConfigTotp.tsx +35 -39
  583. package/src/login/pages/LoginIdpLinkConfirm.tsx +7 -18
  584. package/src/login/pages/LoginIdpLinkEmail.tsx +9 -3
  585. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.tsx +24 -23
  586. package/src/login/pages/LoginOauthGrant.tsx +14 -20
  587. package/src/login/pages/LoginOtp.tsx +27 -30
  588. package/src/login/pages/LoginPageExpired.tsx +2 -2
  589. package/src/login/pages/LoginPassword.tsx +21 -31
  590. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +34 -34
  591. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +19 -22
  592. package/src/login/pages/LoginResetOtp.tsx +19 -22
  593. package/src/login/pages/LoginResetPassword.tsx +21 -24
  594. package/src/login/pages/LoginUpdatePassword.tsx +40 -50
  595. package/src/login/pages/LoginUpdateProfile.tsx +32 -30
  596. package/src/login/pages/LoginUsername.tsx +23 -34
  597. package/src/login/pages/LoginVerifyEmail.tsx +5 -2
  598. package/src/login/pages/LoginX509Info.tsx +24 -33
  599. package/src/login/pages/LogoutConfirm.tsx +8 -14
  600. package/src/login/pages/PageProps.ts +3 -5
  601. package/src/login/pages/Register.tsx +48 -59
  602. package/src/login/pages/SamlPostForm.tsx +2 -2
  603. package/src/login/pages/SelectAuthenticator.tsx +23 -24
  604. package/src/login/pages/Terms.tsx +25 -24
  605. package/src/login/pages/UpdateEmail.tsx +30 -33
  606. package/src/login/pages/WebauthnAuthenticate.tsx +40 -44
  607. package/src/login/pages/WebauthnError.tsx +15 -19
  608. package/src/login/pages/WebauthnRegister.tsx +28 -37
  609. package/src/tools/Array.prototype.every.ts +4 -1
  610. package/src/tools/ExtractAfterStartingWith.ts +4 -0
  611. package/src/tools/LazyOrNot.ts +3 -1
  612. package/src/tools/Object.fromEntries.ts +23 -0
  613. package/src/tools/StatefulObservable/README.md +16 -0
  614. package/src/tools/StatefulObservable/StatefulObservable.ts +58 -0
  615. package/src/tools/StatefulObservable/hooks/index.ts +2 -0
  616. package/src/tools/StatefulObservable/hooks/useObservable.ts +25 -0
  617. package/src/tools/StatefulObservable/hooks/useRerenderOnChange.ts +19 -0
  618. package/src/tools/StatefulObservable/index.ts +2 -0
  619. package/src/tools/ValueOf.ts +2 -0
  620. package/src/tools/clsx.ts +6 -42
  621. package/src/tools/clsx_withTransform.ts +55 -0
  622. package/src/tools/deepAssign.ts +57 -19
  623. package/src/tools/formatNumber.ts +7 -3
  624. package/src/tools/react-markdown.ts +3 -0
  625. package/src/tools/structuredCloneButFunctions.ts +24 -0
  626. package/src/tools/useConstCallback.ts +3 -1
  627. package/src/tools/useInsertLinkTags.ts +78 -74
  628. package/src/tools/useInsertScriptTags.ts +69 -73
  629. package/src/tools/useOnFirstMount.ts +18 -0
  630. package/src/tools/useSetClassName.ts +4 -1
  631. package/src/vite-plugin/vite-plugin.ts +73 -37
  632. package/stories/account/pages/Account.stories.tsx +18 -0
  633. package/stories/account/pages/FederatedIdentity.stories.tsx +38 -0
  634. package/stories/account/pages/Log.stories.tsx +356 -0
  635. package/stories/account/pages/Password.stories.tsx +28 -0
  636. package/stories/account/pages/Sessions.stories.tsx +59 -0
  637. package/stories/account/pages/Totp.stories.tsx +182 -0
  638. package/stories/login/pages/Code.stories.tsx +18 -0
  639. package/stories/login/pages/DeleteAccountConfirm.stories.tsx +18 -0
  640. package/stories/login/pages/DeleteCredential.stories.tsx +18 -0
  641. package/stories/login/pages/Error.stories.tsx +28 -0
  642. package/stories/login/pages/FrontchannelLogout.stories.tsx +18 -0
  643. package/stories/login/pages/IdpReviewUserProfile.stories.tsx +18 -0
  644. package/stories/login/pages/Info.stories.tsx +52 -0
  645. package/stories/login/pages/Login.stories.tsx +221 -0
  646. package/stories/login/pages/LoginConfigTotp.stories.tsx +43 -0
  647. package/stories/login/pages/LoginDeviceVerifyUserCode.stories.tsx +18 -0
  648. package/stories/login/pages/LoginIdpLinkConfirm.stories.tsx +18 -0
  649. package/stories/login/pages/LoginIdpLinkEmail.stories.tsx +18 -0
  650. package/stories/login/pages/LoginOauth2DeviceVerifyUserCode.stories.tsx +18 -0
  651. package/stories/login/pages/LoginOauthGrant.stories.tsx +18 -0
  652. package/stories/login/pages/LoginOtp.stories.tsx +18 -0
  653. package/stories/login/pages/LoginPageExpired.stories.tsx +18 -0
  654. package/stories/login/pages/LoginPassword.stories.tsx +18 -0
  655. package/stories/login/pages/LoginRecoveryAuthnCodeConfig.stories.tsx +18 -0
  656. package/stories/login/pages/LoginRecoveryAuthnCodeInput.stories.tsx +18 -0
  657. package/stories/login/pages/LoginResetOtp.stories.tsx +18 -0
  658. package/stories/login/pages/LoginResetPassword.stories.tsx +31 -0
  659. package/stories/login/pages/LoginUpdatePassword.stories.tsx +18 -0
  660. package/stories/login/pages/LoginUpdateProfile.stories.tsx +18 -0
  661. package/stories/login/pages/LoginUsername.stories.tsx +31 -0
  662. package/stories/login/pages/LoginVerifyEmail.stories.tsx +30 -0
  663. package/stories/login/pages/LoginX509Info.stories.tsx +18 -0
  664. package/stories/login/pages/LogoutConfirm.stories.tsx +18 -0
  665. package/stories/login/pages/Register.stories.tsx +135 -0
  666. package/stories/login/pages/SamlPostForm.stories.tsx +18 -0
  667. package/stories/login/pages/SelectAuthenticator.stories.tsx +43 -0
  668. package/stories/login/pages/Terms.stories.tsx +42 -0
  669. package/stories/login/pages/UpdateEmail.stories.tsx +18 -0
  670. package/stories/login/pages/WebauthnAuthenticate.stories.tsx +18 -0
  671. package/stories/login/pages/WebauthnError.stories.tsx +18 -0
  672. package/stories/login/pages/WebauthnRegister.stories.tsx +18 -0
  673. package/tools/Array.prototype.every.js +2 -1
  674. package/tools/Array.prototype.every.js.map +1 -1
  675. package/tools/ExtractAfterStartingWith.d.ts +1 -0
  676. package/tools/ExtractAfterStartingWith.js +2 -0
  677. package/tools/ExtractAfterStartingWith.js.map +1 -0
  678. package/tools/HTMLElement.prototype.prepend.js.map +1 -1
  679. package/tools/Object.fromEntries.d.ts +1 -0
  680. package/tools/Object.fromEntries.js +17 -0
  681. package/tools/Object.fromEntries.js.map +1 -0
  682. package/tools/StatefulObservable/StatefulObservable.d.ts +8 -0
  683. package/tools/StatefulObservable/StatefulObservable.js +36 -0
  684. package/tools/StatefulObservable/StatefulObservable.js.map +1 -0
  685. package/tools/StatefulObservable/hooks/index.d.ts +2 -0
  686. package/tools/StatefulObservable/hooks/index.js +3 -0
  687. package/tools/StatefulObservable/hooks/index.js.map +1 -0
  688. package/tools/StatefulObservable/hooks/useObservable.d.ts +8 -0
  689. package/tools/StatefulObservable/hooks/useObservable.js +17 -0
  690. package/tools/StatefulObservable/hooks/useObservable.js.map +1 -0
  691. package/tools/StatefulObservable/hooks/useRerenderOnChange.d.ts +5 -0
  692. package/tools/StatefulObservable/hooks/useRerenderOnChange.js +14 -0
  693. package/tools/StatefulObservable/hooks/useRerenderOnChange.js.map +1 -0
  694. package/tools/StatefulObservable/index.d.ts +2 -0
  695. package/tools/StatefulObservable/index.js +3 -0
  696. package/tools/StatefulObservable/index.js.map +1 -0
  697. package/tools/ValueOf.d.ts +2 -0
  698. package/tools/ValueOf.js +2 -0
  699. package/tools/ValueOf.js.map +1 -0
  700. package/tools/clsx.d.ts +3 -2
  701. package/tools/clsx.js +5 -41
  702. package/tools/clsx.js.map +1 -1
  703. package/tools/clsx_withTransform.d.ts +5 -0
  704. package/tools/clsx_withTransform.js +43 -0
  705. package/tools/clsx_withTransform.js.map +1 -0
  706. package/tools/deepAssign.d.ts +1 -0
  707. package/tools/deepAssign.js +41 -16
  708. package/tools/deepAssign.js.map +1 -1
  709. package/tools/formatNumber.js +2 -1
  710. package/tools/formatNumber.js.map +1 -1
  711. package/tools/react-markdown.d.ts +3 -0
  712. package/tools/react-markdown.js +4 -0
  713. package/tools/react-markdown.js.map +1 -0
  714. package/tools/structuredCloneButFunctions.d.ts +7 -0
  715. package/tools/structuredCloneButFunctions.js +19 -0
  716. package/tools/structuredCloneButFunctions.js.map +1 -0
  717. package/tools/useConstCallback.js.map +1 -1
  718. package/tools/useInsertLinkTags.d.ts +11 -6
  719. package/tools/useInsertLinkTags.js +53 -52
  720. package/tools/useInsertLinkTags.js.map +1 -1
  721. package/tools/useInsertScriptTags.d.ts +15 -6
  722. package/tools/useInsertScriptTags.js +56 -61
  723. package/tools/useInsertScriptTags.js.map +1 -1
  724. package/tools/useOnFirstMount.d.ts +2 -0
  725. package/tools/useOnFirstMount.js +15 -0
  726. package/tools/useOnFirstMount.js.map +1 -0
  727. package/tools/useSetClassName.js.map +1 -1
  728. package/vite-plugin/index.d.ts +1 -0
  729. package/vite-plugin/index.js +53394 -0
  730. package/vite-plugin/vite-plugin.d.ts +5 -0
  731. package/account/Fallback.d.ts +0 -5
  732. package/account/Fallback.js.map +0 -1
  733. package/account/kcContext/KcContext.js.map +0 -1
  734. package/account/kcContext/createGetKcContext.d.ts +0 -19
  735. package/account/kcContext/createGetKcContext.js +0 -73
  736. package/account/kcContext/createGetKcContext.js.map +0 -1
  737. package/account/kcContext/getKcContext.d.ts +0 -13
  738. package/account/kcContext/getKcContext.js +0 -13
  739. package/account/kcContext/getKcContext.js.map +0 -1
  740. package/account/kcContext/getKcContextFromWindow.d.ts +0 -8
  741. package/account/kcContext/getKcContextFromWindow.js +0 -5
  742. package/account/kcContext/getKcContextFromWindow.js.map +0 -1
  743. package/account/kcContext/index.d.ts +0 -1
  744. package/account/kcContext/index.js +0 -2
  745. package/account/kcContext/index.js.map +0 -1
  746. package/account/kcContext/kcContextMocks.js +0 -215
  747. package/account/kcContext/kcContextMocks.js.map +0 -1
  748. package/account/lib/useGetClassName.d.ts +0 -7
  749. package/account/lib/useGetClassName.js +0 -19
  750. package/account/lib/useGetClassName.js.map +0 -1
  751. package/lib/isStorybook.d.ts +0 -1
  752. package/lib/isStorybook.js +0 -2
  753. package/lib/isStorybook.js.map +0 -1
  754. package/lib/useGetClassName.d.ts +0 -10
  755. package/lib/useGetClassName.js +0 -14
  756. package/lib/useGetClassName.js.map +0 -1
  757. package/login/Fallback.js.map +0 -1
  758. package/login/kcContext/KcContext.js.map +0 -1
  759. package/login/kcContext/createGetKcContext.d.ts +0 -19
  760. package/login/kcContext/createGetKcContext.js +0 -109
  761. package/login/kcContext/createGetKcContext.js.map +0 -1
  762. package/login/kcContext/getKcContext.d.ts +0 -13
  763. package/login/kcContext/getKcContext.js +0 -13
  764. package/login/kcContext/getKcContext.js.map +0 -1
  765. package/login/kcContext/getKcContextFromWindow.d.ts +0 -8
  766. package/login/kcContext/getKcContextFromWindow.js +0 -5
  767. package/login/kcContext/getKcContextFromWindow.js.map +0 -1
  768. package/login/kcContext/index.d.ts +0 -1
  769. package/login/kcContext/index.js +0 -2
  770. package/login/kcContext/index.js.map +0 -1
  771. package/login/kcContext/kcContextMocks.js +0 -390
  772. package/login/kcContext/kcContextMocks.js.map +0 -1
  773. package/login/lib/useGetClassName.d.ts +0 -7
  774. package/login/lib/useGetClassName.js +0 -130
  775. package/login/lib/useGetClassName.js.map +0 -1
  776. package/src/account/kcContext/createGetKcContext.ts +0 -108
  777. package/src/account/kcContext/getKcContext.ts +0 -21
  778. package/src/account/kcContext/getKcContextFromWindow.ts +0 -11
  779. package/src/account/kcContext/index.ts +0 -1
  780. package/src/account/kcContext/kcContextMocks.ts +0 -260
  781. package/src/account/lib/useGetClassName.ts +0 -20
  782. package/src/bin/download-builtin-keycloak-theme.ts +0 -30
  783. package/src/bin/eject-keycloak-page.ts +0 -126
  784. package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +0 -79
  785. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +0 -32
  786. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +0 -261
  787. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +0 -56
  788. package/src/bin/keycloakify/generateSrcMainResources/index.ts +0 -1
  789. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +0 -60
  790. package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +0 -24
  791. package/src/bin/shared/buildOptions.ts +0 -277
  792. package/src/bin/shared/downloadAndUnzip.ts +0 -203
  793. package/src/bin/shared/downloadBuiltinKeycloakTheme.ts +0 -264
  794. package/src/bin/shared/getJarFileBasename.ts +0 -9
  795. package/src/bin/shared/getThemeSrcDirPath.ts +0 -47
  796. package/src/bin/start-keycloak.ts +0 -236
  797. package/src/bin/tools/unzip.ts +0 -141
  798. package/src/lib/isStorybook.ts +0 -1
  799. package/src/lib/useGetClassName.ts +0 -18
  800. package/src/login/kcContext/createGetKcContext.ts +0 -159
  801. package/src/login/kcContext/getKcContext.ts +0 -21
  802. package/src/login/kcContext/getKcContextFromWindow.ts +0 -11
  803. package/src/login/kcContext/index.ts +0 -1
  804. package/src/login/kcContext/kcContextMocks.ts +0 -630
  805. package/src/login/lib/useDownloadTerms.ts +0 -57
  806. package/src/login/lib/useGetClassName.ts +0 -132
  807. package/src/tools/AndByDiscriminatingKey.ts +0 -25
  808. package/src/tools/Markdown.ts +0 -3
  809. package/src/tools/deepClone.ts +0 -17
  810. package/src/tools/memoize.ts +0 -55
  811. package/tools/AndByDiscriminatingKey.d.ts +0 -5
  812. package/tools/AndByDiscriminatingKey.js +0 -2
  813. package/tools/AndByDiscriminatingKey.js.map +0 -1
  814. package/tools/Markdown.d.ts +0 -2
  815. package/tools/Markdown.js +0 -3
  816. package/tools/Markdown.js.map +0 -1
  817. package/tools/deepClone.d.ts +0 -2
  818. package/tools/deepClone.js +0 -14
  819. package/tools/deepClone.js.map +0 -1
  820. package/tools/memoize.d.ts +0 -7
  821. package/tools/memoize.js +0 -38
  822. package/tools/memoize.js.map +0 -1
  823. /package/account/{kcContext → KcContext}/KcContext.js +0 -0
  824. /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,10 @@ 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: <span key={0}>{errorMessageStr}</span>,
616
+ fieldIndex: undefined,
617
+ source: {
618
+ type: "server"
579
619
  }
580
620
  }
581
621
  ];
@@ -586,7 +626,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
586
626
  break handle_multi_valued_multi_fields;
587
627
  }
588
628
 
589
- if (attribute.annotations.inputType?.startsWith("multiselect")) {
629
+ if (getIsMultivaluedSingleField({ attribute })) {
590
630
  break handle_multi_valued_multi_fields;
591
631
  }
592
632
 
@@ -598,19 +638,19 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
598
638
  .map((...[, index]) => {
599
639
  const specificValueErrors = getErrors({
600
640
  attributeName,
601
- "formFieldStates": formFieldStates.map(formFieldState => {
641
+ formFieldStates: formFieldStates.map(formFieldState => {
602
642
  if (formFieldState.attribute.name === attributeName) {
603
643
  assert(formFieldState.valueOrValues instanceof Array);
604
644
  return {
605
- "attribute": {
645
+ attribute: {
606
646
  ...attribute,
607
- "annotations": {
647
+ annotations: {
608
648
  ...attribute.annotations,
609
- "inputType": undefined
649
+ inputType: undefined
610
650
  },
611
- "multivalued": false
651
+ multivalued: false
612
652
  },
613
- "valueOrValues": formFieldState.valueOrValues[index]
653
+ valueOrValues: formFieldState.valueOrValues[index]
614
654
  };
615
655
  }
616
656
 
@@ -626,7 +666,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
626
666
 
627
667
  return true;
628
668
  })
629
- .map((error): FormFieldError => ({ ...error, "fieldIndex": index }));
669
+ .map(
670
+ (error): FormFieldError => ({
671
+ ...error,
672
+ fieldIndex: index
673
+ })
674
+ );
630
675
  })
631
676
  .reduce((acc, errors) => [...acc, ...errors], []);
632
677
 
@@ -642,12 +687,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
642
687
  const msgArgs = ["error-user-attribute-required"] as const;
643
688
 
644
689
  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"
690
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
691
+ errorMessageStr: msgStr(...msgArgs),
692
+ fieldIndex: undefined,
693
+ source: {
694
+ type: "other",
695
+ rule: "requiredField"
651
696
  }
652
697
  });
653
698
  }
@@ -660,7 +705,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
660
705
  break handle_multi_valued_single_field;
661
706
  }
662
707
 
663
- if (!attribute.annotations.inputType?.startsWith("multiselect")) {
708
+ if (!getIsMultivaluedSingleField({ attribute })) {
664
709
  break handle_multi_valued_single_field;
665
710
  }
666
711
 
@@ -674,13 +719,13 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
674
719
 
675
720
  const { min: minStr } = validator;
676
721
 
677
- const min = minStr !== undefined ? parseInt(`${minStr}`) : attribute.required ? 1 : 0;
722
+ const min = minStr ? parseInt(`${minStr}`) : attribute.required ? 1 : 0;
678
723
 
679
724
  assert(!isNaN(min));
680
725
 
681
726
  const { max: maxStr } = validator;
682
727
 
683
- const max = maxStr === undefined ? Infinity : parseInt(`${maxStr}`);
728
+ const max = !maxStr ? Infinity : parseInt(`${maxStr}`);
684
729
 
685
730
  assert(!isNaN(max));
686
731
 
@@ -696,12 +741,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
696
741
 
697
742
  return [
698
743
  {
699
- "errorMessage": <Fragment key={0}>{msg(...msgArgs)}</Fragment>,
700
- "errorMessageStr": msgStr(...msgArgs),
701
- "fieldIndex": undefined,
702
- "source": {
703
- "type": "validator",
704
- "name": validatorName
744
+ errorMessage: <Fragment key={0}>{msg(...msgArgs)}</Fragment>,
745
+ errorMessageStr: msgStr(...msgArgs),
746
+ fieldIndex: undefined,
747
+ source: {
748
+ type: "validator",
749
+ name: validatorName
705
750
  }
706
751
  }
707
752
  ];
@@ -727,7 +772,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
727
772
 
728
773
  const policy = passwordPolicies[policyName];
729
774
 
730
- if (policy === undefined) {
775
+ if (!policy) {
731
776
  break check_password_policy_x;
732
777
  }
733
778
 
@@ -740,12 +785,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
740
785
  const msgArgs = ["invalidPasswordMinLengthMessage", `${minLength}`] as const;
741
786
 
742
787
  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
788
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
789
+ errorMessageStr: msgStr(...msgArgs),
790
+ fieldIndex: undefined,
791
+ source: {
792
+ type: "passwordPolicy",
793
+ name: policyName
749
794
  }
750
795
  });
751
796
  }
@@ -755,7 +800,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
755
800
 
756
801
  const policy = passwordPolicies[policyName];
757
802
 
758
- if (policy === undefined) {
803
+ if (!policy) {
759
804
  break check_password_policy_x;
760
805
  }
761
806
 
@@ -768,12 +813,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
768
813
  const msgArgs = ["invalidPasswordMinDigitsMessage", `${minNumberOfDigits}`] as const;
769
814
 
770
815
  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
816
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
817
+ errorMessageStr: msgStr(...msgArgs),
818
+ fieldIndex: undefined,
819
+ source: {
820
+ type: "passwordPolicy",
821
+ name: policyName
777
822
  }
778
823
  });
779
824
  }
@@ -783,7 +828,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
783
828
 
784
829
  const policy = passwordPolicies[policyName];
785
830
 
786
- if (policy === undefined) {
831
+ if (!policy) {
787
832
  break check_password_policy_x;
788
833
  }
789
834
 
@@ -798,12 +843,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
798
843
  const msgArgs = ["invalidPasswordMinLowerCaseCharsMessage", `${minNumberOfLowerCaseChar}`] as const;
799
844
 
800
845
  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
846
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
847
+ errorMessageStr: msgStr(...msgArgs),
848
+ fieldIndex: undefined,
849
+ source: {
850
+ type: "passwordPolicy",
851
+ name: policyName
807
852
  }
808
853
  });
809
854
  }
@@ -813,7 +858,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
813
858
 
814
859
  const policy = passwordPolicies[policyName];
815
860
 
816
- if (policy === undefined) {
861
+ if (!policy) {
817
862
  break check_password_policy_x;
818
863
  }
819
864
 
@@ -828,12 +873,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
828
873
  const msgArgs = ["invalidPasswordMinUpperCaseCharsMessage", `${minNumberOfUpperCaseChar}`] as const;
829
874
 
830
875
  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
876
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
877
+ errorMessageStr: msgStr(...msgArgs),
878
+ fieldIndex: undefined,
879
+ source: {
880
+ type: "passwordPolicy",
881
+ name: policyName
837
882
  }
838
883
  });
839
884
  }
@@ -843,7 +888,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
843
888
 
844
889
  const policy = passwordPolicies[policyName];
845
890
 
846
- if (policy === undefined) {
891
+ if (!policy) {
847
892
  break check_password_policy_x;
848
893
  }
849
894
 
@@ -856,12 +901,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
856
901
  const msgArgs = ["invalidPasswordMinSpecialCharsMessage", `${minNumberOfSpecialChar}`] as const;
857
902
 
858
903
  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
904
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
905
+ errorMessageStr: msgStr(...msgArgs),
906
+ fieldIndex: undefined,
907
+ source: {
908
+ type: "passwordPolicy",
909
+ name: policyName
865
910
  }
866
911
  });
867
912
  }
@@ -877,7 +922,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
877
922
 
878
923
  const usernameFormFieldState = formFieldStates.find(formFieldState => formFieldState.attribute.name === "username");
879
924
 
880
- if (usernameFormFieldState === undefined) {
925
+ if (!usernameFormFieldState) {
881
926
  break check_password_policy_x;
882
927
  }
883
928
 
@@ -889,7 +934,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
889
934
  unFormat_number: {
890
935
  const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {};
891
936
 
892
- if (kcNumberUnFormat === undefined) {
937
+ if (!kcNumberUnFormat) {
893
938
  break unFormat_number;
894
939
  }
895
940
 
@@ -899,6 +944,10 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
899
944
  return valueOrValues;
900
945
  })();
901
946
 
947
+ if (usernameValue === "") {
948
+ break check_password_policy_x;
949
+ }
950
+
902
951
  if (value !== usernameValue) {
903
952
  break check_password_policy_x;
904
953
  }
@@ -906,12 +955,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
906
955
  const msgArgs = ["invalidPasswordNotUsernameMessage"] as const;
907
956
 
908
957
  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
958
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
959
+ errorMessageStr: msgStr(...msgArgs),
960
+ fieldIndex: undefined,
961
+ source: {
962
+ type: "passwordPolicy",
963
+ name: policyName
915
964
  }
916
965
  });
917
966
  }
@@ -927,7 +976,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
927
976
 
928
977
  const emailFormFieldState = formFieldStates.find(formFieldState => formFieldState.attribute.name === "email");
929
978
 
930
- if (emailFormFieldState === undefined) {
979
+ if (!emailFormFieldState) {
931
980
  break check_password_policy_x;
932
981
  }
933
982
 
@@ -936,6 +985,10 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
936
985
  {
937
986
  const emailValue = emailFormFieldState.valueOrValues;
938
987
 
988
+ if (emailValue === "") {
989
+ break check_password_policy_x;
990
+ }
991
+
939
992
  if (value !== emailValue) {
940
993
  break check_password_policy_x;
941
994
  }
@@ -944,12 +997,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
944
997
  const msgArgs = ["invalidPasswordNotEmailMessage"] as const;
945
998
 
946
999
  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
1000
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1001
+ errorMessageStr: msgStr(...msgArgs),
1002
+ fieldIndex: undefined,
1003
+ source: {
1004
+ type: "passwordPolicy",
1005
+ name: policyName
953
1006
  }
954
1007
  });
955
1008
  }
@@ -977,12 +1030,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
977
1030
  const msgArgs = ["invalidPasswordConfirmMessage"] as const;
978
1031
 
979
1032
  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"
1033
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1034
+ errorMessageStr: msgStr(...msgArgs),
1035
+ fieldIndex: undefined,
1036
+ source: {
1037
+ type: "other",
1038
+ rule: "passwordConfirmMatchesPassword"
986
1039
  }
987
1040
  });
988
1041
  }
@@ -1001,12 +1054,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1001
1054
  const msgArgs = ["error-user-attribute-required"] as const;
1002
1055
 
1003
1056
  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"
1057
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1058
+ errorMessageStr: msgStr(...msgArgs),
1059
+ fieldIndex: undefined,
1060
+ source: {
1061
+ type: "other",
1062
+ rule: "requiredField"
1010
1063
  }
1011
1064
  });
1012
1065
  }
@@ -1016,7 +1069,7 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1016
1069
 
1017
1070
  const validator = validators[validatorName];
1018
1071
 
1019
- if (validator === undefined) {
1072
+ if (!validator) {
1020
1073
  break validator_x;
1021
1074
  }
1022
1075
 
@@ -1027,28 +1080,28 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1027
1080
  }
1028
1081
 
1029
1082
  const source: FormFieldError.Source = {
1030
- "type": "validator",
1031
- "name": validatorName
1083
+ type: "validator",
1084
+ name: validatorName
1032
1085
  };
1033
1086
 
1034
- if (max !== undefined && value.length > parseInt(`${max}`)) {
1087
+ if (max && value.length > parseInt(`${max}`)) {
1035
1088
  const msgArgs = ["error-invalid-length-too-long", `${max}`] as const;
1036
1089
 
1037
1090
  errors.push({
1038
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1039
- "errorMessageStr": msgStr(...msgArgs),
1040
- "fieldIndex": undefined,
1091
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1092
+ errorMessageStr: msgStr(...msgArgs),
1093
+ fieldIndex: undefined,
1041
1094
  source
1042
1095
  });
1043
1096
  }
1044
1097
 
1045
- if (min !== undefined && value.length < parseInt(`${min}`)) {
1098
+ if (min && value.length < parseInt(`${min}`)) {
1046
1099
  const msgArgs = ["error-invalid-length-too-short", `${min}`] as const;
1047
1100
 
1048
1101
  errors.push({
1049
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1050
- "errorMessageStr": msgStr(...msgArgs),
1051
- "fieldIndex": undefined,
1102
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1103
+ errorMessageStr: msgStr(...msgArgs),
1104
+ fieldIndex: undefined,
1052
1105
  source
1053
1106
  });
1054
1107
  }
@@ -1076,12 +1129,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1076
1129
  const msgArgs = [errorMessageKey ?? id<MessageKey>("shouldMatchPattern"), pattern] as const;
1077
1130
 
1078
1131
  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
1132
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
1133
+ errorMessageStr: advancedMsgStr(...msgArgs),
1134
+ fieldIndex: undefined,
1135
+ source: {
1136
+ type: "validator",
1137
+ name: validatorName
1085
1138
  }
1086
1139
  });
1087
1140
  }
@@ -1115,12 +1168,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1115
1168
  const msgArgs = [id<MessageKey>("invalidEmailMessage")] as const;
1116
1169
 
1117
1170
  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
1171
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1172
+ errorMessageStr: msgStr(...msgArgs),
1173
+ fieldIndex: undefined,
1174
+ source: {
1175
+ type: "validator",
1176
+ name: validatorName
1124
1177
  }
1125
1178
  });
1126
1179
  }
@@ -1143,43 +1196,43 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1143
1196
  const intValue = parseInt(value);
1144
1197
 
1145
1198
  const source: FormFieldError.Source = {
1146
- "type": "validator",
1147
- "name": validatorName
1199
+ type: "validator",
1200
+ name: validatorName
1148
1201
  };
1149
1202
 
1150
1203
  if (isNaN(intValue)) {
1151
1204
  const msgArgs = ["mustBeAnInteger"] as const;
1152
1205
 
1153
1206
  errors.push({
1154
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1155
- "errorMessageStr": msgStr(...msgArgs),
1156
- "fieldIndex": undefined,
1207
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1208
+ errorMessageStr: msgStr(...msgArgs),
1209
+ fieldIndex: undefined,
1157
1210
  source
1158
1211
  });
1159
1212
 
1160
1213
  break validator_x;
1161
1214
  }
1162
1215
 
1163
- if (max !== undefined && intValue > parseInt(`${max}`)) {
1216
+ if (max && intValue > parseInt(`${max}`)) {
1164
1217
  const msgArgs = ["error-number-out-of-range-too-big", `${max}`] as const;
1165
1218
 
1166
1219
  errors.push({
1167
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1168
- "errorMessageStr": msgStr(...msgArgs),
1169
- "fieldIndex": undefined,
1220
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1221
+ errorMessageStr: msgStr(...msgArgs),
1222
+ fieldIndex: undefined,
1170
1223
  source
1171
1224
  });
1172
1225
 
1173
1226
  break validator_x;
1174
1227
  }
1175
1228
 
1176
- if (min !== undefined && intValue < parseInt(`${min}`)) {
1229
+ if (min && intValue < parseInt(`${min}`)) {
1177
1230
  const msgArgs = ["error-number-out-of-range-too-small", `${min}`] as const;
1178
1231
 
1179
1232
  errors.push({
1180
- "errorMessage": <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1181
- "errorMessageStr": msgStr(...msgArgs),
1182
- "fieldIndex": undefined,
1233
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{msg(...msgArgs)}</Fragment>,
1234
+ errorMessageStr: msgStr(...msgArgs),
1235
+ fieldIndex: undefined,
1183
1236
  source
1184
1237
  });
1185
1238
 
@@ -1207,12 +1260,12 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1207
1260
  const msgArgs = [id<MessageKey>("notAValidOption")] as const;
1208
1261
 
1209
1262
  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
1263
+ errorMessage: <Fragment key={`${attributeName}-${errors.length}`}>{advancedMsg(...msgArgs)}</Fragment>,
1264
+ errorMessageStr: advancedMsgStr(...msgArgs),
1265
+ fieldIndex: undefined,
1266
+ source: {
1267
+ type: "validator",
1268
+ name: validatorName
1216
1269
  }
1217
1270
  });
1218
1271
  }
@@ -1225,3 +1278,79 @@ function useGetErrors(params: { kcContext: Pick<KcContextLike, "messagesPerField
1225
1278
 
1226
1279
  return { getErrors };
1227
1280
  }
1281
+
1282
+ function getIsMultivaluedSingleField(params: { attribute: Attribute }) {
1283
+ const { attribute } = params;
1284
+
1285
+ return attribute.annotations.inputType?.startsWith("multiselect") ?? false;
1286
+ }
1287
+
1288
+ export function getButtonToDisplayForMultivaluedAttributeField(params: { attribute: Attribute; values: string[]; fieldIndex: number }) {
1289
+ const { attribute, values, fieldIndex } = params;
1290
+
1291
+ const hasRemove = (() => {
1292
+ if (values.length === 1) {
1293
+ return false;
1294
+ }
1295
+
1296
+ const minCount = (() => {
1297
+ const { multivalued } = attribute.validators;
1298
+
1299
+ if (multivalued === undefined) {
1300
+ return undefined;
1301
+ }
1302
+
1303
+ const minStr = multivalued.min;
1304
+
1305
+ if (minStr === undefined) {
1306
+ return undefined;
1307
+ }
1308
+
1309
+ return parseInt(`${minStr}`);
1310
+ })();
1311
+
1312
+ if (minCount === undefined) {
1313
+ return true;
1314
+ }
1315
+
1316
+ if (values.length === minCount) {
1317
+ return false;
1318
+ }
1319
+
1320
+ return true;
1321
+ })();
1322
+
1323
+ const hasAdd = (() => {
1324
+ if (fieldIndex + 1 !== values.length) {
1325
+ return false;
1326
+ }
1327
+
1328
+ const maxCount = (() => {
1329
+ const { multivalued } = attribute.validators;
1330
+
1331
+ if (multivalued === undefined) {
1332
+ return undefined;
1333
+ }
1334
+
1335
+ const maxStr = multivalued.max;
1336
+
1337
+ if (maxStr === undefined) {
1338
+ return undefined;
1339
+ }
1340
+
1341
+ return parseInt(`${maxStr}`);
1342
+ })();
1343
+
1344
+ if (maxCount === undefined) {
1345
+ return false;
1346
+ }
1347
+
1348
+ if (values.length === maxCount) {
1349
+ return false;
1350
+ }
1351
+
1352
+ return true;
1353
+ })();
1354
+
1355
+ return { hasRemove, hasAdd };
1356
+ }