@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,32 @@
1
+ import { useInsertLinkTags } from '@keycloakify/svelte/tools/useInsertLinkTags';
2
+ import { assert } from 'keycloakify/tools/assert';
3
+ import type { KcContext } from './KcContext';
4
+
5
+ export type KcContextLike = {
6
+ url: {
7
+ resourcesCommonPath: string;
8
+ resourcesPath: string;
9
+ };
10
+ };
11
+
12
+ assert<keyof KcContextLike extends keyof KcContext ? true : false>();
13
+ assert<KcContext extends KcContextLike ? true : false>();
14
+
15
+ export function useInitialize(params: { kcContext: KcContextLike; doUseDefaultCss: boolean }) {
16
+ const { kcContext, doUseDefaultCss } = params;
17
+
18
+ const { url } = kcContext;
19
+
20
+ const { areAllStyleSheetsLoaded } = useInsertLinkTags({
21
+ componentOrHookName: 'Template',
22
+ hrefs: !doUseDefaultCss
23
+ ? []
24
+ : [
25
+ `${url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly.min.css`,
26
+ `${url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly-additions.min.css`,
27
+ `${url.resourcesPath}/css/account.css`,
28
+ ],
29
+ });
30
+
31
+ return { isReadyToRender: areAllStyleSheetsLoaded };
32
+ }
@@ -0,0 +1,15 @@
1
+ import type { ClassKey } from 'keycloakify/account/lib/kcClsx';
2
+ import type { Snippet } from 'svelte';
3
+ import type { Readable } from 'svelte/store';
4
+
5
+ export type TemplateProps<KcContext, I18n> = {
6
+ kcContext: KcContext;
7
+ i18n: Readable<I18n>;
8
+ doUseDefaultCss: boolean;
9
+ classes?: Partial<Record<ClassKey, string>>;
10
+ children: Snippet;
11
+
12
+ active: string;
13
+ };
14
+
15
+ export type { ClassKey };
@@ -0,0 +1,18 @@
1
+ import type { GenericI18n_noJsx } from 'keycloakify/account/i18n/noJsx/GenericI18n_noJsx';
2
+ import { type MessageKey as MessageKey_defaultSet } from 'keycloakify/account/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<
6
+ MessageKey,
7
+ LanguageTag
8
+ > & {
9
+ /**
10
+ * Same as msgStr but returns a Snippet with the html string rendered as html.
11
+ */
12
+ msg: (key: MessageKey_defaultSet, ...args: (string | undefined)[]) => Snippet;
13
+ /**
14
+ * Same as advancedMsgStr but returns a Snippet with the html string rendered as html.
15
+ */
16
+ advancedMsg: (key: string, ...args: (string | undefined)[]) => Snippet;
17
+ };
18
+ export type I18n = GenericI18n_svelte<MessageKey_defaultSet, string>;
@@ -0,0 +1,101 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type {
3
+ LanguageTag as LanguageTag_defaultSet,
4
+ MessageKey as MessageKey_defaultSet,
5
+ } from 'keycloakify/account/i18n/messages_defaultSet/types';
6
+ import { type ReturnTypeOfCreateUseI18n, createUseI18n } from './useI18n';
7
+
8
+ export type I18nBuilder<
9
+ ThemeName extends string = never,
10
+ MessageKey_themeDefined extends string = never,
11
+ LanguageTag_notInDefaultSet extends string = never,
12
+ ExcludedMethod extends 'withThemeName' | 'withExtraLanguages' | 'withCustomTranslations' = never,
13
+ > = Omit<
14
+ {
15
+ withThemeName: <ThemeName extends string>() => I18nBuilder<
16
+ ThemeName,
17
+ MessageKey_themeDefined,
18
+ LanguageTag_notInDefaultSet,
19
+ ExcludedMethod | 'withThemeName'
20
+ >;
21
+ withExtraLanguages: <LanguageTag_notInDefaultSet extends string>(extraLanguageTranslations: {
22
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
23
+ label: string;
24
+ getMessages: () => Promise<{
25
+ default: Record<MessageKey_defaultSet, string>;
26
+ }>;
27
+ };
28
+ }) => I18nBuilder<
29
+ ThemeName,
30
+ MessageKey_themeDefined,
31
+ LanguageTag_notInDefaultSet,
32
+ ExcludedMethod | 'withExtraLanguages'
33
+ >;
34
+ withCustomTranslations: <MessageKey_themeDefined extends string>(
35
+ messagesByLanguageTag_themeDefined: Partial<{
36
+ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record<
37
+ MessageKey_themeDefined,
38
+ string | Record<ThemeName, string>
39
+ >;
40
+ }>,
41
+ ) => I18nBuilder<
42
+ ThemeName,
43
+ MessageKey_themeDefined,
44
+ LanguageTag_notInDefaultSet,
45
+ ExcludedMethod | 'withCustomTranslations'
46
+ >;
47
+ build: () => ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet>;
48
+ },
49
+ ExcludedMethod
50
+ >;
51
+
52
+ function createI18nBuilder<
53
+ ThemeName extends string = never,
54
+ MessageKey_themeDefined extends string = never,
55
+ LanguageTag_notInDefaultSet extends string = never,
56
+ >(params: {
57
+ extraLanguageTranslations: {
58
+ [LanguageTag in LanguageTag_notInDefaultSet]: {
59
+ label: string;
60
+ getMessages: () => Promise<{
61
+ default: Record<MessageKey_defaultSet, string>;
62
+ }>;
63
+ };
64
+ };
65
+ messagesByLanguageTag_themeDefined: Partial<{
66
+ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record<
67
+ MessageKey_themeDefined,
68
+ string | Record<ThemeName, string>
69
+ >;
70
+ }>;
71
+ }): I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet> {
72
+ const i18nBuilder: I18nBuilder<ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet> = {
73
+ withThemeName: () =>
74
+ createI18nBuilder({
75
+ extraLanguageTranslations: params.extraLanguageTranslations,
76
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any,
77
+ }),
78
+ withExtraLanguages: (extraLanguageTranslations) =>
79
+ createI18nBuilder({
80
+ extraLanguageTranslations,
81
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any,
82
+ }),
83
+ withCustomTranslations: (messagesByLanguageTag_themeDefined) =>
84
+ createI18nBuilder({
85
+ extraLanguageTranslations: params.extraLanguageTranslations,
86
+ messagesByLanguageTag_themeDefined,
87
+ }),
88
+ build: () =>
89
+ createUseI18n({
90
+ extraLanguageTranslations: params.extraLanguageTranslations,
91
+ messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined,
92
+ }),
93
+ };
94
+
95
+ return i18nBuilder;
96
+ }
97
+
98
+ export const i18nBuilder = createI18nBuilder({
99
+ extraLanguageTranslations: {},
100
+ messagesByLanguageTag_themeDefined: {},
101
+ });
@@ -0,0 +1 @@
1
+ export * from './i18n';
@@ -0,0 +1,140 @@
1
+ import { useState } from '@keycloakify/svelte/tools/useState';
2
+ import {
3
+ type LanguageTag as LanguageTag_defaultSet,
4
+ type MessageKey as MessageKey_defaultSet,
5
+ } from 'keycloakify/account/i18n/messages_defaultSet/types';
6
+ import type { GenericI18n_noJsx } from 'keycloakify/account/i18n/noJsx/GenericI18n_noJsx';
7
+ import { createGetI18n, type KcContextLike } from 'keycloakify/account/i18n/noJsx/getI18n';
8
+ import { createRawSnippet, onMount, type Snippet } from 'svelte';
9
+ import type { Readable } from 'svelte/store';
10
+ import { Reflect } from 'tsafe/Reflect';
11
+ import type { GenericI18n_svelte } from './i18n';
12
+
13
+ export type ReturnTypeOfCreateUseI18n<
14
+ MessageKey_themeDefined extends string,
15
+ LanguageTag_notInDefaultSet extends string,
16
+ > = {
17
+ useI18n: (params: { kcContext: KcContextLike }) => {
18
+ i18n: Readable<
19
+ GenericI18n_svelte<
20
+ MessageKey_defaultSet | MessageKey_themeDefined,
21
+ LanguageTag_defaultSet | LanguageTag_notInDefaultSet
22
+ >
23
+ >;
24
+ };
25
+ ofTypeI18n: GenericI18n_svelte<
26
+ MessageKey_defaultSet | MessageKey_themeDefined,
27
+ LanguageTag_defaultSet | LanguageTag_notInDefaultSet
28
+ >;
29
+ };
30
+
31
+ export type { KcContextLike };
32
+
33
+ export function createUseI18n<
34
+ ThemeName extends string = string,
35
+ MessageKey_themeDefined extends string = never,
36
+ LanguageTag_notInDefaultSet extends string = never,
37
+ >(params: {
38
+ extraLanguageTranslations: {
39
+ [languageTag in LanguageTag_notInDefaultSet]: {
40
+ label: string;
41
+ getMessages: () => Promise<{ default: Record<MessageKey_defaultSet, string> }>;
42
+ };
43
+ };
44
+ messagesByLanguageTag_themeDefined: Partial<{
45
+ [languageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: {
46
+ [key in MessageKey_themeDefined]: string | Record<ThemeName, string>;
47
+ };
48
+ }>;
49
+ }): ReturnTypeOfCreateUseI18n<MessageKey_themeDefined, LanguageTag_notInDefaultSet> {
50
+ const { extraLanguageTranslations, messagesByLanguageTag_themeDefined } = params;
51
+
52
+ type LanguageTag = LanguageTag_defaultSet | LanguageTag_notInDefaultSet;
53
+
54
+ type MessageKey = MessageKey_defaultSet | MessageKey_themeDefined;
55
+ type I18n = GenericI18n_svelte<MessageKey, LanguageTag>;
56
+ type Result = { i18n: Readable<I18n> };
57
+
58
+ const { withSvelte } = (() => {
59
+ const cache = new WeakMap<
60
+ GenericI18n_noJsx<MessageKey, LanguageTag>,
61
+ GenericI18n_svelte<MessageKey, LanguageTag>
62
+ >();
63
+
64
+ function renderHtmlString(params: { htmlString: string; msgKey: string }): Snippet {
65
+ const { htmlString, msgKey } = params;
66
+ return createRawSnippet(() => ({
67
+ render: () => `<div data-kc-msg="${msgKey}">${htmlString}</div>`,
68
+ }));
69
+ }
70
+
71
+ function withSvelte(i18n_noJsx: GenericI18n_noJsx<MessageKey, LanguageTag>): I18n {
72
+ use_cache: {
73
+ const i18n = cache.get(i18n_noJsx);
74
+
75
+ if (i18n === undefined) {
76
+ break use_cache;
77
+ }
78
+
79
+ return i18n;
80
+ }
81
+
82
+ const i18n: I18n = {
83
+ ...i18n_noJsx,
84
+ msg: (msgKey, ...args) => renderHtmlString({ htmlString: i18n_noJsx.msgStr(msgKey, ...args), msgKey }),
85
+ advancedMsg: (msgKey, ...args) =>
86
+ renderHtmlString({ htmlString: i18n_noJsx.advancedMsgStr(msgKey, ...args), msgKey }),
87
+ };
88
+
89
+ cache.set(i18n_noJsx, i18n);
90
+
91
+ return i18n;
92
+ }
93
+
94
+ return { withSvelte };
95
+ })();
96
+
97
+ add_style: {
98
+ const attributeName = 'data-kc-i18n';
99
+
100
+ // Check if already exists in head
101
+ if (document.querySelector(`style[${attributeName}]`) !== null) {
102
+ break add_style;
103
+ }
104
+
105
+ const styleElement = document.createElement('style');
106
+ styleElement.attributes.setNamedItem(document.createAttribute(attributeName));
107
+ styleElement.textContent = `[data-kc-msg] { display: inline-block; }`;
108
+ document.head.prepend(styleElement);
109
+ }
110
+
111
+ const { getI18n } = createGetI18n({ extraLanguageTranslations, messagesByLanguageTag_themeDefined });
112
+
113
+ function useI18n(params: { kcContext: KcContextLike }): Result {
114
+ const { kcContext } = params;
115
+
116
+ const { i18n, prI18n_currentLanguage } = getI18n({ kcContext });
117
+
118
+ const [i18n_toReturn, setI18n_toReturn] = useState<I18n>(withSvelte(i18n));
119
+
120
+ onMount(() => {
121
+ let isActive = true;
122
+
123
+ prI18n_currentLanguage?.then((i18n) => {
124
+ if (!isActive) {
125
+ return;
126
+ }
127
+
128
+ setI18n_toReturn(withSvelte(i18n));
129
+ });
130
+
131
+ return () => {
132
+ isActive = false;
133
+ };
134
+ });
135
+
136
+ return { i18n: i18n_toReturn };
137
+ }
138
+
139
+ return { useI18n, ofTypeI18n: Reflect<I18n>() };
140
+ }
@@ -0,0 +1,2 @@
1
+ export type { ExtendKcContext } from '@keycloakify/svelte/account/KcContext';
2
+ export { i18nBuilder } from '@keycloakify/svelte/account/i18n/i18nBuilder';
@@ -0,0 +1,182 @@
1
+ <script lang="ts">
2
+ import type { PageProps } from '@keycloakify/svelte/account/pages/PageProps';
3
+ import { getKcClsx } from 'keycloakify/account/lib/kcClsx';
4
+ import { clsx } from 'keycloakify/tools/clsx';
5
+ import type { I18n } from '../i18n';
6
+ import type { KcContext } from '../KcContext';
7
+
8
+ const {
9
+ kcContext,
10
+ i18n,
11
+ doUseDefaultCss,
12
+ Template,
13
+ ...props
14
+ }: PageProps<Extract<KcContext, { pageId: 'account.ftl' }>, I18n> = $props();
15
+
16
+ const classes = {
17
+ ...props.classes,
18
+ kcBodyClass: clsx(props.classes?.kcBodyClass, 'user'),
19
+ };
20
+
21
+ const { kcClsx } = getKcClsx({
22
+ doUseDefaultCss,
23
+ classes,
24
+ });
25
+
26
+ const { url, realm, messagesPerField, stateChecker, account, referrer } = kcContext;
27
+
28
+ const { msg } = $i18n;
29
+ </script>
30
+
31
+ <Template
32
+ {kcContext}
33
+ {i18n}
34
+ {doUseDefaultCss}
35
+ {classes}
36
+ active="account"
37
+ >
38
+ <div class="row">
39
+ <div class="col-md-10">
40
+ <h2>{@render msg('editAccountHtmlTitle')()}</h2>
41
+ </div>
42
+ <div class="col-md-2 subtitle">
43
+ <span class="subtitle">
44
+ <span class="required">*</span>
45
+ {@render msg('requiredFields')()}
46
+ </span>
47
+ </div>
48
+ </div>
49
+
50
+ <form
51
+ action={url.accountUrl}
52
+ class="form-horizontal"
53
+ method="post"
54
+ >
55
+ <input
56
+ type="hidden"
57
+ id="stateChecker"
58
+ name="stateChecker"
59
+ value={stateChecker}
60
+ />
61
+
62
+ {#if !realm.registrationEmailAsUsername}
63
+ <div class={clsx('form-group', messagesPerField.printIfExists('username', 'has-error'))}>
64
+ <div class="col-sm-2 col-md-2">
65
+ <label
66
+ for="username"
67
+ class="control-label"
68
+ >
69
+ {@render msg('username')()}
70
+ </label>
71
+ {#if realm.editUsernameAllowed}<span class="required">*</span>{/if}
72
+ </div>
73
+
74
+ <div class="col-sm-10 col-md-10">
75
+ <input
76
+ type="text"
77
+ class="form-control"
78
+ id="username"
79
+ name="username"
80
+ disabled={!realm.editUsernameAllowed}
81
+ value={account.username ?? ''}
82
+ />
83
+ </div>
84
+ </div>
85
+ {/if}
86
+
87
+ <div class={clsx('form-group', messagesPerField.printIfExists('email', 'has-error'))}>
88
+ <div class="col-sm-2 col-md-2">
89
+ <label
90
+ for="email"
91
+ class="control-label"
92
+ >
93
+ {@render msg('email')()}
94
+ </label>{' '}
95
+ <span class="required">*</span>
96
+ </div>
97
+
98
+ <div class="col-sm-10 col-md-10">
99
+ <!-- svelte-ignore a11y_autofocus -->
100
+ <input
101
+ type="text"
102
+ class="form-control"
103
+ id="email"
104
+ name="email"
105
+ autofocus
106
+ value={account.email ?? ''}
107
+ />
108
+ </div>
109
+ </div>
110
+
111
+ <div class={clsx('form-group', messagesPerField.printIfExists('firstName', 'has-error'))}>
112
+ <div class="col-sm-2 col-md-2">
113
+ <label
114
+ for="firstName"
115
+ class="control-label"
116
+ >
117
+ {@render msg('firstName')()}
118
+ </label>{' '}
119
+ <span class="required">*</span>
120
+ </div>
121
+
122
+ <div class="col-sm-10 col-md-10">
123
+ <input
124
+ type="text"
125
+ class="form-control"
126
+ id="firstName"
127
+ name="firstName"
128
+ value={account.firstName ?? ''}
129
+ />
130
+ </div>
131
+ </div>
132
+
133
+ <div class={clsx('form-group', messagesPerField.printIfExists('lastName', 'has-error'))}>
134
+ <div class="col-sm-2 col-md-2">
135
+ <label
136
+ for="lastName"
137
+ class="control-label"
138
+ >
139
+ {@render msg('lastName')()}
140
+ </label>{' '}
141
+ <span class="required">*</span>
142
+ </div>
143
+
144
+ <div class="col-sm-10 col-md-10">
145
+ <input
146
+ type="text"
147
+ class="form-control"
148
+ id="lastName"
149
+ name="lastName"
150
+ value={account.lastName ?? ''}
151
+ />
152
+ </div>
153
+ </div>
154
+
155
+ <div class="form-group">
156
+ <div
157
+ id="kc-form-buttons"
158
+ class="col-md-offset-2 col-md-10 submit"
159
+ >
160
+ <div>
161
+ {#if referrer !== undefined}<a href={referrer?.url}>{@render msg('backToApplication')()}</a>{/if}
162
+ <button
163
+ type="submit"
164
+ class={kcClsx('kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass')}
165
+ name="submitAction"
166
+ value="Save"
167
+ >
168
+ {@render msg('doSave')()}
169
+ </button>
170
+ <button
171
+ type="submit"
172
+ class={kcClsx('kcButtonClass', 'kcButtonDefaultClass', 'kcButtonLargeClass')}
173
+ name="submitAction"
174
+ value="Cancel"
175
+ >
176
+ {@render msg('doCancel')()}
177
+ </button>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ </form>
182
+ </Template>
@@ -0,0 +1,173 @@
1
+ <script lang="ts">
2
+ import type { PageProps } from '@keycloakify/svelte/account/pages/PageProps';
3
+ import type { KcContext } from '../KcContext';
4
+ import type { I18n } from '../i18n';
5
+ import { getKcClsx } from 'keycloakify/account/lib/kcClsx';
6
+
7
+ const {
8
+ kcContext,
9
+ i18n,
10
+ doUseDefaultCss,
11
+ Template,
12
+ classes,
13
+ }: PageProps<Extract<KcContext, { pageId: 'applications.ftl' }>, I18n> = $props();
14
+
15
+ const { kcClsx } = getKcClsx({
16
+ doUseDefaultCss,
17
+ classes,
18
+ });
19
+
20
+ const {
21
+ url,
22
+ applications: { applications },
23
+ stateChecker,
24
+ } = kcContext;
25
+
26
+ const { msg, advancedMsg } = $i18n;
27
+
28
+ function isArrayWithEmptyObject(variable: unknown): boolean {
29
+ return (
30
+ Array.isArray(variable) &&
31
+ variable.length === 1 &&
32
+ typeof variable[0] === 'object' &&
33
+ Object.keys(variable[0]).length === 0
34
+ );
35
+ }
36
+ </script>
37
+
38
+ <Template
39
+ {kcContext}
40
+ {i18n}
41
+ {doUseDefaultCss}
42
+ {classes}
43
+ active="applications"
44
+ >
45
+ <div class="row">
46
+ <div class="col-md-10">
47
+ <h2>{@render msg('applicationsHtmlTitle')()}</h2>
48
+ </div>
49
+
50
+ <form
51
+ action={url.applicationsUrl}
52
+ method="post"
53
+ >
54
+ <input
55
+ type="hidden"
56
+ id="stateChecker"
57
+ name="stateChecker"
58
+ value={stateChecker}
59
+ />
60
+ <input
61
+ type="hidden"
62
+ id="referrer"
63
+ name="referrer"
64
+ value={stateChecker}
65
+ />
66
+
67
+ <table class="table table-striped table-bordered">
68
+ <thead>
69
+ <tr>
70
+ <td>{@render msg('application')()}</td>
71
+ <td>{@render msg('availableRoles')()}</td>
72
+ <td>{@render msg('grantedPermissions')()}</td>
73
+ <td>{@render msg('additionalGrants')()}</td>
74
+ <td>{@render msg('action')()}</td>
75
+ </tr>
76
+ </thead>
77
+
78
+ <tbody>
79
+ {#each applications as application}
80
+ <tr>
81
+ <td>
82
+ {#if application.effectiveUrl}
83
+ <a href={application.effectiveUrl}>
84
+ {#if application.client.name}
85
+ {@render advancedMsg(application.client.name)()}
86
+ {:else}
87
+ {application.client.clientId}
88
+ {/if}
89
+ </a>
90
+ {/if}
91
+ {#if !application.effectiveUrl && application.client.name}
92
+ {@render advancedMsg(application.client.name)()}
93
+ {:else}
94
+ {application.client.clientId}
95
+ {/if}
96
+ </td>
97
+
98
+ <td>
99
+ {#if !isArrayWithEmptyObject(application.realmRolesAvailable)}
100
+ {#each application.realmRolesAvailable as role, index}
101
+ <span>
102
+ {@render (role.description ? advancedMsg(role.description) : advancedMsg(role.name))()}
103
+ {#if index < application.realmRolesAvailable.length - 1},&nbsp;{/if}
104
+ </span>
105
+ {/each}
106
+ {#if application.resourceRolesAvailable}
107
+ {#each Object.keys(application.resourceRolesAvailable) as resource}
108
+ <span>
109
+ {#if !isArrayWithEmptyObject(application.realmRolesAvailable)},&nbsp;{/if}
110
+ {#each application.resourceRolesAvailable[resource] as clientRole}
111
+ <span>
112
+ {@render (clientRole.roleDescription
113
+ ? advancedMsg(clientRole.roleDescription)
114
+ : advancedMsg(clientRole.roleName))()}{' '}
115
+ {@render msg('inResource')()}{' '}
116
+ <strong>
117
+ {#if clientRole.clientName}
118
+ {@render advancedMsg(clientRole.clientName)()}
119
+ {:else}
120
+ {clientRole.clientId}
121
+ {/if}
122
+ </strong>
123
+ {#if clientRole !== application.resourceRolesAvailable[resource][application.resourceRolesAvailable[resource].length - 1]},&nbsp;{/if}
124
+ </span>
125
+ {/each}
126
+ </span>
127
+ {/each}
128
+ {/if}
129
+ {/if}
130
+ </td>
131
+
132
+ <td>
133
+ {#if application.client.consentRequired}
134
+ {#each application.clientScopesGranted as claim}
135
+ <span>
136
+ {@render advancedMsg(claim)()}
137
+ {#if claim !== application.clientScopesGranted[application.clientScopesGranted.length - 1]},&nbsp;{/if}
138
+ </span>
139
+ {/each}
140
+ {:else}
141
+ <strong>{@render msg('fullAccess')()}</strong>
142
+ {/if}
143
+ </td>
144
+
145
+ <td>
146
+ {#each application.additionalGrants as grant}
147
+ <span>
148
+ {@render advancedMsg(grant)()}
149
+ {#if grant !== application.additionalGrants[application.additionalGrants.length - 1]},&nbsp;{/if}
150
+ </span>
151
+ {/each}
152
+ </td>
153
+
154
+ <td>
155
+ {#if (application.client.consentRequired && application.clientScopesGranted.length > 0) || application.additionalGrants.length > 0}
156
+ <button
157
+ type="submit"
158
+ class={kcClsx('kcButtonPrimaryClass', 'kcButtonClass')}
159
+ id={`revoke-${application.client.clientId}`}
160
+ name="clientId"
161
+ value={application.client.id}
162
+ >
163
+ {@render msg('revoke')()}
164
+ </button>
165
+ {/if}
166
+ </td>
167
+ </tr>
168
+ {/each}
169
+ </tbody>
170
+ </table>
171
+ </form>
172
+ </div>
173
+ </Template>