keycloakify 6.11.9 → 6.12.1

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 (253) hide show
  1. package/README.md +10 -7
  2. package/bin/create-keycloak-email-directory.js +1 -1
  3. package/bin/download-builtin-keycloak-theme.js +1 -1
  4. package/bin/keycloakify/BuildOptions.d.ts +2 -2
  5. package/bin/keycloakify/BuildOptions.js.map +1 -1
  6. package/bin/keycloakify/generateFtl/generateFtl.d.ts +2 -2
  7. package/bin/keycloakify/generateJavaStackFiles.d.ts +1 -1
  8. package/bin/keycloakify/generateKeycloakThemeResources.d.ts +1 -1
  9. package/bin/keycloakify/generateKeycloakThemeResources.js +1 -1
  10. package/bin/keycloakify/generateStartKeycloakTestingContainer.d.ts +1 -1
  11. package/bin/keycloakify/keycloakify.js +1 -1
  12. package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.d.ts +1 -1
  13. package/bin/keycloakify/replacers/replaceImportsInCssCode.d.ts +1 -1
  14. package/bin/keycloakify/replacers/replaceImportsInInlineCssCode.d.ts +1 -1
  15. package/bin/promptKeycloakVersion.js +1 -1
  16. package/bin/tools/NpmModuleVersion.d.ts +1 -1
  17. package/bin/tools/cliOptions.d.ts +1 -1
  18. package/bin/tools/deflate.js +1 -1
  19. package/bin/tools/downloadAndUnzip.js +51 -44
  20. package/bin/tools/downloadAndUnzip.js.map +1 -1
  21. package/bin/tools/grant-exec-perms.js +3 -2
  22. package/bin/tools/grant-exec-perms.js.map +1 -1
  23. package/bin/tools/jar.d.ts +1 -1
  24. package/bin/tools/jar.js +1 -1
  25. package/bin/tools/logger.d.ts +2 -2
  26. package/bin/tools/octokit-addons/getLatestsSemVersionedTag.js +34 -27
  27. package/bin/tools/octokit-addons/getLatestsSemVersionedTag.js.map +1 -1
  28. package/bin/tools/octokit-addons/listTags.js +1 -1
  29. package/bin/tools/transformCodebase.d.ts +1 -1
  30. package/bin/tools/walk.js +1 -1
  31. package/bin/tools/zip.d.ts +2 -2
  32. package/bin/tools/zip.js +1 -1
  33. package/bin/tsconfig.tsbuildinfo +1 -1
  34. package/lib/KcApp.d.ts +6 -0
  35. package/lib/{components/KcApp.js → KcApp.js} +25 -26
  36. package/lib/KcApp.js.map +1 -0
  37. package/lib/{components/KcProps.d.ts → KcProps.d.ts} +30 -6
  38. package/lib/{components/KcProps.js → KcProps.js} +1 -1
  39. package/lib/KcProps.js.map +1 -0
  40. package/lib/Template.d.ts +18 -0
  41. package/lib/{components/Template.js → Template.js} +67 -55
  42. package/lib/Template.js.map +1 -0
  43. package/lib/getKcContext/KcContextBase.d.ts +6 -6
  44. package/lib/getKcContext/getKcContextFromWindow.d.ts +1 -1
  45. package/lib/getKcContext/{kcContextMocks/kcContextMocks.d.ts → kcContextMocks.d.ts} +1 -1
  46. package/lib/getKcContext/{kcContextMocks/kcContextMocks.js → kcContextMocks.js} +8 -5
  47. package/lib/getKcContext/kcContextMocks.js.map +1 -0
  48. package/lib/i18n/i18n.d.ts +100 -0
  49. package/lib/i18n/i18n.js +160 -0
  50. package/lib/i18n/i18n.js.map +1 -0
  51. package/lib/i18n/index.d.ts +1 -99
  52. package/lib/i18n/index.js +1 -159
  53. package/lib/i18n/index.js.map +1 -1
  54. package/lib/index.d.ts +3 -3
  55. package/lib/index.js +3 -3
  56. package/lib/index.js.map +1 -1
  57. package/lib/pages/Error.d.ts +5 -0
  58. package/lib/{components → pages}/Error.js +4 -6
  59. package/lib/pages/Error.js.map +1 -0
  60. package/lib/pages/IdpReviewUserProfile.d.ts +5 -0
  61. package/lib/{components → pages}/IdpReviewUserProfile.js +4 -6
  62. package/lib/pages/IdpReviewUserProfile.js.map +1 -0
  63. package/lib/pages/Info.d.ts +5 -0
  64. package/lib/{components → pages}/Info.js +4 -6
  65. package/lib/pages/Info.js.map +1 -0
  66. package/lib/pages/Login.d.ts +5 -0
  67. package/lib/{components → pages}/Login.js +5 -7
  68. package/lib/pages/Login.js.map +1 -0
  69. package/lib/pages/LoginConfigTotp.d.ts +5 -0
  70. package/lib/{components → pages}/LoginConfigTotp.js +4 -6
  71. package/lib/pages/LoginConfigTotp.js.map +1 -0
  72. package/lib/pages/LoginIdpLinkConfirm.d.ts +5 -0
  73. package/lib/{components → pages}/LoginIdpLinkConfirm.js +4 -6
  74. package/lib/pages/LoginIdpLinkConfirm.js.map +1 -0
  75. package/lib/pages/LoginIdpLinkEmail.d.ts +5 -0
  76. package/lib/{components → pages}/LoginIdpLinkEmail.js +4 -6
  77. package/lib/pages/LoginIdpLinkEmail.js.map +1 -0
  78. package/lib/pages/LoginOtp.d.ts +5 -0
  79. package/lib/{components → pages}/LoginOtp.js +4 -6
  80. package/lib/pages/LoginOtp.js.map +1 -0
  81. package/lib/pages/LoginPageExpired.d.ts +5 -0
  82. package/lib/{components → pages}/LoginPageExpired.js +4 -6
  83. package/lib/pages/LoginPageExpired.js.map +1 -0
  84. package/lib/pages/LoginPassword.d.ts +5 -0
  85. package/lib/{components → pages}/LoginPassword.js +5 -7
  86. package/lib/pages/LoginPassword.js.map +1 -0
  87. package/lib/pages/LoginResetPassword.d.ts +5 -0
  88. package/lib/{components → pages}/LoginResetPassword.js +4 -6
  89. package/lib/pages/LoginResetPassword.js.map +1 -0
  90. package/lib/pages/LoginUpdatePassword.d.ts +5 -0
  91. package/lib/{components → pages}/LoginUpdatePassword.js +4 -6
  92. package/lib/pages/LoginUpdatePassword.js.map +1 -0
  93. package/lib/pages/LoginUpdateProfile.d.ts +5 -0
  94. package/lib/{components → pages}/LoginUpdateProfile.js +4 -6
  95. package/lib/pages/LoginUpdateProfile.js.map +1 -0
  96. package/lib/pages/LoginUsername.d.ts +5 -0
  97. package/lib/{components → pages}/LoginUsername.js +5 -7
  98. package/lib/pages/LoginUsername.js.map +1 -0
  99. package/lib/pages/LoginVerifyEmail.d.ts +5 -0
  100. package/lib/{components → pages}/LoginVerifyEmail.js +4 -6
  101. package/lib/pages/LoginVerifyEmail.js.map +1 -0
  102. package/lib/pages/LogoutConfirm.d.ts +5 -0
  103. package/lib/{components → pages}/LogoutConfirm.js +4 -6
  104. package/lib/pages/LogoutConfirm.js.map +1 -0
  105. package/lib/pages/Register.d.ts +5 -0
  106. package/lib/{components → pages}/Register.js +4 -6
  107. package/lib/pages/Register.js.map +1 -0
  108. package/lib/pages/RegisterUserProfile.d.ts +5 -0
  109. package/lib/{components → pages}/RegisterUserProfile.js +4 -6
  110. package/lib/pages/RegisterUserProfile.js.map +1 -0
  111. package/lib/pages/Terms.d.ts +19 -0
  112. package/lib/{components → pages}/Terms.js +20 -22
  113. package/lib/pages/Terms.js.map +1 -0
  114. package/lib/pages/UpdateUserProfile.d.ts +5 -0
  115. package/lib/{components → pages}/UpdateUserProfile.js +4 -6
  116. package/lib/pages/UpdateUserProfile.js.map +1 -0
  117. package/lib/pages/WebauthnAuthenticate.d.ts +5 -0
  118. package/lib/{components → pages}/WebauthnAuthenticate.js +5 -7
  119. package/lib/pages/WebauthnAuthenticate.js.map +1 -0
  120. package/lib/{components → pages}/shared/UserProfileCommons.d.ts +6 -6
  121. package/lib/{components → pages}/shared/UserProfileCommons.js +4 -4
  122. package/lib/pages/shared/UserProfileCommons.js.map +1 -0
  123. package/lib/tools/AndByDiscriminatingKey.d.ts +1 -1
  124. package/lib/tools/DeepPartial.d.ts +1 -1
  125. package/lib/tools/ReactComponent.d.ts +1 -1
  126. package/lib/tools/SetOptional.d.ts +1 -0
  127. package/lib/tools/SetOptional.js +2 -0
  128. package/lib/tools/SetOptional.js.map +1 -0
  129. package/lib/tools/clsx.d.ts +2 -3
  130. package/lib/tools/clsx.js +39 -3
  131. package/lib/tools/clsx.js.map +1 -1
  132. package/lib/tools/deepAssign.js +1 -1
  133. package/lib/tools/deepAssign.js.map +1 -1
  134. package/lib/tools/memoize.d.ts +7 -0
  135. package/lib/tools/memoize.js +38 -0
  136. package/lib/tools/memoize.js.map +1 -0
  137. package/lib/tools/useCallbackFactory.d.ts +15 -0
  138. package/lib/tools/useCallbackFactory.js +28 -0
  139. package/lib/tools/useCallbackFactory.js.map +1 -0
  140. package/lib/tools/useConst.d.ts +5 -0
  141. package/lib/tools/useConst.js +10 -0
  142. package/lib/tools/useConst.js.map +1 -0
  143. package/lib/tools/useConstCallback.d.ts +2 -0
  144. package/lib/tools/useConstCallback.js +8 -0
  145. package/lib/tools/useConstCallback.js.map +1 -0
  146. package/lib/tools/useCssAndCx.d.ts +1 -1
  147. package/lib/tsconfig.tsbuildinfo +1 -1
  148. package/lib/useFormValidationSlice.d.ts +4 -4
  149. package/lib/useFormValidationSlice.js +1 -1
  150. package/lib/useFormValidationSlice.js.map +1 -1
  151. package/package.json +133 -124
  152. package/src/bin/keycloakify/BuildOptions.ts +2 -2
  153. package/src/bin/keycloakify/generateFtl/generateFtl.ts +1 -1
  154. package/src/lib/{components/KcApp.tsx → KcApp.tsx} +29 -38
  155. package/src/lib/{components/KcProps.ts → KcProps.ts} +27 -1
  156. package/src/lib/{components/Template.tsx → Template.tsx} +111 -95
  157. package/src/lib/getKcContext/KcContextBase.ts +1 -1
  158. package/src/lib/getKcContext/{kcContextMocks/kcContextMocks.ts → kcContextMocks.ts} +9 -6
  159. package/src/lib/i18n/i18n.tsx +292 -0
  160. package/src/lib/i18n/index.tsx +1 -290
  161. package/src/lib/index.ts +3 -3
  162. package/src/lib/{components → pages}/Error.tsx +7 -18
  163. package/src/lib/{components → pages}/IdpReviewUserProfile.tsx +7 -18
  164. package/src/lib/{components → pages}/Info.tsx +7 -18
  165. package/src/lib/{components → pages}/Login.tsx +8 -20
  166. package/src/lib/{components → pages}/LoginConfigTotp.tsx +7 -18
  167. package/src/lib/{components → pages}/LoginIdpLinkConfirm.tsx +7 -18
  168. package/src/lib/{components → pages}/LoginIdpLinkEmail.tsx +7 -18
  169. package/src/lib/{components → pages}/LoginOtp.tsx +7 -18
  170. package/src/lib/{components → pages}/LoginPageExpired.tsx +7 -18
  171. package/src/lib/{components → pages}/LoginPassword.tsx +8 -19
  172. package/src/lib/{components → pages}/LoginResetPassword.tsx +7 -18
  173. package/src/lib/{components → pages}/LoginUpdatePassword.tsx +7 -18
  174. package/src/lib/{components → pages}/LoginUpdateProfile.tsx +7 -18
  175. package/src/lib/{components → pages}/LoginUsername.tsx +8 -19
  176. package/src/lib/{components → pages}/LoginVerifyEmail.tsx +7 -18
  177. package/src/lib/{components → pages}/LogoutConfirm.tsx +7 -18
  178. package/src/lib/{components → pages}/Register.tsx +7 -18
  179. package/src/lib/{components → pages}/RegisterUserProfile.tsx +7 -18
  180. package/src/lib/{components → pages}/Terms.tsx +50 -61
  181. package/src/lib/{components → pages}/UpdateUserProfile.tsx +7 -18
  182. package/src/lib/{components → pages}/WebauthnAuthenticate.tsx +9 -19
  183. package/src/lib/pages/shared/UserProfileCommons.tsx +178 -0
  184. package/src/lib/tools/SetOptional.ts +1 -0
  185. package/src/lib/tools/clsx.ts +42 -5
  186. package/src/lib/tools/deepAssign.ts +1 -1
  187. package/src/lib/tools/memoize.ts +55 -0
  188. package/src/lib/tools/useCallbackFactory.ts +45 -0
  189. package/src/lib/tools/useConst.ts +10 -0
  190. package/src/lib/tools/useConstCallback.ts +15 -0
  191. package/src/lib/useFormValidationSlice.tsx +4 -4
  192. package/bin/generate-i18n-messages.d.ts +0 -1
  193. package/bin/generate-i18n-messages.js +0 -126
  194. package/bin/generate-i18n-messages.js.map +0 -1
  195. package/bin/link_in_test_app.d.ts +0 -1
  196. package/bin/link_in_test_app.js +0 -141
  197. package/bin/link_in_test_app.js.map +0 -1
  198. package/lib/components/Error.d.ts +0 -13
  199. package/lib/components/Error.js.map +0 -1
  200. package/lib/components/IdpReviewUserProfile.d.ts +0 -13
  201. package/lib/components/IdpReviewUserProfile.js.map +0 -1
  202. package/lib/components/Info.d.ts +0 -13
  203. package/lib/components/Info.js.map +0 -1
  204. package/lib/components/KcApp.d.ts +0 -13
  205. package/lib/components/KcApp.js.map +0 -1
  206. package/lib/components/KcProps.js.map +0 -1
  207. package/lib/components/Login.d.ts +0 -13
  208. package/lib/components/Login.js.map +0 -1
  209. package/lib/components/LoginConfigTotp.d.ts +0 -13
  210. package/lib/components/LoginConfigTotp.js.map +0 -1
  211. package/lib/components/LoginIdpLinkConfirm.d.ts +0 -13
  212. package/lib/components/LoginIdpLinkConfirm.js.map +0 -1
  213. package/lib/components/LoginIdpLinkEmail.d.ts +0 -13
  214. package/lib/components/LoginIdpLinkEmail.js.map +0 -1
  215. package/lib/components/LoginOtp.d.ts +0 -13
  216. package/lib/components/LoginOtp.js.map +0 -1
  217. package/lib/components/LoginPageExpired.d.ts +0 -13
  218. package/lib/components/LoginPageExpired.js.map +0 -1
  219. package/lib/components/LoginPassword.d.ts +0 -13
  220. package/lib/components/LoginPassword.js.map +0 -1
  221. package/lib/components/LoginResetPassword.d.ts +0 -13
  222. package/lib/components/LoginResetPassword.js.map +0 -1
  223. package/lib/components/LoginUpdatePassword.d.ts +0 -13
  224. package/lib/components/LoginUpdatePassword.js.map +0 -1
  225. package/lib/components/LoginUpdateProfile.d.ts +0 -13
  226. package/lib/components/LoginUpdateProfile.js.map +0 -1
  227. package/lib/components/LoginUsername.d.ts +0 -13
  228. package/lib/components/LoginUsername.js.map +0 -1
  229. package/lib/components/LoginVerifyEmail.d.ts +0 -13
  230. package/lib/components/LoginVerifyEmail.js.map +0 -1
  231. package/lib/components/LogoutConfirm.d.ts +0 -13
  232. package/lib/components/LogoutConfirm.js.map +0 -1
  233. package/lib/components/Register.d.ts +0 -13
  234. package/lib/components/Register.js.map +0 -1
  235. package/lib/components/RegisterUserProfile.d.ts +0 -13
  236. package/lib/components/RegisterUserProfile.js.map +0 -1
  237. package/lib/components/Template.d.ts +0 -25
  238. package/lib/components/Template.js.map +0 -1
  239. package/lib/components/Terms.d.ts +0 -27
  240. package/lib/components/Terms.js.map +0 -1
  241. package/lib/components/UpdateUserProfile.d.ts +0 -13
  242. package/lib/components/UpdateUserProfile.js.map +0 -1
  243. package/lib/components/WebauthnAuthenticate.d.ts +0 -13
  244. package/lib/components/WebauthnAuthenticate.js.map +0 -1
  245. package/lib/components/shared/UserProfileCommons.js.map +0 -1
  246. package/lib/getKcContext/kcContextMocks/index.d.ts +0 -1
  247. package/lib/getKcContext/kcContextMocks/index.js +0 -2
  248. package/lib/getKcContext/kcContextMocks/index.js.map +0 -1
  249. package/lib/getKcContext/kcContextMocks/kcContextMocks.js.map +0 -1
  250. package/src/bin/generate-i18n-messages.ts +0 -86
  251. package/src/bin/link_in_test_app.ts +0 -128
  252. package/src/lib/components/shared/UserProfileCommons.tsx +0 -173
  253. package/src/lib/getKcContext/kcContextMocks/index.ts +0 -1
