keycloakify 10.0.0-rc.97 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/PUBLIC_URL.js +2 -2
  2. package/PUBLIC_URL.js.map +1 -1
  3. package/README.md +28 -242
  4. package/account/KcContext/KcContext.d.ts +4 -1
  5. package/account/KcContext/KcContext.js.map +1 -1
  6. package/account/KcContext/kcContextMocks.js +7 -4
  7. package/account/KcContext/kcContextMocks.js.map +1 -1
  8. package/account/Template.js +3 -1
  9. package/account/Template.js.map +1 -1
  10. package/account/i18n/GenericI18n.d.ts +6 -0
  11. package/account/i18n/GenericI18n.js +2 -0
  12. package/account/i18n/GenericI18n.js.map +1 -0
  13. package/account/i18n/i18n.d.ts +24 -30
  14. package/account/i18n/i18n.js +50 -70
  15. package/account/i18n/i18n.js.map +1 -1
  16. package/account/i18n/index.d.ts +4 -3
  17. package/account/i18n/index.js.map +1 -1
  18. package/account/i18n/messages_defaultSet/ar.js.map +1 -0
  19. package/account/i18n/messages_defaultSet/ca.js.map +1 -0
  20. package/account/i18n/messages_defaultSet/cs.js.map +1 -0
  21. package/account/i18n/messages_defaultSet/da.js.map +1 -0
  22. package/account/i18n/messages_defaultSet/de.js.map +1 -0
  23. package/account/i18n/messages_defaultSet/el.js.map +1 -0
  24. package/account/i18n/messages_defaultSet/en.js.map +1 -0
  25. package/account/i18n/messages_defaultSet/es.js.map +1 -0
  26. package/account/i18n/messages_defaultSet/fa.js.map +1 -0
  27. package/account/i18n/messages_defaultSet/fi.js.map +1 -0
  28. package/account/i18n/messages_defaultSet/fr.js.map +1 -0
  29. package/account/i18n/messages_defaultSet/hu.js.map +1 -0
  30. package/account/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  31. package/account/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  32. package/account/i18n/messages_defaultSet/index.js.map +1 -0
  33. package/account/i18n/messages_defaultSet/it.js.map +1 -0
  34. package/account/i18n/messages_defaultSet/ja.js.map +1 -0
  35. package/account/i18n/messages_defaultSet/lt.js.map +1 -0
  36. package/account/i18n/messages_defaultSet/lv.js.map +1 -0
  37. package/account/i18n/messages_defaultSet/nl.js.map +1 -0
  38. package/account/i18n/messages_defaultSet/no.js.map +1 -0
  39. package/account/i18n/messages_defaultSet/pl.js.map +1 -0
  40. package/account/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  41. package/account/i18n/messages_defaultSet/ru.js.map +1 -0
  42. package/account/i18n/messages_defaultSet/sk.js.map +1 -0
  43. package/account/i18n/messages_defaultSet/sv.js.map +1 -0
  44. package/account/i18n/messages_defaultSet/th.js.map +1 -0
  45. package/account/i18n/messages_defaultSet/tr.js.map +1 -0
  46. package/account/i18n/messages_defaultSet/uk.js.map +1 -0
  47. package/account/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  48. package/account/i18n/useI18n.d.ts +6 -5
  49. package/account/i18n/useI18n.js +37 -4
  50. package/account/i18n/useI18n.js.map +1 -1
  51. package/account/pages/Applications.js +1 -1
  52. package/account/pages/Applications.js.map +1 -1
  53. package/account/pages/FederatedIdentity.js +1 -1
  54. package/account/pages/FederatedIdentity.js.map +1 -1
  55. package/account/pages/Totp.js +5 -1
  56. package/account/pages/Totp.js.map +1 -1
  57. package/bin/193.index.js +5 -5
  58. package/bin/{490.index.js → 246.index.js} +22 -4
  59. package/bin/31.index.js +264 -203
  60. package/bin/440.index.js +178 -106
  61. package/bin/453.index.js +59 -7
  62. package/bin/526.index.js +525 -137
  63. package/bin/599.index.js +567 -0
  64. package/bin/{893.index.js → 622.index.js} +239 -231
  65. package/bin/{36.index.js → 678.index.js} +577 -71
  66. package/bin/{180.index.js → 697.index.js} +611 -526
  67. package/bin/743.index.js +70 -0
  68. package/bin/780.index.js +895 -0
  69. package/bin/786.index.js +185 -0
  70. package/bin/932.index.js +740 -52
  71. package/bin/{456.index.js → 941.index.js} +3 -1988
  72. package/bin/97.index.js +29 -7
  73. package/bin/main.js +1994 -8
  74. package/bin/shared/KeycloakVersionRange.d.ts +3 -3
  75. package/bin/shared/buildContext.d.ts +52 -16
  76. package/bin/shared/buildContext.js.map +1 -1
  77. package/bin/shared/constants.d.ts +18 -17
  78. package/bin/shared/constants.js +15 -14
  79. package/bin/shared/constants.js.map +1 -1
  80. package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -1
  81. package/bin/shared/downloadKeycloakDefaultTheme.js.map +1 -1
  82. package/bin/shared/generateKcGenTs.d.ts +3 -0
  83. package/bin/shared/generateKcGenTs.js.map +1 -1
  84. package/bin/shared/getLatestsSemVersionedTag.d.ts +15 -0
  85. package/bin/shared/getLatestsSemVersionedTag.js.map +1 -0
  86. package/bin/shared/promptKeycloakVersion.d.ts +3 -1
  87. package/bin/shared/promptKeycloakVersion.js.map +1 -1
  88. package/lib/getKcClsx.js +2 -1
  89. package/lib/getKcClsx.js.map +1 -1
  90. package/login/KcContext/KcContext.d.ts +10 -11
  91. package/login/KcContext/KcContext.js.map +1 -1
  92. package/login/KcContext/kcContextMocks.js +4 -5
  93. package/login/KcContext/kcContextMocks.js.map +1 -1
  94. package/login/Template.js +13 -7
  95. package/login/Template.js.map +1 -1
  96. package/login/TemplateProps.d.ts +0 -1
  97. package/login/UserProfileFormFields.js +6 -5
  98. package/login/UserProfileFormFields.js.map +1 -1
  99. package/login/i18n/GenericI18n.d.ts +6 -0
  100. package/login/i18n/GenericI18n.js +2 -0
  101. package/login/i18n/GenericI18n.js.map +1 -0
  102. package/login/i18n/i18n.d.ts +22 -32
  103. package/login/i18n/i18n.js +51 -92
  104. package/login/i18n/i18n.js.map +1 -1
  105. package/login/i18n/index.d.ts +4 -3
  106. package/login/i18n/index.js.map +1 -1
  107. package/login/i18n/messages_defaultSet/ar.js.map +1 -0
  108. package/login/i18n/messages_defaultSet/ca.js.map +1 -0
  109. package/login/i18n/messages_defaultSet/cs.js.map +1 -0
  110. package/login/i18n/messages_defaultSet/da.js.map +1 -0
  111. package/login/i18n/messages_defaultSet/de.js.map +1 -0
  112. package/login/i18n/messages_defaultSet/el.js.map +1 -0
  113. package/login/i18n/messages_defaultSet/en.js.map +1 -0
  114. package/login/i18n/messages_defaultSet/es.js.map +1 -0
  115. package/login/i18n/messages_defaultSet/fa.js.map +1 -0
  116. package/login/i18n/messages_defaultSet/fi.js.map +1 -0
  117. package/login/i18n/messages_defaultSet/fr.js.map +1 -0
  118. package/login/i18n/messages_defaultSet/hu.js.map +1 -0
  119. package/login/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  120. package/login/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  121. package/login/i18n/messages_defaultSet/index.js.map +1 -0
  122. package/login/i18n/messages_defaultSet/it.js.map +1 -0
  123. package/login/i18n/messages_defaultSet/ja.js.map +1 -0
  124. package/login/i18n/messages_defaultSet/lt.js.map +1 -0
  125. package/login/i18n/messages_defaultSet/lv.js.map +1 -0
  126. package/login/i18n/messages_defaultSet/nl.js.map +1 -0
  127. package/login/i18n/messages_defaultSet/no.js.map +1 -0
  128. package/login/i18n/messages_defaultSet/pl.js.map +1 -0
  129. package/login/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  130. package/login/i18n/messages_defaultSet/ru.js.map +1 -0
  131. package/login/i18n/messages_defaultSet/sk.js.map +1 -0
  132. package/login/i18n/messages_defaultSet/sv.js.map +1 -0
  133. package/login/i18n/messages_defaultSet/th.js.map +1 -0
  134. package/login/i18n/messages_defaultSet/tr.js.map +1 -0
  135. package/login/i18n/messages_defaultSet/uk.js.map +1 -0
  136. package/login/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  137. package/login/i18n/useI18n.d.ts +6 -5
  138. package/login/i18n/useI18n.js +37 -4
  139. package/login/i18n/useI18n.js.map +1 -1
  140. package/login/lib/useUserProfileForm.d.ts +2 -0
  141. package/login/lib/useUserProfileForm.js +44 -10
  142. package/login/lib/useUserProfileForm.js.map +1 -1
  143. package/login/pages/Error.js +1 -1
  144. package/login/pages/Error.js.map +1 -1
  145. package/login/pages/Info.js +15 -3
  146. package/login/pages/Info.js.map +1 -1
  147. package/login/pages/Login.js +6 -2
  148. package/login/pages/Login.js.map +1 -1
  149. package/login/pages/LoginConfigTotp.js +5 -1
  150. package/login/pages/LoginConfigTotp.js.map +1 -1
  151. package/login/pages/LoginOtp.js +3 -1
  152. package/login/pages/LoginOtp.js.map +1 -1
  153. package/login/pages/LoginPassword.js +3 -1
  154. package/login/pages/LoginPassword.js.map +1 -1
  155. package/login/pages/LoginRecoveryAuthnCodeInput.js +3 -1
  156. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  157. package/login/pages/LoginResetPassword.js +3 -1
  158. package/login/pages/LoginResetPassword.js.map +1 -1
  159. package/login/pages/LoginUpdatePassword.js +5 -1
  160. package/login/pages/LoginUpdatePassword.js.map +1 -1
  161. package/login/pages/Register.js +3 -1
  162. package/login/pages/Register.js.map +1 -1
  163. package/login/pages/SamlPostForm.js +1 -1
  164. package/login/pages/SamlPostForm.js.map +1 -1
  165. package/login/pages/SelectAuthenticator.js +2 -2
  166. package/login/pages/SelectAuthenticator.js.map +1 -1
  167. package/login/pages/WebauthnAuthenticate.js +3 -3
  168. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  169. package/login/pages/WebauthnRegister.js +2 -2
  170. package/package.json +267 -245
  171. package/src/PUBLIC_URL.ts +2 -2
  172. package/src/account/KcContext/KcContext.ts +4 -1
  173. package/src/account/KcContext/kcContextMocks.ts +7 -4
  174. package/src/account/Template.tsx +6 -1
  175. package/src/account/i18n/GenericI18n.tsx +6 -0
  176. package/src/account/i18n/i18n.tsx +91 -129
  177. package/src/account/i18n/index.ts +4 -3
  178. package/src/account/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  179. package/src/account/i18n/useI18n.tsx +95 -0
  180. package/src/account/pages/Applications.tsx +0 -1
  181. package/src/account/pages/FederatedIdentity.tsx +1 -1
  182. package/src/account/pages/Totp.tsx +16 -6
  183. package/src/bin/add-story.ts +42 -10
  184. package/src/bin/eject-page.ts +119 -11
  185. package/src/bin/initialize-account-theme/copyBoilerplate.ts +32 -0
  186. package/src/bin/initialize-account-theme/index.ts +1 -0
  187. package/src/bin/initialize-account-theme/initialize-account-theme.ts +112 -0
  188. package/src/bin/initialize-account-theme/initializeAccountTheme_multiPage.ts +21 -0
  189. package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +152 -0
  190. package/src/bin/initialize-account-theme/src/multi-page/KcContext.ts +12 -0
  191. package/src/bin/initialize-account-theme/src/multi-page/KcPage.tsx +25 -0
  192. package/src/bin/initialize-account-theme/src/multi-page/KcPageStory.tsx +38 -0
  193. package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +5 -0
  194. package/src/bin/initialize-account-theme/src/single-page/KcContext.ts +7 -0
  195. package/src/bin/initialize-account-theme/src/single-page/KcPage.tsx +11 -0
  196. package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +92 -0
  197. package/src/bin/initialize-email-theme.ts +1 -1
  198. package/src/bin/keycloakify/buildJars/buildJar.ts +38 -24
  199. package/src/bin/keycloakify/buildJars/buildJars.ts +6 -3
  200. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +5 -5
  201. package/src/bin/keycloakify/generateFtl/generateFtl.ts +16 -16
  202. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +471 -364
  203. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +7 -7
  204. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +3 -3
  205. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +125 -59
  206. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +2 -2
  207. package/src/bin/keycloakify/generateResources/readExtraPageNames.ts +5 -8
  208. package/src/bin/keycloakify/keycloakify.ts +8 -6
  209. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +41 -27
  210. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +2 -2
  211. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +6 -6
  212. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +4 -4
  213. package/src/bin/main.ts +19 -2
  214. package/src/bin/shared/KeycloakVersionRange.ts +4 -4
  215. package/src/bin/shared/buildContext.ts +360 -251
  216. package/src/bin/shared/constants.ts +19 -17
  217. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +6 -6
  218. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +48 -27
  219. package/src/bin/shared/downloadKeycloakStaticResources.ts +2 -2
  220. package/src/bin/shared/generateKcGenTs.ts +110 -3
  221. package/src/bin/shared/getLatestsSemVersionedTag.ts +201 -0
  222. package/src/bin/shared/promptKeycloakVersion.ts +20 -80
  223. package/src/bin/start-keycloak/appBuild.ts +15 -11
  224. package/src/bin/start-keycloak/keycloakifyBuild.ts +3 -3
  225. package/src/bin/start-keycloak/myrealm-realm-18.json +4 -4
  226. package/src/bin/start-keycloak/myrealm-realm-19.json +4 -4
  227. package/src/bin/start-keycloak/myrealm-realm-20.json +4 -4
  228. package/src/bin/start-keycloak/myrealm-realm-21.json +4 -4
  229. package/src/bin/start-keycloak/myrealm-realm-23.json +3 -3
  230. package/src/bin/start-keycloak/myrealm-realm-24.json +4 -4
  231. package/src/bin/start-keycloak/myrealm-realm-25.json +4 -4
  232. package/src/bin/start-keycloak/start-keycloak.ts +256 -102
  233. package/src/bin/tools/assertNoPnpmDlx.ts +17 -0
  234. package/src/bin/tools/downloadAndExtractArchive.ts +10 -9
  235. package/src/bin/tools/fetchProxyOptions.ts +32 -11
  236. package/src/bin/tools/npmInstall.ts +63 -0
  237. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +3 -2
  238. package/src/bin/tsconfig.json +3 -1
  239. package/src/lib/getKcClsx.ts +2 -2
  240. package/src/login/KcContext/KcContext.ts +10 -28
  241. package/src/login/KcContext/kcContextMocks.ts +5 -6
  242. package/src/login/Template.tsx +32 -54
  243. package/src/login/TemplateProps.ts +0 -1
  244. package/src/login/UserProfileFormFields.tsx +15 -11
  245. package/src/login/i18n/GenericI18n.tsx +6 -0
  246. package/src/login/i18n/i18n.tsx +91 -166
  247. package/src/login/i18n/index.ts +4 -3
  248. package/src/login/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  249. package/src/login/i18n/useI18n.tsx +95 -0
  250. package/src/login/lib/useUserProfileForm.tsx +68 -20
  251. package/src/login/pages/Error.tsx +1 -1
  252. package/src/login/pages/Info.tsx +26 -6
  253. package/src/login/pages/Login.tsx +20 -9
  254. package/src/login/pages/LoginConfigTotp.tsx +16 -6
  255. package/src/login/pages/LoginOtp.tsx +8 -3
  256. package/src/login/pages/LoginPassword.tsx +8 -3
  257. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +8 -3
  258. package/src/login/pages/LoginResetPassword.tsx +8 -3
  259. package/src/login/pages/LoginUpdatePassword.tsx +55 -47
  260. package/src/login/pages/Register.tsx +8 -3
  261. package/src/login/pages/SamlPostForm.tsx +1 -1
  262. package/src/login/pages/SelectAuthenticator.tsx +4 -4
  263. package/src/login/pages/WebauthnAuthenticate.tsx +5 -5
  264. package/src/login/pages/WebauthnRegister.tsx +2 -2
  265. package/src/tools/useInsertLinkTags.ts +9 -1
  266. package/src/tools/useInsertScriptTags.ts +9 -1
  267. package/src/vite-plugin/vite-plugin.ts +15 -13
  268. package/stories/account/pages/Applications.stories.tsx +80 -0
  269. package/stories/account/pages/Log.stories.tsx +1 -0
  270. package/stories/account-spa/index.stories.tsx +94 -0
  271. package/stories/intro/intro.stories.tsx +90 -0
  272. package/stories/login/pages/Info.stories.tsx +7 -2
  273. package/stories/login/pages/Login.stories.tsx +25 -13
  274. package/stories/login/pages/Register.stories.tsx +11 -9
  275. package/stories/login/pages/SelectAuthenticator.stories.tsx +41 -0
  276. package/stories/login/pages/Terms.stories.tsx +6 -2
  277. package/tools/useInsertLinkTags.js +7 -1
  278. package/tools/useInsertLinkTags.js.map +1 -1
  279. package/tools/useInsertScriptTags.js +7 -1
  280. package/tools/useInsertScriptTags.js.map +1 -1
  281. package/vite-plugin/index.js +25820 -25686
  282. package/vite-plugin/vite-plugin.d.ts +6 -4
  283. package/account/i18n/baseMessages/ar.js.map +0 -1
  284. package/account/i18n/baseMessages/ca.js.map +0 -1
  285. package/account/i18n/baseMessages/cs.js.map +0 -1
  286. package/account/i18n/baseMessages/da.js.map +0 -1
  287. package/account/i18n/baseMessages/de.js.map +0 -1
  288. package/account/i18n/baseMessages/el.js.map +0 -1
  289. package/account/i18n/baseMessages/en.js.map +0 -1
  290. package/account/i18n/baseMessages/es.js.map +0 -1
  291. package/account/i18n/baseMessages/fa.js.map +0 -1
  292. package/account/i18n/baseMessages/fi.js.map +0 -1
  293. package/account/i18n/baseMessages/fr.js.map +0 -1
  294. package/account/i18n/baseMessages/hu.js.map +0 -1
  295. package/account/i18n/baseMessages/index.js.map +0 -1
  296. package/account/i18n/baseMessages/it.js.map +0 -1
  297. package/account/i18n/baseMessages/ja.js.map +0 -1
  298. package/account/i18n/baseMessages/lt.js.map +0 -1
  299. package/account/i18n/baseMessages/lv.js.map +0 -1
  300. package/account/i18n/baseMessages/nl.js.map +0 -1
  301. package/account/i18n/baseMessages/no.js.map +0 -1
  302. package/account/i18n/baseMessages/pl.js.map +0 -1
  303. package/account/i18n/baseMessages/pt-BR.js.map +0 -1
  304. package/account/i18n/baseMessages/ru.js.map +0 -1
  305. package/account/i18n/baseMessages/sk.js.map +0 -1
  306. package/account/i18n/baseMessages/sv.js.map +0 -1
  307. package/account/i18n/baseMessages/th.js.map +0 -1
  308. package/account/i18n/baseMessages/tr.js.map +0 -1
  309. package/account/i18n/baseMessages/uk.js.map +0 -1
  310. package/account/i18n/baseMessages/zh-CN.js.map +0 -1
  311. package/bin/538.index.js +0 -108
  312. package/login/i18n/baseMessages/ar.js.map +0 -1
  313. package/login/i18n/baseMessages/ca.js.map +0 -1
  314. package/login/i18n/baseMessages/cs.js.map +0 -1
  315. package/login/i18n/baseMessages/da.js.map +0 -1
  316. package/login/i18n/baseMessages/de.js.map +0 -1
  317. package/login/i18n/baseMessages/el.js.map +0 -1
  318. package/login/i18n/baseMessages/en.js.map +0 -1
  319. package/login/i18n/baseMessages/es.js.map +0 -1
  320. package/login/i18n/baseMessages/fa.js.map +0 -1
  321. package/login/i18n/baseMessages/fi.js.map +0 -1
  322. package/login/i18n/baseMessages/fr.js.map +0 -1
  323. package/login/i18n/baseMessages/hu.js.map +0 -1
  324. package/login/i18n/baseMessages/index.js.map +0 -1
  325. package/login/i18n/baseMessages/it.js.map +0 -1
  326. package/login/i18n/baseMessages/ja.js.map +0 -1
  327. package/login/i18n/baseMessages/lt.js.map +0 -1
  328. package/login/i18n/baseMessages/lv.js.map +0 -1
  329. package/login/i18n/baseMessages/nl.js.map +0 -1
  330. package/login/i18n/baseMessages/no.js.map +0 -1
  331. package/login/i18n/baseMessages/pl.js.map +0 -1
  332. package/login/i18n/baseMessages/pt-BR.js.map +0 -1
  333. package/login/i18n/baseMessages/ru.js.map +0 -1
  334. package/login/i18n/baseMessages/sk.js.map +0 -1
  335. package/login/i18n/baseMessages/sv.js.map +0 -1
  336. package/login/i18n/baseMessages/th.js.map +0 -1
  337. package/login/i18n/baseMessages/tr.js.map +0 -1
  338. package/login/i18n/baseMessages/uk.js.map +0 -1
  339. package/login/i18n/baseMessages/zh-CN.js.map +0 -1
  340. package/src/account/i18n/useI18n.ts +0 -44
  341. package/src/login/i18n/useI18n.ts +0 -44
  342. package/src/tools/ExtractAfterStartingWith.ts +0 -4
  343. package/tools/ExtractAfterStartingWith.d.ts +0 -1
  344. package/tools/ExtractAfterStartingWith.js +0 -2
  345. package/tools/ExtractAfterStartingWith.js.map +0 -1
  346. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  347. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  348. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  349. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  350. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  351. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  352. /package/account/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  353. /package/account/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  354. /package/account/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  355. /package/account/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  356. /package/account/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  357. /package/account/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  358. /package/account/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  359. /package/account/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  360. /package/account/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  361. /package/account/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  362. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  363. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  364. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  365. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  366. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  367. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  368. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  369. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  370. /package/account/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  371. /package/account/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  372. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  373. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  374. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  375. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  376. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  377. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  378. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  379. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  380. /package/account/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  381. /package/account/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  382. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  383. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  384. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  385. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  386. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  387. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  388. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  389. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  390. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  391. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  392. /package/account/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  393. /package/account/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  394. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  395. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  396. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  397. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  398. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  399. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  400. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  401. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  402. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  403. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  404. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  405. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  406. /package/login/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  407. /package/login/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  408. /package/login/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  409. /package/login/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  410. /package/login/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  411. /package/login/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  412. /package/login/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  413. /package/login/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  414. /package/login/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  415. /package/login/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  416. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  417. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  418. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  419. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  420. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  421. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  422. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  423. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  424. /package/login/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  425. /package/login/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  426. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  427. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  428. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  429. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  430. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  431. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  432. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  433. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  434. /package/login/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  435. /package/login/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  436. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  437. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  438. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  439. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  440. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  441. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  442. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  443. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  444. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  445. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  446. /package/login/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  447. /package/login/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  448. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  449. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  450. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  451. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  452. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  453. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  454. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  455. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  456. /package/src/account/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  457. /package/src/account/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  458. /package/src/account/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  459. /package/src/account/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  460. /package/src/account/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  461. /package/src/account/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  462. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  463. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  464. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  465. /package/src/account/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  466. /package/src/account/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  467. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  468. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  469. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  470. /package/src/account/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  471. /package/src/account/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  472. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  473. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  474. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  475. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  476. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  477. /package/src/account/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  478. /package/src/account/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  479. /package/src/account/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  480. /package/src/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
  481. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  482. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  483. /package/src/login/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  484. /package/src/login/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  485. /package/src/login/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  486. /package/src/login/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  487. /package/src/login/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  488. /package/src/login/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  489. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  490. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  491. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  492. /package/src/login/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  493. /package/src/login/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  494. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  495. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  496. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  497. /package/src/login/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  498. /package/src/login/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  499. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  500. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  501. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  502. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  503. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  504. /package/src/login/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  505. /package/src/login/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  506. /package/src/login/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  507. /package/src/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
