keycloakify 10.0.0-rc.14 → 10.0.0-rc.141

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