keycloakify 10.1.3 → 11.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 (198) hide show
  1. package/account/KcContext/kcContextMocks.js +18 -6
  2. package/account/KcContext/kcContextMocks.js.map +1 -1
  3. package/account/Template.js +8 -26
  4. package/account/Template.js.map +1 -1
  5. package/account/Template.useInitialize.d.ts +12 -0
  6. package/account/Template.useInitialize.js +20 -0
  7. package/account/Template.useInitialize.js.map +1 -0
  8. package/account/i18n/index.d.ts +5 -5
  9. package/account/i18n/index.js +1 -1
  10. package/account/i18n/index.js.map +1 -1
  11. package/account/i18n/messages_defaultSet/types.d.ts +3 -0
  12. package/account/i18n/messages_defaultSet/types.js +26 -0
  13. package/account/i18n/messages_defaultSet/types.js.map +1 -0
  14. package/account/i18n/noJsx/GenericI18n_noJsx.d.ts +63 -0
  15. package/account/i18n/noJsx/GenericI18n_noJsx.js +2 -0
  16. package/account/i18n/noJsx/GenericI18n_noJsx.js.map +1 -0
  17. package/account/i18n/noJsx/getI18n.d.ts +41 -0
  18. package/account/i18n/noJsx/getI18n.js +207 -0
  19. package/account/i18n/noJsx/getI18n.js.map +1 -0
  20. package/account/i18n/noJsx/i18nBuilder.d.ts +18 -0
  21. package/account/i18n/noJsx/i18nBuilder.js +27 -0
  22. package/account/i18n/noJsx/i18nBuilder.js.map +1 -0
  23. package/account/i18n/noJsx/index.d.ts +3 -0
  24. package/account/i18n/noJsx/index.js +2 -0
  25. package/account/i18n/noJsx/index.js.map +1 -0
  26. package/account/i18n/withJsx/GenericI18n.d.ts +72 -0
  27. package/account/i18n/withJsx/GenericI18n.js +5 -0
  28. package/account/i18n/withJsx/GenericI18n.js.map +1 -0
  29. package/account/i18n/withJsx/i18nBuilder.d.ts +18 -0
  30. package/account/i18n/withJsx/i18nBuilder.js +27 -0
  31. package/account/i18n/withJsx/i18nBuilder.js.map +1 -0
  32. package/account/i18n/withJsx/index.d.ts +3 -0
  33. package/account/i18n/withJsx/index.js +2 -0
  34. package/account/i18n/withJsx/index.js.map +1 -0
  35. package/account/i18n/withJsx/useI18n.d.ts +27 -0
  36. package/account/i18n/{useI18n.js → withJsx/useI18n.js} +6 -4
  37. package/account/i18n/withJsx/useI18n.js.map +1 -0
  38. package/account/index.d.ts +1 -1
  39. package/account/index.js +1 -1
  40. package/account/index.js.map +1 -1
  41. package/account/pages/Totp.js +3 -2
  42. package/account/pages/Totp.js.map +1 -1
  43. package/bin/246.index.js +191 -191
  44. package/bin/499.index.js +252 -68
  45. package/bin/main.js +1 -1
  46. package/lib/kcSanitize/HtmlPolicyBuilder.d.ts +28 -0
  47. package/lib/kcSanitize/HtmlPolicyBuilder.js +209 -0
  48. package/lib/kcSanitize/HtmlPolicyBuilder.js.map +1 -0
  49. package/lib/kcSanitize/KcSanitizer.d.ts +12 -0
  50. package/lib/kcSanitize/KcSanitizer.js +46 -0
  51. package/lib/kcSanitize/KcSanitizer.js.map +1 -0
  52. package/lib/kcSanitize/KcSanitizerPolicy.d.ts +24 -0
  53. package/lib/kcSanitize/KcSanitizerPolicy.js +149 -0
  54. package/lib/kcSanitize/KcSanitizerPolicy.js.map +1 -0
  55. package/lib/kcSanitize/index.d.ts +1 -0
  56. package/lib/kcSanitize/index.js +5 -0
  57. package/lib/kcSanitize/index.js.map +1 -0
  58. package/login/KcContext/kcContextMocks.js +24 -6
  59. package/login/KcContext/kcContextMocks.js.map +1 -1
  60. package/login/Template.js +7 -7
  61. package/login/Template.js.map +1 -1
  62. package/login/{Template.useStylesAndScripts.d.ts → Template.useInitialize.d.ts} +1 -4
  63. package/login/{Template.useStylesAndScripts.js → Template.useInitialize.js} +5 -23
  64. package/login/Template.useInitialize.js.map +1 -0
  65. package/login/i18n/index.d.ts +5 -5
  66. package/login/i18n/index.js +1 -1
  67. package/login/i18n/index.js.map +1 -1
  68. package/login/i18n/messages_defaultSet/types.d.ts +3 -0
  69. package/login/i18n/messages_defaultSet/types.js +33 -0
  70. package/login/i18n/messages_defaultSet/types.js.map +1 -0
  71. package/login/i18n/noJsx/GenericI18n_noJsx.d.ts +63 -0
  72. package/login/i18n/noJsx/GenericI18n_noJsx.js +2 -0
  73. package/login/i18n/noJsx/GenericI18n_noJsx.js.map +1 -0
  74. package/login/i18n/noJsx/getI18n.d.ts +41 -0
  75. package/login/i18n/noJsx/getI18n.js +207 -0
  76. package/login/i18n/noJsx/getI18n.js.map +1 -0
  77. package/login/i18n/noJsx/i18nBuilder.d.ts +18 -0
  78. package/login/i18n/noJsx/i18nBuilder.js +27 -0
  79. package/login/i18n/noJsx/i18nBuilder.js.map +1 -0
  80. package/login/i18n/noJsx/index.d.ts +3 -0
  81. package/login/i18n/noJsx/index.js +2 -0
  82. package/login/i18n/noJsx/index.js.map +1 -0
  83. package/login/i18n/withJsx/GenericI18n.d.ts +72 -0
  84. package/login/i18n/withJsx/GenericI18n.js +5 -0
  85. package/login/i18n/withJsx/GenericI18n.js.map +1 -0
  86. package/login/i18n/withJsx/i18nBuilder.d.ts +18 -0
  87. package/login/i18n/withJsx/i18nBuilder.js +27 -0
  88. package/login/i18n/withJsx/i18nBuilder.js.map +1 -0
  89. package/login/i18n/withJsx/index.d.ts +3 -0
  90. package/login/i18n/withJsx/index.js +2 -0
  91. package/login/i18n/withJsx/index.js.map +1 -0
  92. package/login/i18n/withJsx/useI18n.d.ts +27 -0
  93. package/login/i18n/{useI18n.js → withJsx/useI18n.js} +6 -4
  94. package/login/i18n/withJsx/useI18n.js.map +1 -0
  95. package/login/index.d.ts +1 -1
  96. package/login/index.js +1 -1
  97. package/login/index.js.map +1 -1
  98. package/login/lib/useUserProfileForm.d.ts +1 -1
  99. package/login/lib/useUserProfileForm.js +2 -1
  100. package/login/lib/useUserProfileForm.js.map +1 -1
  101. package/login/pages/Error.js +2 -1
  102. package/login/pages/Error.js.map +1 -1
  103. package/login/pages/Info.js +4 -3
  104. package/login/pages/Info.js.map +1 -1
  105. package/login/pages/Login.js +4 -3
  106. package/login/pages/Login.js.map +1 -1
  107. package/login/pages/LoginConfigTotp.js +3 -2
  108. package/login/pages/LoginConfigTotp.js.map +1 -1
  109. package/login/pages/LoginOtp.js +2 -1
  110. package/login/pages/LoginOtp.js.map +1 -1
  111. package/login/pages/LoginPassword.js +2 -1
  112. package/login/pages/LoginPassword.js.map +1 -1
  113. package/login/pages/LoginRecoveryAuthnCodeInput.js +2 -1
  114. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  115. package/login/pages/LoginResetPassword.js +2 -1
  116. package/login/pages/LoginResetPassword.js.map +1 -1
  117. package/login/pages/LoginUpdatePassword.js +3 -2
  118. package/login/pages/LoginUpdatePassword.js.map +1 -1
  119. package/login/pages/Register.js +2 -1
  120. package/login/pages/Register.js.map +1 -1
  121. package/package.json +110 -31
  122. package/src/account/KcContext/kcContextMocks.ts +49 -29
  123. package/src/account/Template.tsx +11 -32
  124. package/src/account/Template.useInitialize.ts +35 -0
  125. package/src/account/i18n/index.ts +5 -5
  126. package/src/account/i18n/messages_defaultSet/types.ts +30 -0
  127. package/src/account/i18n/noJsx/GenericI18n_noJsx.ts +64 -0
  128. package/src/account/i18n/noJsx/getI18n.tsx +341 -0
  129. package/src/account/i18n/noJsx/i18nBuilder.ts +117 -0
  130. package/src/account/i18n/noJsx/index.ts +3 -0
  131. package/src/account/i18n/withJsx/GenericI18n.tsx +81 -0
  132. package/src/account/i18n/withJsx/i18nBuilder.ts +117 -0
  133. package/src/account/i18n/withJsx/index.ts +3 -0
  134. package/src/{login/i18n → account/i18n/withJsx}/useI18n.tsx +43 -11
  135. package/src/account/index.ts +1 -1
  136. package/src/account/pages/Totp.tsx +3 -2
  137. package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +10 -3
  138. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +15 -0
  139. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +371 -121
  140. package/src/bin/keycloakify/generateResources/generateResources.ts +8 -6
  141. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +61 -29
  142. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +15 -9
  143. package/src/lib/kcSanitize/HtmlPolicyBuilder.ts +252 -0
  144. package/src/lib/kcSanitize/KcSanitizer.ts +60 -0
  145. package/src/lib/kcSanitize/KcSanitizerPolicy.ts +294 -0
  146. package/src/lib/kcSanitize/index.ts +5 -0
  147. package/src/login/KcContext/kcContextMocks.ts +54 -29
  148. package/src/login/Template.tsx +11 -17
  149. package/src/login/{Template.useStylesAndScripts.ts → Template.useInitialize.ts} +5 -29
  150. package/src/login/i18n/index.ts +5 -5
  151. package/src/login/i18n/messages_defaultSet/types.ts +37 -0
  152. package/src/login/i18n/noJsx/GenericI18n_noJsx.ts +64 -0
  153. package/src/login/i18n/noJsx/getI18n.tsx +341 -0
  154. package/src/login/i18n/noJsx/i18nBuilder.ts +117 -0
  155. package/src/login/i18n/noJsx/index.ts +3 -0
  156. package/src/login/i18n/withJsx/GenericI18n.tsx +81 -0
  157. package/src/login/i18n/withJsx/i18nBuilder.ts +117 -0
  158. package/src/login/i18n/withJsx/index.ts +3 -0
  159. package/src/{account/i18n → login/i18n/withJsx}/useI18n.tsx +43 -11
  160. package/src/login/index.ts +1 -1
  161. package/src/login/lib/useUserProfileForm.tsx +3 -2
  162. package/src/login/pages/Error.tsx +2 -1
  163. package/src/login/pages/Info.tsx +13 -10
  164. package/src/login/pages/Login.tsx +4 -3
  165. package/src/login/pages/LoginConfigTotp.tsx +3 -2
  166. package/src/login/pages/LoginOtp.tsx +2 -1
  167. package/src/login/pages/LoginPassword.tsx +2 -1
  168. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +2 -1
  169. package/src/login/pages/LoginResetPassword.tsx +2 -1
  170. package/src/login/pages/LoginUpdatePassword.tsx +3 -2
  171. package/src/login/pages/Register.tsx +2 -1
  172. package/src/tools/useInsertScriptTags.ts +1 -1
  173. package/src/tools/vendor/dompurify.ts +3 -0
  174. package/stories/intro/intro.stories.tsx +0 -1
  175. package/tools/useInsertScriptTags.d.ts +1 -1
  176. package/tools/vendor/dompurify.d.ts +2 -0
  177. package/tools/vendor/dompurify.js +2 -0
  178. package/account/i18n/GenericI18n.d.ts +0 -6
  179. package/account/i18n/GenericI18n.js +0 -2
  180. package/account/i18n/GenericI18n.js.map +0 -1
  181. package/account/i18n/i18n.d.ts +0 -87
  182. package/account/i18n/i18n.js +0 -111
  183. package/account/i18n/i18n.js.map +0 -1
  184. package/account/i18n/useI18n.d.ts +0 -14
  185. package/account/i18n/useI18n.js.map +0 -1
  186. package/login/Template.useStylesAndScripts.js.map +0 -1
  187. package/login/i18n/GenericI18n.d.ts +0 -6
  188. package/login/i18n/GenericI18n.js +0 -2
  189. package/login/i18n/GenericI18n.js.map +0 -1
  190. package/login/i18n/i18n.d.ts +0 -87
  191. package/login/i18n/i18n.js +0 -113
  192. package/login/i18n/i18n.js.map +0 -1
  193. package/login/i18n/useI18n.d.ts +0 -14
  194. package/login/i18n/useI18n.js.map +0 -1
  195. package/src/account/i18n/GenericI18n.tsx +0 -6
  196. package/src/account/i18n/i18n.tsx +0 -250
  197. package/src/login/i18n/GenericI18n.tsx +0 -6
  198. package/src/login/i18n/i18n.tsx +0 -252