package/src/PUBLIC_URL.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { basenameOfTheKeycloakifyResourcesDir } from "keycloakify/bin/shared/constants";
1
+ import { BASENAME_OF_KEYCLOAKIFY_RESOURCES_DIR } from "keycloakify/bin/shared/constants";
2
2
  import { assert } from "tsafe/assert";
3
3
 
4
4
  /**
@@ -17,5 +17,5 @@ export const PUBLIC_URL = (() => {
17
17
  return process.env.PUBLIC_URL;
18
18
  }
19
19
 
20
- return `${kcContext.url.resourcesPath}/${basenameOfTheKeycloakifyResourcesDir}`;
20
+ return `${kcContext.url.resourcesPath}/${BASENAME_OF_KEYCLOAKIFY_RESOURCES_DIR}`;
21
21
  })();
@@ -118,7 +118,10 @@ export declare namespace KcContext {
118
118
  lastName?: string;
119
119
  username?: string;
120
120
  };
121
- properties: Record<string, string | undefined>;
121
+ properties: {};
122
+ "x-keycloakify": {
123
+ messages: Record<string, string>;
124
+ };
122
125
  };
123
126
 
124
127
  export type Password = Common & {
@@ -1,10 +1,10 @@
1
1
  import "keycloakify/tools/Object.fromEntries";
2
- import { resources_common, keycloak_resources } from "keycloakify/bin/shared/constants";
2
+ import { RESOURCES_COMMON, KEYCLOAK_RESOURCES } from "keycloakify/bin/shared/constants";
3
3
  import { id } from "tsafe/id";
4
4
  import type { KcContext } from "./KcContext";
5
5
  import { BASE_URL } from "keycloakify/lib/BASE_URL";
6
6
 
7
- const resourcesPath = `${BASE_URL}${keycloak_resources}/account/resources`;
7
+ const resourcesPath = `${BASE_URL}${KEYCLOAK_RESOURCES}/account/resources`;
8
8
 
9
9
  export const kcContextCommonMock: KcContext.Common = {
10
10
  themeVersion: "0.0.0",
@@ -13,7 +13,7 @@ export const kcContextCommonMock: KcContext.Common = {
13
13
  themeName: "my-theme-name",
14
14
  url: {
15
15
  resourcesPath,
16
- resourcesCommonPath: `${resourcesPath}/${resources_common}`,
16
+ resourcesCommonPath: `${resourcesPath}/${RESOURCES_COMMON}`,
17
17
  resourceUrl: "#",
18
18
  accountUrl: "#",
19
19
  applicationsUrl: "#",
@@ -82,7 +82,10 @@ export const kcContextCommonMock: KcContext.Common = {
82
82
  email: "john.doe@code.gouv.fr",
83
83
  username: "doe_j"
84
84
  },
85
- properties: {}
85
+ properties: {},
86
+ "x-keycloakify": {
87
+ messages: {}
88
+ }
86
89
  };
87
90
 
88
91
  export const kcContextMocks: KcContext[] = [
@@ -145,7 +145,12 @@ export default function Template(props: TemplateProps<KcContext, I18n>) {
145
145
  <div className={clsx("alert", `alert-${message.type}`)}>
146
146
  {message.type === "success" && <span className="pficon pficon-ok"></span>}
147
147
  {message.type === "error" && <span className="pficon pficon-error-circle-o"></span>}
148
- <span className="kc-feedback-text">{message.summary}</span>
148
+ <span
149
+ className="kc-feedback-text"
150
+ dangerouslySetInnerHTML={{
151
+ __html: message.summary
152
+ }}
153
+ />
149
154
  </div>
150
155
  )}
151
156
 
@@ -0,0 +1,6 @@
1
+ import type { GenericI18n_noJsx } from "./i18n";
2
+
3
+ export type GenericI18n<MessageKey extends string> = GenericI18n_noJsx<MessageKey> & {
4
+ msg: (key: MessageKey, ...args: (string | undefined)[]) => JSX.Element;
5
+ advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
6
+ };
@@ -1,22 +1,24 @@
1
1
  import "keycloakify/tools/Object.fromEntries";
2
2
  import { assert } from "tsafe/assert";
3
- import messages_fallbackLanguage from "./baseMessages/en";
4
- import { getMessages } from "./baseMessages";
3
+ import messages_defaultSet_fallbackLanguage from "./messages_defaultSet/en";
4
+ import { fetchMessages_defaultSet } from "./messages_defaultSet";
5
5
  import type { KcContext } from "../KcContext";
6
- import { fallbackLanguageTag } from "keycloakify/bin/shared/constants";
6
+ import { FALLBACK_LANGUAGE_TAG } from "keycloakify/bin/shared/constants";
7
+ import { id } from "tsafe/id";
7
8
 
8
9
  export type KcContextLike = {
9
10
  locale?: {
10
11
  currentLanguageTag: string;
11
12
  supported: { languageTag: string; url: string; label: string }[];
12
13
  };
14
+ "x-keycloakify": {
15
+ messages: Record<string, string>;
16
+ };
13
17
  };
14
18
 
15
19
  assert<KcContext extends KcContextLike ? true : false>();
16
20
 
17
- export type MessageKey = keyof typeof messages_fallbackLanguage;
18
-
19
- export type GenericI18n<MessageKey extends string> = {
21
+ export type GenericI18n_noJsx<MessageKey extends string> = {
20
22
  /**
21
23
  * e.g: "en", "fr", "zh-CN"
22
24
  *
@@ -36,16 +38,21 @@ export type GenericI18n<MessageKey extends string> = {
36
38
  * */
