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
@@ -1,9 +1,10 @@
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?: {
@@ -11,16 +12,13 @@ export type KcContextLike = {
11
12
  supported: { languageTag: string; url: string; label: string }[];
12
13
  };
13
14
  "x-keycloakify": {
14
- realmMessageBundleUserProfile: Record<string, string> | undefined;
15
- realmMessageBundleTermsText: string | undefined;
15
+ messages: Record<string, string>;
16
16
  };
17
17
  };
18
18
 
19
19
  assert<KcContext extends KcContextLike ? true : false>();
20
20
 
21
- export type MessageKey = keyof typeof messages_fallbackLanguage;
22
-
23
- export type GenericI18n<MessageKey extends string> = {
21
+ export type GenericI18n_noJsx<MessageKey extends string> = {
24
22
  /**
25
23
  * e.g: "en", "fr", "zh-CN"
26
24
  *
@@ -40,16 +38,21 @@ export type GenericI18n<MessageKey extends string> = {
40
38
  * */
41
39
  labelBySupportedLanguageTag: Record<string, string>;
42
40
  /**
41
+ *
43
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
+ * }
44
50
  *
45
- * msg("access-denied") === <span>Access denied</span>
46
- * msg("impersonateTitleHtml", "Foo") === <span><strong>Foo</strong> Impersonate User</span>
47
- */
48
- msg: (key: MessageKey, ...args: (string | undefined)[]) => JSX.Element;
49
- /**
50
- * It's the same thing as msg() but instead of returning a JSX.Element it returns a string.
51
- * 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
52
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.
53
56
  */
54
57
  msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
55
58
  /**
@@ -60,24 +63,11 @@ export type GenericI18n<MessageKey extends string> = {
60
63
  * {
61
64
  * en: {
62
65
  * "access-denied": "Access denied",
63
- * "foo": "Foo {0} {1}",
64
- * "bar": "Bar {0}"
65
66
  * }
66
67
  * }
67
68
  *
68
- * advancedMsg("${access-denied} foo bar") === <span>{msgStr("access-denied")} foo bar<span> === <span>Access denied foo bar</span>
69
- * advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied") === <span>Access denied</span>
70
- * advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === <span>not-a-message-key</span>
71
- * advancedMsg("${bar}", "<strong>c</strong>")
72
- * === <span>{msgStr("bar", "<strong>XXX</strong>")}<span>
73
- * === <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)
74
- * advancedMsg("${foo} xx ${bar}", "a", "b", "c")
75
- * === <span>{msgStr("foo", "a", "b")} xx {msgStr("bar")}<span>
76
- * === <span>Foo a b xx Bar {0}</span> (The substitution are only applied in the first message)
77
- */
78
- advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
79
- /**
80
- * 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"
81
71
  */
82
72
  advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string;
83
73
 
@@ -89,10 +79,12 @@ export type GenericI18n<MessageKey extends string> = {
89
79
  isFetchingTranslations: boolean;
90
80
  };
91
81
 
92
- export function createGetI18n<ExtraMessageKey extends string = never>(messageBundle: {
93
- [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 };
94
86
  }) {
95
- type I18n = GenericI18n<MessageKey | ExtraMessageKey>;
87
+ type I18n = GenericI18n_noJsx<MessageKey_defaultSet | MessageKey_themeDefined>;
96
88
 
97
89
  type Result = { i18n: I18n; prI18n_currentLanguage: Promise<I18n> | undefined };
98
90
 
@@ -112,7 +104,7 @@ export function createGetI18n<ExtraMessageKey extends string = never>(messageBun
112
104
  }
113
105
 
114
106
  const partialI18n: Pick<I18n, "currentLanguageTag" | "getChangeLocaleUrl" | "labelBySupportedLanguageTag"> = {
115
- currentLanguageTag: kcContext.locale?.currentLanguageTag ?? fallbackLanguageTag,
107
+ currentLanguageTag: kcContext.locale?.currentLanguageTag ?? FALLBACK_LANGUAGE_TAG,
116
108
  getChangeLocaleUrl: newLanguageTag => {
117
109
  const { locale } = kcContext;
118
110
 
@@ -127,32 +119,38 @@ export function createGetI18n<ExtraMessageKey extends string = never>(messageBun
127
119
  labelBySupportedLanguageTag: Object.fromEntries((kcContext.locale?.supported ?? []).map(({ languageTag, label }) => [languageTag, label]))
128
120
  };
129
121
 
130
- const { createI18nTranslationFunctions } = createI18nTranslationFunctionsFactory<MessageKey, ExtraMessageKey>({
131
- messages_fallbackLanguage,
132
- messageBundle_fallbackLanguage: messageBundle[fallbackLanguageTag],
133
- messageBundle_currentLanguage: messageBundle[partialI18n.currentLanguageTag],
134
- realmMessageBundleUserProfile: kcContext["x-keycloakify"].realmMessageBundleUserProfile,
135
- realmMessageBundleTermsText: kcContext["x-keycloakify"].realmMessageBundleTermsText
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
136
134
  });
137
135
 
138
- const isCurrentLanguageFallbackLanguage = partialI18n.currentLanguageTag === fallbackLanguageTag;
136
+ const isCurrentLanguageFallbackLanguage = partialI18n.currentLanguageTag === FALLBACK_LANGUAGE_TAG;
139
137
 
140
138
  const result: Result = {
141
139
  i18n: {
142
140
  ...partialI18n,
143
141
  ...createI18nTranslationFunctions({
144
- messages_currentLanguage: isCurrentLanguageFallbackLanguage ? messages_fallbackLanguage : undefined
142
+ messages_defaultSet_currentLanguage: isCurrentLanguageFallbackLanguage ? messages_defaultSet_fallbackLanguage : undefined
145
143
  }),
146
144
  isFetchingTranslations: !isCurrentLanguageFallbackLanguage
147
145
  },
148
146
  prI18n_currentLanguage: isCurrentLanguageFallbackLanguage
149
147
  ? undefined
150
148
  : (async () => {
151
- const messages_currentLanguage = await getMessages(partialI18n.currentLanguageTag);
149
+ const messages_defaultSet_currentLanguage = await fetchMessages_defaultSet(partialI18n.currentLanguageTag);
152
150
 
153
151
  const i18n_currentLanguage: I18n = {
154
152
  ...partialI18n,
155
- ...createI18nTranslationFunctions({ messages_currentLanguage }),
153
+ ...createI18nTranslationFunctions({ messages_defaultSet_currentLanguage }),
156
154
  isFetchingTranslations: false
157
155
  };
158
156
 
@@ -175,151 +173,78 @@ export function createGetI18n<ExtraMessageKey extends string = never>(messageBun
175
173
  return { getI18n };
176
174
  }
177
175
 
178
- function createI18nTranslationFunctionsFactory<MessageKey extends string, ExtraMessageKey extends string>(params: {
179
- messages_fallbackLanguage: Record<MessageKey, string>;
180
- messageBundle_fallbackLanguage: Record<ExtraMessageKey, string> | undefined;
181
- messageBundle_currentLanguage: Partial<Record<ExtraMessageKey, string>> | undefined;
182
- realmMessageBundleUserProfile: Record<string, string> | undefined;
183
- realmMessageBundleTermsText: string | undefined;
176
+ function createI18nTranslationFunctionsFactory<MessageKey_themeDefined extends string>(params: {
177
+ messages_themeDefined: Record<MessageKey_themeDefined, string> | undefined;
178
+ messages_fromKcServer: Record<string, string>;
184
179
  }) {
185
- const { messageBundle_currentLanguage, realmMessageBundleUserProfile, realmMessageBundleTermsText } = params;
186
-
187
- const messages_fallbackLanguage = {
188
- ...params.messages_fallbackLanguage,
189
- ...params.messageBundle_fallbackLanguage
190
- };
180
+ const { messages_themeDefined, messages_fromKcServer } = params;
191
181
 
192
182
  function createI18nTranslationFunctions(params: {
193
- messages_currentLanguage: Partial<Record<MessageKey, string>> | undefined;
194
- }): Pick<GenericI18n<MessageKey | ExtraMessageKey>, "msg" | "msgStr" | "advancedMsg" | "advancedMsgStr"> {
195
- const messages_currentLanguage = {
196
- ...params.messages_currentLanguage,
197
- ...messageBundle_currentLanguage
198
- };
199
-
200
- function resolveMsg(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): string | JSX.Element | undefined {
201
- const { key, args, doRenderAsHtml } = props;
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;
202
186
 
203
- const messageOrUndefined: string | undefined = (() => {
204
- const messageOrUndefined = (messages_currentLanguage as any)[key] ?? (messages_fallbackLanguage as any)[key];
187
+ function resolveMsg(props: { key: string; args: (string | undefined)[] }): string | undefined {
188
+ const { key, args } = props;
205
189
 
206
- if (key === "termsText" && realmMessageBundleTermsText !== undefined) {
207
- return realmMessageBundleTermsText;
208
- }
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];
209
195
 
210
- return messageOrUndefined;
211
- })();
212
-
213
- if (messageOrUndefined === undefined) {
196
+ if (message === undefined) {
214
197
  return undefined;
215
198
  }
216
199
 
217
- const message = messageOrUndefined;
218
-
219
- const messageWithArgsInjectedIfAny = (() => {
220
- const startIndex = message
221
- .match(/{[0-9]+}/g)
222
- ?.map(g => g.match(/{([0-9]+)}/)![1])
223
- .map(indexStr => parseInt(indexStr))
224
- .sort((a, b) => a - b)[0];
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];
225
205
 
226
- if (startIndex === undefined) {
227
- // No {0} in message (no arguments expected)
228
- return message;
229
- }
230
-
231
- let messageWithArgsInjected = message;
232
-
233
- args.forEach((arg, i) => {
234
- if (arg === undefined) {
235
- return;
236
- }
237
-
238
- messageWithArgsInjected = messageWithArgsInjected.replace(
239
- new RegExp(`\\{${i + startIndex}\\}`, "g"),
240
- arg.replace(/</g, "&lt;").replace(/>/g, "&gt;")
241
- );
242
- });
243
-
244
- return messageWithArgsInjected;
245
- })();
246
-
247
- return doRenderAsHtml ? (
248
- <span
249
- // NOTE: The message is trusted. The arguments are not but are escaped.
250
- dangerouslySetInnerHTML={{
251
- __html: messageWithArgsInjectedIfAny
252
- }}
253
- />
254
- ) : (
255
- messageWithArgsInjectedIfAny
256
- );
257
- }
258
-
259
- function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[]; doRenderAsHtml: boolean }): JSX.Element | string {
260
- const { key, args, doRenderAsHtml } = props;
261
-
262
- user_profile: {
263
- if (realmMessageBundleUserProfile === undefined) {
264
- break user_profile;
265
- }
266
-
267
- const resolvedMessage = realmMessageBundleUserProfile[key] ?? realmMessageBundleUserProfile["${" + key + "}"];
268
-
269
- if (resolvedMessage === undefined) {
270
- break user_profile;
271
- }
272
-
273
- return doRenderAsHtml ? (
274
- <span
275
- // NOTE: The message is trusted. The arguments are not but are escaped.
276
- dangerouslySetInnerHTML={{
277
- __html: resolvedMessage
278
- }}
279
- />
280
- ) : (
281
- resolvedMessage
282
- );
206
+ if (startIndex === undefined) {
207
+ // No {0} in message (no arguments expected)
208
+ return message;
283
209
  }
284
210
 
285
- if (!/\$\{[^}]+\}/.test(key)) {
286
- const resolvedMessage = resolveMsg({ key, args, doRenderAsHtml });
211
+ let messageWithArgsInjected = message;
287
212
 
288
- if (resolvedMessage === undefined) {
289
- return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: key }} /> : key;
213
+ args.forEach((arg, i) => {
214
+ if (arg === undefined) {
215
+ return;
290
216
  }
291
217
 
292
- return resolvedMessage;
293
- }
218
+ messageWithArgsInjected = messageWithArgsInjected.replace(
219
+ new RegExp(`\\{${i + startIndex}\\}`, "g"),
220
+ (() => {
221
+ if (key === "loginTitleHtml") {
222
+ return arg;
223
+ }
294
224
 
295
- let isFirstMatch = true;
225
+ return arg.replace(/</g, "&lt;").replace(/>/g, "&gt;");
226
+ })()
227
+ );
228
+ });
296
229
 
297
- const resolvedComplexMessage = key.replace(/\$\{([^}]+)\}/g, (...[, key_i]) => {
298
- const replaceBy = resolveMsg({ key: key_i, args: isFirstMatch ? args : [], doRenderAsHtml: false }) ?? key_i;
230
+ return messageWithArgsInjected;
231
+ }
299
232
 
300
- isFirstMatch = false;
233
+ function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[] }): string {
234
+ const { key, args } = props;
301
235
 
302
- return replaceBy;
303
- });
236
+ const match = key.match(/^\$\{(.+)\}$/);
304
237
 
305
- return doRenderAsHtml ? <span dangerouslySetInnerHTML={{ __html: resolvedComplexMessage }} /> : resolvedComplexMessage;
238
+ return resolveMsg({ key: match !== null ? match[1] : key, args }) ?? key;
306
239
  }
307
240
 
308
241
  return {
309
- msgStr: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: false }) as string,
310
- msg: (key, ...args) => resolveMsg({ key, args, doRenderAsHtml: true }) as JSX.Element,
311
- advancedMsg: (key, ...args) =>
312
- resolveMsgAdvanced({
313
- key,
314
- args,
315
- doRenderAsHtml: true
316
- }) as JSX.Element,
317
- advancedMsgStr: (key, ...args) =>
318
- resolveMsgAdvanced({
319
- key,
320
- args,
321
- doRenderAsHtml: false
322
- }) as string
242
+ msgStr: (key, ...args) => {
243
+ const resolvedMessage = resolveMsg({ key, args });
244
+ assert(resolvedMessage !== undefined, `Message with key "${key}" not found`);
245
+ return resolvedMessage;
246
+ },
247
+ advancedMsgStr: (key, ...args) => resolveMsgAdvanced({ key, args })
323
248
  };
324
249
  }
325
250
 
@@ -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
+ }