@keycloakify/svelte 0.0.1-rc.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 (284) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/account/DefaultPage.svelte +42 -0
  4. package/dist/account/DefaultPage.svelte.d.ts +6 -0
  5. package/dist/account/KcContext/KcContext.d.ts +1 -0
  6. package/dist/account/KcContext/KcContext.js +1 -0
  7. package/dist/account/KcContext/index.d.ts +1 -0
  8. package/dist/account/KcContext/index.js +1 -0
  9. package/dist/account/Template.svelte +143 -0
  10. package/dist/account/Template.svelte.d.ts +6 -0
  11. package/dist/account/Template.useInitialize.d.ts +12 -0
  12. package/dist/account/Template.useInitialize.js +19 -0
  13. package/dist/account/TemplateProps.d.ts +12 -0
  14. package/dist/account/TemplateProps.js +1 -0
  15. package/dist/account/i18n/i18n.d.ts +15 -0
  16. package/dist/account/i18n/i18n.js +1 -0
  17. package/dist/account/i18n/i18nBuilder.d.ts +18 -0
  18. package/dist/account/i18n/i18nBuilder.js +26 -0
  19. package/dist/account/i18n/index.d.ts +1 -0
  20. package/dist/account/i18n/index.js +1 -0
  21. package/dist/account/i18n/useI18n.d.ts +28 -0
  22. package/dist/account/i18n/useI18n.js +65 -0
  23. package/dist/account/index.d.ts +2 -0
  24. package/dist/account/index.js +1 -0
  25. package/dist/account/pages/Account.svelte +182 -0
  26. package/dist/account/pages/Account.svelte.d.ts +6 -0
  27. package/dist/account/pages/Applications.svelte +173 -0
  28. package/dist/account/pages/Applications.svelte.d.ts +6 -0
  29. package/dist/account/pages/FederatedIdentity.svelte +114 -0
  30. package/dist/account/pages/FederatedIdentity.svelte.d.ts +6 -0
  31. package/dist/account/pages/Log.svelte +68 -0
  32. package/dist/account/pages/Log.svelte.d.ts +6 -0
  33. package/dist/account/pages/PageProps.d.ts +10 -0
  34. package/dist/account/pages/PageProps.js +1 -0
  35. package/dist/account/pages/Password.svelte +233 -0
  36. package/dist/account/pages/Password.svelte.d.ts +6 -0
  37. package/dist/account/pages/Sessions.svelte +88 -0
  38. package/dist/account/pages/Sessions.svelte.d.ts +6 -0
  39. package/dist/account/pages/Totp.svelte +287 -0
  40. package/dist/account/pages/Totp.svelte.d.ts +6 -0
  41. package/dist/additional-svelte-typings.d.ts +6 -0
  42. package/dist/bin/197.index.js +13 -0
  43. package/dist/bin/381.index.js +13 -0
  44. package/dist/bin/504.index.js +13 -0
  45. package/dist/bin/87.index.js +13 -0
  46. package/dist/bin/main.js +230 -0
  47. package/dist/bin/package.json +3 -0
  48. package/dist/login/DefaultPage.svelte +135 -0
  49. package/dist/login/DefaultPage.svelte.d.ts +12 -0
  50. package/dist/login/KcContext/KcContext.d.ts +1 -0
  51. package/dist/login/KcContext/KcContext.js +1 -0
  52. package/dist/login/KcContext/index.d.ts +1 -0
  53. package/dist/login/KcContext/index.js +1 -0
  54. package/dist/login/Template.svelte +223 -0
  55. package/dist/login/Template.svelte.d.ts +6 -0
  56. package/dist/login/Template.useInitialize.d.ts +14 -0
  57. package/dist/login/Template.useInitialize.js +55 -0
  58. package/dist/login/TemplateProps.d.ts +20 -0
  59. package/dist/login/TemplateProps.js +1 -0
  60. package/dist/login/components/AddRemoveButtonsMultiValuedAttribute.svelte +57 -0
  61. package/dist/login/components/AddRemoveButtonsMultiValuedAttribute.svelte.d.ts +18 -0
  62. package/dist/login/components/FieldErrors.svelte +31 -0
  63. package/dist/login/components/FieldErrors.svelte.d.ts +12 -0
  64. package/dist/login/components/GroupLabel.svelte +68 -0
  65. package/dist/login/components/GroupLabel.svelte.d.ts +15 -0
  66. package/dist/login/components/InputFieldByType.svelte +58 -0
  67. package/dist/login/components/InputFieldByType.svelte.d.ts +4 -0
  68. package/dist/login/components/InputFieldByTypeProps.d.ts +16 -0
  69. package/dist/login/components/InputFieldByTypeProps.js +1 -0
  70. package/dist/login/components/InputTag.svelte +107 -0
  71. package/dist/login/components/InputTag.svelte.d.ts +7 -0
  72. package/dist/login/components/InputTagSelects.svelte +111 -0
  73. package/dist/login/components/InputTagSelects.svelte.d.ts +4 -0
  74. package/dist/login/components/LogoutOtherSessions.svelte +29 -0
  75. package/dist/login/components/LogoutOtherSessions.svelte.d.ts +10 -0
  76. package/dist/login/components/PasswordWrapper.svelte +43 -0
  77. package/dist/login/components/PasswordWrapper.svelte.d.ts +13 -0
  78. package/dist/login/components/SelectTag.svelte +72 -0
  79. package/dist/login/components/SelectTag.svelte.d.ts +4 -0
  80. package/dist/login/components/TermsAcceptance.svelte +56 -0
  81. package/dist/login/components/TermsAcceptance.svelte.d.ts +13 -0
  82. package/dist/login/components/TextareaTag.svelte +40 -0
  83. package/dist/login/components/TextareaTag.svelte.d.ts +4 -0
  84. package/dist/login/components/UserProfileFormFields.svelte +123 -0
  85. package/dist/login/components/UserProfileFormFields.svelte.d.ts +6 -0
  86. package/dist/login/components/UserProfileFormFieldsProps.d.ts +27 -0
  87. package/dist/login/components/UserProfileFormFieldsProps.js +2 -0
  88. package/dist/login/components/inputLabel.d.ts +3 -0
  89. package/dist/login/components/inputLabel.js +12 -0
  90. package/dist/login/i18n/i18n.d.ts +15 -0
  91. package/dist/login/i18n/i18n.js +1 -0
  92. package/dist/login/i18n/i18nBuilder.d.ts +18 -0
  93. package/dist/login/i18n/i18nBuilder.js +26 -0
  94. package/dist/login/i18n/index.d.ts +1 -0
  95. package/dist/login/i18n/index.js +1 -0
  96. package/dist/login/i18n/useI18n.d.ts +28 -0
  97. package/dist/login/i18n/useI18n.js +65 -0
  98. package/dist/login/index.d.ts +2 -0
  99. package/dist/login/index.js +1 -0
  100. package/dist/login/lib/useUserProfileForm.d.ts +66 -0
  101. package/dist/login/lib/useUserProfileForm.js +63 -0
  102. package/dist/login/pages/Code.svelte +46 -0
  103. package/dist/login/pages/Code.svelte.d.ts +6 -0
  104. package/dist/login/pages/DeleteAccountConfirm.svelte +77 -0
  105. package/dist/login/pages/DeleteAccountConfirm.svelte.d.ts +6 -0
  106. package/dist/login/pages/DeleteCredential.svelte +58 -0
  107. package/dist/login/pages/DeleteCredential.svelte.d.ts +6 -0
  108. package/dist/login/pages/Error.svelte +43 -0
  109. package/dist/login/pages/Error.svelte.d.ts +6 -0
  110. package/dist/login/pages/FrontchannelLogout.svelte +57 -0
  111. package/dist/login/pages/FrontchannelLogout.svelte.d.ts +6 -0
  112. package/dist/login/pages/IdpReviewUserProfile.svelte +80 -0
  113. package/dist/login/pages/IdpReviewUserProfile.svelte.d.ts +11 -0
  114. package/dist/login/pages/Info.svelte +66 -0
  115. package/dist/login/pages/Info.svelte.d.ts +6 -0
  116. package/dist/login/pages/Login.svelte +225 -0
  117. package/dist/login/pages/Login.svelte.d.ts +6 -0
  118. package/dist/login/pages/LoginConfigTotp.svelte +217 -0
  119. package/dist/login/pages/LoginConfigTotp.svelte.d.ts +6 -0
  120. package/dist/login/pages/LoginIdpLinkConfirm.svelte +60 -0
  121. package/dist/login/pages/LoginIdpLinkConfirm.svelte.d.ts +6 -0
  122. package/dist/login/pages/LoginIdpLinkConfirmOverride.svelte +59 -0
  123. package/dist/login/pages/LoginIdpLinkConfirmOverride.svelte.d.ts +6 -0
  124. package/dist/login/pages/LoginIdpLinkEmail.svelte +50 -0
  125. package/dist/login/pages/LoginIdpLinkEmail.svelte.d.ts +6 -0
  126. package/dist/login/pages/LoginOauth2DeviceVerifyUserCode.svelte +85 -0
  127. package/dist/login/pages/LoginOauth2DeviceVerifyUserCode.svelte.d.ts +6 -0
  128. package/dist/login/pages/LoginOauthGrant.svelte +126 -0
  129. package/dist/login/pages/LoginOauthGrant.svelte.d.ts +6 -0
  130. package/dist/login/pages/LoginOtp.svelte +128 -0
  131. package/dist/login/pages/LoginOtp.svelte.d.ts +6 -0
  132. package/dist/login/pages/LoginPageExpired.svelte +50 -0
  133. package/dist/login/pages/LoginPageExpired.svelte.d.ts +6 -0
  134. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.svelte +240 -0
  135. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.svelte.d.ts +6 -0
  136. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.useScript.d.ts +21 -0
  137. package/dist/login/pages/LoginPasskeysConditionalAuthenticate.useScript.js +57 -0
  138. package/dist/login/pages/LoginPassword.svelte +120 -0
  139. package/dist/login/pages/LoginPassword.svelte.d.ts +6 -0
  140. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.svelte +179 -0
  141. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.svelte.d.ts +6 -0
  142. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.useScript.d.ts +10 -0
  143. package/dist/login/pages/LoginRecoveryAuthnCodeConfig.useScript.js +141 -0
  144. package/dist/login/pages/LoginRecoveryAuthnCodeInput.svelte +94 -0
  145. package/dist/login/pages/LoginRecoveryAuthnCodeInput.svelte.d.ts +6 -0
  146. package/dist/login/pages/LoginResetOtp.svelte +86 -0
  147. package/dist/login/pages/LoginResetOtp.svelte.d.ts +6 -0
  148. package/dist/login/pages/LoginResetPassword.svelte +109 -0
  149. package/dist/login/pages/LoginResetPassword.svelte.d.ts +6 -0
  150. package/dist/login/pages/LoginUpdatePassword.svelte +149 -0
  151. package/dist/login/pages/LoginUpdatePassword.svelte.d.ts +6 -0
  152. package/dist/login/pages/LoginUpdateProfile.svelte +98 -0
  153. package/dist/login/pages/LoginUpdateProfile.svelte.d.ts +11 -0
  154. package/dist/login/pages/LoginUsername.svelte +182 -0
  155. package/dist/login/pages/LoginUsername.svelte.d.ts +6 -0
  156. package/dist/login/pages/LoginVerifyEmail.svelte +39 -0
  157. package/dist/login/pages/LoginVerifyEmail.svelte.d.ts +6 -0
  158. package/dist/login/pages/LoginX509Info.svelte +123 -0
  159. package/dist/login/pages/LoginX509Info.svelte.d.ts +6 -0
  160. package/dist/login/pages/LogoutConfirm.svelte +77 -0
  161. package/dist/login/pages/LogoutConfirm.svelte.d.ts +6 -0
  162. package/dist/login/pages/PageProps.d.ts +10 -0
  163. package/dist/login/pages/PageProps.js +1 -0
  164. package/dist/login/pages/Register.svelte +136 -0
  165. package/dist/login/pages/Register.svelte.d.ts +11 -0
  166. package/dist/login/pages/SamlPostForm.svelte +80 -0
  167. package/dist/login/pages/SamlPostForm.svelte.d.ts +6 -0
  168. package/dist/login/pages/SelectAuthenticator.svelte +63 -0
  169. package/dist/login/pages/SelectAuthenticator.svelte.d.ts +6 -0
  170. package/dist/login/pages/Terms.svelte +57 -0
  171. package/dist/login/pages/Terms.svelte.d.ts +6 -0
  172. package/dist/login/pages/UpdateEmail.svelte +104 -0
  173. package/dist/login/pages/UpdateEmail.svelte.d.ts +11 -0
  174. package/dist/login/pages/WebauthnAuthenticate.svelte +182 -0
  175. package/dist/login/pages/WebauthnAuthenticate.svelte.d.ts +6 -0
  176. package/dist/login/pages/WebauthnAuthenticate.useScript.d.ts +22 -0
  177. package/dist/login/pages/WebauthnAuthenticate.useScript.js +49 -0
  178. package/dist/login/pages/WebauthnError.svelte +86 -0
  179. package/dist/login/pages/WebauthnError.svelte.d.ts +6 -0
  180. package/dist/login/pages/WebauthnRegister.svelte +109 -0
  181. package/dist/login/pages/WebauthnRegister.svelte.d.ts +6 -0
  182. package/dist/login/pages/WebauthnRegister.useScript.d.ts +28 -0
  183. package/dist/login/pages/WebauthnRegister.useScript.js +57 -0
  184. package/dist/tools/useConst.d.ts +1 -0
  185. package/dist/tools/useConst.js +4 -0
  186. package/dist/tools/useInsertLinkTags.d.ts +12 -0
  187. package/dist/tools/useInsertLinkTags.js +62 -0
  188. package/dist/tools/useInsertScriptTags.d.ts +29 -0
  189. package/dist/tools/useInsertScriptTags.js +77 -0
  190. package/dist/tools/useReducer.d.ts +2 -0
  191. package/dist/tools/useReducer.js +7 -0
  192. package/dist/tools/useSetClassName.d.ts +4 -0
  193. package/dist/tools/useSetClassName.js +15 -0
  194. package/dist/tools/useState.d.ts +2 -0
  195. package/dist/tools/useState.js +7 -0
  196. package/package.json +468 -0
  197. package/src/account/DefaultPage.svelte +42 -0
  198. package/src/account/KcContext/KcContext.ts +1 -0
  199. package/src/account/KcContext/index.ts +1 -0
  200. package/src/account/Template.svelte +143 -0
  201. package/src/account/Template.useInitialize.ts +32 -0
  202. package/src/account/TemplateProps.ts +15 -0
  203. package/src/account/i18n/i18n.ts +18 -0
  204. package/src/account/i18n/i18nBuilder.ts +101 -0
  205. package/src/account/i18n/index.ts +1 -0
  206. package/src/account/i18n/useI18n.ts +140 -0
  207. package/src/account/index.ts +2 -0
  208. package/src/account/pages/Account.svelte +182 -0
  209. package/src/account/pages/Applications.svelte +173 -0
  210. package/src/account/pages/FederatedIdentity.svelte +114 -0
  211. package/src/account/pages/Log.svelte +68 -0
  212. package/src/account/pages/PageProps.ts +11 -0
  213. package/src/account/pages/Password.svelte +233 -0
  214. package/src/account/pages/Sessions.svelte +88 -0
  215. package/src/account/pages/Totp.svelte +287 -0
  216. package/src/additional-svelte-typings.d.ts +6 -0
  217. package/src/login/DefaultPage.svelte +135 -0
  218. package/src/login/KcContext/KcContext.ts +1 -0
  219. package/src/login/KcContext/index.ts +1 -0
  220. package/src/login/Template.svelte +223 -0
  221. package/src/login/Template.useInitialize.ts +72 -0
  222. package/src/login/TemplateProps.ts +23 -0
  223. package/src/login/components/AddRemoveButtonsMultiValuedAttribute.svelte +57 -0
  224. package/src/login/components/FieldErrors.svelte +31 -0
  225. package/src/login/components/GroupLabel.svelte +68 -0
  226. package/src/login/components/InputFieldByType.svelte +58 -0
  227. package/src/login/components/InputFieldByTypeProps.ts +15 -0
  228. package/src/login/components/InputTag.svelte +107 -0
  229. package/src/login/components/InputTagSelects.svelte +111 -0
  230. package/src/login/components/LogoutOtherSessions.svelte +29 -0
  231. package/src/login/components/PasswordWrapper.svelte +43 -0
  232. package/src/login/components/SelectTag.svelte +72 -0
  233. package/src/login/components/TermsAcceptance.svelte +56 -0
  234. package/src/login/components/TextareaTag.svelte +40 -0
  235. package/src/login/components/UserProfileFormFields.svelte +123 -0
  236. package/src/login/components/UserProfileFormFieldsProps.ts +25 -0
  237. package/src/login/components/inputLabel.ts +19 -0
  238. package/src/login/i18n/i18n.ts +18 -0
  239. package/src/login/i18n/i18nBuilder.ts +101 -0
  240. package/src/login/i18n/index.ts +1 -0
  241. package/src/login/i18n/useI18n.ts +140 -0
  242. package/src/login/index.ts +2 -0
  243. package/src/login/lib/useUserProfileForm.ts +166 -0
  244. package/src/login/pages/Code.svelte +46 -0
  245. package/src/login/pages/DeleteAccountConfirm.svelte +77 -0
  246. package/src/login/pages/DeleteCredential.svelte +58 -0
  247. package/src/login/pages/Error.svelte +43 -0
  248. package/src/login/pages/FrontchannelLogout.svelte +57 -0
  249. package/src/login/pages/IdpReviewUserProfile.svelte +80 -0
  250. package/src/login/pages/Info.svelte +66 -0
  251. package/src/login/pages/Login.svelte +225 -0
  252. package/src/login/pages/LoginConfigTotp.svelte +217 -0
  253. package/src/login/pages/LoginIdpLinkConfirm.svelte +60 -0
  254. package/src/login/pages/LoginIdpLinkConfirmOverride.svelte +59 -0
  255. package/src/login/pages/LoginIdpLinkEmail.svelte +50 -0
  256. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.svelte +85 -0
  257. package/src/login/pages/LoginOauthGrant.svelte +126 -0
  258. package/src/login/pages/LoginOtp.svelte +128 -0
  259. package/src/login/pages/LoginPageExpired.svelte +50 -0
  260. package/src/login/pages/LoginPasskeysConditionalAuthenticate.svelte +240 -0
  261. package/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.ts +82 -0
  262. package/src/login/pages/LoginPassword.svelte +120 -0
  263. package/src/login/pages/LoginRecoveryAuthnCodeConfig.svelte +179 -0
  264. package/src/login/pages/LoginRecoveryAuthnCodeConfig.useScript.ts +157 -0
  265. package/src/login/pages/LoginRecoveryAuthnCodeInput.svelte +94 -0
  266. package/src/login/pages/LoginResetOtp.svelte +86 -0
  267. package/src/login/pages/LoginResetPassword.svelte +109 -0
  268. package/src/login/pages/LoginUpdatePassword.svelte +149 -0
  269. package/src/login/pages/LoginUpdateProfile.svelte +98 -0
  270. package/src/login/pages/LoginUsername.svelte +182 -0
  271. package/src/login/pages/LoginVerifyEmail.svelte +39 -0
  272. package/src/login/pages/LoginX509Info.svelte +123 -0
  273. package/src/login/pages/LogoutConfirm.svelte +77 -0
  274. package/src/login/pages/PageProps.ts +11 -0
  275. package/src/login/pages/Register.svelte +136 -0
  276. package/src/login/pages/SamlPostForm.svelte +80 -0
  277. package/src/login/pages/SelectAuthenticator.svelte +63 -0
  278. package/src/login/pages/Terms.svelte +57 -0
  279. package/src/login/pages/UpdateEmail.svelte +104 -0
  280. package/src/login/pages/WebauthnAuthenticate.svelte +182 -0
  281. package/src/login/pages/WebauthnAuthenticate.useScript.ts +74 -0
  282. package/src/login/pages/WebauthnError.svelte +86 -0
  283. package/src/login/pages/WebauthnRegister.svelte +109 -0
  284. package/src/login/pages/WebauthnRegister.useScript.ts +107 -0
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import { useReducer } from '../../tools/useReducer';
3
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
4
+ import { assert } from 'keycloakify/tools/assert';
5
+ import { onMount, type Snippet } from 'svelte';
6
+ import type { I18n } from '../i18n';
7
+ import type { Readable } from 'svelte/store';
8
+
9
+ const props: { kcClsx: KcClsx; i18n: Readable<I18n>; passwordInputId: string; children: Snippet } = $props();
10
+ const { kcClsx, i18n, passwordInputId, children } = props;
11
+
12
+ const { msgStr } = $i18n;
13
+
14
+ const [isPasswordRevealed, toggleIsPasswordRevealed] = useReducer<boolean, boolean>(
15
+ (isPasswordRevealed: boolean) => !isPasswordRevealed,
16
+ false,
17
+ );
18
+ onMount(() => {
19
+ const unsubscribe = isPasswordRevealed.subscribe(($isPasswordRevealed) => {
20
+ const passwordInputElement: HTMLInputElement = document.getElementById(passwordInputId) as HTMLInputElement;
21
+
22
+ assert(passwordInputElement instanceof HTMLInputElement);
23
+ passwordInputElement.type = $isPasswordRevealed ? 'text' : 'password';
24
+ });
25
+ return () => unsubscribe();
26
+ });
27
+ </script>
28
+
29
+ <div class={kcClsx('kcInputGroup')}>
30
+ {@render children?.()}
31
+ <button
32
+ type="button"
33
+ class={kcClsx('kcFormPasswordVisibilityButtonClass')}
34
+ aria-label={msgStr($isPasswordRevealed ? 'hidePassword' : 'showPassword')}
35
+ aria-controls={passwordInputId}
36
+ onclick={() => toggleIsPasswordRevealed($isPasswordRevealed)}
37
+ >
38
+ <i
39
+ class={kcClsx($isPasswordRevealed ? 'kcFormPasswordVisibilityIconHide' : 'kcFormPasswordVisibilityIconShow')}
40
+ aria-hidden="true"
41
+ ></i>
42
+ </button>
43
+ </div>
@@ -0,0 +1,13 @@
1
+ type $$ComponentProps = {
2
+ kcClsx: KcClsx;
3
+ i18n: Readable<I18n>;
4
+ passwordInputId: string;
5
+ children: Snippet;
6
+ };
7
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
8
+ import { type Snippet } from 'svelte';
9
+ import type { I18n } from '../i18n';
10
+ import type { Readable } from 'svelte/store';
11
+ declare const PasswordWrapper: import("svelte").Component<$$ComponentProps, {}, "">;
12
+ type PasswordWrapper = ReturnType<typeof PasswordWrapper>;
13
+ export default PasswordWrapper;
@@ -0,0 +1,72 @@
1
+ <script lang="ts">
2
+ import type { InputFieldByTypeProps } from './InputFieldByTypeProps';
3
+ import { inputLabel } from './inputLabel';
4
+ import { assert } from 'keycloakify/tools/assert';
5
+ const { attribute, dispatchFormAction, kcClsx, displayableErrors, i18n, valueOrValues }: InputFieldByTypeProps =
6
+ $props();
7
+
8
+ const isMultiple = attribute.annotations.inputType === 'multiselect';
9
+ const options = (() => {
10
+ walk: {
11
+ const { inputOptionsFromValidation } = attribute.annotations;
12
+
13
+ if (inputOptionsFromValidation === undefined) {
14
+ break walk;
15
+ }
16
+
17
+ assert(typeof inputOptionsFromValidation === 'string');
18
+
19
+ const validator = (attribute.validators as Record<string, { options?: string[] }>)[inputOptionsFromValidation];
20
+
21
+ if (validator === undefined) {
22
+ break walk;
23
+ }
24
+
25
+ if (validator.options === undefined) {
26
+ break walk;
27
+ }
28
+
29
+ return validator.options;
30
+ }
31
+
32
+ return attribute.validators.options?.options ?? [];
33
+ })();
34
+ </script>
35
+
36
+ <select
37
+ id={attribute.name}
38
+ name={attribute.name}
39
+ class={kcClsx('kcInputClass')}
40
+ aria-invalid={displayableErrors.length !== 0}
41
+ disabled={attribute.readOnly}
42
+ multiple={isMultiple}
43
+ size={attribute.annotations.inputTypeSize === undefined
44
+ ? undefined
45
+ : parseInt(`${attribute.annotations.inputTypeSize}`)}
46
+ value={valueOrValues}
47
+ onchange={(event) =>
48
+ dispatchFormAction('formAction', {
49
+ action: 'update',
50
+ name: attribute.name,
51
+ valueOrValues: (() => {
52
+ if (isMultiple) {
53
+ return Array.from(event.currentTarget.selectedOptions).map((option) => option.value);
54
+ }
55
+
56
+ return event.currentTarget.value;
57
+ })(),
58
+ })}
59
+ onblur={() =>
60
+ dispatchFormAction('formAction', {
61
+ action: 'focus lost',
62
+ name: attribute.name,
63
+ fieldIndex: undefined,
64
+ })}
65
+ >
66
+ {#if !isMultiple}<option value=""></option>{/if}
67
+ {#each options as option}
68
+ <option value={option}>
69
+ {@render inputLabel($i18n, attribute, option)()}
70
+ </option>
71
+ {/each}
72
+ </select>
@@ -0,0 +1,4 @@
1
+ import type { InputFieldByTypeProps } from './InputFieldByTypeProps';
2
+ declare const SelectTag: import("svelte").Component<InputFieldByTypeProps, {}, "">;
3
+ type SelectTag = ReturnType<typeof SelectTag>;
4
+ export default SelectTag;
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import { kcSanitize } from 'keycloakify/lib/kcSanitize';
3
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
4
+ import type { KcContext } from '../KcContext';
5
+ import type { I18n } from '../i18n';
6
+ import type { Readable } from 'svelte/store';
7
+
8
+ type TermsAcceptanceProps = {
9
+ i18n: Readable<I18n>;
10
+ kcClsx: KcClsx;
11
+ messagesPerField: Pick<KcContext['messagesPerField'], 'existsError' | 'get'>;
12
+ areTermsAccepted: boolean;
13
+ onAreTermsAcceptedValueChange: (areTermsAccepted: boolean) => void;
14
+ };
15
+ const { i18n, kcClsx, messagesPerField, areTermsAccepted, onAreTermsAcceptedValueChange }: TermsAcceptanceProps =
16
+ $props();
17
+
18
+ const { msg } = $i18n;
19
+ </script>
20
+
21
+ <div class="form-group">
22
+ <div class={kcClsx('kcInputWrapperClass')}>
23
+ {@render msg('termsTitle')()}
24
+ <div id="kc-registration-terms-text">{@render msg('termsText')()}</div>
25
+ </div>
26
+ </div>
27
+ <div class="form-group">
28
+ <div class={kcClsx('kcLabelWrapperClass')}>
29
+ <input
30
+ type="checkbox"
31
+ id="termsAccepted"
32
+ name="termsAccepted"
33
+ class={kcClsx('kcCheckboxInputClass')}
34
+ checked={areTermsAccepted}
35
+ onchange={(e) => onAreTermsAcceptedValueChange(e.currentTarget.checked)}
36
+ aria-invalid={messagesPerField.existsError('termsAccepted')}
37
+ />
38
+ <label
39
+ for="termsAccepted"
40
+ class={kcClsx('kcLabelClass')}
41
+ >
42
+ {@render msg('acceptTerms')()}
43
+ </label>
44
+ </div>
45
+ {#if messagesPerField.existsError('termsAccepted')}
46
+ <div class={kcClsx('kcLabelWrapperClass')}>
47
+ <span
48
+ id="input-error-terms-accepted"
49
+ class={kcClsx('kcInputErrorMessageClass')}
50
+ aria-live="polite"
51
+ >
52
+ {@html kcSanitize(messagesPerField.get('termsAccepted'))}
53
+ </span>
54
+ </div>
55
+ {/if}
56
+ </div>
@@ -0,0 +1,13 @@
1
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
2
+ import type { KcContext } from '../KcContext';
3
+ import type { I18n } from '../i18n';
4
+ import type { Readable } from 'svelte/store';
5
+ declare const TermsAcceptance: import("svelte").Component<{
6
+ i18n: Readable<I18n>;
7
+ kcClsx: KcClsx;
8
+ messagesPerField: Pick<KcContext["messagesPerField"], "existsError" | "get">;
9
+ areTermsAccepted: boolean;
10
+ onAreTermsAcceptedValueChange: (areTermsAccepted: boolean) => void;
11
+ }, {}, "">;
12
+ type TermsAcceptance = ReturnType<typeof TermsAcceptance>;
13
+ export default TermsAcceptance;
@@ -0,0 +1,40 @@
1
+ <script lang="ts">
2
+ import { assert } from 'keycloakify/tools/assert';
3
+ import type { InputFieldByTypeProps } from './InputFieldByTypeProps';
4
+
5
+ const { attribute, dispatchFormAction, kcClsx, displayableErrors, valueOrValues }: InputFieldByTypeProps = $props();
6
+
7
+ assert(typeof valueOrValues === 'string');
8
+
9
+ const value = valueOrValues;
10
+ </script>
11
+
12
+ <textarea
13
+ id={attribute.name}
14
+ name={attribute.name}
15
+ class={kcClsx('kcInputClass')}
16
+ aria-invalid={displayableErrors.length !== 0}
17
+ disabled={attribute.readOnly}
18
+ cols={attribute.annotations.inputTypeCols === undefined
19
+ ? undefined
20
+ : parseInt(`${attribute.annotations.inputTypeCols}`)}
21
+ rows={attribute.annotations.inputTypeRows === undefined
22
+ ? undefined
23
+ : parseInt(`${attribute.annotations.inputTypeRows}`)}
24
+ maxlength={attribute.annotations.inputTypeMaxlength === undefined
25
+ ? undefined
26
+ : parseInt(`${attribute.annotations.inputTypeMaxlength}`)}
27
+ {value}
28
+ onchange={(event) =>
29
+ dispatchFormAction('formAction', {
30
+ action: 'update',
31
+ name: attribute.name,
32
+ valueOrValues: event.currentTarget.value,
33
+ })}
34
+ onblur={() =>
35
+ dispatchFormAction('formAction', {
36
+ action: 'focus lost',
37
+ name: attribute.name,
38
+ fieldIndex: undefined,
39
+ })}
40
+ ></textarea>
@@ -0,0 +1,4 @@
1
+ import type { InputFieldByTypeProps } from './InputFieldByTypeProps';
2
+ declare const TextareaTag: import("svelte").Component<InputFieldByTypeProps, {}, "">;
3
+ type TextareaTag = ReturnType<typeof TextareaTag>;
4
+ export default TextareaTag;
@@ -0,0 +1,123 @@
1
+ <script lang="ts">
2
+ import FieldErrors from './FieldErrors.svelte';
3
+ import GroupLabel from './GroupLabel.svelte';
4
+ import InputFieldByType from './InputFieldByType.svelte';
5
+ import type { UserProfileFormFieldsProps } from './UserProfileFormFieldsProps';
6
+ import { useUserProfileForm } from '../lib/useUserProfileForm';
7
+ import { onMount } from 'svelte';
8
+ import { derived } from 'svelte/store';
9
+ import type { I18n } from '../i18n';
10
+ import type { KcContext } from '../KcContext';
11
+
12
+ const props: UserProfileFormFieldsProps<KcContext, I18n> = $props();
13
+ const {
14
+ kcContext,
15
+ i18n,
16
+ kcClsx,
17
+ onIsFormSubmittableValueChange,
18
+ doMakeUserConfirmPassword,
19
+ beforeField,
20
+ afterField,
21
+ } = props;
22
+
23
+ const { advancedMsg } = $i18n;
24
+
25
+ const { formState, dispatchFormAction } = useUserProfileForm({
26
+ kcContext,
27
+ i18n: $i18n,
28
+ doMakeUserConfirmPassword,
29
+ });
30
+ onMount(() => {
31
+ const unsubscribe = formState.subscribe(({ isFormSubmittable }) => {
32
+ onIsFormSubmittableValueChange(isFormSubmittable);
33
+ });
34
+ return () => unsubscribe();
35
+ });
36
+
37
+ const groupNameRef = { current: '' };
38
+ const formFieldStates = derived(formState, ($formState) => $formState.formFieldStates);
39
+ const displayableErrors = derived(formFieldStates, ($formFieldStates) =>
40
+ $formFieldStates.map((f) => f.displayableErrors),
41
+ );
42
+ </script>
43
+
44
+ {#each $formFieldStates as formFieldState, i}
45
+ {@const { attribute, valueOrValues } = formFieldState}
46
+ <GroupLabel
47
+ {attribute}
48
+ {groupNameRef}
49
+ {i18n}
50
+ {kcClsx}
51
+ />
52
+ {#if beforeField}
53
+ {@render beforeField({
54
+ attribute,
55
+ dispatchFormAction,
56
+ displayableErrors: $displayableErrors[i],
57
+ valueOrValues,
58
+ kcClsx,
59
+ i18n,
60
+ })}
61
+ {/if}
62
+ <div
63
+ class={kcClsx('kcFormGroupClass')}
64
+ style:display={attribute.name === 'password-confirm' && !doMakeUserConfirmPassword ? 'none' : undefined}
65
+ >
66
+ <div class={kcClsx('kcLabelWrapperClass')}>
67
+ <label
68
+ for={attribute.name}
69
+ class={kcClsx('kcLabelClass')}
70
+ >
71
+ {@render advancedMsg(attribute.displayName ?? '')()}
72
+ </label>
73
+ {#if attribute.required}
74
+ *
75
+ {/if}
76
+ </div>
77
+ <div class={kcClsx('kcInputWrapperClass')}>
78
+ {#if attribute.annotations.inputHelperTextBefore !== undefined}
79
+ <div
80
+ class={kcClsx('kcInputHelperTextBeforeClass')}
81
+ id={`form-help-text-before-${attribute.name}`}
82
+ aria-live="polite"
83
+ >
84
+ {@render advancedMsg(attribute.annotations.inputHelperTextBefore)()}
85
+ </div>
86
+ {/if}
87
+ <InputFieldByType
88
+ {attribute}
89
+ {valueOrValues}
90
+ displayableErrors={$displayableErrors[i]}
91
+ {dispatchFormAction}
92
+ {kcClsx}
93
+ {i18n}
94
+ />
95
+ <FieldErrors
96
+ {attribute}
97
+ bind:displayableErrors={$displayableErrors[i]}
98
+ {kcClsx}
99
+ />
100
+ {#if attribute.annotations.inputHelperTextAfter !== undefined}
101
+ <div
102
+ class={kcClsx('kcInputHelperTextAfterClass')}
103
+ id={`form-help-text-after-${attribute.name}`}
104
+ aria-live="polite"
105
+ >
106
+ {@render advancedMsg(attribute.annotations.inputHelperTextAfter)()}
107
+ </div>
108
+ {/if}
109
+
110
+ {#if afterField}
111
+ {@render afterField({
112
+ attribute,
113
+ dispatchFormAction,
114
+ displayableErrors: $displayableErrors[i],
115
+ valueOrValues,
116
+ kcClsx,
117
+ i18n,
118
+ })}
119
+ {/if}
120
+ <!-- NOTE: Downloading of html5DataAnnotations scripts is done in the useUserProfileForm hook -->
121
+ </div>
122
+ </div>
123
+ {/each}
@@ -0,0 +1,6 @@
1
+ import type { UserProfileFormFieldsProps } from './UserProfileFormFieldsProps';
2
+ import type { I18n } from '../i18n';
3
+ import type { KcContext } from '../KcContext';
4
+ declare const UserProfileFormFields: import("svelte").Component<UserProfileFormFieldsProps<KcContext, I18n>, {}, "">;
5
+ type UserProfileFormFields = ReturnType<typeof UserProfileFormFields>;
6
+ export default UserProfileFormFields;
@@ -0,0 +1,27 @@
1
+ import { type FormAction, type FormFieldError } from '../lib/useUserProfileForm';
2
+ import type { Attribute } from 'keycloakify/login/KcContext';
3
+ import type { KcClsx } from 'keycloakify/login/lib/kcClsx';
4
+ import type { EventDispatcher, Snippet } from 'svelte';
5
+ import type { Readable } from 'svelte/store';
6
+ export type UserProfileFormFieldsProps<KcContext = any, I18n = any> = {
7
+ kcContext: Extract<KcContext, {
8
+ profile: unknown;
9
+ }>;
10
+ i18n: Readable<I18n>;
11
+ kcClsx: KcClsx;
12
+ onIsFormSubmittableValueChange: (isFormSubmittable: boolean) => void;
13
+ doMakeUserConfirmPassword: boolean;
14
+ beforeField?: Snippet<[BeforeAfterFieldProps<I18n>]> | null;
15
+ afterField?: Snippet<[BeforeAfterFieldProps<I18n>]> | null;
16
+ };
17
+ type BeforeAfterFieldProps<I18n> = {
18
+ attribute: Attribute;
19
+ dispatchFormAction: EventDispatcher<{
20
+ formAction: FormAction;
21
+ }>;
22
+ displayableErrors: FormFieldError[];
23
+ valueOrValues: string | string[];
24
+ kcClsx: KcClsx;
25
+ i18n: Readable<I18n>;
26
+ };
27
+ export {};
@@ -0,0 +1,2 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import {} from '../lib/useUserProfileForm';
@@ -0,0 +1,3 @@
1
+ import type { Attribute } from 'keycloakify/login/KcContext';
2
+ import type { I18n } from '../i18n';
3
+ export declare const inputLabel: (i18n: I18n, attribute: Attribute, option: string) => import("svelte").Snippet<[]>;
@@ -0,0 +1,12 @@
1
+ import { createRawSnippet } from 'svelte';
2
+ export const inputLabel = (i18n, attribute, option) => {
3
+ const { advancedMsg } = i18n;
4
+ if (attribute.annotations.inputOptionLabels !== undefined) {
5
+ const { inputOptionLabels } = attribute.annotations;
6
+ return advancedMsg(inputOptionLabels[option] ?? option);
7
+ }
8
+ if (attribute.annotations.inputOptionLabelsI18nPrefix !== undefined) {
9
+ return advancedMsg(`${attribute.annotations.inputOptionLabelsI18nPrefix}.${option}`);
10
+ }
11
+ return createRawSnippet(() => ({ render: () => option }));
12
+ };
@@ -0,0 +1,15 @@
1
+ import type { GenericI18n_noJsx } from 'keycloakify/login/i18n/noJsx/GenericI18n_noJsx';
2
+ import { type MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types';
3
+ import type { Snippet } from 'svelte';
4
+ /** INTERNAL: DO NOT IMPORT THIS */
5
+ export type GenericI18n_svelte<MessageKey extends string, LanguageTag extends string> = GenericI18n_noJsx<MessageKey, LanguageTag> & {
6
+ /**
7
+ * Same as msgStr but returns a Snippet with the html string rendered as html.
8
+ */
9
+ msg: (key: MessageKey_defaultSet, ...args: (string | undefined)[]) => Snippet;
10
+ /**
11
+ * Same as advancedMsgStr but returns a Snippet with the html string rendered as html.
12
+ */
13
+ advancedMsg: (key: string, ...args: (string | undefined)[]) => Snippet;
14
+ };
15
+ export type I18n = GenericI18n_svelte<MessageKey_defaultSet, string>;
@@ -0,0 +1 @@
1
+ import {} from 'keycloakify/login/i18n/messages_defaultSet/types';
@@ -0,0 +1,18 @@
1
+ import type { LanguageTag as LanguageTag_defaultSet, MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types';
2
+ import { type ReturnTypeOfCreateUseI18n } from './useI18n';
3
+ export type I18nBuilder<ThemeName extends string = never, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never, ExcludedMethod extends 'withThemeName' | 'withExtraLanguages' | 'withCustomTranslations' = never> = Omit<{
4
+ withThemeName: <ThemeName extends string>() => I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withThemeName'>;
5
+ withExtraLanguages: <LanguageTag_notInDefaultSet extends string>(extraLanguageTranslations: {
6
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
7
+ label: string;
8
+ getMessages: () => Promise<{
9
+ default: Record<MessageKey_defaultSet, string>;
10
+ }>;
11
+ };
12
+ }) => I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withExtraLanguages'>;
13
+ withCustomTranslations: <MessageKey_themeDefined extends string>(messagesByLanguageTag_themeDefined: Partial<{
14
+ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record<MessageKey_themeDefined, string | Record<ThemeName, string>>;
15
+ }>) => I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withCustomTranslations'>;
16
+ build: () => ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet>;
17
+ }, ExcludedMethod>;
18
+ export declare const i18nBuilder: I18nBuilder<never, never, never, never>;
@@ -0,0 +1,26 @@
1
+ import { createUseI18n } from './useI18n';
2
+ function createI18nBuilder(params) {
3
+ const i18nBuilder = {
4
+ withThemeName: () => createI18nBuilder({
5
+ extraLanguageTranslations: params.extraLanguageTranslations,
6
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
7
+ }),
8
+ withExtraLanguages: (extraLanguageTranslations) => createI18nBuilder({
9
+ extraLanguageTranslations,
10
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
11
+ }),
12
+ withCustomTranslations: (messagesByLanguageTag_themeDefined) => createI18nBuilder({
13
+ extraLanguageTranslations: params.extraLanguageTranslations,
14
+ messagesByLanguageTag_themeDefined,
15
+ }),
16
+ build: () => createUseI18n({
17
+ extraLanguageTranslations: params.extraLanguageTranslations,
18
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
19
+ }),
20
+ };
21
+ return i18nBuilder;
22
+ }
23
+ export const i18nBuilder = createI18nBuilder({
24
+ extraLanguageTranslations: {},
25
+ messagesByLanguageTag_themeDefined: {},
26
+ });
@@ -0,0 +1 @@
1
+ export * from './i18n';
@@ -0,0 +1 @@
1
+ export * from './i18n';
@@ -0,0 +1,28 @@
1
+ import { type LanguageTag as LanguageTag_defaultSet, type MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types';
2
+ import { type KcContextLike } from 'keycloakify/login/i18n/noJsx/getI18n';
3
+ import type { Readable } from 'svelte/store';
4
+ import type { GenericI18n_svelte } from './i18n';
5
+ export type ReturnTypeOfCreateUseI18n<MessageKey_themeDefined extends string, LanguageTag_notInDefaultSet extends string> = {
6
+ useI18n: (params: {
7
+ kcContext: KcContextLike;
8
+ }) => {
9
+ i18n: Readable<GenericI18n_svelte<MessageKey_defaultSet | MessageKey_themeDefined, LanguageTag_defaultSet | LanguageTag_notInDefaultSet>>;
10
+ };
11
+ ofTypeI18n: GenericI18n_svelte<MessageKey_defaultSet | MessageKey_themeDefined, LanguageTag_defaultSet | LanguageTag_notInDefaultSet>;
12
+ };
13
+ export type { KcContextLike };
14
+ export declare function createUseI18n<ThemeName extends string = string, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never>(params: {
15
+ extraLanguageTranslations: {
16
+ [languageTag in LanguageTag_notInDefaultSet]: {
17
+ label: string;
18
+ getMessages: () => Promise<{
19
+ default: Record<MessageKey_defaultSet, string>;
20
+ }>;
21
+ };
22
+ };
23
+ messagesByLanguageTag_themeDefined: Partial<{
24
+ [languageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: {
25
+ [key in MessageKey_themeDefined]: string | Record<ThemeName, string>;
26
+ };
27
+ }>;
28
+ }): ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet>;
@@ -0,0 +1,65 @@
1
+ import { useState } from '../../tools/useState';
2
+ import {} from 'keycloakify/login/i18n/messages_defaultSet/types';
3
+ import { createGetI18n } from 'keycloakify/login/i18n/noJsx/getI18n';
4
+ import { createRawSnippet, onMount } from 'svelte';
5
+ import { Reflect } from 'tsafe/Reflect';
6
+ export function createUseI18n(params) {
7
+ const { extraLanguageTranslations, messagesByLanguageTag_themeDefined } = params;
8
+ const { withSvelte } = (() => {
9
+ const cache = new WeakMap();
10
+ function renderHtmlString(params) {
11
+ const { htmlString, msgKey } = params;
12
+ return createRawSnippet(() => ({
13
+ render: () => `<div data-kc-msg="${msgKey}">${htmlString}</div>`,
14
+ }));
15
+ }
16
+ function withSvelte(i18n_noJsx) {
17
+ use_cache: {
18
+ const i18n = cache.get(i18n_noJsx);
19
+ if (i18n === undefined) {
20
+ break use_cache;
21
+ }
22
+ return i18n;
23
+ }
24
+ const i18n = {
25
+ ...i18n_noJsx,
26
+ msg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.msgStr(msgKey, ...args), msgKey }),
27
+ advancedMsg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.advancedMsgStr(msgKey, ...args), msgKey }),
28
+ };
29
+ cache.set(i18n_noJsx, i18n);
30
+ return i18n;
31
+ }
32
+ return { withSvelte };
33
+ })();
34
+ add_style: {
35
+ const attributeName = 'data-kc-i18n';
36
+ // Check if already exists in head
37
+ if (document.querySelector(`style[${attributeName}]`) !== null) {
38
+ break add_style;
39
+ }
40
+ const styleElement = document.createElement('style');
41
+ styleElement.attributes.setNamedItem(document.createAttribute(attributeName));
42
+ styleElement.textContent = `[data-kc-msg] { display: inline-block; }`;
43
+ document.head.prepend(styleElement);
44
+ }
45
+ const { getI18n } = createGetI18n({ extraLanguageTranslations, messagesByLanguageTag_themeDefined });
46
+ function useI18n(params) {
47
+ const { kcContext } = params;
48
+ const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
49
+ const [i18n_toReturn, setI18n_toReturn] = useState(withSvelte(i18n));
50
+ onMount(() => {
51
+ let isActive = true;
52
+ prI18n_currentLanguage?.then((i18n) => {
53
+ if (!isActive) {
54
+ return;
55
+ }
56
+ setI18n_toReturn(withSvelte(i18n));
57
+ });
58
+ return () => {
59
+ isActive = false;
60
+ };
61
+ });
62
+ return { i18n: i18n_toReturn };
63
+ }
64
+ return { useI18n, ofTypeI18n: Reflect() };
65
+ }
@@ -0,0 +1,2 @@
1
+ export type { ExtendKcContext } from './KcContext';
2
+ export { i18nBuilder } from './i18n/i18nBuilder';
@@ -0,0 +1 @@
1
+ export { i18nBuilder } from './i18n/i18nBuilder';