37
39
  labelBySupportedLanguageTag: Record<string, string>;
38
40
  /**
41
+ *
39
42
  * Examples assuming currentLanguageTag === "en"
43
+ * {
44
+ * en: {
45
+ * "access-denied": "Access denied",
46
+ * "impersonateTitleHtml": "<strong>{0}</strong> Impersonate User",
47
+ * "bar": "Bar {0}"
48
+ * }
49
+ * }
40
50
  *
41
- * msg("access-denied") === <span>Access denied</span>
42
- * msg("impersonateTitleHtml", "Foo") === <span><strong>Foo</strong> Impersonate User</span>
43
- */
44
- msg: (key: MessageKey, ...args: (string | undefined)[]) => JSX.Element;
45
- /**
46
- * It's the same thing as msg() but instead of returning a JSX.Element it returns a string.
47
- * It can be more convenient to manipulate strings but if there are HTML tags it wont render.
51
+ * msgStr("access-denied") === "Access denied"
52
+ * msgStr("not-a-message-key") Throws an error
48
53
  * msgStr("impersonateTitleHtml", "Foo") === "<strong>Foo</strong> Impersonate User"
54
+ * msgStr("${bar}", "<strong>c</strong>") === "Bar &lt;strong&gt;XXX&lt;/strong&gt;"
55
+ * The html in the arg is partially escaped for security reasons, it might come from an untrusted source, it's not safe to render it as html.
49
56
  */
