keycloakify 10.0.0-rc.99 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/PUBLIC_URL.js +2 -2
  2. package/PUBLIC_URL.js.map +1 -1
  3. package/README.md +28 -242
  4. package/account/KcContext/KcContext.d.ts +4 -1
  5. package/account/KcContext/KcContext.js.map +1 -1
  6. package/account/KcContext/kcContextMocks.js +7 -4
  7. package/account/KcContext/kcContextMocks.js.map +1 -1
  8. package/account/Template.js +3 -1
  9. package/account/Template.js.map +1 -1
  10. package/account/i18n/GenericI18n.d.ts +6 -0
  11. package/account/i18n/GenericI18n.js +2 -0
  12. package/account/i18n/GenericI18n.js.map +1 -0
  13. package/account/i18n/i18n.d.ts +24 -30
  14. package/account/i18n/i18n.js +50 -70
  15. package/account/i18n/i18n.js.map +1 -1
  16. package/account/i18n/index.d.ts +4 -3
  17. package/account/i18n/index.js.map +1 -1
  18. package/account/i18n/messages_defaultSet/ar.js.map +1 -0
  19. package/account/i18n/messages_defaultSet/ca.js.map +1 -0
  20. package/account/i18n/messages_defaultSet/cs.js.map +1 -0
  21. package/account/i18n/messages_defaultSet/da.js.map +1 -0
  22. package/account/i18n/messages_defaultSet/de.js.map +1 -0
  23. package/account/i18n/messages_defaultSet/el.js.map +1 -0
  24. package/account/i18n/messages_defaultSet/en.js.map +1 -0
  25. package/account/i18n/messages_defaultSet/es.js.map +1 -0
  26. package/account/i18n/messages_defaultSet/fa.js.map +1 -0
  27. package/account/i18n/messages_defaultSet/fi.js.map +1 -0
  28. package/account/i18n/messages_defaultSet/fr.js.map +1 -0
  29. package/account/i18n/messages_defaultSet/hu.js.map +1 -0
  30. package/account/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  31. package/account/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  32. package/account/i18n/messages_defaultSet/index.js.map +1 -0
  33. package/account/i18n/messages_defaultSet/it.js.map +1 -0
  34. package/account/i18n/messages_defaultSet/ja.js.map +1 -0
  35. package/account/i18n/messages_defaultSet/lt.js.map +1 -0
  36. package/account/i18n/messages_defaultSet/lv.js.map +1 -0
  37. package/account/i18n/messages_defaultSet/nl.js.map +1 -0
  38. package/account/i18n/messages_defaultSet/no.js.map +1 -0
  39. package/account/i18n/messages_defaultSet/pl.js.map +1 -0
  40. package/account/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  41. package/account/i18n/messages_defaultSet/ru.js.map +1 -0
  42. package/account/i18n/messages_defaultSet/sk.js.map +1 -0
  43. package/account/i18n/messages_defaultSet/sv.js.map +1 -0
  44. package/account/i18n/messages_defaultSet/th.js.map +1 -0
  45. package/account/i18n/messages_defaultSet/tr.js.map +1 -0
  46. package/account/i18n/messages_defaultSet/uk.js.map +1 -0
  47. package/account/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  48. package/account/i18n/useI18n.d.ts +6 -5
  49. package/account/i18n/useI18n.js +37 -4
  50. package/account/i18n/useI18n.js.map +1 -1
  51. package/account/pages/FederatedIdentity.js +1 -1
  52. package/account/pages/FederatedIdentity.js.map +1 -1
  53. package/account/pages/Totp.js +5 -1
  54. package/account/pages/Totp.js.map +1 -1
  55. package/bin/193.index.js +5 -5
  56. package/bin/{490.index.js → 246.index.js} +22 -4
  57. package/bin/31.index.js +264 -203
  58. package/bin/440.index.js +178 -106
  59. package/bin/453.index.js +59 -7
  60. package/bin/526.index.js +525 -137
  61. package/bin/599.index.js +567 -0
  62. package/bin/{893.index.js → 622.index.js} +239 -231
  63. package/bin/{36.index.js → 678.index.js} +577 -71
  64. package/bin/{180.index.js → 697.index.js} +611 -526
  65. package/bin/743.index.js +70 -0
  66. package/bin/780.index.js +895 -0
  67. package/bin/786.index.js +185 -0
  68. package/bin/932.index.js +740 -52
  69. package/bin/{966.index.js → 941.index.js} +2 -19
  70. package/bin/97.index.js +29 -7
  71. package/bin/main.js +22 -10
  72. package/bin/shared/KeycloakVersionRange.d.ts +3 -3
  73. package/bin/shared/buildContext.d.ts +52 -16
  74. package/bin/shared/buildContext.js.map +1 -1
  75. package/bin/shared/constants.d.ts +18 -17
  76. package/bin/shared/constants.js +15 -14
  77. package/bin/shared/constants.js.map +1 -1
  78. package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -1
  79. package/bin/shared/downloadKeycloakDefaultTheme.js.map +1 -1
  80. package/bin/shared/generateKcGenTs.d.ts +3 -0
  81. package/bin/shared/generateKcGenTs.js.map +1 -1
  82. package/bin/shared/getLatestsSemVersionedTag.d.ts +15 -0
  83. package/bin/shared/getLatestsSemVersionedTag.js.map +1 -0
  84. package/bin/shared/promptKeycloakVersion.d.ts +3 -1
  85. package/bin/shared/promptKeycloakVersion.js.map +1 -1
  86. package/lib/getKcClsx.js +2 -1
  87. package/lib/getKcClsx.js.map +1 -1
  88. package/login/KcContext/KcContext.d.ts +10 -11
  89. package/login/KcContext/KcContext.js.map +1 -1
  90. package/login/KcContext/kcContextMocks.js +4 -5
  91. package/login/KcContext/kcContextMocks.js.map +1 -1
  92. package/login/Template.js +13 -7
  93. package/login/Template.js.map +1 -1
  94. package/login/TemplateProps.d.ts +0 -1
  95. package/login/UserProfileFormFields.js +6 -5
  96. package/login/UserProfileFormFields.js.map +1 -1
  97. package/login/i18n/GenericI18n.d.ts +6 -0
  98. package/login/i18n/GenericI18n.js +2 -0
  99. package/login/i18n/GenericI18n.js.map +1 -0
  100. package/login/i18n/i18n.d.ts +22 -32
  101. package/login/i18n/i18n.js +51 -92
  102. package/login/i18n/i18n.js.map +1 -1
  103. package/login/i18n/index.d.ts +4 -3
  104. package/login/i18n/index.js.map +1 -1
  105. package/login/i18n/messages_defaultSet/ar.js.map +1 -0
  106. package/login/i18n/messages_defaultSet/ca.js.map +1 -0
  107. package/login/i18n/messages_defaultSet/cs.js.map +1 -0
  108. package/login/i18n/messages_defaultSet/da.js.map +1 -0
  109. package/login/i18n/messages_defaultSet/de.js.map +1 -0
  110. package/login/i18n/messages_defaultSet/el.js.map +1 -0
  111. package/login/i18n/messages_defaultSet/en.js.map +1 -0
  112. package/login/i18n/messages_defaultSet/es.js.map +1 -0
  113. package/login/i18n/messages_defaultSet/fa.js.map +1 -0
  114. package/login/i18n/messages_defaultSet/fi.js.map +1 -0
  115. package/login/i18n/messages_defaultSet/fr.js.map +1 -0
  116. package/login/i18n/messages_defaultSet/hu.js.map +1 -0
  117. package/login/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  118. package/login/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  119. package/login/i18n/messages_defaultSet/index.js.map +1 -0
  120. package/login/i18n/messages_defaultSet/it.js.map +1 -0
  121. package/login/i18n/messages_defaultSet/ja.js.map +1 -0
  122. package/login/i18n/messages_defaultSet/lt.js.map +1 -0
  123. package/login/i18n/messages_defaultSet/lv.js.map +1 -0
  124. package/login/i18n/messages_defaultSet/nl.js.map +1 -0
  125. package/login/i18n/messages_defaultSet/no.js.map +1 -0
  126. package/login/i18n/messages_defaultSet/pl.js.map +1 -0
  127. package/login/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  128. package/login/i18n/messages_defaultSet/ru.js.map +1 -0
  129. package/login/i18n/messages_defaultSet/sk.js.map +1 -0
  130. package/login/i18n/messages_defaultSet/sv.js.map +1 -0
  131. package/login/i18n/messages_defaultSet/th.js.map +1 -0
  132. package/login/i18n/messages_defaultSet/tr.js.map +1 -0
  133. package/login/i18n/messages_defaultSet/uk.js.map +1 -0
  134. package/login/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  135. package/login/i18n/useI18n.d.ts +6 -5
  136. package/login/i18n/useI18n.js +37 -4
  137. package/login/i18n/useI18n.js.map +1 -1
  138. package/login/lib/useUserProfileForm.d.ts +2 -0
  139. package/login/lib/useUserProfileForm.js +44 -10
  140. package/login/lib/useUserProfileForm.js.map +1 -1
  141. package/login/pages/Error.js +1 -1
  142. package/login/pages/Error.js.map +1 -1
  143. package/login/pages/Info.js +15 -3
  144. package/login/pages/Info.js.map +1 -1
  145. package/login/pages/Login.js +6 -2
  146. package/login/pages/Login.js.map +1 -1
  147. package/login/pages/LoginConfigTotp.js +5 -1
  148. package/login/pages/LoginConfigTotp.js.map +1 -1
  149. package/login/pages/LoginOtp.js +3 -1
  150. package/login/pages/LoginOtp.js.map +1 -1
  151. package/login/pages/LoginPassword.js +3 -1
  152. package/login/pages/LoginPassword.js.map +1 -1
  153. package/login/pages/LoginRecoveryAuthnCodeInput.js +3 -1
  154. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  155. package/login/pages/LoginResetPassword.js +3 -1
  156. package/login/pages/LoginResetPassword.js.map +1 -1
  157. package/login/pages/LoginUpdatePassword.js +5 -1
  158. package/login/pages/LoginUpdatePassword.js.map +1 -1
  159. package/login/pages/Register.js +3 -1
  160. package/login/pages/Register.js.map +1 -1
  161. package/login/pages/SamlPostForm.js +1 -1
  162. package/login/pages/SamlPostForm.js.map +1 -1
  163. package/login/pages/SelectAuthenticator.js +2 -2
  164. package/login/pages/SelectAuthenticator.js.map +1 -1
  165. package/login/pages/WebauthnAuthenticate.js +3 -3
  166. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  167. package/login/pages/WebauthnRegister.js +2 -2
  168. package/package.json +265 -245
  169. package/src/PUBLIC_URL.ts +2 -2
  170. package/src/account/KcContext/KcContext.ts +4 -1
  171. package/src/account/KcContext/kcContextMocks.ts +7 -4
  172. package/src/account/Template.tsx +6 -1
  173. package/src/account/i18n/GenericI18n.tsx +6 -0
  174. package/src/account/i18n/i18n.tsx +91 -129
  175. package/src/account/i18n/index.ts +4 -3
  176. package/src/account/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  177. package/src/account/i18n/useI18n.tsx +95 -0
  178. package/src/account/pages/FederatedIdentity.tsx +1 -1
  179. package/src/account/pages/Totp.tsx +16 -6
  180. package/src/bin/add-story.ts +42 -10
  181. package/src/bin/eject-page.ts +119 -11
  182. package/src/bin/initialize-account-theme/copyBoilerplate.ts +32 -0
  183. package/src/bin/initialize-account-theme/index.ts +1 -0
  184. package/src/bin/initialize-account-theme/initialize-account-theme.ts +112 -0
  185. package/src/bin/initialize-account-theme/initializeAccountTheme_multiPage.ts +21 -0
  186. package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +152 -0
  187. package/src/bin/initialize-account-theme/src/multi-page/KcContext.ts +12 -0
  188. package/src/bin/initialize-account-theme/src/multi-page/KcPage.tsx +25 -0
  189. package/src/bin/initialize-account-theme/src/multi-page/KcPageStory.tsx +38 -0
  190. package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +5 -0
  191. package/src/bin/initialize-account-theme/src/single-page/KcContext.ts +7 -0
  192. package/src/bin/initialize-account-theme/src/single-page/KcPage.tsx +11 -0
  193. package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +92 -0
  194. package/src/bin/initialize-email-theme.ts +1 -1
  195. package/src/bin/keycloakify/buildJars/buildJar.ts +38 -24
  196. package/src/bin/keycloakify/buildJars/buildJars.ts +6 -3
  197. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +5 -5
  198. package/src/bin/keycloakify/generateFtl/generateFtl.ts +16 -16
  199. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +471 -364
  200. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +7 -7
  201. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +3 -3
  202. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +125 -59
  203. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +2 -2
  204. package/src/bin/keycloakify/generateResources/readExtraPageNames.ts +5 -8
  205. package/src/bin/keycloakify/keycloakify.ts +8 -6
  206. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +41 -27
  207. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +2 -2
  208. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +6 -6
  209. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +4 -4
  210. package/src/bin/main.ts +16 -2
  211. package/src/bin/shared/KeycloakVersionRange.ts +4 -4
  212. package/src/bin/shared/buildContext.ts +360 -251
  213. package/src/bin/shared/constants.ts +19 -17
  214. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +6 -6
  215. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +48 -27
  216. package/src/bin/shared/downloadKeycloakStaticResources.ts +2 -2
  217. package/src/bin/shared/generateKcGenTs.ts +110 -3
  218. package/src/bin/shared/getLatestsSemVersionedTag.ts +201 -0
  219. package/src/bin/shared/promptKeycloakVersion.ts +20 -80
  220. package/src/bin/start-keycloak/appBuild.ts +15 -11
  221. package/src/bin/start-keycloak/keycloakifyBuild.ts +3 -3
  222. package/src/bin/start-keycloak/myrealm-realm-18.json +4 -4
  223. package/src/bin/start-keycloak/myrealm-realm-19.json +4 -4
  224. package/src/bin/start-keycloak/myrealm-realm-20.json +4 -4
  225. package/src/bin/start-keycloak/myrealm-realm-21.json +4 -4
  226. package/src/bin/start-keycloak/myrealm-realm-23.json +3 -3
  227. package/src/bin/start-keycloak/myrealm-realm-24.json +4 -4
  228. package/src/bin/start-keycloak/myrealm-realm-25.json +4 -4
  229. package/src/bin/start-keycloak/start-keycloak.ts +256 -102
  230. package/src/bin/tools/assertNoPnpmDlx.ts +4 -2
  231. package/src/bin/tools/downloadAndExtractArchive.ts +10 -9
  232. package/src/bin/tools/fetchProxyOptions.ts +32 -11
  233. package/src/bin/tools/npmInstall.ts +63 -0
  234. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +3 -2
  235. package/src/bin/tsconfig.json +3 -1
  236. package/src/lib/getKcClsx.ts +2 -2
  237. package/src/login/KcContext/KcContext.ts +10 -28
  238. package/src/login/KcContext/kcContextMocks.ts +5 -6
  239. package/src/login/Template.tsx +32 -54
  240. package/src/login/TemplateProps.ts +0 -1
  241. package/src/login/UserProfileFormFields.tsx +15 -11
  242. package/src/login/i18n/GenericI18n.tsx +6 -0
  243. package/src/login/i18n/i18n.tsx +91 -166
  244. package/src/login/i18n/index.ts +4 -3
  245. package/src/login/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  246. package/src/login/i18n/useI18n.tsx +95 -0
  247. package/src/login/lib/useUserProfileForm.tsx +68 -20
  248. package/src/login/pages/Error.tsx +1 -1
  249. package/src/login/pages/Info.tsx +26 -6
  250. package/src/login/pages/Login.tsx +20 -9
  251. package/src/login/pages/LoginConfigTotp.tsx +16 -6
  252. package/src/login/pages/LoginOtp.tsx +8 -3
  253. package/src/login/pages/LoginPassword.tsx +8 -3
  254. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +8 -3
  255. package/src/login/pages/LoginResetPassword.tsx +8 -3
  256. package/src/login/pages/LoginUpdatePassword.tsx +55 -47
  257. package/src/login/pages/Register.tsx +8 -3
  258. package/src/login/pages/SamlPostForm.tsx +1 -1
  259. package/src/login/pages/SelectAuthenticator.tsx +4 -4
  260. package/src/login/pages/WebauthnAuthenticate.tsx +5 -5
  261. package/src/login/pages/WebauthnRegister.tsx +2 -2
  262. package/src/tools/useInsertLinkTags.ts +9 -1
  263. package/src/tools/useInsertScriptTags.ts +9 -1
  264. package/src/vite-plugin/vite-plugin.ts +15 -13
  265. package/stories/account/pages/Log.stories.tsx +1 -0
  266. package/stories/account-spa/index.stories.tsx +94 -0
  267. package/stories/intro/intro.stories.tsx +90 -0
  268. package/stories/login/pages/Info.stories.tsx +7 -2
  269. package/stories/login/pages/Login.stories.tsx +25 -13
  270. package/stories/login/pages/Register.stories.tsx +11 -9
  271. package/stories/login/pages/SelectAuthenticator.stories.tsx +41 -0
  272. package/stories/login/pages/Terms.stories.tsx +6 -2
  273. package/tools/useInsertLinkTags.js +7 -1
  274. package/tools/useInsertLinkTags.js.map +1 -1
  275. package/tools/useInsertScriptTags.js +7 -1
  276. package/tools/useInsertScriptTags.js.map +1 -1
  277. package/vite-plugin/index.js +25820 -25686
  278. package/vite-plugin/vite-plugin.d.ts +6 -4
  279. package/account/i18n/baseMessages/ar.js.map +0 -1
  280. package/account/i18n/baseMessages/ca.js.map +0 -1
  281. package/account/i18n/baseMessages/cs.js.map +0 -1
  282. package/account/i18n/baseMessages/da.js.map +0 -1
  283. package/account/i18n/baseMessages/de.js.map +0 -1
  284. package/account/i18n/baseMessages/el.js.map +0 -1
  285. package/account/i18n/baseMessages/en.js.map +0 -1
  286. package/account/i18n/baseMessages/es.js.map +0 -1
  287. package/account/i18n/baseMessages/fa.js.map +0 -1
  288. package/account/i18n/baseMessages/fi.js.map +0 -1
  289. package/account/i18n/baseMessages/fr.js.map +0 -1
  290. package/account/i18n/baseMessages/hu.js.map +0 -1
  291. package/account/i18n/baseMessages/index.js.map +0 -1
  292. package/account/i18n/baseMessages/it.js.map +0 -1
  293. package/account/i18n/baseMessages/ja.js.map +0 -1
  294. package/account/i18n/baseMessages/lt.js.map +0 -1
  295. package/account/i18n/baseMessages/lv.js.map +0 -1
  296. package/account/i18n/baseMessages/nl.js.map +0 -1
  297. package/account/i18n/baseMessages/no.js.map +0 -1
  298. package/account/i18n/baseMessages/pl.js.map +0 -1
  299. package/account/i18n/baseMessages/pt-BR.js.map +0 -1
  300. package/account/i18n/baseMessages/ru.js.map +0 -1
  301. package/account/i18n/baseMessages/sk.js.map +0 -1
  302. package/account/i18n/baseMessages/sv.js.map +0 -1
  303. package/account/i18n/baseMessages/th.js.map +0 -1
  304. package/account/i18n/baseMessages/tr.js.map +0 -1
  305. package/account/i18n/baseMessages/uk.js.map +0 -1
  306. package/account/i18n/baseMessages/zh-CN.js.map +0 -1
  307. package/bin/538.index.js +0 -108
  308. package/login/i18n/baseMessages/ar.js.map +0 -1
  309. package/login/i18n/baseMessages/ca.js.map +0 -1
  310. package/login/i18n/baseMessages/cs.js.map +0 -1
  311. package/login/i18n/baseMessages/da.js.map +0 -1
  312. package/login/i18n/baseMessages/de.js.map +0 -1
  313. package/login/i18n/baseMessages/el.js.map +0 -1
  314. package/login/i18n/baseMessages/en.js.map +0 -1
  315. package/login/i18n/baseMessages/es.js.map +0 -1
  316. package/login/i18n/baseMessages/fa.js.map +0 -1
  317. package/login/i18n/baseMessages/fi.js.map +0 -1
  318. package/login/i18n/baseMessages/fr.js.map +0 -1
  319. package/login/i18n/baseMessages/hu.js.map +0 -1
  320. package/login/i18n/baseMessages/index.js.map +0 -1
  321. package/login/i18n/baseMessages/it.js.map +0 -1
  322. package/login/i18n/baseMessages/ja.js.map +0 -1
  323. package/login/i18n/baseMessages/lt.js.map +0 -1
  324. package/login/i18n/baseMessages/lv.js.map +0 -1
  325. package/login/i18n/baseMessages/nl.js.map +0 -1
  326. package/login/i18n/baseMessages/no.js.map +0 -1
  327. package/login/i18n/baseMessages/pl.js.map +0 -1
  328. package/login/i18n/baseMessages/pt-BR.js.map +0 -1
  329. package/login/i18n/baseMessages/ru.js.map +0 -1
  330. package/login/i18n/baseMessages/sk.js.map +0 -1
  331. package/login/i18n/baseMessages/sv.js.map +0 -1
  332. package/login/i18n/baseMessages/th.js.map +0 -1
  333. package/login/i18n/baseMessages/tr.js.map +0 -1
  334. package/login/i18n/baseMessages/uk.js.map +0 -1
  335. package/login/i18n/baseMessages/zh-CN.js.map +0 -1
  336. package/src/account/i18n/useI18n.ts +0 -44
  337. package/src/login/i18n/useI18n.ts +0 -44
  338. package/src/tools/ExtractAfterStartingWith.ts +0 -4
  339. package/tools/ExtractAfterStartingWith.d.ts +0 -1
  340. package/tools/ExtractAfterStartingWith.js +0 -2
  341. package/tools/ExtractAfterStartingWith.js.map +0 -1
  342. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  343. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  344. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  345. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  346. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  347. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  348. /package/account/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  349. /package/account/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  350. /package/account/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  351. /package/account/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  352. /package/account/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  353. /package/account/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  354. /package/account/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  355. /package/account/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  356. /package/account/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  357. /package/account/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  358. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  359. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  360. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  361. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  362. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  363. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  364. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  365. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  366. /package/account/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  367. /package/account/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  368. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  369. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  370. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  371. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  372. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  373. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  374. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  375. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  376. /package/account/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  377. /package/account/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  378. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  379. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  380. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  381. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  382. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  383. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  384. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  385. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  386. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  387. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  388. /package/account/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  389. /package/account/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  390. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  391. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  392. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  393. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  394. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  395. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  396. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  397. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  398. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  399. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  400. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  401. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  402. /package/login/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  403. /package/login/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  404. /package/login/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  405. /package/login/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  406. /package/login/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  407. /package/login/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  408. /package/login/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  409. /package/login/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  410. /package/login/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  411. /package/login/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  412. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  413. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  414. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  415. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  416. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  417. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  418. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  419. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  420. /package/login/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  421. /package/login/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  422. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  423. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  424. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  425. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  426. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  427. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  428. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  429. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  430. /package/login/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  431. /package/login/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  432. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  433. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  434. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  435. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  436. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  437. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  438. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  439. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  440. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  441. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  442. /package/login/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  443. /package/login/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  444. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  445. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  446. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  447. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  448. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  449. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  450. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  451. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  452. /package/src/account/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  453. /package/src/account/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  454. /package/src/account/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  455. /package/src/account/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  456. /package/src/account/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  457. /package/src/account/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  458. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  459. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  460. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  461. /package/src/account/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  462. /package/src/account/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  463. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  464. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  465. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  466. /package/src/account/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  467. /package/src/account/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  468. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  469. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  470. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  471. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  472. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  473. /package/src/account/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  474. /package/src/account/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  475. /package/src/account/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  476. /package/src/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
  477. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  478. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  479. /package/src/login/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  480. /package/src/login/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  481. /package/src/login/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  482. /package/src/login/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  483. /package/src/login/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  484. /package/src/login/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  485. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  486. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  487. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  488. /package/src/login/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  489. /package/src/login/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  490. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  491. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  492. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  493. /package/src/login/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  494. /package/src/login/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  495. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  496. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  497. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  498. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  499. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  500. /package/src/login/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  501. /package/src/login/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  502. /package/src/login/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  503. /package/src/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