@@ -1,290 +1 @@
1
- import "minimal-polyfills/Object.fromEntries";
2
- //NOTE for later: https://github.com/remarkjs/react-markdown/blob/236182ecf30bd89c1e5a7652acaf8d0bf81e6170/src/renderers.js#L7-L35
3
- import React, { useEffect, useState, useRef } from "react";
4
- import type baseMessages from "./generated_messages/18.0.1/login/en";
5
- import { assert } from "tsafe/assert";
6
- import type { KcContextBase } from "../getKcContext/KcContextBase";
7
- import { Markdown } from "../tools/Markdown";
8
-
9
- export const fallbackLanguageTag = "en";
10
-
11
- export type KcContextLike = {
12
- locale?: {
13
- currentLanguageTag: string;
14
- supported: { languageTag: string; url: string; label: string }[];
15
- };
16
- };
17
-
18
- assert<KcContextBase extends KcContextLike ? true : false>();
19
-
20
- export type MessageKeyBase = keyof typeof baseMessages | keyof typeof keycloakifyExtraMessages[typeof fallbackLanguageTag];
21
-
22
- export type I18n<MessageKey extends string = MessageKeyBase> = {
23
- /**
24
- * e.g: "en", "fr", "zh-CN"
25
- *
26
- * The current language
27
- */
28
- currentLanguageTag: string;
29
- /**
30
- * To call when the user switch language.
31
- * This will cause the page to be reloaded,
32
- * on next load currentLanguageTag === newLanguageTag
33
- */
34
- changeLocale: (newLanguageTag: string) => never;
35
- /**
36
- * e.g. "en" => "English", "fr" => "Français", ...
37
- *
38
- * Used to render a select that enable user to switch language.
39
- * ex: https://user-images.githubusercontent.com/6702424/186044799-38801eec-4e89-483b-81dd-8e9233e8c0eb.png
40
- * */
41
- labelBySupportedLanguageTag: Record<string, string>;
42
- /**
43
- * Examples assuming currentLanguageTag === "en"
44
- *
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.
52
- * msgStr("impersonateTitleHtml", "Foo") === "<strong>Foo</strong> Impersonate User"
53
- */
54
- msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
55
- /**
56
- * Examples assuming currentLanguageTag === "en"
57
- * advancedMsg("${access-denied} foo bar") === <span>${msgStr("access-denied")} foo bar<span> === <span>Access denied foo bar</span>
58
- * advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied") === <span>Access denied</span>
59
- * advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === <span>not-a-message-key</span>
60
- */
61
- advancedMsg: (key: string, ...args: (string | undefined)[]) => JSX.Element;
62
- /**
63
- * Examples assuming currentLanguageTag === "en"
64
- * advancedMsg("${access-denied} foo bar") === msg("access-denied") + " foo bar" === "Access denied foo bar"
65
- * advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === "not-a-message-key"
66
- */
67
- advancedMsgStr: (key: string, ...args: (string | undefined)[]) => string;
68
- };
69
-
70
- export function __unsafe_useI18n<ExtraMessageKey extends string = never>(params: {
71
- kcContext: KcContextLike;
72
- extraMessages: { [languageTag: string]: { [key in ExtraMessageKey]: string } };
73
- doSkip: boolean;
74
- }): I18n<MessageKeyBase | ExtraMessageKey> | null {
75
- const { kcContext, extraMessages, doSkip } = params;
76
-
77
- const [i18n, setI18n] = useState<I18n<ExtraMessageKey | MessageKeyBase> | undefined>(undefined);
78
-
79
- const refHasStartedFetching = useRef(false);
80
-
81
- useEffect(() => {
82
- if (doSkip || refHasStartedFetching.current) {
83
- return;
84
- }
85
-
86
- refHasStartedFetching.current = true;
87
-
88
- (async () => {
89
- const { currentLanguageTag = fallbackLanguageTag } = kcContext.locale ?? {};
90
-
91
- const [fallbackMessages, messages] = await Promise.all([
92
- import("./generated_messages/18.0.1/login/en"),
93
- (() => {
94
- switch (currentLanguageTag) {
95
- case "ca":
96
- return import("./generated_messages/18.0.1/login/ca");
97
- case "cs":
98
- return import("./generated_messages/18.0.1/login/cs");
99
- case "da":
100
- return import("./generated_messages/18.0.1/login/da");
101
- case "de":
102
- return import("./generated_messages/18.0.1/login/de");
103
- case "en":
104
- return import("./generated_messages/18.0.1/login/en");
105
- case "es":
106
- return import("./generated_messages/18.0.1/login/es");
107
- case "fi":
108
- return import("./generated_messages/18.0.1/login/fi");
109
- case "fr":
110
- return import("./generated_messages/18.0.1/login/fr");
111
- case "hu":
112
- return import("./generated_messages/18.0.1/login/hu");
113
- case "it":
114
- return import("./generated_messages/18.0.1/login/it");
115
- case "ja":
116
- return import("./generated_messages/18.0.1/login/ja");
117
- case "lt":
118
- return import("./generated_messages/18.0.1/login/lt");
119
- case "lv":
120
- return import("./generated_messages/18.0.1/login/lv");
121
- case "nl":
122
- return import("./generated_messages/18.0.1/login/nl");
123
- case "no":
124
- return import("./generated_messages/18.0.1/login/no");
125
- case "pl":
126
- return import("./generated_messages/18.0.1/login/pl");
127
- case "pt-BR":
128
- return import("./generated_messages/18.0.1/login/pt-BR");
129
- case "ru":
130
- return import("./generated_messages/18.0.1/login/ru");
131
- case "sk":
132
- return import("./generated_messages/18.0.1/login/sk");
133
- case "sv":
134
- return import("./generated_messages/18.0.1/login/sv");
135
- case "tr":
136
- return import("./generated_messages/18.0.1/login/tr");
137
- case "zh-CN":
138
- return import("./generated_messages/18.0.1/login/zh-CN");
139
- default:
140
- return { "default": {} };
141
- }
142
- })()
143
- ]).then(modules => modules.map(module => module.default));
144
-
145
- setI18n({
146
- ...createI18nTranslationFunctions({
147
- "fallbackMessages": {
148
- ...fallbackMessages,
149
- ...(keycloakifyExtraMessages[fallbackLanguageTag] ?? {}),
150
- ...(extraMessages[fallbackLanguageTag] ?? {})
151
- } as any,
152
- "messages": {
153
- ...messages,
154
- ...((keycloakifyExtraMessages as any)[currentLanguageTag] ?? {}),
155
- ...(extraMessages[currentLanguageTag] ?? {})
156
- } as any
157
- }),
158
- currentLanguageTag,
159
- "changeLocale": newLanguageTag => {
160
- const { locale } = kcContext;
161
-
162
- assert(locale !== undefined, "Internationalization not enabled");
163
-
164
- const targetSupportedLocale = locale.supported.find(({ languageTag }) => languageTag === newLanguageTag);
165
-
166
- assert(targetSupportedLocale !== undefined, `${newLanguageTag} need to be enabled in Keycloak admin`);
167
-
168
- window.location.href = targetSupportedLocale.url;
169
-
170
- assert(false, "never");
171
- },
172
- "labelBySupportedLanguageTag": Object.fromEntries(
173
- (kcContext.locale?.supported ?? []).map(({ languageTag, label }) => [languageTag, label])
174
- )
175
- });
176
- })();
177
- }, []);
178
-
179
- return i18n ?? null;
180
- }
181
-
182
- const useI18n_private = __unsafe_useI18n;
183
-
184
- export function useI18n<ExtraMessageKey extends string = never>(params: {
185
- kcContext: KcContextLike;
186
- extraMessages: { [languageTag: string]: { [key in ExtraMessageKey]: string } };
187
- }): I18n<MessageKeyBase | ExtraMessageKey> | null {
188
- return useI18n_private({
189
- ...params,
190
- "doSkip": false
191
- });
192
- }
193
-
194
- function createI18nTranslationFunctions<MessageKey extends string>(params: {
195
- fallbackMessages: Record<MessageKey, string>;
196
- messages: Record<MessageKey, string>;
197
- }): Pick<I18n<MessageKey>, "msg" | "msgStr" | "advancedMsg" | "advancedMsgStr"> {
198
- const { fallbackMessages, messages } = params;
199
-
200
- function resolveMsg(props: { key: string; args: (string | undefined)[]; doRenderMarkdown: boolean }): string | JSX.Element | undefined {
201
- const { key, args, doRenderMarkdown } = props;
202
-
203
- const messageOrUndefined: string | undefined = (messages as any)[key] ?? (fallbackMessages as any)[key];
204
-
205
- if (messageOrUndefined === undefined) {
206
- return undefined;
207
- }
208
-
209
- const message = messageOrUndefined;
210
-
211
- const messageWithArgsInjectedIfAny = (() => {
212
- const startIndex = message
213
- .match(/{[0-9]+}/g)
214
- ?.map(g => g.match(/{([0-9]+)}/)![1])
215
- .map(indexStr => parseInt(indexStr))
216
- .sort((a, b) => a - b)[0];
217
-
218
- if (startIndex === undefined) {
219
- // No {0} in message (no arguments expected)
220
- return message;
221
- }
222
-
223
- let messageWithArgsInjected = message;
224
-
225
- args.forEach((arg, i) => {
226
- if (arg === undefined) {
227
- return;
228
- }
229
-
230
- messageWithArgsInjected = messageWithArgsInjected.replace(new RegExp(`\\{${i + startIndex}\\}`, "g"), arg);
231
- });
232
-
233
- return messageWithArgsInjected;
234
- })();
235
-
236
- return doRenderMarkdown ? (
237
- <Markdown allowDangerousHtml renderers={{ "paragraph": "span" }}>
238
- {messageWithArgsInjectedIfAny}
239
- </Markdown>
240
- ) : (
241
- messageWithArgsInjectedIfAny
242
- );
243
- }
244
-
245
- function resolveMsgAdvanced(props: { key: string; args: (string | undefined)[]; doRenderMarkdown: boolean }): JSX.Element | string {
246
- const { key, args, doRenderMarkdown } = props;
247
-
248
- const match = key.match(/^\$\{([^{]+)\}$/);
249
-
250
- const keyUnwrappedFromCurlyBraces = match === null ? key : match[1];
251
-
252
- const out = resolveMsg({
253
- "key": keyUnwrappedFromCurlyBraces,
254
- args,
255
- doRenderMarkdown
256
- });
257
-
258
- return (out !== undefined ? out : doRenderMarkdown ? <span>{keyUnwrappedFromCurlyBraces}</span> : keyUnwrappedFromCurlyBraces) as any;
259
- }
260
-
261
- return {
262
- "msgStr": (key, ...args) => resolveMsg({ key, args, "doRenderMarkdown": false }) as string,
263
- "msg": (key, ...args) => resolveMsg({ key, args, "doRenderMarkdown": true }) as JSX.Element,
264
- "advancedMsg": (key, ...args) => resolveMsgAdvanced({ key, args, "doRenderMarkdown": true }) as JSX.Element,
265
- "advancedMsgStr": (key, ...args) => resolveMsgAdvanced({ key, args, "doRenderMarkdown": false }) as string
266
- };
267
- }
268
-
269
- const keycloakifyExtraMessages = {
270
- "en": {
271
- "shouldBeEqual": "{0} should be equal to {1}",
272
- "shouldBeDifferent": "{0} should be different to {1}",
273
- "shouldMatchPattern": "Pattern should match: `/{0}/`",
274
- "mustBeAnInteger": "Must be an integer",
275
- "notAValidOption": "Not a valid option"
276
- },
277
- "fr": {
278
- /* spell-checker: disable */
279
- "shouldBeEqual": "{0} doit être égal à {1}",
280
- "shouldBeDifferent": "{0} doit être différent de {1}",
281
- "shouldMatchPattern": "Dois respecter le schéma: `/{0}/`",
282
- "mustBeAnInteger": "Doit être un nombre entier",
283
- "notAValidOption": "N'est pas une option valide",
284
-
285
- "logoutConfirmTitle": "Déconnexion",
286
- "logoutConfirmHeader": "Êtes-vous sûr(e) de vouloir vous déconnecter ?",
287
- "doLogout": "Se déconnecter"
288
- /* spell-checker: enable */
289
- }
290
- };
1
+ export * from "./i18n";
package/src/lib/index.ts CHANGED
@@ -2,12 +2,12 @@ export * from "./getKcContext";
2
2
 
3
3
  export * from "./i18n";
4
4
 
5
- export { useDownloadTerms } from "./components/Terms";
5
+ export { useDownloadTerms } from "./pages/Terms";
6
6
 
7
- export * from "./components/KcProps";
7
+ export * from "./KcProps";
8
8
  export * from "./keycloakJsAdapter";
9
9
  export * from "./useFormValidationSlice";
10
10
 
11
- import KcApp from "./components/KcApp";
11
+ import KcApp from "./KcApp";
12
12
 
13
13
  export default KcApp;
@@ -1,19 +1,10 @@
1
- import React, { memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
6
- import type { I18n } from "../i18n";
1
+ import React from "react";
2
+ import type { KcContextBase } from "../getKcContext";
3
+ import type { PageProps } from "../KcProps";
4
+ import type { I18nBase } from "../i18n";
7
5
 
8
- export type ErrorProps = KcProps & {
9
- kcContext: KcContextBase.Error;
10
- i18n: I18n;
11
- doFetchDefaultThemeResources?: boolean;
12
- Template?: (props: TemplateProps) => JSX.Element | null;
13
- };
14
-
15
- const Error = memo((props: ErrorProps) => {
16
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
6
+ export default function Error(props: PageProps<KcContextBase.Error, I18nBase>) {
7
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
17
8
 
18
9
  const { message, client } = kcContext;
19
10
 
@@ -38,6 +29,4 @@ const Error = memo((props: ErrorProps) => {
38
29
  }
39
30
  />
40
31
  );
41
- });
42
-
43
- export default Error;
32
+ }
@@ -1,21 +1,12 @@
1
- import React, { useState, memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
1
+ import React, { useState } from "react";
6
2
  import { clsx } from "../tools/clsx";
7
- import type { I18n } from "../i18n";
8
3
  import { UserProfileFormFields } from "./shared/UserProfileCommons";
4
+ import type { KcContextBase } from "../getKcContext";
5
+ import type { PageProps } from "../KcProps";
6
+ import type { I18nBase } from "../i18n";
9
7
 
10
- export type IdpReviewUserProfileProps = KcProps & {
11
- kcContext: KcContextBase.IdpReviewUserProfile;
12
- i18n: I18n;
13
- doFetchDefaultThemeResources?: boolean;
14
- Template?: (props: TemplateProps) => JSX.Element | null;
15
- };
16
-
17
- const IdpReviewUserProfile = memo((props: IdpReviewUserProfileProps) => {
18
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
8
+ export default function IdpReviewUserProfile(props: PageProps<KcContextBase.IdpReviewUserProfile, I18nBase>) {
9
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
19
10
 
20
11
  const { msg, msgStr } = i18n;
21
12
 
@@ -53,6 +44,4 @@ const IdpReviewUserProfile = memo((props: IdpReviewUserProfileProps) => {
53
44
  }
54
45
  />
55
46
  );
56
- });
57
-
58
- export default IdpReviewUserProfile;
47
+ }
@@ -1,20 +1,11 @@
1
- import React, { memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
1
+ import React from "react";
5
2
  import { assert } from "../tools/assert";
6
- import type { KcContextBase } from "../getKcContext/KcContextBase";
7
- import type { I18n } from "../i18n";
3
+ import type { KcContextBase } from "../getKcContext";
4
+ import type { PageProps } from "../KcProps";
5
+ import type { I18nBase } from "../i18n";
8
6
 
9
- export type InfoProps = KcProps & {
10
- kcContext: KcContextBase.Info;
11
- i18n: I18n;
12
- doFetchDefaultThemeResources?: boolean;
13
- Template?: (props: TemplateProps) => JSX.Element | null;
14
- };
15
-
16
- const Info = memo((props: InfoProps) => {
17
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
7
+ export default function Info(props: PageProps<KcContextBase.Info, I18nBase>) {
8
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
18
9
 
19
10
  const { msgStr, msg } = i18n;
20
11
 
@@ -55,6 +46,4 @@ const Info = memo((props: InfoProps) => {
55
46
  }
56
47
  />
57
48
  );
58
- });
59
-
60
- export default Info;
49
+ }
@@ -1,22 +1,12 @@
1
- import React, { useState, memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
1
+ import React, { useState, type FormEventHandler } from "react";
6
2
  import { clsx } from "../tools/clsx";
7
- import { useConstCallback } from "powerhooks/useConstCallback";
8
- import type { FormEventHandler } from "react";
9
- import type { I18n } from "../i18n";
3
+ import { useConstCallback } from "../tools/useConstCallback";
4
+ import type { KcContextBase } from "../getKcContext";
5
+ import type { PageProps } from "../KcProps";
6
+ import type { I18nBase } from "../i18n";
10
7
 
11
- export type LoginProps = KcProps & {
12
- kcContext: KcContextBase.Login;
13
- i18n: I18n;
14
- doFetchDefaultThemeResources?: boolean;
15
- Template?: (props: TemplateProps) => JSX.Element | null;
16
- };
17
-
18
- const Login = memo((props: LoginProps) => {
19
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
8
+ export default function Login(props: PageProps<KcContextBase.Login, I18nBase>) {
9
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
20
10
 
21
11
  const { social, realm, url, usernameEditDisabled, login, auth, registrationDisabled } = kcContext;
22
12
 
@@ -199,6 +189,4 @@ const Login = memo((props: LoginProps) => {
199
189
  }
200
190
  />
201
191
  );
202
- });
203
-
204
- export default Login;
192
+ }
@@ -1,20 +1,11 @@
1
- import React, { memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
1
+ import React from "react";
6
2
  import { clsx } from "../tools/clsx";
7
- import type { I18n } from "../i18n";
3
+ import type { KcContextBase } from "../getKcContext";
4
+ import type { PageProps } from "../KcProps";
5
+ import type { I18nBase } from "../i18n";
8
6
 
9
- export type LoginConfigTotpProps = KcProps & {
10
- kcContext: KcContextBase.LoginConfigTotp;
11
- i18n: I18n;
12
- doFetchDefaultThemeResources?: boolean;
13
- Template?: (props: TemplateProps) => JSX.Element | null;
14
- };
15
-
16
- const LoginConfigTotp = memo((props: LoginConfigTotpProps) => {
17
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
7
+ export default function LoginConfigTotp(props: PageProps<KcContextBase.LoginConfigTotp, I18nBase>) {
8
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
18
9
 
19
10
  const { url, isAppInitiatedAction, totp, mode, messagesPerField } = kcContext;
20
11
 
@@ -188,6 +179,4 @@ const LoginConfigTotp = memo((props: LoginConfigTotpProps) => {
188
179
  }
189
180
  />
190
181
  );
191
- });
192
-
193
- export default LoginConfigTotp;
182
+ }
@@ -1,20 +1,11 @@
1
- import React, { memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
1
+ import React from "react";
6
2
  import { clsx } from "../tools/clsx";
7
- import type { I18n } from "../i18n";
3
+ import type { KcContextBase } from "../getKcContext";
4
+ import type { PageProps } from "../KcProps";
5
+ import type { I18nBase } from "../i18n";
8
6
 
9
- export type LoginIdpLinkConfirmProps = KcProps & {
10
- kcContext: KcContextBase.LoginIdpLinkConfirm;
11
- i18n: I18n;
12
- doFetchDefaultThemeResources?: boolean;
13
- Template?: (props: TemplateProps) => JSX.Element | null;
14
- };
15
-
16
- const LoginIdpLinkConfirm = memo((props: LoginIdpLinkConfirmProps) => {
17
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
7
+ export default function LoginIdpLinkConfirm(props: PageProps<KcContextBase.LoginIdpLinkConfirm, I18nBase>) {
8
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
18
9
 
19
10
  const { url, idpAlias } = kcContext;
20
11
 
@@ -60,6 +51,4 @@ const LoginIdpLinkConfirm = memo((props: LoginIdpLinkConfirmProps) => {
60
51
  }
61
52
  />
62
53
  );
63
- });
64
-
65
- export default LoginIdpLinkConfirm;
54
+ }
@@ -1,19 +1,10 @@
1
- import React, { memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
6
- import type { I18n } from "../i18n";
1
+ import React from "react";
2
+ import type { KcContextBase } from "../getKcContext";
3
+ import type { PageProps } from "../KcProps";
4
+ import type { I18nBase } from "../i18n";
7
5
 
8
- export type LoginIdpLinkEmailProps = KcProps & {
9
- kcContext: KcContextBase.LoginIdpLinkEmail;
10
- i18n: I18n;
11
- doFetchDefaultThemeResources?: boolean;
12
- Template?: (props: TemplateProps) => JSX.Element | null;
13
- };
14
-
15
- const LoginIdpLinkEmail = memo((props: LoginIdpLinkEmailProps) => {
16
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
6
+ export default function LoginIdpLinkEmail(props: PageProps<KcContextBase.LoginIdpLinkEmail, I18nBase>) {
7
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
17
8
 
18
9
  const { url, realm, brokerContext, idpAlias } = kcContext;
19
10
 
@@ -38,6 +29,4 @@ const LoginIdpLinkEmail = memo((props: LoginIdpLinkEmailProps) => {
38
29
  }
39
30
  />
40
31
  );
41
- });
42
-
43
- export default LoginIdpLinkEmail;
32
+ }
@@ -1,22 +1,13 @@
1
- import React, { useEffect, memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
1
+ import React, { useEffect } from "react";
6
2
  import { headInsert } from "../tools/headInsert";
7
3
  import { pathJoin } from "../../bin/tools/pathJoin";
8
4
  import { clsx } from "../tools/clsx";
9
- import type { I18n } from "../i18n";
5
+ import type { KcContextBase } from "../getKcContext";
6
+ import type { PageProps } from "../KcProps";
7
+ import type { I18nBase } from "../i18n";
10
8
 
11
- export type LoginOtpProps = KcProps & {
12
- kcContext: KcContextBase.LoginOtp;
13
- i18n: I18n;
14
- doFetchDefaultThemeResources?: boolean;
15
- Template?: (props: TemplateProps) => JSX.Element | null;
16
- };
17
-
18
- const LoginOtp = memo((props: LoginOtpProps) => {
19
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
9
+ export default function LoginOtp(props: PageProps<KcContextBase.LoginOtp, I18nBase>) {
10
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
20
11
 
21
12
  const { otpLogin, url } = kcContext;
22
13
 
@@ -96,7 +87,7 @@ const LoginOtp = memo((props: LoginOtpProps) => {
96
87
  }
97
88
  />
98
89
  );
99
- });
90
+ }
100
91
 
101
92
  declare const $: any;
102
93
 
@@ -121,5 +112,3 @@ function evaluateInlineScript() {
121
112
  }
122
113
  });
123
114
  }
124
-
125
- export default LoginOtp;
@@ -1,19 +1,10 @@
1
- import React, { memo } from "react";
2
- import DefaultTemplate from "./Template";
3
- import type { TemplateProps } from "./Template";
4
- import type { KcProps } from "./KcProps";
5
- import type { KcContextBase } from "../getKcContext/KcContextBase";
6
- import type { I18n } from "../i18n";
1
+ import React from "react";
2
+ import type { KcContextBase } from "../getKcContext";
3
+ import type { PageProps } from "../KcProps";
4
+ import type { I18nBase } from "../i18n";
7
5
 
8
- export type LoginPageExpired = KcProps & {
9
- kcContext: KcContextBase.LoginPageExpired;
10
- i18n: I18n;
11
- doFetchDefaultThemeResources?: boolean;
12
- Template?: (props: TemplateProps) => JSX.Element | null;
13
- };
14
-
15
- const LoginPageExpired = memo((props: LoginPageExpired) => {
16
- const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
6
+ export default function LoginPageExpired(props: PageProps<KcContextBase.LoginPageExpired, I18nBase>) {
7
+ const { kcContext, i18n, doFetchDefaultThemeResources = true, Template, ...kcProps } = props;
17
8
 
18
9
  const { url } = kcContext;
19
10
 
@@ -42,6 +33,4 @@ const LoginPageExpired = memo((props: LoginPageExpired) => {
42
33
  }
43
34
  />
44
35
  );
45
- });
46
-
47
- export default LoginPageExpired;
36
+ }