@@ -0,0 +1,117 @@
1
+ import type {
2
+ LanguageTag as LanguageTag_defaultSet,
3
+ MessageKey as MessageKey_defaultSet
4
+ } from "../messages_defaultSet/types";
5
+ import { type ReturnTypeOfCreateUseI18n, createUseI18n } from "../withJsx/useI18n";
6
+
7
+ export type I18nBuilder<
8
+ ThemeName extends string = never,
9
+ MessageKey_themeDefined extends string = never,
10
+ LanguageTag_notInDefaultSet extends string = never,
11
+ ExcludedMethod extends
12
+ | "withThemeName"
13
+ | "withExtraLanguages"
14
+ | "withCustomTranslations" = never
15
+ > = Omit<
16
+ {
17
+ withThemeName: <ThemeName extends string>() => I18nBuilder<
18
+ ThemeName,
19
+ MessageKey_themeDefined,
20
+ LanguageTag_notInDefaultSet,
21
+ ExcludedMethod | "withThemeName"
22
+ >;
23
+ withExtraLanguages: <
24
+ LanguageTag_notInDefaultSet extends string
25
+ >(extraLanguageTranslations: {
26
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
27
+ label: string;
28
+ getMessages: () => Promise<{
29
+ default: Record<MessageKey_defaultSet, string>;
30
+ }>;
31
+ };
32
+ }) => I18nBuilder<
33
+ ThemeName,
34
+ MessageKey_themeDefined,
35
+ LanguageTag_notInDefaultSet,
36
+ ExcludedMethod | "withExtraLanguages"
37
+ >;
38
+ withCustomTranslations: <MessageKey_themeDefined extends string>(
39
+ messagesByLanguageTag_themeDefined: Partial<{
40
+ [LanguageTag in
41
+ | LanguageTag_defaultSet
42
+ | LanguageTag_notInDefaultSet]: Record<
43
+ MessageKey_themeDefined,
44
+ string | Record<ThemeName, string>
45
+ >;
46
+ }>
47
+ ) => I18nBuilder<
48
+ ThemeName,
49
+ MessageKey_themeDefined,
50
+ LanguageTag_notInDefaultSet,
51
+ ExcludedMethod | "withCustomTranslations"
52
+ >;
53
+ build: () => ReturnTypeOfCreateUseI18n<
54
+ MessageKey_themeDefined,
55
+ LanguageTag_notInDefaultSet
56
+ >;
57
+ },
58
+ ExcludedMethod
59
+ >;
60
+
61
+ function createI18nBuilder<
62
+ ThemeName extends string = never,
63
+ MessageKey_themeDefined extends string = never,
64
+ LanguageTag_notInDefaultSet extends string = never
65
+ >(params: {
66
+ extraLanguageTranslations: {
67
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
68
+ label: string;
69
+ getMessages: () => Promise<{
70
+ default: Record<MessageKey_defaultSet, string>;
71
+ }>;
72
+ };
73
+ };
74
+ messagesByLanguageTag_themeDefined: Partial<{
75
+ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record<
76
+ MessageKey_themeDefined,
77
+ string | Record<ThemeName, string>
78
+ >;
79
+ }>;
80
+ }): I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet> {
81
+ const i18nBuilder: I18nBuilder<
82
+ ThemeName,
83
+ MessageKey_themeDefined,
84
+ LanguageTag_notInDefaultSet
85
+ > = {
86
+ withThemeName: () =>
87
+ createI18nBuilder({
88
+ extraLanguageTranslations: params.extraLanguageTranslations,
89
+ messagesByLanguageTag_themeDefined:
90
+ params.messagesByLanguageTag_themeDefined as any
91
+ }),
92
+ withExtraLanguages: extraLanguageTranslations =>
93
+ createI18nBuilder({
94
+ extraLanguageTranslations,
95
+ messagesByLanguageTag_themeDefined:
96
+ params.messagesByLanguageTag_themeDefined as any
97
+ }),
98
+ withCustomTranslations: messagesByLanguageTag_themeDefined =>
99
+ createI18nBuilder({
100
+ extraLanguageTranslations: params.extraLanguageTranslations,
101
+ messagesByLanguageTag_themeDefined
102
+ }),
103
+ build: () =>
104
+ createUseI18n({
105
+ extraLanguageTranslations: params.extraLanguageTranslations,
106
+ messagesByLanguageTag_themeDefined:
107
+ params.messagesByLanguageTag_themeDefined
108
+ })
109
+ };
110
+
111
+ return i18nBuilder;
112
+ }
113
+
114
+ export const i18nBuilder = createI18nBuilder({
115
+ extraLanguageTranslations: {},
116
+ messagesByLanguageTag_themeDefined: {}
117
+ });
@@ -0,0 +1,3 @@
1
+ export { i18nBuilder } from "./i18nBuilder";
2
+ export type { KcContextLike } from "./useI18n";
3
+ export type { MessageKey as MessageKey_defaultSet } from "../messages_defaultSet/types";
@@ -1,17 +1,49 @@
1
1
  import { useEffect, useState } from "react";