@@ -1,5 +1,50 @@
1
- <#assign pageId="PAGE_ID_xIgLsPgGId9D8e">
2
- const kcContext = ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
1
+ <#assign xKeycloakify={
2
+ "messages": {},
3
+ "pageId": "{{pageId}}",
4
+ "ftlTemplateFileName": "{{ftlTemplateFileName}}",
5
+ "themeType": "{{themeType}}",
6
+ "themeName": "{{themeName}}",
7
+ "keycloakifyVersion": "{{keycloakifyVersion}}",
8
+ "themeVersion": "{{themeVersion}}",
9
+ "resourcesPath": ""
10
+ }>
11
+
12
+ <#if url?? && url?is_hash && url.resourcesPath?? && url.resourcesPath?is_string>
13
+ <#assign xKeycloakify = xKeycloakify + { "resourcesPath": url.resourcesPath }>
14
+ </#if>
15
+ <#if resourceUrl?? && resourceUrl?is_string>
16
+ <#assign xKeycloakify = xKeycloakify + { "resourcesPath": resourceUrl }>
17
+ </#if>
18
+
19
+ const kcContext = ${toJsDeclarationString(.data_model, [])?no_esc};
20
+ kcContext.keycloakifyVersion = "${xKeycloakify.keycloakifyVersion}";
21
+ kcContext.themeVersion = "${xKeycloakify.themeVersion}";
22
+ kcContext.themeType = "${xKeycloakify.themeType}";
23
+ kcContext.themeName = "${xKeycloakify.themeName}";
24
+ kcContext.pageId = "${xKeycloakify.pageId}";
25
+ kcContext.ftlTemplateFileName = "${xKeycloakify.ftlTemplateFileName}";
26
+
27
+ <@addNonAutomaticallyGatherableMessagesToXKeycloakifyMessages />
28
+
29
+ kcContext["x-keycloakify"] = {};
30
+
31
+ kcContext["x-keycloakify"].resourcesPath = "${xKeycloakify.resourcesPath}";
32
+
33
+ {
34
+ var messages = {};
35
+ <#list xKeycloakify.messages as key, resolvedMsg>
36
+ messages["${key}"] = decodeHtmlEntities("${resolvedMsg?js_string}");
37
+ </#list>
38
+ kcContext["x-keycloakify"].messages = messages;
39
+ }
40
+
41
+ if(
42
+ kcContext.url instanceof Object &&
43
+ typeof kcContext.url.resourcesPath === "string"
44
+ ){
45
+ kcContext.url.resourcesCommonPath = kcContext.url.resourcesPath + "/{{RESOURCES_COMMON}}";
46
+ }
47
+
3
48
  if( kcContext.messagesPerField ){
4
49
  var existsError_singleFieldName = kcContext.messagesPerField.existsError;
5
50
  kcContext.messagesPerField.existsError = function (){
@@ -25,46 +70,6 @@ if( kcContext.messagesPerField ){
25
70
  }
26
71
  };
27
72
  }