50
57
  msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
51
58
  /**
@@ -56,24 +63,11 @@ export type GenericI18n<MessageKey extends string> = {
56
63
  * {
57
64
  * en: {
58
65
  * "access-denied": "Access denied",
59
- * "foo": "Foo {0} {1}",
60
- * "bar": "Bar {0}"
61
66
  * }
62
67
  * }
63
68
  *
64
- * advancedMsg("${access-denied} foo bar") === <span>{msgStr("access-denied")} foo bar<span> === <span>Access denied foo bar</span>
65
- * advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied") === <span>Access denied</span>
66
- * advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === <span>not-a-message-key</span>
67
- * advancedMsg("${bar}", "<strong>c</strong>")
68
- * === <span>{msgStr("bar", "<strong>XXX</strong>")}<span>
69
- * === <span>Bar &lt;strong&gt;XXX&lt;/strong&gt;</span> (The html in the arg is partially escaped for security reasons, it might be untrusted)
70
- * advancedMsg("${foo} xx ${bar}", "a", "b", "c")
71
- * === <span>{msgStr("foo", "a", "b")} xx {msgStr("bar")}<span>
72
- * === <span>Foo a b xx Bar {0}</span> (The substitution are only applied in the first message)
73
- */
74
- advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
75
- /**
76
- * See advancedMsg() but instead of returning a JSX.Element it returns a string.
69
+ * advancedMsgStr("${access-denied}") === advancedMsgStr("access-denied") === msgStr("access-denied") === "Access denied"
70
+ * advancedMsgStr("${not-a-message-key}") === advancedMsgStr("not-a-message-key") === "not-a-message-key"
77
71
  */