2
- import { createGetI18n, type GenericI18n_noJsx, type KcContextLike, type MessageKey_defaultSet } from "./i18n";
3
- import { GenericI18n } from "./GenericI18n";
2
+ import { kcSanitize } from "keycloakify/lib/kcSanitize";
3
+ import { createGetI18n, type KcContextLike } from "../noJsx/getI18n";
4
+ import type { GenericI18n_noJsx } from "../noJsx/GenericI18n_noJsx";
4
5
  import { Reflect } from "tsafe/Reflect";
6
+ import type { GenericI18n } from "./GenericI18n";
7
+ import type { LanguageTag as LanguageTag_defaultSet, MessageKey as MessageKey_defaultSet } from "../messages_defaultSet/types";
8
+
9
+ export type ReturnTypeOfCreateUseI18n<MessageKey_themeDefined extends string, LanguageTag_notInDefaultSet extends string> = {
10
+ useI18n: (params: { kcContext: KcContextLike }) => {
11
+ i18n: GenericI18n<MessageKey_defaultSet | MessageKey_themeDefined, LanguageTag_defaultSet | LanguageTag_notInDefaultSet>;
12
+ };
13
+ ofTypeI18n: GenericI18n<MessageKey_defaultSet | MessageKey_themeDefined, LanguageTag_defaultSet | LanguageTag_notInDefaultSet>;
14
+ };
15
+
16
+ export { KcContextLike };
17
+
18
+ export function createUseI18n<
19
+ ThemeName extends string = string,
20
+ MessageKey_themeDefined extends string = never,
21
+ LanguageTag_notInDefaultSet extends string = never
22
+ >(params: {
23
+ extraLanguageTranslations: {
24
+ [languageTag in LanguageTag_notInDefaultSet]: {
25
+ label: string;
26
+ getMessages: () => Promise<{ default: Record<MessageKey_defaultSet, string> }>;
27
+ };
28
+ };
29
+ messagesByLanguageTag_themeDefined: Partial<{
30
+ [languageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: {
31
+ [key in MessageKey_themeDefined]: string | Record<ThemeName, string>;
32
+ };
33
+ }>;
34
+ }): ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet> {
35
+ const { extraLanguageTranslations, messagesByLanguageTag_themeDefined } = params;
36
+
37
+ type LanguageTag = LanguageTag_defaultSet | LanguageTag_notInDefaultSet;
5
38
 
6
- export function createUseI18n<MessageKey_themeDefined extends string = never>(messagesByLanguageTag: {
7
- [languageTag: string]: { [key in MessageKey_themeDefined]: string };
8
- }) {
9
39
  type MessageKey = MessageKey_defaultSet | MessageKey_themeDefined;
10
40
 
11
- type I18n = GenericI18n<MessageKey>;
41
+ type I18n = GenericI18n<MessageKey, LanguageTag>;
42
+
43
+ type Result = { i18n: I18n };
12
44
 
13
45
  const { withJsx } = (() => {
14
- const cache = new WeakMap<GenericI18n_noJsx<MessageKey>, GenericI18n<MessageKey>>();
46
+ const cache = new WeakMap<GenericI18n_noJsx<MessageKey, LanguageTag>, GenericI18n<MessageKey, LanguageTag>>();
15
47
 
16
48
  function renderHtmlString(params: { htmlString: string; msgKey: string }): JSX.Element {
17
49
  const { htmlString, msgKey } = params;
@@ -19,13 +51,13 @@ export function createUseI18n<MessageKey_themeDefined extends string = never>(me
19
51
  <div
20
52
  data-kc-msg={msgKey}
21
53
  dangerouslySetInnerHTML={{
22
- __html: htmlString
54
+ __html: kcSanitize(htmlString)
23
55
  }}
24
56
  />
25
57
  );
26
58
  }
27
59
 
28
- function withJsx(i18n_noJsx: GenericI18n_noJsx<MessageKey>): I18n {
60
+ function withJsx(i18n_noJsx: GenericI18n_noJsx<MessageKey, LanguageTag>): I18n {
29
61
  use_cache: {
30
62
  const i18n = cache.get(i18n_noJsx);
31
63
 
@@ -63,9 +95,9 @@ export function createUseI18n<MessageKey_themeDefined extends string = never>(me
63
95
  (styleElement.textContent = `[data-kc-msg] { display: inline-block; }`), document.head.prepend(styleElement);
64
96
  }
65
97
 
66
- const { getI18n } = createGetI18n(messagesByLanguageTag);
98
+ const { getI18n } = createGetI18n({ extraLanguageTranslations, messagesByLanguageTag_themeDefined });
67
99
 
68
- function useI18n(params: { kcContext: KcContextLike }): { i18n: I18n } {
100
+ function useI18n(params: { kcContext: KcContextLike }): Result {
69
101
  const { kcContext } = params;
70
102
 
71
103
  const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
@@ -1,3 +1,3 @@
1
1
  export type { ExtendKcContext } from "keycloakify/account/KcContext";
2
2
  export type { ClassKey } from "keycloakify/account/TemplateProps";
3
- export { createUseI18n } from "keycloakify/account/i18n";
3
+ export { i18nBuilder, type MessageKey_defaultSet } from "keycloakify/account/i18n";
@@ -1,5 +1,6 @@
1
1
  import { clsx } from "keycloakify/tools/clsx";
2
2
  import { getKcClsx } from "keycloakify/account/lib/kcClsx";
3
+ import { kcSanitize } from "keycloakify/lib/kcSanitize";
3
4
  import type { PageProps } from "keycloakify/account/pages/PageProps";
4
5
  import type { KcContext } from "../KcContext";
5
6
  import type { I18n } from "../i18n";
@@ -159,7 +160,7 @@ export default function Totp(props: PageProps<Extract<KcContext, { pageId: "totp
159
160
  className={kcClsx("kcInputErrorMessageClass")}
160
161
  aria-live="polite"
161
162
  dangerouslySetInnerHTML={{
162
- __html: messagesPerField.get("totp")
163
+ __html: kcSanitize(messagesPerField.get("totp"))
163
164
  }}
164
165
  />
165
166
  )}
@@ -190,7 +191,7 @@ export default function Totp(props: PageProps<Extract<KcContext, { pageId: "totp
190
191
  className={kcClsx("kcInputErrorMessageClass")}
191
192
  aria-live="polite"
192
193
  dangerouslySetInnerHTML={{
193
- __html: messagesPerField.get("userLabel")
194
+ __html: kcSanitize(messagesPerField.get("userLabel"))
194
195
  }}
195
196
  />
196
197
  )}
@@ -1,5 +1,12 @@
1
- import { createUseI18n } from "keycloakify/account";
1
+ import { i18nBuilder } from "keycloakify/account";
2
+ import type { ThemeName } from "../kc.gen";
2
3
 
3
- export const { useI18n, ofTypeI18n } = createUseI18n({});
4
+ const { useI18n, ofTypeI18n } = i18nBuilder
5
+ .withThemeName<ThemeName>()
6
+ .withExtraLanguages({})
7
+ .withCustomTranslations({})
8
+ .build();
4
9
 
5
- export type I18n = typeof ofTypeI18n;
10
+ type I18n = typeof ofTypeI18n;
11
+
12
+ export { useI18n, type I18n };
@@ -85,6 +85,21 @@ attributes_to_attributesByName: {
85
85
  });
86
86
  }
87
87
  window.kcContext = kcContext;
88
+
89
+ <#if xKeycloakify.themeType == "login" >
90
+ {
91
+ const script = document.createElement("script");
92
+ script.type = "importmap";
93
+ script.textContent = JSON.stringify({
94
+ imports: {
95
+ "rfc4648": kcContext.url.resourcesCommonPath + "/node_modules/rfc4648/lib/rfc4648.js"
96
+ }
97
+ }, null, 2);
98
+
99
+ document.head.appendChild(script);
100
+ }
101
+ </#if>
102
+
88
103
  function decodeHtmlEntities(htmlStr){
89
104
  var element = decodeHtmlEntities.element;
90
105
  if (!element) {