28
- kcContext.keycloakifyVersion = "KEYCLOAKIFY_VERSION_xEdKd3xEdr";
29
- kcContext.themeVersion = "KEYCLOAKIFY_THEME_VERSION_sIgKd3xEdr3dx";
30
- kcContext.themeType = "KEYCLOAKIFY_THEME_TYPE_dExKd3xEdr";
31
- kcContext.themeName = "KEYCLOAKIFY_THEME_NAME_cXxKd3xEer";
32
- kcContext.pageId = "${pageId}";
33
- if( kcContext.url && kcContext.url.resourcesPath ){
34
- kcContext.url.resourcesCommonPath = kcContext.url.resourcesPath + "/" + "RESOURCES_COMMON_cLsLsMrtDkpVv";
35
- }
36
- kcContext["x-keycloakify"] = {};
37
- <#if profile?? && profile.attributes??>
38
- kcContext["x-keycloakify"].realmMessageBundleUserProfile = {
39
- <#list profile.attributes as attribute>
40
- <#if attribute.annotations?? && attribute.displayName??>
41
- "${attribute.displayName}": decodeHtmlEntities("${advancedMsg(attribute.displayName)?js_string}"),
42
- </#if>
43
- <#if attribute.annotations.inputHelperTextBefore??>
44
- "${attribute.annotations.inputHelperTextBefore}": decodeHtmlEntities("${advancedMsg(attribute.annotations.inputHelperTextBefore)?js_string}"),
45
- </#if>
46
- <#if attribute.annotations.inputHelperTextAfter??>
47
- "${attribute.annotations.inputHelperTextAfter}": decodeHtmlEntities("${advancedMsg(attribute.annotations.inputHelperTextAfter)?js_string}"),
48
- </#if>
49
- <#if attribute.annotations.inputTypePlaceholder??>
50
- "${attribute.annotations.inputTypePlaceholder}": decodeHtmlEntities("${advancedMsg(attribute.annotations.inputTypePlaceholder)?js_string}"),
51
- </#if>
52
- <!-- Loop through the options that are in attribute.validators.options.options -->
53
- <#if (
54
- attribute.annotations.inputOptionLabelsI18nPrefix?? &&
55
- attribute.validators?? &&
56
- attribute.validators.options??
57
- )>
58
- <#list attribute.validators.options.options as option>
59
- "${attribute.annotations.inputOptionLabelsI18nPrefix}.${option}": decodeHtmlEntities("${msg(attribute.annotations.inputOptionLabelsI18nPrefix + "." + option)?js_string}"),
60
- </#list>
61
- </#if>
62
- </#list>
63
- };
64
- </#if>
65
- <#if pageId == "terms.ftl" || termsAcceptanceRequired?? && termsAcceptanceRequired>
66
- kcContext["x-keycloakify"].realmMessageBundleTermsText= decodeHtmlEntities("${msg("termsText")?js_string}");
67
- </#if>
68
73
  attributes_to_attributesByName: {
69
74
  if( !kcContext.profile ){
70
75
  break attributes_to_attributesByName;
@@ -72,7 +77,7 @@ attributes_to_attributesByName: {
72
77
  if( !kcContext.profile.attributes ){
73
78
  break attributes_to_attributesByName;
74
79
  }
75
- var attributes = kcContext.profile.attributes;
80
+ var attributes = kcContext.profile.attributes;
76
81
  delete kcContext.profile.attributes;
77
82
  kcContext.profile.attributesByName = {};
78
83
  attributes.forEach(function(attribute){
@@ -90,432 +95,465 @@ function decodeHtmlEntities(htmlStr){
90
95
  return element.value;
91
96
  }
92
97
 
93
- <#function ftl_object_to_js_code_declaring_an_object object path>
98
+ <#function toJsDeclarationString object path>
99
+ <#local isHash = -1>
100
+ <#attempt>
101
+ <#local isHash = object?is_hash || object?is_hash_ex>
102
+ <#recover>
103
+ <#return "ABORT: Can't evaluate if " + path?join(".") + " is a hash">
104
+ </#attempt>
105
+
106
+ <#if isHash>
107
+ <#if path?size gt 10>
108
+ <#return "ABORT: Too many recursive calls, path: " + path?join(".")>
109
+ </#if>
110
+ <#local keys = -1>
94
111
 
95
- <#local isHash = "">
96
112
  <#attempt>
97
- <#local isHash = object?is_hash || object?is_hash_ex>
113
+ <#local keys = object?keys>
98
114
  <#recover>
99
- <#return "ABORT: Can't evaluate if " + path?join(".") + " is hash">
115
+ <#return "ABORT: We can't list keys on object">
100
116
  </#attempt>
101
117
 
102
- <#if isHash>
118
+ <#local outSeq = []>
103
119
 
104
- <#if path?size gt 10>
105
- <#return "ABORT: Too many recursive calls, path: " + path?join(".")>
120
+ <#list keys as key>
121
+ <#if ["class","declaredConstructors","superclass","declaringClass" ]?seq_contains(key) >
122
+ <#continue>
106
123
  </#if>
107
124
 
108
- <#local keys = "">
109
-
110
- <#attempt>
111
- <#local keys = object?keys>
112
- <#recover>
113
- <#return "ABORT: We can't list keys on this object">
114
- </#attempt>
115
-
116
- <#local out_seq = []>
117
-
118
- <#list keys as key>
119
-
120
- <#if ["class","declaredConstructors","superclass","declaringClass" ]?seq_contains(key) >
121
- <#continue>
122
- </#if>
123
-
124
- <#if
125
+ <#if (
126
+ areSamePath(path, ["url"]) &&
127
+ ["loginUpdatePasswordUrl", "loginUpdateProfileUrl", "loginUsernameReminderUrl", "loginUpdateTotpUrl"]?seq_contains(key)
128
+ ) || (
129
+ key == "updateProfileCtx" &&
130
+ areSamePath(path, [])
131
+ ) || (
132
+ <#-- https://github.com/keycloakify/keycloakify/pull/65#issuecomment-991896344 (reports with saml-post-form.ftl) -->
133
+ <#-- https://github.com/keycloakify/keycloakify/issues/91#issue-1212319466 (reports with error.ftl and Kc18) -->
134
+ <#-- https://github.com/keycloakify/keycloakify/issues/109#issuecomment-1134610163 -->
135
+ <#-- https://github.com/keycloakify/keycloakify/issues/357 -->
136
+ <#-- https://github.com/keycloakify/keycloakify/discussions/406#discussioncomment-7514787 -->
137
+ key == "loginAction" &&
138
+ areSamePath(path, ["url"]) &&
139
+ ["saml-post-form.ftl", "error.ftl", "info.ftl", "login-oauth-grant.ftl", "logout-confirm.ftl", "login-oauth2-device-verify-user-code.ftl"]?seq_contains(xKeycloakify.pageId) &&
140
+ !(auth?has_content && auth.showTryAnotherWayLink())
141
+ ) || (
142
+ <#-- https://github.com/keycloakify/keycloakify/issues/362 -->
143
+ ["secretData", "value"]?seq_contains(key) &&
144
+ areSamePath(path, [ "totp", "otpCredentials", "*" ])
145
+ ) || (
146
+ ["contextData", "idpConfig", "idp", "authenticationSession"]?seq_contains(key) &&
147
+ areSamePath(path, ["brokerContext"]) &&
148
+ ["login-idp-link-confirm.ftl", "login-idp-link-email.ftl" ]?seq_contains(xKeycloakify.pageId)
149
+ ) || (
150
+ key == "identityProviderBrokerCtx" &&
151
+ areSamePath(path, []) &&
152
+ ["login-idp-link-confirm.ftl", "login-idp-link-email.ftl" ]?seq_contains(xKeycloakify.pageId)
153
+ ) || (
154
+ ["masterAdminClient", "delegateForUpdate", "defaultRole"]?seq_contains(key) &&
155
+ areSamePath(path, ["realm"])
156
+ ) || (
157
+ xKeycloakify.pageId == "error.ftl" &&
158
+ areSamePath(path, ["realm"]) &&
159
+ !["name", "displayName", "displayNameHtml", "internationalizationEnabled", "registrationEmailAsUsername" ]?seq_contains(key)
160
+ ) || (
161
+ xKeycloakify.pageId == "applications.ftl" &&
162
+ (
163
+ key == "realm" ||
164
+ key == "container"
165
+ ) &&
166
+ isSubpath(path, ["applications", "applications"])
167
+ ) || (
168
+ key == "delegateForUpdate" &&
169
+ areSamePath(path, ["user"])
170
+ ) || (
171
+ <#-- Security audit forwarded by Garth (Gmail) -->
172
+ key == "saml.signing.private.key" &&
173
+ areSamePath(path, ["client", "attributes"])
174
+ ) || (
175
+ <#-- See: https://github.com/keycloakify/keycloakify/issues/534 -->
176
+ key == "password" &&
177
+ areSamePath(path, ["login"])
178
+ ) || (
179
+ <#-- Remove realmAttributes added by https://github.com/jcputney/keycloak-theme-additional-info-extension for peace of mind. -->
180
+ key == "realmAttributes" &&
181
+ areSamePath(path, [])
182
+ ) || (
183
+ <#-- attributesByName adds a lot of noise to the output and is not needed, we already have profile.attributes -->
184
+ key == "attributesByName" &&
185
+ areSamePath(path, ["profile"])
186
+ ) || (
187
+ <#-- We already have the attributes in profile speedup the rendering by filtering it out from the register object -->
188
+ (key == "attributes" || key == "attributesByName") &&
189
+ areSamePath(path, ["register"])
190
+ ) || (
191
+ areSamePath(path, ["properties"]) &&
125
192
  (
126
- ["loginUpdatePasswordUrl", "loginUpdateProfileUrl", "loginUsernameReminderUrl", "loginUpdateTotpUrl"]?seq_contains(key) &&
127
- are_same_path(path, ["url"])
128
- ) || (
129
- key == "updateProfileCtx" &&
130
- are_same_path(path, [])
131
- ) || (
132
- <#-- https://github.com/keycloakify/keycloakify/pull/65#issuecomment-991896344 (reports with saml-post-form.ftl) -->
133
- <#-- https://github.com/keycloakify/keycloakify/issues/91#issue-1212319466 (reports with error.ftl and Kc18) -->
134
- <#-- https://github.com/keycloakify/keycloakify/issues/109#issuecomment-1134610163 -->
135
- <#-- https://github.com/keycloakify/keycloakify/issues/357 -->
136
- <#-- https://github.com/keycloakify/keycloakify/discussions/406#discussioncomment-7514787 -->
137
- key == "loginAction" &&
138
- are_same_path(path, ["url"]) &&
139
- ["saml-post-form.ftl", "error.ftl", "info.ftl", "login-oauth-grant.ftl", "logout-confirm.ftl", "login-oauth2-device-verify-user-code.ftl"]?seq_contains(pageId) &&
140
- !(auth?has_content && auth.showTryAnotherWayLink())
141
- ) || (
142
- <#-- https://github.com/keycloakify/keycloakify/issues/362 -->
143
- ["secretData", "value"]?seq_contains(key) &&
144
- are_same_path(path, [ "totp", "otpCredentials", "*" ])
145
- ) || (
146
- ["contextData", "idpConfig", "idp", "authenticationSession"]?seq_contains(key) &&
147
- are_same_path(path, ["brokerContext"]) &&
148
- ["login-idp-link-confirm.ftl", "login-idp-link-email.ftl" ]?seq_contains(pageId)
149
- ) || (
150
- key == "identityProviderBrokerCtx" &&
151
- are_same_path(path, []) &&
152
- ["login-idp-link-confirm.ftl", "login-idp-link-email.ftl" ]?seq_contains(pageId)
153
- ) || (
154
- ["masterAdminClient", "delegateForUpdate", "defaultRole"]?seq_contains(key) &&
155
- are_same_path(path, ["realm"])
156
- ) || (
157
- "error.ftl" == pageId &&
158
- are_same_path(path, ["realm"]) &&
159
- !["name", "displayName", "displayNameHtml", "internationalizationEnabled", "registrationEmailAsUsername" ]?seq_contains(key)
160
- ) || (
161
- "applications.ftl" == pageId &&
162
- (
163
- key == "realm" ||
164
- key == "container"
165
- ) &&
166
- is_subpath(path, ["applications", "applications"])
167
- ) || (
168
- key == "delegateForUpdate" &&
169
- are_same_path(path, ["user"])
170
- ) || (
171
- <#-- Security audit forwarded by Garth (Gmail) -->
172
- key == "saml.signing.private.key" &&
173
- are_same_path(path, ["client", "attributes"])
174
- ) || (
175
- <#-- See: https://github.com/keycloakify/keycloakify/issues/534 -->
176
- key == "password" &&
177
- are_same_path(path, ["login"])
178
- ) || (
179
- <#-- Remove realmAttributes added by https://github.com/jcputney/keycloak-theme-additional-info-extension for peace of mind. -->
180
- key == "realmAttributes" &&
181
- are_same_path(path, [])
182
- ) || (
183
- <#-- attributesByName adds a lot of noise to the output and is not needed, we already have profile.attributes -->
184
- key == "attributesByName" &&
185
- are_same_path(path, ["profile"])
186
- ) || (
187
- <#-- We already have the attributes in profile speedup the rendering by filtering it out from the register object -->
188
- (key == "attributes" || key == "attributesByName") &&
189
- are_same_path(path, ["register"])
190
- ) || (
191
- are_same_path(path, ["properties"]) &&
192
- (
193
- key?starts_with("kc") ||
194
- key == "locales" ||
195
- key == "import" ||
196
- key == "parent" ||
197
- key == "meta" ||
198
- key == "stylesCommon" ||
199
- key == "styles" ||
200
- key == "accountResourceProvider"
201
- )
202
- ) || (
203
- key == "execution" &&
204
- are_same_path(path, [])
205
- ) || (
206
- key == "entity" &&
207
- are_same_path(path, ["user"])
193
+ key?starts_with("kc") ||
194
+ key == "locales" ||
195
+ key == "import" ||
196
+ key == "parent" ||
197
+ key == "meta" ||
198
+ key == "stylesCommon" ||
199
+ key == "styles" ||
200
+ key == "accountResourceProvider"
208
201
  )
209
- >
210
- <#-- <#local out_seq += ["/*" + path?join(".") + "." + key + " excluded*/"]> -->
211
- <#continue>
212
- </#if>
213
-
214
- <#-- https://github.com/keycloakify/keycloakify/discussions/406 -->
215
- <#if (
216
- ["register.ftl", "register-user-profile.ftl", "terms.ftl", "info.ftl", "login.ftl", "login-update-password.ftl", "login-oauth2-device-verify-user-code.ftl"]?seq_contains(pageId) &&
217
- key == "attemptedUsername" && are_same_path(path, ["auth"])
218
- )>
219
- <#attempt>
220
- <#-- https://github.com/keycloak/keycloak/blob/3a2bf0c04bcde185e497aaa32d0bb7ab7520cf4a/themes/src/main/resources/theme/base/login/template.ftl#L63 -->
221
- <#if !(auth?has_content && auth.showUsername() && !auth.showResetCredentials())>
222
- <#local out_seq += ["/*" + path?join(".") + "." + key + " excluded*/"]>
223
- <#continue>
224
- </#if>
225
- <#recover>
226
- <#local out_seq += ["/*Accessing attemptedUsername throwed an exception */"]>
227
- </#attempt>
228
- </#if>
202
+ ) || (
203
+ key == "execution" &&
204
+ areSamePath(path, [])
205
+ ) || (
206
+ key == "entity" &&
207
+ areSamePath(path, ["user"])
208
+ ) || (
209
+ key == "attributes" &&
210
+ areSamePath(path, ["realm"])
211
+ ) || (
212
+ xKeycloakify.pageId == "index.ftl" &&
213
+ xKeycloakify.themeType == "account" &&
214
+ areSamePath(path, ["realm"]) &&
215
+ ![
216
+ "name",
217
+ "registrationEmailAsUsername",
218
+ "editUsernameAllowed",
219
+ "isInternationalizationEnabled",
220
+ "identityFederationEnabled",
221
+ "userManagedAccessAllowed"
222
+ ]?seq_contains(key)
223
+ )
224
+ >
225
+ <#-- <#local outSeq += ["/*" + path?join(".") + "." + key + " excluded*/"]> -->
226
+ <#continue>
227
+ </#if>
229
228
 
230
- USER_DEFINED_EXCLUSIONS_eKsaY4ZsZ4eMr2
231
-
229
+ <#-- https://github.com/keycloakify/keycloakify/discussions/406 -->
230
+ <#if (
231
+ key == "attemptedUsername" &&
232
+ areSamePath(path, ["auth"]) &&
233
+ [
234
+ "register.ftl", "terms.ftl", "info.ftl", "login.ftl",
235
+ "login-update-password.ftl", "login-oauth2-device-verify-user-code.ftl"
236
+ ]?seq_contains(xKeycloakify.pageId)
237
+ )>
232
238
  <#attempt>
233
- <#if !object[key]??>
239
+ <#-- https://github.com/keycloak/keycloak/blob/3a2bf0c04bcde185e497aaa32d0bb7ab7520cf4a/themes/src/main/resources/theme/base/login/template.ftl#L63 -->
240
+ <#if !(auth?has_content && auth.showUsername() && !auth.showResetCredentials())>
241
+ <#local outSeq += ["/*" + path?join(".") + "." + key + " excluded*/"]>
234
242
  <#continue>
235
243
  </#if>
236
244
  <#recover>
237
- <#local out_seq += ["/*Couldn't test if '" + key + "' is available on this object*/"]>
238
- <#continue>
245
+ <#local outSeq += ["/*Accessing attemptedUsername throwed an exception */"]>
239
246
  </#attempt>
247
+ </#if>
240
248
 
241
- <#local propertyValue = "">
249
+ {{userDefinedExclusions}}
242
250
 
243
- <#attempt>
244
- <#local propertyValue = object[key]>
245
- <#recover>
246
- <#local out_seq += ["/*Couldn't dereference '" + key + "' on this object*/"]>
251
+ <#attempt>
252
+ <#if !object[key]??>
247
253
  <#continue>
248
- </#attempt>
254
+ </#if>
255
+ <#recover>
256
+ <#local outSeq += ["/*Couldn't test if '" + key + "' is available on this object*/"]>
257
+ <#continue>
258
+ </#attempt>
249
259
 
250
- <#local rec_out = ftl_object_to_js_code_declaring_an_object(propertyValue, path + [ key ])>
260
+ <#local propertyValue = -1>
251
261
 
252
- <#if rec_out?starts_with("ABORT:")>
262
+ <#attempt>
263
+ <#local propertyValue = object[key]>
264
+ <#recover>
265
+ <#local outSeq += ["/*Couldn't dereference '" + key + "' on this object*/"]>
266
+ <#continue>
267
+ </#attempt>
253
268
 
254
- <#local errorMessage = rec_out?remove_beginning("ABORT:")>
269
+ <#local recOut = toJsDeclarationString(propertyValue, path + [ key ])>
255
270
 
256
- <#if errorMessage != " It's a method" >
257
- <#local out_seq += ["/*" + key + ": " + errorMessage + "*/"]>
258
- </#if>
271
+ <#if recOut?starts_with("ABORT:")>
259
272
 
260
- <#continue>
273
+ <#local errorMessage = recOut?remove_beginning("ABORT:")>
274
+
275
+ <#if errorMessage != " It's a method" >
276
+ <#local outSeq += ["/*" + key + ": " + errorMessage + "*/"]>
261
277
  </#if>
262
278
 
263
- <#local out_seq += ['"' + key + '": ' + rec_out + ","]>
279
+ <#continue>
280
+ </#if>
264
281
 
265
- </#list>
282
+ <#local outSeq += ['"' + key + '": ' + recOut + ","]>
266
283
 
267
- <#return (["{"] + out_seq?map(str -> ""?right_pad(4 * (path?size + 1)) + str) + [ ""?right_pad(4 * path?size) + "}"])?join("\n")>
284
+ </#list>
268
285
 
269
- </#if>
286
+ <#return (["{"] + outSeq?map(str -> ""?right_pad(4 * (path?size + 1)) + str) + [ ""?right_pad(4 * path?size) + "}"])?join("\n")>
270
287
 
271
- <#local isMethod = "">
272
- <#attempt>
273
- <#local isMethod = object?is_method>
274
- <#recover>
275
- <#return "ABORT: Can't test if it'sa method.">
276
- </#attempt>
288
+ </#if>
277
289
 
278
- <#if isMethod>
290
+ <#local isMethod = -1>
291
+ <#attempt>
292
+ <#local isMethod = object?is_method>
293
+ <#recover>
294
+ <#return "ABORT: Can't test if it'sa method.">
295
+ </#attempt>
279
296
 
280
- <#if are_same_path(path, ["auth", "showUsername"])>
281
- <#attempt>
282
- <#return auth.showUsername()?c>
283
- <#recover>
284
- <#return "ABORT: Couldn't evaluate auth.showUsername()">
285
- </#attempt>
286
- </#if>
297
+ <#if isMethod>
287
298
 
288
- <#if are_same_path(path, ["auth", "showResetCredentials"])>
289
- <#attempt>
290
- <#return auth.showResetCredentials()?c>
291
- <#recover>
292
- <#return "ABORT: Couldn't evaluate auth.showResetCredentials()">
293
- </#attempt>
294
- </#if>
299
+ <#if areSamePath(path, ["auth", "showUsername"])>
300
+ <#attempt>
301
+ <#return auth.showUsername()?c>
302
+ <#recover>
303
+ <#return "ABORT: Couldn't evaluate auth.showUsername()">
304
+ </#attempt>
305
+ </#if>
295
306
 
296
- <#if are_same_path(path, ["auth", "showTryAnotherWayLink"])>
297
- <#attempt>
298
- <#return auth.showTryAnotherWayLink()?c>
299
- <#recover>
300
- <#return "ABORT: Couldn't evaluate auth.showTryAnotherWayLink()">
301
- </#attempt>
302
- </#if>
307
+ <#if areSamePath(path, ["auth", "showResetCredentials"])>
308
+ <#attempt>
309
+ <#return auth.showResetCredentials()?c>
310
+ <#recover>
311
+ <#return "ABORT: Couldn't evaluate auth.showResetCredentials()">
312
+ </#attempt>
313
+ </#if>
314
+
315
+ <#if areSamePath(path, ["auth", "showTryAnotherWayLink"])>
316
+ <#attempt>
317
+ <#return auth.showTryAnotherWayLink()?c>
318
+ <#recover>
319
+ <#return "ABORT: Couldn't evaluate auth.showTryAnotherWayLink()">
320
+ </#attempt>
321
+ </#if>
322
+
323
+ <#if areSamePath(path, ["url", "getLogoutUrl"])>
324
+ <#local returnValue = -1>
325
+ <#attempt>
326
+ <#local returnValue = url.getLogoutUrl()>
327
+ <#recover>
328
+ <#return "ABORT: Couldn't evaluate url.getLogoutUrl()">
329
+ </#attempt>
330
+ <#return 'function(){ return "' + returnValue + '"; }'>
331
+ </#if>
303
332
 
304
- <#if are_same_path(path, ["url", "getLogoutUrl"])>
305
- <#local returnValue = "">
333
+ <#if areSamePath(path, ["totp", "policy", "getAlgorithmKey"])>
334
+ <#local returnValue = "error">
335
+ <#if mode?? && mode = "manual">
306
336
  <#attempt>
307
- <#local returnValue = url.getLogoutUrl()>
337
+ <#local returnValue = totp.policy.getAlgorithmKey()>
308
338
  <#recover>
309
- <#return "ABORT: Couldn't evaluate url.getLogoutUrl()">
339
+ <#return "ABORT: Couldn't evaluate totp.policy.getAlgorithmKey()">
310
340
  </#attempt>
311
- <#return 'function(){ return "' + returnValue + '"; }'>
312
341
  </#if>
342
+ <#return 'function(){ return "' + returnValue + '"; }'>
343
+ </#if>
313
344
 
314
- <#if are_same_path(path, ["totp", "policy", "getAlgorithmKey"])>
315
- <#local returnValue = "error">
316
- <#if mode?? && mode = "manual">
317
- <#attempt>
318
- <#local returnValue = totp.policy.getAlgorithmKey()>
319
- <#recover>
320
- <#return "ABORT: Couldn't evaluate totp.policy.getAlgorithmKey()">
321
- </#attempt>
345
+ <#assign fieldNames = [{{fieldNames}}]>
346
+ <#if profile?? && profile.attributes??>
347
+ <#list profile.attributes as attribute>
348
+ <#if fieldNames?seq_contains(attribute.name)>
349
+ <#continue>
322
350
  </#if>
323
- <#return 'function(){ return "' + returnValue + '"; }'>
324
- </#if>
325
-
326
- <#assign fieldNames = [ FIELD_NAMES_eKsIY4ZsZ4xeM ]>
327
- <#if profile?? && profile.attributes??>
328
- <#list profile.attributes as attribute>
329
- <#if fieldNames?seq_contains(attribute.name)>
330
- <#continue>
331
- </#if>
332
- <#assign fieldNames += [attribute.name]>
333
- </#list>
334
- </#if>
335
-
336
- <#if are_same_path(path, ["messagesPerField", "get"])>
337
-
338
- <#local jsFunctionCode = "function (fieldName) { ">
351
+ <#assign fieldNames += [attribute.name]>
352
+ </#list>
353
+ </#if>
339
354
 
340
- <#list fieldNames as fieldName>
355
+ <#if areSamePath(path, ["messagesPerField", "get"])>
341
356
 
342
- <#-- See: https://github.com/keycloakify/keycloakify/issues/217 -->
343
- <#if pageId == "login.ftl" >
357
+ <#local jsFunctionCode = "function (fieldName) { ">
344
358
 
345
- <#if fieldName == "username">
359
+ <#list fieldNames as fieldName>
346
360
 
347
- <#local jsFunctionCode += "if(fieldName === 'username' || fieldName === 'password' ){ ">
361
+ <#-- See: https://github.com/keycloakify/keycloakify/issues/217 -->
362
+ <#if xKeycloakify.pageId == "login.ftl" >
348
363
 
349
- <#if messagesPerField.exists('username') || messagesPerField.exists('password')>
350
- <#local jsFunctionCode += "return kcContext.message && kcContext.message.summary ? kcContext.message.summary : 'error'; ">
351
- <#else>
352
- <#local jsFunctionCode += "return ''; ">
353
- </#if>
364
+ <#if fieldName == "username">
354
365
 
355
- <#local jsFunctionCode += "} ">
366
+ <#local jsFunctionCode += "if(fieldName === 'username' || fieldName === 'password' ){ ">
356
367
 
357
- <#continue>
368
+ <#if messagesPerField.exists('username') || messagesPerField.exists('password')>
369
+ <#local jsFunctionCode += "return kcContext.message && kcContext.message.summary ? kcContext.message.summary : 'error'; ">
370
+ <#else>
371
+ <#local jsFunctionCode += "return ''; ">
358
372
  </#if>
359
373
 
360
- <#if fieldName == "password">
361
- <#continue>
362
- </#if>
374
+ <#local jsFunctionCode += "} ">
363
375
 
376
+ <#continue>
364
377
  </#if>
365
378
 
366
- <#local jsFunctionCode += "if(fieldName === '" + fieldName + "'){ ">
367
-
368
- <#if messagesPerField.exists('${fieldName}')>
369
- <#local jsFunctionCode += 'return decodeHtmlEntities("' + messagesPerField.get('${fieldName}')?js_string + '"); '>
370
- <#else>
371
- <#local jsFunctionCode += "return ''; ">
379
+ <#if fieldName == "password">
380
+ <#continue>
372
381
  </#if>
373
382
 
374
- <#local jsFunctionCode += "} ">
383
+ </#if>
375
384
 
376
- </#list>
385
+ <#local jsFunctionCode += "if(fieldName === '" + fieldName + "'){ ">
377
386
 
378
- <#local jsFunctionCode += "}">
387
+ <#if messagesPerField.exists('${fieldName}')>
388
+ <#local jsFunctionCode += 'return decodeHtmlEntities("' + messagesPerField.get('${fieldName}')?js_string + '"); '>
389
+ <#else>
390
+ <#local jsFunctionCode += "return ''; ">
391
+ </#if>
379
392
 
380
- <#return jsFunctionCode>
393
+ <#local jsFunctionCode += "} ">
381
394
 
382
- </#if>
395
+ </#list>
383
396
 
384
- <#if are_same_path(path, ["messagesPerField", "existsError"])>
397
+ <#local jsFunctionCode += "}">
385
398
 
386
- <#local jsFunctionCode = "function (fieldName) { ">
399
+ <#return jsFunctionCode>
387
400
 
388
- <#list fieldNames as fieldName>
401
+ </#if>
389
402
 
390
- <#-- See: https://github.com/keycloakify/keycloakify/issues/217 -->
391
- <#if pageId == "login.ftl" >
392
- <#if fieldName == "username">
403
+ <#if areSamePath(path, ["messagesPerField", "existsError"])>
393
404
 
394
- <#local jsFunctionCode += "if(fieldName === 'username' || fieldName === 'password' ){ ">
405
+ <#local jsFunctionCode = "function (fieldName) { ">
395
406
 
396
- <#if messagesPerField.existsError('username') || messagesPerField.existsError('password')>
397
- <#local jsFunctionCode += "return true; ">
398
- <#else>
399
- <#local jsFunctionCode += "return false; ">
400
- </#if>
407
+ <#list fieldNames as fieldName>
401
408
 
402
- <#local jsFunctionCode += "} ">
409
+ <#-- See: https://github.com/keycloakify/keycloakify/issues/217 -->
410
+ <#if xKeycloakify.pageId == "login.ftl" >
411
+ <#if fieldName == "username">
403
412
 
404
- <#continue>
405
- </#if>
413
+ <#local jsFunctionCode += "if(fieldName === 'username' || fieldName === 'password' ){ ">
406
414
 
407
- <#if fieldName == "password">
408
- <#continue>
415
+ <#if messagesPerField.existsError('username') || messagesPerField.existsError('password')>
416
+ <#local jsFunctionCode += "return true; ">
417
+ <#else>
418
+ <#local jsFunctionCode += "return false; ">
409
419
  </#if>
410
- </#if>
411
420
 
412
- <#local jsFunctionCode += "if(fieldName === '" + fieldName + "' ){ ">
421
+ <#local jsFunctionCode += "} ">
413
422
 
414
- <#if messagesPerField.existsError('${fieldName}')>
415
- <#local jsFunctionCode += 'return true; '>
416
- <#else>
417
- <#local jsFunctionCode += "return false; ">
423
+ <#continue>
418
424
  </#if>
419
425
 
420
- <#local jsFunctionCode += "}">
426
+ <#if fieldName == "password">
427
+ <#continue>
428
+ </#if>
429
+ </#if>
421
430
 
422
- </#list>
431
+ <#local jsFunctionCode += "if(fieldName === '" + fieldName + "' ){ ">
432
+
433
+ <#if messagesPerField.existsError('${fieldName}')>
434
+ <#local jsFunctionCode += 'return true; '>
435
+ <#else>
436
+ <#local jsFunctionCode += "return false; ">
437
+ </#if>
423
438
 
424
439
  <#local jsFunctionCode += "}">
425
440
 
426
- <#return jsFunctionCode>
441
+ </#list>
442
+
443
+ <#local jsFunctionCode += "}">
427
444
 
428
- </#if>
445
+ <#return jsFunctionCode>
429
446
 
430
- <#return "ABORT: It's a method">
431
447
  </#if>
432
448
 
433
- <#local isBoolean = "">
434
- <#attempt>
435
- <#local isBoolean = object?is_boolean>
436
- <#recover>
437
- <#return "ABORT: Can't test if it's a boolean">
438
- </#attempt>
439
-
440
- <#if isBoolean>
441
- <#return object?c>
449
+ <#if xKeycloakify.themeType == "account" && areSamePath(path, ["realm", "isInternationalizationEnabled"])>
450
+ <#attempt>
451
+ <#return realm.isInternationalizationEnabled()?c>
452
+ <#recover>
453
+ <#return "ABORT: Couldn't evaluate realm.isInternationalizationEnabled()">
454
+ </#attempt>
442
455
  </#if>
443
456
 
444
- <#local isEnumerable = "">
445
- <#attempt>
446
- <#local isEnumerable = object?is_enumerable>
447
- <#recover>
448
- <#return "ABORT: Can't test if it's an enumerable">
449
- </#attempt>
457
+ <#return "ABORT: It's a method">
458
+ </#if>
450
459
 
460
+ <#local isBoolean = -1>
461
+ <#attempt>
462
+ <#local isBoolean = object?is_boolean>
463
+ <#recover>
464
+ <#return "ABORT: Can't test if it's a boolean">
465
+ </#attempt>
451
466
 
452
- <#if isEnumerable>
467
+ <#if isBoolean>
468
+ <#return object?c>
469
+ </#if>
453
470
 
454
- <#local out_seq = []>
471
+ <#local isEnumerable = -1>
472
+ <#attempt>
473
+ <#local isEnumerable = object?is_enumerable>
474
+ <#recover>
475
+ <#return "ABORT: Can't test if it's an enumerable">
476
+ </#attempt>
455
477
 
456
- <#local i = 0>
457
478
 
458
- <#list object as array_item>
479
+ <#if isEnumerable>
459
480
 
460
- <#if !array_item??>
461
- <#local out_seq += ["null,"]>
462
- <#continue>
463
- </#if>
481
+ <#local outSeq = []>
464
482
 
465
- <#local rec_out = ftl_object_to_js_code_declaring_an_object(array_item, path + [ i ])>
483
+ <#local i = 0>
466
484
 
467
- <#local i = i + 1>
485
+ <#list object as array_item>
468
486
 
469
- <#if rec_out?starts_with("ABORT:")>
487
+ <#if !array_item??>
488
+ <#local outSeq += ["null,"]>
489
+ <#continue>
490
+ </#if>
470
491
 
471
- <#local errorMessage = rec_out?remove_beginning("ABORT:")>
492
+ <#local recOut = toJsDeclarationString(array_item, path + [ i ])>
472
493
 
473
- <#if errorMessage != " It's a method" >
474
- <#local out_seq += ["/*" + i?string + ": " + errorMessage + "*/"]>
475
- </#if>
494
+ <#local i = i + 1>
476
495
 
477
- <#continue>
496
+ <#if recOut?starts_with("ABORT:")>
497
+
498
+ <#local errorMessage = recOut?remove_beginning("ABORT:")>
499
+
500
+ <#if errorMessage != " It's a method" >
501
+ <#local outSeq += ["/*" + i?string + ": " + errorMessage + "*/"]>
478
502
  </#if>
479
503
 
480
- <#local out_seq += [rec_out + ","]>
504
+ <#continue>
505
+ </#if>
481
506
 
482
- </#list>
507
+ <#local outSeq += [recOut + ","]>
483
508
 
484
- <#return (["["] + out_seq?map(str -> ""?right_pad(4 * (path?size + 1)) + str) + [ ""?right_pad(4 * path?size) + "]"])?join("\n")>
509
+ </#list>
485
510
 
486
- </#if>
511
+ <#return (["["] + outSeq?map(str -> ""?right_pad(4 * (path?size + 1)) + str) + [ ""?right_pad(4 * path?size) + "]"])?join("\n")>
487
512
 
488
- <#local isDate = "">
489
- <#attempt>
490
- <#local isDate = object?is_date_like>
491
- <#recover>
492
- <#return "ABORT: Can't test if it's a date">
493
- </#attempt>
513
+ </#if>
494
514
 
495
- <#if isDate>
496
- <#return '"' + object?datetime?iso_utc + '"'>
497
- </#if>
515
+ <#local isDate = -1>
516
+ <#attempt>
517
+ <#local isDate = object?is_date_like>
518
+ <#recover>
519
+ <#return "ABORT: Can't test if it's a date">
520
+ </#attempt>
498
521
 
499
- <#local isNumber = "">
500
- <#attempt>
501
- <#local isNumber = object?is_number>
502
- <#recover>
503
- <#return "ABORT: Can't test if it's a number">
504
- </#attempt>
522
+ <#if isDate>
523
+ <#return '"' + object?datetime?iso_utc + '"'>
524
+ </#if>
505
525
 
506
- <#if isNumber>
507
- <#return object?c>
508
- </#if>
526
+ <#local isNumber = -1>
527
+ <#attempt>
528
+ <#local isNumber = object?is_number>
529
+ <#recover>
530
+ <#return "ABORT: Can't test if it's a number">
531
+ </#attempt>
509
532
 
510
- <#attempt>
511
- <#return '"' + object?js_string + '"'>;
512
- <#recover>
513
- </#attempt>
533
+ <#if isNumber>
534
+ <#return object?c>
535
+ </#if>
536
+
537
+ <#local isString = -1>
538
+ <#attempt>
539
+ <#local isString = object?is_string>
540
+ <#recover>
541
+ <#return "ABORT: Can't test if it's a string">
542
+ </#attempt>
543
+
544
+ <#if isString>
545
+ <@addToXKeycloakifyMessagesIfMessageKey str=object />
546
+ </#if>
547
+
548
+ <#attempt>
549
+ <#return '"' + object?js_string + '"'>;
550
+ <#recover>
551
+ </#attempt>
514
552
 
515
- <#return "ABORT: Couldn't convert into string non hash, non method, non boolean, non number, non enumerable object">
553
+ <#return "ABORT: Couldn't convert into string non hash, non method, non boolean, non number, non enumerable object">
516
554
 
517
555
  </#function>
518
- <#function is_subpath path searchedPath>
556
+ <#function isSubpath path searchedPath>
519
557
 
520
558
  <#if path?size < searchedPath?size>
521
559
  <#return false>
@@ -555,6 +593,75 @@ function decodeHtmlEntities(htmlStr){
555
593
 
556
594
  </#function>
557
595
 
558
- <#function are_same_path path searchedPath>
559
- <#return path?size == searchedPath?size && is_subpath(path, searchedPath)>
560
- </#function>
596
+ <#function areSamePath path searchedPath>
597
+ <#return path?size == searchedPath?size && isSubpath(path, searchedPath)>
598
+ </#function>
599
+
600
+ <#macro addToXKeycloakifyMessagesIfMessageKey str>
601
+ <#if !msg?? || !msg?is_method>
602
+ <#return>
603
+ </#if>
604
+ <#if (str?length > 200)>
605
+ <#return>
606
+ </#if>
607
+ <#local key=removeBrackets(str)>
608
+ <#if key?length==0>
609
+ <#return>
610
+ </#if>
611
+ <#if !(key?matches(r"^[a-zA-Z0-9-_.]*$"))>
612
+ <#return>
613
+ </#if>
614
+ <#local resolvedMsg=msg(key)>
615
+ <#if resolvedMsg==key>
616
+ <#return>
617
+ </#if>
618
+ <#local messages=xKeycloakify.messages>
619
+ <#local messages = messages + { key: resolvedMsg }>
620
+ <#assign xKeycloakify = xKeycloakify + { "messages": messages }>
621
+ </#macro>
622
+
623
+ <#function removeBrackets str>
624
+ <#if str?starts_with("${") && str?ends_with("}")>
625
+ <#return str[2..(str?length-2)]>
626
+ <#else>
627
+ <#return str>
628
+ </#if>
629
+ </#function>
630
+
631
+ <#macro addNonAutomaticallyGatherableMessagesToXKeycloakifyMessages>
632
+ <#if profile?? && profile?is_hash && profile.attributes?? && profile.attributes?is_enumerable>
633
+ <#list profile.attributes as attribute>
634
+ <#if !(
635
+ attribute.annotations?? && attribute.annotations?is_hash &&
636
+ attribute.annotations.inputOptionLabelsI18nPrefix?? && attribute.annotations.inputOptionLabelsI18nPrefix?is_string
637
+ )>
638
+ <#continue>
639
+ </#if>
640
+ <#local prefix=attribute.annotations.inputOptionLabelsI18nPrefix>
641
+ <#if !(
642
+ attribute.validators?? && attribute.validators?is_hash &&
643
+ attribute.validators.options?? && attribute.validators.options?is_hash &&
644
+ attribute.validators.options.options?? && attribute.validators.options.options?is_enumerable
645
+ )>
646
+ <#continue>
647
+ </#if>
648
+ <#list attribute.validators.options.options as option>
649
+ <#if !option?is_string>
650
+ <#continue>
651
+ </#if>
652
+ <@addToXKeycloakifyMessagesIfMessageKey str="${prefix}.${option}" />
653
+ </#list>
654
+ </#list>
655
+ </#if>
656
+ <#if xKeycloakify.pageId == "terms.ftl" || termsAcceptanceRequired?? && termsAcceptanceRequired>
657
+ <@addToXKeycloakifyMessagesIfMessageKey str="termsText" />
658
+ </#if>
659
+ <#if requiredActions?? && requiredActions?is_enumerable>
660
+ <#list requiredActions as requiredAction>
661
+ <#if !requiredAction?is_string>
662
+ <#continue>
663
+ </#if>
664
+ <@addToXKeycloakifyMessagesIfMessageKey str="requiredAction.${requiredAction}" />
665
+ </#list>
666
+ </#if>
667
+ </#macro>