78
72
  advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string;
79
73
 
@@ -85,10 +79,12 @@ export type GenericI18n<MessageKey extends string> = {
85
79
  isFetchingTranslations: boolean;
86
80
  };
87
81
 
88
- export function createGetI18n<ExtraMessageKey extends string = never>(messageBundle: {
89
- [languageTag: string]: { [key in ExtraMessageKey]: string };
82
+ export type MessageKey_defaultSet = keyof typeof messages_defaultSet_fallbackLanguage;
83
+
84
+ export function createGetI18n<MessageKey_themeDefined extends string = never>(messagesByLanguageTag_themeDefined: {
85
+ [languageTag: string]: { [key in MessageKey_themeDefined]: string };
90
86
  }) {
91
- type I18n = GenericI18n<MessageKey | ExtraMessageKey>;
87
+ type I18n = GenericI18n_noJsx<MessageKey_defaultSet | MessageKey_themeDefined>;
92
88
 
93
89
  type Result = { i18n: I18n; prI18n_currentLanguage: Promise<I18n> | undefined };
94
90
 
@@ -108,7 +104,7 @@ export function createGetI18n<ExtraMessageKey extends string = never>(messageBun
108
104
  }
109
105
 
110
106
  const partialI18n: Pick<I18n, "currentLanguageTag" | "getChangeLocaleUrl" | "labelBySupportedLanguageTag"> = {
111
- currentLanguageTag: kcContext.locale?.currentLanguageTag ?? fallbackLanguageTag,
107
+ currentLanguageTag: kcContext.locale?.currentLanguageTag ?? FALLBACK_LANGUAGE_TAG,
112
108
  getChangeLocaleUrl: newLanguageTag => {
113
109
  const { locale } = kcContext;
114
110
 
@@ -123,30 +119,38 @@ export function createGetI18n<ExtraMessageKey extends string = never>(messageBun
123
119
  labelBySupportedLanguageTag: Object.fromEntries((kcContext.locale?.supported ?? []).map(({ languageTag, label }) => [languageTag, label]))
124
120
  };
125
121
 
126
- const { createI18nTranslationFunctions } = createI18nTranslationFunctionsFactory<MessageKey, ExtraMessageKey>({
127
- messages_fallbackLanguage,
128
- messageBundle_fallbackLanguage: messageBundle[fallbackLanguageTag],
129
- messageBundle_currentLanguage: messageBundle[partialI18n.currentLanguageTag]
122
+ const { createI18nTranslationFunctions } = createI18nTranslationFunctionsFactory<MessageKey_themeDefined>({
123
+ messages_themeDefined:
124
+ messagesByLanguageTag_themeDefined[partialI18n.currentLanguageTag] ??
125
+ messagesByLanguageTag_themeDefined[FALLBACK_LANGUAGE_TAG] ??
126
+ (() => {
127
+ const firstLanguageTag = Object.keys(messagesByLanguageTag_themeDefined)[0];
128
+ if (firstLanguageTag === undefined) {
129
+ return undefined;
130
+ }
131
+ return messagesByLanguageTag_themeDefined[firstLanguageTag];
132
+ })(),
133
+ messages_fromKcServer: kcContext["x-keycloakify"].messages
130
134
  });
131
135
 
132
- const isCurrentLanguageFallbackLanguage = partialI18n.currentLanguageTag === fallbackLanguageTag;
136
+ const isCurrentLanguageFallbackLanguage = partialI18n.currentLanguageTag === FALLBACK_LANGUAGE_TAG;
133
137
 
134
138
  const result: Result = {
135
139
  i18n: {
136
140
  ...partialI18n,
137
141
  ...createI18nTranslationFunctions({
138
- messages_currentLanguage: isCurrentLanguageFallbackLanguage ? messages_fallbackLanguage : undefined
142
+ messages_defaultSet_currentLanguage: isCurrentLanguageFallbackLanguage ? messages_defaultSet_fallbackLanguage : undefined
139
143
  }),
140
144
  isFetchingTranslations: !isCurrentLanguageFallbackLanguage
141
145
  },
142
146
  prI18n_currentLanguage: isCurrentLanguageFallbackLanguage
143
147
  ? undefined
144
148
  : (async () => {
145
- const messages_currentLanguage = await getMessages(partialI18n.currentLanguageTag);
149
+ const messages_defaultSet_currentLanguage = await fetchMessages_defaultSet(partialI18n.currentLanguageTag);
146
150
 
147
151
  const i18n_currentLanguage: I18n = {
148
152
  ...partialI18n,
149
- ...createI18nTranslationFunctions({ messages_currentLanguage }),
153
+ ...createI18nTranslationFunctions({ messages_defaultSet_currentLanguage }),
150
154
  isFetchingTranslations: false
151
155
  };
152
156
 
@@ -169,118 +173,76 @@ export function createGetI18n<ExtraMessageKey extends string = never>(messageBun
169
173
  return { getI18n };
170
174
  }
171
175
 
172
- function createI18nTranslationFunctionsFactory<MessageKey extends string, ExtraMessageKey extends string>(params: {
173
- messages_fallbackLanguage: Record<MessageKey, string>;
174
- messageBundle_fallbackLanguage: Record<ExtraMessageKey, string> | undefined;
175
- messageBundle_currentLanguage: Partial<Record<ExtraMessageKey, string>> | undefined;
176
+ function createI18nTranslationFunctionsFactory<MessageKey_themeDefined extends string>(params: {
177
+ messages_themeDefined: Record<MessageKey_themeDefined, string> | undefined;
178
+ messages_fromKcServer: Record<string, string>;
176
179
  }) {
177
- const { messageBundle_currentLanguage } = params;
178
-
179
- const messages_fallbackLanguage = {
180
- ...params.messages_fallbackLanguage,
181
- ...params.messageBundle_fallbackLanguage
182
- };
180
+ const { messages_themeDefined, messages_fromKcServer } = params;
183
181
 
184
182
  function createI18nTranslationFunctions(params: {
185
- messages_currentLanguage: Partial<Record<MessageKey, string>> | undefined;
186
- }): Pick<GenericI18n<MessageKey | ExtraMessageKey>, "msg" | "msgStr" | "advancedMsg" | "advancedMsgStr"> {
187
- const messages_currentLanguage = {
188
- ...params.messages_currentLanguage,
189
- ...messageBundle_currentLanguage
190
- };
183
+ messages_defaultSet_currentLanguage: Partial<Record<MessageKey_defaultSet, string>> | undefined;
184
+ }): Pick<GenericI18n_noJsx<MessageKey_defaultSet | MessageKey_themeDefined>, "msgStr" | "advancedMsgStr"> {
185
+ const { messages_defaultSet_currentLanguage } = params;
191
186
 
192
- function resolveMsg(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): string | JSX.Element | undefined {
193
- const { key, args, doRenderAsHtml } = props;
187
+ function resolveMsg(props: { key: string; args: (string | undefined)[] }): string | undefined {
188
+ const { key, args } = props;
194
189
 
195
- const messageOrUndefined: string | undefined = (messages_currentLanguage as any)[key] ?? (messages_fallbackLanguage as any)[key];
190
+ const message =
191
+ id<Record<string, string | undefined>>(messages_fromKcServer)[key] ??
192
+ id<Record<string, string | undefined> | undefined>(messages_themeDefined)?.[key] ??
193
+ id<Record<string, string | undefined> | undefined>(messages_defaultSet_currentLanguage)?.[key] ??
194
+ id<Record<string, string | undefined>>(messages_defaultSet_fallbackLanguage)[key];
196
195
 
197
- if (messageOrUndefined === undefined) {
196
+ if (message === undefined) {
198
197
  return undefined;
199
198
  }
200
199
 
201
- const message = messageOrUndefined;
200
+ const startIndex = message
201
+ .match(/{[0-9]+}/g)
202
+ ?.map(g => g.match(/{([0-9]+)}/)![1])
203
+ .map(indexStr => parseInt(indexStr))
204
+ .sort((a, b) => a - b)[0];
202
205
 
203
- const messageWithArgsInjectedIfAny = (() => {
204
- const startIndex = message
205
- .match(/{[0-9]+}/g)
206
- ?.map(g => g.match(/{([0-9]+)}/)![1])
207
- .map(indexStr => parseInt(indexStr))
208
- .sort((a, b) => a - b)[0];
206
+ if (startIndex === undefined) {
207
+ // No {0} in message (no arguments expected)
208
+ return message;
209
+ }
209
210
 
210
- if (startIndex === undefined) {
211
- // No {0} in message (no arguments expected)
212
- return message;
213
- }
211
+ let messageWithArgsInjected = message;
214
212
 
215
- let messageWithArgsInjected = message;
213
+ args.forEach((arg, i) => {
214
+ if (arg === undefined) {
215
+ return;
216
+ }
216
217
 
217
- args.forEach((arg, i) => {
218
- if (arg === undefined) {
219
- return;
220
- }
218
+ messageWithArgsInjected = messageWithArgsInjected.replace(
219
+ new RegExp(`\\{${i + startIndex}\\}`, "g"),
220
+ arg.replace(/</g, "&lt;").replace(/>/g, "&gt;")
221
+ );
222
+ });
221
223
 
222
- messageWithArgsInjected = messageWithArgsInjected.replace(
223
- new RegExp(`\\{${i + startIndex}\\}`, "g"),
224
- arg.replace(/</g, "&lt;").replace(/>/g, "&gt;")
225
- );
226
- });
227
-
228
- return messageWithArgsInjected;
229
- })();
230
-
231
- return doRenderAsHtml ? (
232
- <span
233
- // NOTE: The message is trusted. The arguments are not but are escaped.
234
- dangerouslySetInnerHTML={{
235
- __html: messageWithArgsInjectedIfAny
236
- }}
237
- />
238
- ) : (
239
- messageWithArgsInjectedIfAny
240
- );
224
+ return messageWithArgsInjected;
241
225
  }
242
226
 
243
- function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): JSX.Element | string {
244
- const { key, args, doRenderAsHtml } = props;
227
+ function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[] }): string {
228
+ const { key, args } = props;
245
229
 
246
- if (!/\$\{[^}]+\}/.test(key)) {
247
- const resolvedMessage = resolveMsg({ key, args, doRenderAsHtml });
248
-
249
- if (resolvedMessage === undefined) {
250
- return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: key }} /> : key;
251
- }
230
+ const match = key.match(/^\$\{(.+)\}$/);
252
231
 
253
- return resolvedMessage;
232
+ if (match === null) {
233
+ return key;
254
234
  }
255
235
 
256
- let isFirstMatch = true;
257
-
258
- const resolvedComplexMessage = key.replace(/\$\{([^}]+)\}/g, (...[, key_i]) => {
259
- const replaceBy = resolveMsg({ key: key_i, args: isFirstMatch ? args : [], doRenderAsHtml: false }) ?? key_i;
260
-
261
- isFirstMatch = false;
262
-
263
- return replaceBy;
264
- });
265
-
266
- return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: resolvedComplexMessage }} /> : resolvedComplexMessage;
236
+ return resolveMsg({ key: match[1], args }) ?? key;
267
237
  }
268
238
 
269
239
  return {
270
- msgStr: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: false }) as string,
271
- msg: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: true }) as JSX.Element,
272
- advancedMsg: (key, ...args) =>
273
- resolveMsgAdvanced({
274
- key,
275
- args,
276
- doRenderAsHtml: true
277
- }) as JSX.Element,
278
- advancedMsgStr: (key, ...args) =>
279
- resolveMsgAdvanced({
280
- key,
281
- args,
282
- doRenderAsHtml: false
283
- }) as string
240
+ msgStr: (key, ...args) => {
241
+ const resolvedMessage = resolveMsg({ key, args });
242
+ assert(resolvedMessage !== undefined, `Message with key "${key}" not found`);
243
+ return resolvedMessage;
244
+ },
245
+ advancedMsgStr: (key, ...args) => resolveMsgAdvanced({ key, args })
284
246
  };
285
247
  }
286
248
 
@@ -1,4 +1,5 @@
1
- import type { GenericI18n, MessageKey, KcContextLike } from "./i18n";
2
- export type { MessageKey, KcContextLike };
3
- export type I18n = GenericI18n<MessageKey>;
1
+ import type { GenericI18n } from "./GenericI18n";
2
+ import type { MessageKey_defaultSet, KcContextLike } from "./i18n";
3
+ export type { MessageKey_defaultSet, KcContextLike };
4
+ export type I18n = GenericI18n<MessageKey_defaultSet>;
4
5
  export { createUseI18n } from "./useI18n";
@@ -2,8 +2,8 @@
2
2
  //PLEASE DO NOT EDIT MANUALLY
3
3
  import * as en from "./en";
4
4
 
5
- export async function getMessages(currentLanguageTag: string) {
6
- const { default: messages } = await (() => {
5
+ export async function fetchMessages_defaultSet(currentLanguageTag: string) {
6
+ const { default: messages_defaultSet } = await (() => {
7
7
  switch (currentLanguageTag) {
8
8
  case "en": return en;
9
9
  case "ar": return import("./ar");
@@ -35,5 +35,5 @@ export async function getMessages(currentLanguageTag: string) {
35
35
  default: return { "default": {} };
36
36
  }
37
37
  })();
38
- return messages;
38
+ return messages_defaultSet;
39
39
  }
@@ -0,0 +1,95 @@
1
+ import { useEffect, useState } from "react";
2
+ import { createGetI18n, type GenericI18n_noJsx, type KcContextLike, type MessageKey_defaultSet } from "./i18n";
3
+ import { GenericI18n } from "./GenericI18n";
4
+ import { Reflect } from "tsafe/Reflect";
5
+
6
+ export function createUseI18n<MessageKey_themeDefined extends string = never>(messagesByLanguageTag: {
7
+ [languageTag: string]: { [key in MessageKey_themeDefined]: string };
8
+ }) {
9
+ type MessageKey = MessageKey_defaultSet | MessageKey_themeDefined;
10
+
11
+ type I18n = GenericI18n<MessageKey>;
12
+
13
+ const { withJsx } = (() => {
14
+ const cache = new WeakMap<GenericI18n_noJsx<MessageKey>, GenericI18n<MessageKey>>();
15
+
16
+ function renderHtmlString(params: { htmlString: string; msgKey: string }): JSX.Element {
17
+ const { htmlString, msgKey } = params;
18
+ return (
19
+ <div
20
+ data-kc-msg={msgKey}
21
+ dangerouslySetInnerHTML={{
22
+ __html: htmlString
23
+ }}
24
+ />
25
+ );
26
+ }
27
+
28
+ function withJsx(i18n_noJsx: GenericI18n_noJsx<MessageKey>): I18n {
29
+ use_cache: {
30
+ const i18n = cache.get(i18n_noJsx);
31
+
32
+ if (i18n === undefined) {
33
+ break use_cache;
34
+ }
35
+
36
+ return i18n;
37
+ }
38
+
39
+ const i18n: I18n = {
40
+ ...i18n_noJsx,
41
+ msg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.msgStr(msgKey, ...args), msgKey }),
42
+ advancedMsg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.advancedMsgStr(msgKey, ...args), msgKey })
43
+ };
44
+
45
+ cache.set(i18n_noJsx, i18n);
46
+
47
+ return i18n;
48
+ }
49
+
50
+ return { withJsx };
51
+ })();
52
+
53
+ add_style: {
54
+ const attributeName = "data-kc-i18n";
55
+
56
+ // Check if already exists in head
57
+ if (document.querySelector(`style[${attributeName}]`) !== null) {
58
+ break add_style;
59
+ }
60
+
61
+ const styleElement = document.createElement("style");
62
+ styleElement.attributes.setNamedItem(document.createAttribute(attributeName));
63
+ (styleElement.textContent = `[data-kc-msg] { display: inline-block; }`), document.head.prepend(styleElement);
64
+ }
65
+
66
+ const { getI18n } = createGetI18n(messagesByLanguageTag);
67
+
68
+ function useI18n(params: { kcContext: KcContextLike }): { i18n: I18n } {
69
+ const { kcContext } = params;
70
+
71
+ const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
72
+
73
+ const [i18n_toReturn, setI18n_toReturn] = useState<I18n>(withJsx(i18n));
74
+
75
+ useEffect(() => {
76
+ let isActive = true;
77
+
78
+ prI18n_currentLanguage?.then(i18n => {
79
+ if (!isActive) {
80
+ return;
81
+ }
82
+
83
+ setI18n_toReturn(withJsx(i18n));
84
+ });
85
+
86
+ return () => {
87
+ isActive = false;
88
+ };
89
+ }, []);
90
+
91
+ return { i18n: i18n_toReturn };
92
+ }
93
+
94
+ return { useI18n, ofTypeI18n: Reflect<I18n>() };
95
+ }
@@ -62,7 +62,6 @@ export default function Applications(props: PageProps<Extract<KcContext, { pageI
62
62
  {index < application.realmRolesAvailable.length - 1 && ", "}
63
63
  </span>
64
64
  ))}
65
- {!isArrayWithEmptyObject(application.realmRolesAvailable) && application.resourceRolesAvailable && ", "}
66
65
  {application.resourceRolesAvailable &&
67
66
  Object.keys(application.resourceRolesAvailable).map(resource => (
68
67
  <span key={resource}>
@@ -8,7 +8,7 @@ export default function FederatedIdentity(props: PageProps<Extract<KcContext, {
8
8
  const { url, federatedIdentity, stateChecker } = kcContext;
9
9
  const { msg } = i18n;
10
10
  return (
11
- <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="federatedIdentity">
11
+ <Template {...{ kcContext, i18n, doUseDefaultCss, classes }} active="social">
12
12
  <div className="main-layout social">
13
13
  <div className="row">
14
14
  <div className="col-md-10">
@@ -154,9 +154,14 @@ export default function Totp(props: PageProps<Extract<KcContext, { pageId: "totp
154
154
  />
155
155
 
156
156
  {messagesPerField.existsError("totp") && (
157
- <span id="input-error-otp-code" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
158
- {messagesPerField.get("totp")}
159
- </span>
157
+ <span
158
+ id="input-error-otp-code"
159
+ className={kcClsx("kcInputErrorMessageClass")}
160
+ aria-live="polite"
161
+ dangerouslySetInnerHTML={{
162
+ __html: messagesPerField.get("totp")
163
+ }}
164
+ />
160
165
  )}
161
166
  </div>
162
167
  <input type="hidden" id="totpSecret" name="totpSecret" value={totp.totpSecret} />
@@ -180,9 +185,14 @@ export default function Totp(props: PageProps<Extract<KcContext, { pageId: "totp
180
185
  aria-invalid={messagesPerField.existsError("userLabel")}
181
186
  />
182
187
  {messagesPerField.existsError("userLabel") && (
183
- <span id="input-error-otp-label" className={kcClsx("kcInputErrorMessageClass")} aria-live="polite">
184
- {messagesPerField.get("userLabel")}
185
- </span>
188
+ <span
189
+ id="input-error-otp-label"
190
+ className={kcClsx("kcInputErrorMessageClass")}
191
+ aria-live="polite"
192
+ dangerouslySetInnerHTML={{
193
+ __html: messagesPerField.get("userLabel")
194
+ }}
195
+ />
186
196
  )}
187
197
  </div>
188
198
  </div>