@andreyyolkin/keycloakify-vue 0.1.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 (349) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/keycloakify-vue/account/DefaultPage.vue +55 -0
  4. package/keycloakify-vue/account/DefaultPage.vue.d.ts +14 -0
  5. package/keycloakify-vue/account/KcContext/index.d.ts +1 -0
  6. package/keycloakify-vue/account/KcContext/index.js +0 -0
  7. package/keycloakify-vue/account/Template.useInitialize.d.ts +13 -0
  8. package/keycloakify-vue/account/Template.useInitialize.js +20 -0
  9. package/keycloakify-vue/account/Template.vue +178 -0
  10. package/keycloakify-vue/account/Template.vue.d.ts +17 -0
  11. package/keycloakify-vue/account/TemplateProps.d.ts +9 -0
  12. package/keycloakify-vue/account/TemplateProps.js +0 -0
  13. package/keycloakify-vue/account/i18n/i18n.d.ts +11 -0
  14. package/keycloakify-vue/account/i18n/i18n.js +0 -0
  15. package/keycloakify-vue/account/i18n/i18nBuilder.d.ts +18 -0
  16. package/keycloakify-vue/account/i18n/i18nBuilder.js +29 -0
  17. package/keycloakify-vue/account/i18n/index.d.ts +1 -0
  18. package/keycloakify-vue/account/i18n/index.js +1 -0
  19. package/keycloakify-vue/account/i18n/useI18n.d.ts +28 -0
  20. package/keycloakify-vue/account/i18n/useI18n.js +67 -0
  21. package/keycloakify-vue/account/index.d.ts +4 -0
  22. package/keycloakify-vue/account/index.js +8 -0
  23. package/keycloakify-vue/account/pages/Account.vue +182 -0
  24. package/keycloakify-vue/account/pages/Account.vue.d.ts +9 -0
  25. package/keycloakify-vue/account/pages/Applications.vue +192 -0
  26. package/keycloakify-vue/account/pages/Applications.vue.d.ts +9 -0
  27. package/keycloakify-vue/account/pages/FederatedIdentity.vue +123 -0
  28. package/keycloakify-vue/account/pages/FederatedIdentity.vue.d.ts +9 -0
  29. package/keycloakify-vue/account/pages/Log.vue +64 -0
  30. package/keycloakify-vue/account/pages/Log.vue.d.ts +9 -0
  31. package/keycloakify-vue/account/pages/NotImplemented.vue +24 -0
  32. package/keycloakify-vue/account/pages/NotImplemented.vue.d.ts +6 -0
  33. package/keycloakify-vue/account/pages/PageProps.d.ts +9 -0
  34. package/keycloakify-vue/account/pages/PageProps.js +0 -0
  35. package/keycloakify-vue/account/pages/Password.vue +247 -0
  36. package/keycloakify-vue/account/pages/Password.vue.d.ts +9 -0
  37. package/keycloakify-vue/account/pages/Sessions.vue +84 -0
  38. package/keycloakify-vue/account/pages/Sessions.vue.d.ts +9 -0
  39. package/keycloakify-vue/account/pages/Totp.vue +308 -0
  40. package/keycloakify-vue/account/pages/Totp.vue.d.ts +9 -0
  41. package/keycloakify-vue/bin/index.js +14 -0
  42. package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcContext.js +0 -0
  43. package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcPage.vue +23 -0
  44. package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcPageStory.js +18 -0
  45. package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcPageStory.vue +13 -0
  46. package/keycloakify-vue/bin/initialize-account-theme/boilerplate/i18n.js +5 -0
  47. package/keycloakify-vue/login/DefaultPage.vue +167 -0
  48. package/keycloakify-vue/login/DefaultPage.vue.d.ts +20 -0
  49. package/keycloakify-vue/login/Template.useInitialize.d.ts +18 -0
  50. package/keycloakify-vue/login/Template.useInitialize.js +49 -0
  51. package/keycloakify-vue/login/Template.vue +239 -0
  52. package/keycloakify-vue/login/Template.vue.d.ts +26 -0
  53. package/keycloakify-vue/login/TemplateProps.d.ts +14 -0
  54. package/keycloakify-vue/login/TemplateProps.js +0 -0
  55. package/keycloakify-vue/login/components/AddRemoveButtonsMultiValuedAttribute.vue +59 -0
  56. package/keycloakify-vue/login/components/AddRemoveButtonsMultiValuedAttribute.vue.d.ts +15 -0
  57. package/keycloakify-vue/login/components/FieldErrors.vue +35 -0
  58. package/keycloakify-vue/login/components/FieldErrors.vue.d.ts +14 -0
  59. package/keycloakify-vue/login/components/GroupLabel.vue +68 -0
  60. package/keycloakify-vue/login/components/GroupLabel.vue.d.ts +14 -0
  61. package/keycloakify-vue/login/components/InputFieldByType.vue +94 -0
  62. package/keycloakify-vue/login/components/InputFieldByType.vue.d.ts +4 -0
  63. package/keycloakify-vue/login/components/InputFieldByTypeProps.d.ts +12 -0
  64. package/keycloakify-vue/login/components/InputFieldByTypeProps.js +0 -0
  65. package/keycloakify-vue/login/components/InputTag.vue +105 -0
  66. package/keycloakify-vue/login/components/InputTag.vue.d.ts +7 -0
  67. package/keycloakify-vue/login/components/InputTagSelects.vue +108 -0
  68. package/keycloakify-vue/login/components/InputTagSelects.vue.d.ts +4 -0
  69. package/keycloakify-vue/login/components/LogoutOtherSessions.vue +27 -0
  70. package/keycloakify-vue/login/components/LogoutOtherSessions.vue.d.ts +9 -0
  71. package/keycloakify-vue/login/components/PasswordWrapper.vue +42 -0
  72. package/keycloakify-vue/login/components/PasswordWrapper.vue.d.ts +20 -0
  73. package/keycloakify-vue/login/components/SelectTag.vue +74 -0
  74. package/keycloakify-vue/login/components/SelectTag.vue.d.ts +4 -0
  75. package/keycloakify-vue/login/components/TermsAcceptance.vue +59 -0
  76. package/keycloakify-vue/login/components/TermsAcceptance.vue.d.ts +13 -0
  77. package/keycloakify-vue/login/components/TextareaTag.vue +47 -0
  78. package/keycloakify-vue/login/components/TextareaTag.vue.d.ts +4 -0
  79. package/keycloakify-vue/login/components/UserProfileFormFields.vue +119 -0
  80. package/keycloakify-vue/login/components/UserProfileFormFields.vue.d.ts +33 -0
  81. package/keycloakify-vue/login/components/UserProfileFormFieldsProps.d.ts +22 -0
  82. package/keycloakify-vue/login/components/UserProfileFormFieldsProps.js +0 -0
  83. package/keycloakify-vue/login/components/inputLabel.d.ts +4 -0
  84. package/keycloakify-vue/login/components/inputLabel.js +15 -0
  85. package/keycloakify-vue/login/i18n/i18n.d.ts +11 -0
  86. package/keycloakify-vue/login/i18n/i18n.js +0 -0
  87. package/keycloakify-vue/login/i18n/i18nBuilder.d.ts +18 -0
  88. package/keycloakify-vue/login/i18n/i18nBuilder.js +29 -0
  89. package/keycloakify-vue/login/i18n/index.d.ts +1 -0
  90. package/keycloakify-vue/login/i18n/index.js +1 -0
  91. package/keycloakify-vue/login/i18n/useI18n.d.ts +28 -0
  92. package/keycloakify-vue/login/i18n/useI18n.js +67 -0
  93. package/keycloakify-vue/login/index.d.ts +5 -0
  94. package/keycloakify-vue/login/index.js +10 -0
  95. package/keycloakify-vue/login/lib/useUserProfileForm.d.ts +53 -0
  96. package/keycloakify-vue/login/lib/useUserProfileForm.js +50 -0
  97. package/keycloakify-vue/login/pages/Code.vue +54 -0
  98. package/keycloakify-vue/login/pages/Code.vue.d.ts +9 -0
  99. package/keycloakify-vue/login/pages/DeleteAccountConfirm.vue +69 -0
  100. package/keycloakify-vue/login/pages/DeleteAccountConfirm.vue.d.ts +9 -0
  101. package/keycloakify-vue/login/pages/DeleteCredential.vue +56 -0
  102. package/keycloakify-vue/login/pages/DeleteCredential.vue.d.ts +9 -0
  103. package/keycloakify-vue/login/pages/Error.vue +41 -0
  104. package/keycloakify-vue/login/pages/Error.vue.d.ts +9 -0
  105. package/keycloakify-vue/login/pages/FrontchannelLogout.vue +67 -0
  106. package/keycloakify-vue/login/pages/FrontchannelLogout.vue.d.ts +9 -0
  107. package/keycloakify-vue/login/pages/IdpReviewUserProfile.vue +77 -0
  108. package/keycloakify-vue/login/pages/IdpReviewUserProfile.vue.d.ts +14 -0
  109. package/keycloakify-vue/login/pages/Info.vue +61 -0
  110. package/keycloakify-vue/login/pages/Info.vue.d.ts +9 -0
  111. package/keycloakify-vue/login/pages/LinkIdpAction.vue +66 -0
  112. package/keycloakify-vue/login/pages/LinkIdpAction.vue.d.ts +9 -0
  113. package/keycloakify-vue/login/pages/Login.vue +230 -0
  114. package/keycloakify-vue/login/pages/Login.vue.d.ts +9 -0
  115. package/keycloakify-vue/login/pages/LoginConfigTotp.vue +233 -0
  116. package/keycloakify-vue/login/pages/LoginConfigTotp.vue.d.ts +9 -0
  117. package/keycloakify-vue/login/pages/LoginIdpLinkConfirm.vue +57 -0
  118. package/keycloakify-vue/login/pages/LoginIdpLinkConfirm.vue.d.ts +9 -0
  119. package/keycloakify-vue/login/pages/LoginIdpLinkConfirmOverride.vue +56 -0
  120. package/keycloakify-vue/login/pages/LoginIdpLinkConfirmOverride.vue.d.ts +9 -0
  121. package/keycloakify-vue/login/pages/LoginIdpLinkEmail.vue +52 -0
  122. package/keycloakify-vue/login/pages/LoginIdpLinkEmail.vue.d.ts +9 -0
  123. package/keycloakify-vue/login/pages/LoginOauth2DeviceVerifyUserCode.vue +82 -0
  124. package/keycloakify-vue/login/pages/LoginOauth2DeviceVerifyUserCode.vue.d.ts +9 -0
  125. package/keycloakify-vue/login/pages/LoginOauthGrant.vue +131 -0
  126. package/keycloakify-vue/login/pages/LoginOauthGrant.vue.d.ts +9 -0
  127. package/keycloakify-vue/login/pages/LoginOtp.vue +135 -0
  128. package/keycloakify-vue/login/pages/LoginOtp.vue.d.ts +9 -0
  129. package/keycloakify-vue/login/pages/LoginPageExpired.vue +44 -0
  130. package/keycloakify-vue/login/pages/LoginPageExpired.vue.d.ts +9 -0
  131. package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.useScript.d.ts +21 -0
  132. package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.useScript.js +74 -0
  133. package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.vue +255 -0
  134. package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.vue.d.ts +9 -0
  135. package/keycloakify-vue/login/pages/LoginPassword.useScript.d.ts +23 -0
  136. package/keycloakify-vue/login/pages/LoginPassword.useScript.js +64 -0
  137. package/keycloakify-vue/login/pages/LoginPassword.vue +191 -0
  138. package/keycloakify-vue/login/pages/LoginPassword.vue.d.ts +9 -0
  139. package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.useScript.d.ts +9 -0
  140. package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.useScript.js +139 -0
  141. package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.vue +183 -0
  142. package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.vue.d.ts +9 -0
  143. package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeInput.vue +90 -0
  144. package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeInput.vue.d.ts +9 -0
  145. package/keycloakify-vue/login/pages/LoginResetOtp.vue +88 -0
  146. package/keycloakify-vue/login/pages/LoginResetOtp.vue.d.ts +9 -0
  147. package/keycloakify-vue/login/pages/LoginResetPassword.vue +114 -0
  148. package/keycloakify-vue/login/pages/LoginResetPassword.vue.d.ts +9 -0
  149. package/keycloakify-vue/login/pages/LoginUpdatePassword.vue +145 -0
  150. package/keycloakify-vue/login/pages/LoginUpdatePassword.vue.d.ts +9 -0
  151. package/keycloakify-vue/login/pages/LoginUpdateProfile.vue +94 -0
  152. package/keycloakify-vue/login/pages/LoginUpdateProfile.vue.d.ts +14 -0
  153. package/keycloakify-vue/login/pages/LoginUsername.useScript.d.ts +23 -0
  154. package/keycloakify-vue/login/pages/LoginUsername.useScript.js +64 -0
  155. package/keycloakify-vue/login/pages/LoginUsername.vue +263 -0
  156. package/keycloakify-vue/login/pages/LoginUsername.vue.d.ts +9 -0
  157. package/keycloakify-vue/login/pages/LoginVerifyEmail.vue +39 -0
  158. package/keycloakify-vue/login/pages/LoginVerifyEmail.vue.d.ts +9 -0
  159. package/keycloakify-vue/login/pages/LoginX509Info.vue +120 -0
  160. package/keycloakify-vue/login/pages/LoginX509Info.vue.d.ts +9 -0
  161. package/keycloakify-vue/login/pages/LogoutConfirm.vue +73 -0
  162. package/keycloakify-vue/login/pages/LogoutConfirm.vue.d.ts +9 -0
  163. package/keycloakify-vue/login/pages/NotImplemented.vue +12 -0
  164. package/keycloakify-vue/login/pages/NotImplemented.vue.d.ts +6 -0
  165. package/keycloakify-vue/login/pages/PageProps.d.ts +9 -0
  166. package/keycloakify-vue/login/pages/PageProps.js +0 -0
  167. package/keycloakify-vue/login/pages/Register.vue +158 -0
  168. package/keycloakify-vue/login/pages/Register.vue.d.ts +14 -0
  169. package/keycloakify-vue/login/pages/SamlPostForm.vue +75 -0
  170. package/keycloakify-vue/login/pages/SamlPostForm.vue.d.ts +9 -0
  171. package/keycloakify-vue/login/pages/SelectAuthenticator.vue +65 -0
  172. package/keycloakify-vue/login/pages/SelectAuthenticator.vue.d.ts +9 -0
  173. package/keycloakify-vue/login/pages/SelectOrganization.vue +89 -0
  174. package/keycloakify-vue/login/pages/SelectOrganization.vue.d.ts +9 -0
  175. package/keycloakify-vue/login/pages/Terms.vue +56 -0
  176. package/keycloakify-vue/login/pages/Terms.vue.d.ts +9 -0
  177. package/keycloakify-vue/login/pages/UpdateEmail.vue +100 -0
  178. package/keycloakify-vue/login/pages/UpdateEmail.vue.d.ts +14 -0
  179. package/keycloakify-vue/login/pages/WebauthnAuthenticate.useScript.d.ts +22 -0
  180. package/keycloakify-vue/login/pages/WebauthnAuthenticate.useScript.js +53 -0
  181. package/keycloakify-vue/login/pages/WebauthnAuthenticate.vue +186 -0
  182. package/keycloakify-vue/login/pages/WebauthnAuthenticate.vue.d.ts +9 -0
  183. package/keycloakify-vue/login/pages/WebauthnError.vue +84 -0
  184. package/keycloakify-vue/login/pages/WebauthnError.vue.d.ts +9 -0
  185. package/keycloakify-vue/login/pages/WebauthnRegister.useScript.d.ts +28 -0
  186. package/keycloakify-vue/login/pages/WebauthnRegister.useScript.js +75 -0
  187. package/keycloakify-vue/login/pages/WebauthnRegister.vue +105 -0
  188. package/keycloakify-vue/login/pages/WebauthnRegister.vue.d.ts +9 -0
  189. package/keycloakify-vue/tools/useInsertLinkTags.d.ts +12 -0
  190. package/keycloakify-vue/tools/useInsertLinkTags.js +47 -0
  191. package/keycloakify-vue/tools/useInsertScriptTags.d.ts +19 -0
  192. package/keycloakify-vue/tools/useInsertScriptTags.js +56 -0
  193. package/keycloakify-vue/tools/useSetClassName.d.ts +4 -0
  194. package/keycloakify-vue/tools/useSetClassName.js +16 -0
  195. package/package.json +553 -0
  196. package/src/account/DefaultPage.vue +55 -0
  197. package/src/account/KcContext/index.ts +1 -0
  198. package/src/account/Template.useInitialize.ts +34 -0
  199. package/src/account/Template.vue +178 -0
  200. package/src/account/TemplateProps.ts +11 -0
  201. package/src/account/i18n/i18n.ts +16 -0
  202. package/src/account/i18n/i18nBuilder.ts +100 -0
  203. package/src/account/i18n/index.ts +1 -0
  204. package/src/account/i18n/useI18n.ts +128 -0
  205. package/src/account/index.ts +4 -0
  206. package/src/account/pages/Account.vue +182 -0
  207. package/src/account/pages/Applications.vue +192 -0
  208. package/src/account/pages/FederatedIdentity.vue +123 -0
  209. package/src/account/pages/Log.vue +64 -0
  210. package/src/account/pages/NotImplemented.vue +24 -0
  211. package/src/account/pages/PageProps.ts +10 -0
  212. package/src/account/pages/Password.vue +247 -0
  213. package/src/account/pages/Sessions.vue +84 -0
  214. package/src/account/pages/Totp.vue +308 -0
  215. package/src/bin/initialize-account-theme/boilerplate/KcContext.ts +11 -0
  216. package/src/bin/initialize-account-theme/boilerplate/KcPage.vue +23 -0
  217. package/src/bin/initialize-account-theme/boilerplate/KcPageStory.ts +22 -0
  218. package/src/bin/initialize-account-theme/boilerplate/KcPageStory.vue +13 -0
  219. package/src/bin/initialize-account-theme/boilerplate/i18n.ts +8 -0
  220. package/src/login/DefaultPage.vue +167 -0
  221. package/src/login/Template.useInitialize.ts +71 -0
  222. package/src/login/Template.vue +239 -0
  223. package/src/login/TemplateProps.ts +17 -0
  224. package/src/login/components/AddRemoveButtonsMultiValuedAttribute.vue +59 -0
  225. package/src/login/components/FieldErrors.vue +35 -0
  226. package/src/login/components/GroupLabel.vue +68 -0
  227. package/src/login/components/InputFieldByType.vue +94 -0
  228. package/src/login/components/InputFieldByTypeProps.ts +13 -0
  229. package/src/login/components/InputTag.vue +105 -0
  230. package/src/login/components/InputTagSelects.vue +108 -0
  231. package/src/login/components/LogoutOtherSessions.vue +27 -0
  232. package/src/login/components/PasswordWrapper.vue +42 -0
  233. package/src/login/components/SelectTag.vue +74 -0
  234. package/src/login/components/TermsAcceptance.vue +59 -0
  235. package/src/login/components/TextareaTag.vue +47 -0
  236. package/src/login/components/UserProfileFormFields.vue +119 -0
  237. package/src/login/components/UserProfileFormFieldsProps.ts +22 -0
  238. package/src/login/components/inputLabel.ts +18 -0
  239. package/src/login/i18n/i18n.ts +16 -0
  240. package/src/login/i18n/i18nBuilder.ts +100 -0
  241. package/src/login/i18n/index.ts +1 -0
  242. package/src/login/i18n/useI18n.ts +128 -0
  243. package/src/login/index.ts +5 -0
  244. package/src/login/lib/useUserProfileForm.ts +121 -0
  245. package/src/login/pages/Code.vue +54 -0
  246. package/src/login/pages/DeleteAccountConfirm.vue +69 -0
  247. package/src/login/pages/DeleteCredential.vue +56 -0
  248. package/src/login/pages/Error.vue +41 -0
  249. package/src/login/pages/FrontchannelLogout.vue +67 -0
  250. package/src/login/pages/IdpReviewUserProfile.vue +77 -0
  251. package/src/login/pages/Info.vue +61 -0
  252. package/src/login/pages/LinkIdpAction.vue +66 -0
  253. package/src/login/pages/Login.vue +230 -0
  254. package/src/login/pages/LoginConfigTotp.vue +233 -0
  255. package/src/login/pages/LoginIdpLinkConfirm.vue +57 -0
  256. package/src/login/pages/LoginIdpLinkConfirmOverride.vue +56 -0
  257. package/src/login/pages/LoginIdpLinkEmail.vue +52 -0
  258. package/src/login/pages/LoginOauth2DeviceVerifyUserCode.vue +82 -0
  259. package/src/login/pages/LoginOauthGrant.vue +131 -0
  260. package/src/login/pages/LoginOtp.vue +135 -0
  261. package/src/login/pages/LoginPageExpired.vue +44 -0
  262. package/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.ts +96 -0
  263. package/src/login/pages/LoginPasskeysConditionalAuthenticate.vue +255 -0
  264. package/src/login/pages/LoginPassword.useScript.ts +88 -0
  265. package/src/login/pages/LoginPassword.vue +191 -0
  266. package/src/login/pages/LoginRecoveryAuthnCodeConfig.useScript.ts +152 -0
  267. package/src/login/pages/LoginRecoveryAuthnCodeConfig.vue +183 -0
  268. package/src/login/pages/LoginRecoveryAuthnCodeInput.vue +90 -0
  269. package/src/login/pages/LoginResetOtp.vue +88 -0
  270. package/src/login/pages/LoginResetPassword.vue +114 -0
  271. package/src/login/pages/LoginUpdatePassword.vue +145 -0
  272. package/src/login/pages/LoginUpdateProfile.vue +94 -0
  273. package/src/login/pages/LoginUsername.useScript.ts +88 -0
  274. package/src/login/pages/LoginUsername.vue +263 -0
  275. package/src/login/pages/LoginVerifyEmail.vue +39 -0
  276. package/src/login/pages/LoginX509Info.vue +120 -0
  277. package/src/login/pages/LogoutConfirm.vue +73 -0
  278. package/src/login/pages/NotImplemented.vue +12 -0
  279. package/src/login/pages/PageProps.ts +10 -0
  280. package/src/login/pages/Register.vue +158 -0
  281. package/src/login/pages/SamlPostForm.vue +75 -0
  282. package/src/login/pages/SelectAuthenticator.vue +65 -0
  283. package/src/login/pages/SelectOrganization.vue +89 -0
  284. package/src/login/pages/Terms.vue +56 -0
  285. package/src/login/pages/UpdateEmail.vue +100 -0
  286. package/src/login/pages/WebauthnAuthenticate.useScript.ts +75 -0
  287. package/src/login/pages/WebauthnAuthenticate.vue +186 -0
  288. package/src/login/pages/WebauthnError.vue +84 -0
  289. package/src/login/pages/WebauthnRegister.useScript.ts +109 -0
  290. package/src/login/pages/WebauthnRegister.vue +105 -0
  291. package/src/tools/useInsertLinkTags.ts +62 -0
  292. package/src/tools/useInsertScriptTags.ts +75 -0
  293. package/src/tools/useSetClassName.ts +15 -0
  294. package/stories/account/KcContext.ts +13 -0
  295. package/stories/account/KcContextMock.ts +26 -0
  296. package/stories/account/KcPage.vue +26 -0
  297. package/stories/account/KcPageStory.vue +13 -0
  298. package/stories/account/i18n.ts +7 -0
  299. package/stories/account/pages/Account.stories.ts +22 -0
  300. package/stories/account/pages/Applications.stories.ts +70 -0
  301. package/stories/account/pages/FederatedIdentity.stories.ts +64 -0
  302. package/stories/account/pages/Log.stories.ts +42 -0
  303. package/stories/account/pages/Password.stories.ts +22 -0
  304. package/stories/account/pages/Sessions.stories.ts +41 -0
  305. package/stories/account/pages/Totp.stories.ts +33 -0
  306. package/stories/kc.gen.ts +17 -0
  307. package/stories/login/KcContext.ts +13 -0
  308. package/stories/login/KcContextMock.ts +26 -0
  309. package/stories/login/KcPage.vue +28 -0
  310. package/stories/login/KcPageStory.vue +13 -0
  311. package/stories/login/i18n.ts +7 -0
  312. package/stories/login/pages/Code.stories.ts +50 -0
  313. package/stories/login/pages/DeleteAccountConfirm.stories.ts +32 -0
  314. package/stories/login/pages/DeleteCredential.stories.ts +23 -0
  315. package/stories/login/pages/Error.stories.ts +53 -0
  316. package/stories/login/pages/FrontchannelLogout.stories.ts +24 -0
  317. package/stories/login/pages/IdpReviewUserProfile.stories.ts +56 -0
  318. package/stories/login/pages/Info.stories.ts +52 -0
  319. package/stories/login/pages/LinkIdpAction.stories.ts +30 -0
  320. package/stories/login/pages/Login.stories.ts +76 -0
  321. package/stories/login/pages/LoginConfigTotp.stories.ts +53 -0
  322. package/stories/login/pages/LoginIdpLinkConfirm.stories.ts +34 -0
  323. package/stories/login/pages/LoginIdpLinkConfirmOverride.stories.ts +14 -0
  324. package/stories/login/pages/LoginIdpLinkEmail.stories.ts +60 -0
  325. package/stories/login/pages/LoginOauth2DeviceVerifyUserCode.stories.ts +42 -0
  326. package/stories/login/pages/LoginOauthGrant.stories.ts +95 -0
  327. package/stories/login/pages/LoginOtp.stories.ts +92 -0
  328. package/stories/login/pages/LoginPageExpired.stories.ts +29 -0
  329. package/stories/login/pages/LoginPasskeysConditionalAuthenticate.stories.ts +14 -0
  330. package/stories/login/pages/LoginPassword.stories.ts +49 -0
  331. package/stories/login/pages/LoginRecoveryAuthnCodeConfig.stories.ts +28 -0
  332. package/stories/login/pages/LoginRecoveryAuthnCodeInput.stories.ts +14 -0
  333. package/stories/login/pages/LoginResetOtp.stories.ts +69 -0
  334. package/stories/login/pages/LoginResetPassword.stories.ts +48 -0
  335. package/stories/login/pages/LoginUpdatePassword.stories.ts +52 -0
  336. package/stories/login/pages/LoginUpdateProfile.stories.ts +29 -0
  337. package/stories/login/pages/LoginUsername.stories.ts +25 -0
  338. package/stories/login/pages/LoginVerifyEmail.stories.ts +63 -0
  339. package/stories/login/pages/LoginX509Info.stories.ts +29 -0
  340. package/stories/login/pages/LogoutConfirm.stories.ts +35 -0
  341. package/stories/login/pages/Register.stories.ts +76 -0
  342. package/stories/login/pages/SamlPostForm.stories.ts +14 -0
  343. package/stories/login/pages/SelectAuthenticator.stories.ts +89 -0
  344. package/stories/login/pages/SelectOrganization.stories.ts +63 -0
  345. package/stories/login/pages/Terms.stories.ts +78 -0
  346. package/stories/login/pages/UpdateEmail.stories.ts +28 -0
  347. package/stories/login/pages/WebauthnAuthenticate.stories.ts +147 -0
  348. package/stories/login/pages/WebauthnError.stories.ts +77 -0
  349. package/stories/login/pages/WebauthnRegister.stories.ts +54 -0
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
3
+ var Lt=Object.create;var fe=Object.defineProperty;var Dt=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var jt=Object.getPrototypeOf,Kt=Object.prototype.hasOwnProperty;var De=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var m=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var O=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}},J=(e,t)=>{for(var r in t)fe(e,r,{get:t[r],enumerable:!0})},Vt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ft(t))!Kt.call(e,n)&&n!==r&&fe(e,n,{get:()=>t[n],enumerable:!(o=Dt(t,n))||o.enumerable});return e};var Fe=(e,t,r)=>(r=e!=null?Lt(jt(e)):{},Vt(t||!e||!e.__esModule?fe(r,"default",{value:e,enumerable:!0}):r,e));var j,K,V,pe,$t,Ir,me=m(()=>{j=["login","account","admin"],K=["login.ftl","login-username.ftl","login-password.ftl","webauthn-authenticate.ftl","webauthn-register.ftl","register.ftl","info.ftl","error.ftl","login-reset-password.ftl","login-verify-email.ftl","terms.ftl","login-oauth2-device-verify-user-code.ftl","login-oauth-grant.ftl","login-otp.ftl","login-update-profile.ftl","login-update-password.ftl","link-idp-action.ftl","login-idp-link-confirm.ftl","login-idp-link-email.ftl","login-page-expired.ftl","login-config-totp.ftl","logout-confirm.ftl","idp-review-user-profile.ftl","update-email.ftl","select-authenticator.ftl","saml-post-form.ftl","delete-credential.ftl","code.ftl","delete-account-confirm.ftl","frontchannel-logout.ftl","login-recovery-authn-code-config.ftl","login-recovery-authn-code-input.ftl","login-reset-otp.ftl","login-x509-info.ftl","webauthn-error.ftl","login-passkeys-conditional-authenticate.ftl","login-idp-link-confirm-override.ftl","select-organization.ftl"],V=["password.ftl","account.ftl","sessions.ftl","totp.ftl","applications.ftl","log.ftl","federatedIdentity.ftl"],pe={COMMAND_NAME:"KEYCLOAKIFY_COMMAND_NAME",BUILD_CONTEXT:"KEYCLOAKIFY_BUILD_CONTEXT"},$t="1.0.3",Ir=`keycloakify-logging-${$t}.jar`});function g(e,t){if(arguments.length===0&&(e=!0),S!==void 0){S=void 0;return}if(!e){let r=new de(typeof t=="function"?t():t);throw Error.captureStackTrace&&Error.captureStackTrace(r,g),r}}function Ke(e){let t={};if(S!==void 0)throw S=void 0,new Error(je);return S=t,Promise.resolve().then(()=>{if(S===t)throw new Error(je)}),null}var de,S,je,w=m(()=>{de=class extends Error{constructor(t){super("Wrong assertion encountered"+(t?`: "${t}"`:"")),this.originalMessage=t,Object.setPrototypeOf(this,new.target.prototype)}};je="Wrong usage of the `is` function refer to https://docs.tsafe.dev/is"});function ge(e){let{apiVersion:t}=e;g(t==="v1");let r=(()=>{let n=process.env[pe.COMMAND_NAME];return g(n!==void 0),n})(),o=(()=>{let n=process.env[pe.BUILD_CONTEXT];return g(n!==void 0),JSON.parse(n)})();return{commandName:r,buildContext:o}}var he,Ve=m(()=>{w();me();he=78});var q=m(()=>{"use strict";me();Ve()});var Ge={};J(Ge,{command:()=>Ce});import*as ye from"fs/promises";import{existsSync as Gt}from"fs";import{join as $e}from"path";async function Ce(e){let{buildContext:t}=e,r=t.implementedThemeTypes.login.isImplemented,o=t.implementedThemeTypes.account.isImplemented,n=t.themeNames,i=n.map(y=>`"${y}"`).join(" | "),s=n.map(y=>`"${y}"`).join(", "),d=[r&&' | import("./login/KcContext").KcContext',o&&' | import("./account/KcContext").KcContext'].filter(y=>typeof y=="string"),x=["// This file is auto-generated by keycloakify. Do not edit it manually.","","/* eslint-disable */","// @ts-nocheck","",`export type ThemeName = ${i};`,"",`export const themeNames: ThemeName[] = [${s}];`,"","export type KcEnvName = never;","export const kcEnvNames: KcEnvName[] = [];","export const kcEnvDefaults: Record<KcEnvName, string> = {};","","export type KcContext =",...d,"","declare global {"," interface Window {"," kcContext?: KcContext;"," }","}",""].join(`
4
+ `),h=['<script setup lang="ts">',"// This file is auto-generated by keycloakify. Do not edit it manually.",'import { defineAsyncComponent } from "vue";','import type { KcContext } from "./kc.gen";',"","const props = defineProps<{ kcContext: KcContext }>();","",r&&'const KcLoginPage = defineAsyncComponent(() => import("./login/KcPage.vue"));',o&&'const KcAccountPage = defineAsyncComponent(() => import("./account/KcPage.vue"));',"</script>","","<template>",r&&` <KcLoginPage v-if="props.kcContext.themeType === 'login'" :kcContext="props.kcContext" />`,o&&` <KcAccountPage v-else-if="props.kcContext.themeType === 'account'" :kcContext="props.kcContext" />`,"</template>",""].filter(y=>typeof y=="string").join(`
5
+ `);await ye.writeFile($e(t.themeSrcDirPath,"kc.gen.ts"),x);let p=$e(t.themeSrcDirPath,"kc.gen.vue");(Gt(p)||r||o)&&await ye.writeFile(p,h)}var Te=m(()=>{"use strict"});function Ht(){let e=new Map;for(let[t,r]of Object.entries(u)){for(let[o,n]of Object.entries(r))u[o]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},r[o]=u[o],e.set(n[0],n[1]);Object.defineProperty(u,t,{value:r,enumerable:!1})}return Object.defineProperty(u,"codes",{value:e,enumerable:!1}),u.color.close="\x1B[39m",u.bgColor.close="\x1B[49m",u.color.ansi=Ye(),u.color.ansi256=Ue(),u.color.ansi16m=He(),u.bgColor.ansi=Ye(10),u.bgColor.ansi256=Ue(10),u.bgColor.ansi16m=He(10),Object.defineProperties(u,{rgbToAnsi256:{value(t,r,o){return t===r&&r===o?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(t){let r=/[a-f\d]{6}|[a-f\d]{3}/i.exec(t.toString(16));if(!r)return[0,0,0];let[o]=r;o.length===3&&(o=[...o].map(i=>i+i).join(""));let n=Number.parseInt(o,16);return[n>>16&255,n>>8&255,n&255]},enumerable:!1},hexToAnsi256:{value:t=>u.rgbToAnsi256(...u.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let r,o,n;if(t>=232)r=((t-232)*10+8)/255,o=r,n=r;else{t-=16;let d=t%36;r=Math.floor(t/36)/5,o=Math.floor(d/6)/5,n=d%6/5}let i=Math.max(r,o,n)*2;if(i===0)return 30;let s=30+(Math.round(n)<<2|Math.round(o)<<1|Math.round(r));return i===2&&(s+=60),s},enumerable:!1},rgbToAnsi:{value:(t,r,o)=>u.ansi256ToAnsi(u.rgbToAnsi256(t,r,o)),enumerable:!1},hexToAnsi:{value:t=>u.ansi256ToAnsi(u.hexToAnsi256(t)),enumerable:!1}}),u}var Ye,Ue,He,u,Gr,Yt,Ut,Yr,Jt,T,Je=m(()=>{Ye=(e=0)=>t=>`\x1B[${t+e}m`,Ue=(e=0)=>t=>`\x1B[${38+e};5;${t}m`,He=(e=0)=>(t,r,o)=>`\x1B[${38+e};2;${t};${r};${o}m`,u={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Gr=Object.keys(u.modifier),Yt=Object.keys(u.color),Ut=Object.keys(u.bgColor),Yr=[...Yt,...Ut];Jt=Ht(),T=Jt});import be from"node:process";import qt from"node:os";import qe from"node:tty";function C(e,t=globalThis.Deno?globalThis.Deno.args:be.argv){let r=e.startsWith("-")?"":e.length===1?"-":"--",o=t.indexOf(r+e),n=t.indexOf("--");return o!==-1&&(n===-1||o<n)}function Wt(){if("FORCE_COLOR"in f)return f.FORCE_COLOR==="true"?1:f.FORCE_COLOR==="false"?0:f.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(f.FORCE_COLOR,10),3)}function zt(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function Xt(e,{streamIsTTY:t,sniffFlags:r=!0}={}){let o=Wt();o!==void 0&&(W=o);let n=r?W:o;if(n===0)return 0;if(r){if(C("color=16m")||C("color=full")||C("color=truecolor"))return 3;if(C("color=256"))return 2}if("TF_BUILD"in f&&"AGENT_NAME"in f)return 1;if(e&&!t&&n===void 0)return 0;let i=n||0;if(f.TERM==="dumb")return i;if(be.platform==="win32"){let s=qt.release().split(".");return Number(s[0])>=10&&Number(s[2])>=10586?Number(s[2])>=14931?3:2:1}if("CI"in f)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(s=>s in f)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(s=>s in f)||f.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in f)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(f.TEAMCITY_VERSION)?1:0;if(f.COLORTERM==="truecolor"||f.TERM==="xterm-kitty"||f.TERM==="xterm-ghostty"||f.TERM==="wezterm")return 3;if("TERM_PROGRAM"in f){let s=Number.parseInt((f.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(f.TERM_PROGRAM){case"iTerm.app":return s>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(f.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(f.TERM)||"COLORTERM"in f?1:i}function We(e,t={}){let r=Xt(e,{streamIsTTY:e&&e.isTTY,...t});return zt(r)}var f,W,Qt,ze,Xe=m(()=>{({env:f}=be);C("no-color")||C("no-colors")||C("color=false")||C("color=never")?W=0:(C("color")||C("colors")||C("color=true")||C("color=always"))&&(W=1);Qt={stdout:We({isTTY:qe.isatty(1)}),stderr:We({isTTY:qe.isatty(2)})},ze=Qt});function Qe(e,t,r){let o=e.indexOf(t);if(o===-1)return e;let n=t.length,i=0,s="";do s+=e.slice(i,o)+t+r,i=o+n,o=e.indexOf(t,i);while(o!==-1);return s+=e.slice(i),s}function Ze(e,t,r,o){let n=0,i="";do{let s=e[o-1]==="\r";i+=e.slice(n,s?o-1:o)+t+(s?`\r
6
+ `:`
7
+ `)+r,n=o+1,o=e.indexOf(`
8
+ `,n)}while(o!==-1);return i+=e.slice(n),i}var et=m(()=>{});function G(e){return er(e)}var tt,rt,Ee,A,$,ot,k,Zt,er,ve,tr,rr,_e,z,or,nr,eo,l,I=m(()=>{Je();Xe();et();({stdout:tt,stderr:rt}=ze),Ee=Symbol("GENERATOR"),A=Symbol("STYLER"),$=Symbol("IS_EMPTY"),ot=["ansi","ansi","ansi256","ansi16m"],k=Object.create(null),Zt=(e,t={})=>{if(t.level&&!(Number.isInteger(t.level)&&t.level>=0&&t.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=tt?tt.level:0;e.level=t.level===void 0?r:t.level},er=e=>{let t=(...r)=>r.join(" ");return Zt(t,e),Object.setPrototypeOf(t,G.prototype),t};Object.setPrototypeOf(G.prototype,Function.prototype);for(let[e,t]of Object.entries(T))k[e]={get(){let r=z(this,_e(t.open,t.close,this[A]),this[$]);return Object.defineProperty(this,e,{value:r}),r}};k.visible={get(){let e=z(this,this[A],!0);return Object.defineProperty(this,"visible",{value:e}),e}};ve=(e,t,r,...o)=>e==="rgb"?t==="ansi16m"?T[r].ansi16m(...o):t==="ansi256"?T[r].ansi256(T.rgbToAnsi256(...o)):T[r].ansi(T.rgbToAnsi(...o)):e==="hex"?ve("rgb",t,r,...T.hexToRgb(...o)):T[r][e](...o),tr=["rgb","hex","ansi256"];for(let e of tr){k[e]={get(){let{level:r}=this;return function(...o){let n=_e(ve(e,ot[r],"color",...o),T.color.close,this[A]);return z(this,n,this[$])}}};let t="bg"+e[0].toUpperCase()+e.slice(1);k[t]={get(){let{level:r}=this;return function(...o){let n=_e(ve(e,ot[r],"bgColor",...o),T.bgColor.close,this[A]);return z(this,n,this[$])}}}}rr=Object.defineProperties(()=>{},{...k,level:{enumerable:!0,get(){return this[Ee].level},set(e){this[Ee].level=e}}}),_e=(e,t,r)=>{let o,n;return r===void 0?(o=e,n=t):(o=r.openAll+e,n=t+r.closeAll),{open:e,close:t,openAll:o,closeAll:n,parent:r}},z=(e,t,r)=>{let o=(...n)=>or(o,n.length===1?""+n[0]:n.join(" "));return Object.setPrototypeOf(o,rr),o[Ee]=e,o[A]=t,o[$]=r,o},or=(e,t)=>{if(e.level<=0||!t)return e[$]?"":t;let r=e[A];if(r===void 0)return t;let{openAll:o,closeAll:n}=r;if(t.includes("\x1B"))for(;r!==void 0;)t=Qe(t,r.close,r.open),r=r.parent;let i=t.indexOf(`
9
+ `);return i!==-1&&(t=Ze(t,n,o,i)),o+t+n};Object.defineProperties(G.prototype,k);nr=G(),eo=G({level:rt?rt.level:0}),l=nr});var nt=O(X=>{"use strict";Object.defineProperty(X,"__esModule",{value:!0});X.default=void 0;var ir=sr(De("readline"));function sr(e){return e&&e.__esModule?e:{default:e}}var Pe=class{constructor(t=process.stdin){this.stream=t,this.values=[],this.selectedValue=0,this.onSelectListener=()=>{},this.onKeyPress=this.onKeyPress.bind(this)}setValues(t){this.values=t,this.renderer&&this.renderer.setValues(t)}setDefaultValue(t){this.selectedValue=t}attachRenderer(t){this.renderer=t,this.renderer.setValues(this.values)}onSelect(t){this.onSelectListener=t}open(){ir.default.emitKeypressEvents(this.stream),this.stream.on("keypress",this.onKeyPress),this.renderer&&this.renderer.render(this.selectedValue),this.stream.setRawMode(!0),this.stream.resume()}close(t=!1){this.stream.setRawMode(!1),this.stream.pause(),this.renderer&&this.renderer.cleanup(),t?this.onSelectListener(null):this.onSelectListener(this.selectedValue,this.values[this.selectedValue]),this.stream.removeListener("keypress",this.onKeyPress)}render(){this.renderer&&this.renderer.render(this.selectedValue)}onKeyPress(t,r){r&&(r.name==="up"&&this.selectedValue>0?(this.selectedValue--,this.render()):r.name==="down"&&this.selectedValue+1<this.values.length?(this.selectedValue++,this.render()):r.name==="return"?this.close():(r.name==="escape"||r.name==="c"&&r.ctrl)&&this.close(!0))}};X.default=Pe});var at=O((oo,st)=>{"use strict";var a=st.exports,c="\x1B[",Z="\x1B]",Y="\x07",Q=";",it=process.env.TERM_PROGRAM==="Apple_Terminal";a.cursorTo=(e,t)=>{if(typeof e!="number")throw new TypeError("The `x` argument is required");return typeof t!="number"?c+(e+1)+"G":c+(t+1)+";"+(e+1)+"H"};a.cursorMove=(e,t)=>{if(typeof e!="number")throw new TypeError("The `x` argument is required");let r="";return e<0?r+=c+-e+"D":e>0&&(r+=c+e+"C"),t<0?r+=c+-t+"A":t>0&&(r+=c+t+"B"),r};a.cursorUp=e=>c+(typeof e=="number"?e:1)+"A";a.cursorDown=e=>c+(typeof e=="number"?e:1)+"B";a.cursorForward=e=>c+(typeof e=="number"?e:1)+"C";a.cursorBackward=e=>c+(typeof e=="number"?e:1)+"D";a.cursorLeft=c+"G";a.cursorSavePosition=c+(it?"7":"s");a.cursorRestorePosition=c+(it?"8":"u");a.cursorGetPosition=c+"6n";a.cursorNextLine=c+"E";a.cursorPrevLine=c+"F";a.cursorHide=c+"?25l";a.cursorShow=c+"?25h";a.eraseLines=e=>{let t="";for(let r=0;r<e;r++)t+=a.eraseLine+(r<e-1?a.cursorUp():"");return e&&(t+=a.cursorLeft),t};a.eraseEndLine=c+"K";a.eraseStartLine=c+"1K";a.eraseLine=c+"2K";a.eraseDown=c+"J";a.eraseUp=c+"1J";a.eraseScreen=c+"2J";a.scrollUp=c+"S";a.scrollDown=c+"T";a.clearScreen="\x1Bc";a.clearTerminal=process.platform==="win32"?`${a.eraseScreen}${c}0f`:`${a.eraseScreen}${c}3J${c}H`;a.beep=Y;a.link=(e,t)=>[Z,"8",Q,Q,t,Y,e,Z,"8",Q,Q,Y].join("");a.image=(e,t)=>{t=t||{};let r=Z+"1337;File=inline=1";return t.width&&(r+=`;width=${t.width}`),t.height&&(r+=`;height=${t.height}`),t.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+e.toString("base64")+Y};a.iTerm={};a.iTerm.setCwd=e=>Z+"50;CurrentDir="+(e||process.cwd())+Y});var lt=O(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.default=void 0;var no=ar(De("readline")),ee=at();function ar(e){return e&&e.__esModule?e:{default:e}}var xe=class{constructor(t,r=process.stdout){this.options=t,this.stream=r,this.values=[],this.initialRender=!0}setValues(t){this.values=t}render(t=0){this.initialRender?(this.initialRender=!1,this.stream.write(ee.cursorHide)):this.stream.write((0,ee.eraseLines)(this.values.length)),this.values.forEach((r,o)=>{let n=t===o?this.options.selected:this.options.unselected,i=" ".repeat(this.options.indentation),s=this.options.valueRenderer(r,t===o),d=o!==this.values.length-1?`
10
+ `:"";this.stream.write(i+n+" "+s+d)})}cleanup(){this.stream.write((0,ee.eraseLines)(this.values.length)),this.stream.write(ee.cursorShow)}};te.default=xe});var ct=O(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.withPromise=R.withCallback=void 0;var lr=(e,t,r)=>{e.open(),e.onSelect((o,n)=>r(t(o,n)))};R.withCallback=lr;var cr=(e,t)=>new Promise((r,o)=>{e.open(),e.onSelect((n,i)=>{n===null?o():r(t(n,i))})});R.withPromise=cr});var ut=O(N=>{"use strict";Object.defineProperty(N,"__esModule",{value:!0});N.withObjectValues=N.withArrayValues=void 0;var ur=e=>({input:e.values,output:(t,r)=>({id:t,value:r})});N.withArrayValues=ur;var fr=e=>{let t=e.values;return{input:Object.values(t),output:(r,o)=>({id:Object.keys(t)[r],value:o})}};N.withObjectValues=fr});var Oe=O((M,ht)=>{"use strict";Object.defineProperty(M,"__esModule",{value:!0});M.default=void 0;var pr=mt(nt()),mr=mt(lt()),ft=ct(),pt=ut();function mt(e){return e&&e.__esModule?e:{default:e}}function dr(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{},o=Object.keys(r);typeof Object.getOwnPropertySymbols=="function"&&(o=o.concat(Object.getOwnPropertySymbols(r).filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable}))),o.forEach(function(n){hr(e,n,r[n])})}return e}function hr(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var gr={outputStream:process.stdout,inputStream:process.stdin,values:[],defaultValue:0,selected:"(x)",unselected:"( )",indentation:0,cleanup:!0,valueRenderer:e=>e},dt=(e,t)=>{e=dr({},gr,e);let r=new mr.default(e,e.outputStream),o=new pr.default(e.inputStream);o.setDefaultValue(e.defaultValue),o.attachRenderer(r);let n;return Array.isArray(e.values)?n=(0,pt.withArrayValues)(e):n=(0,pt.withObjectValues)(e),e.values=n.input,o.setValues(e.values),typeof t=="function"?(0,ft.withCallback)(o,n.output,t):(0,ft.withPromise)(o,n.output)};M=ht.exports=dt;Object.defineProperty(M,"__esModule",{value:!0});var yr=dt;M.default=yr});function B(e){return e.charAt(0).toUpperCase()+e.slice(1)}var re=m(()=>{});import*as we from"fs";import*as P from"path";import*as gt from"url";function yt(e){return we.existsSync(P.join(e,"LICENSE"))?e:yt(P.join(e,".."))}function L(){return Se!==void 0?Se:Se=yt(Cr)}function Ae(e){return we.existsSync(P.join(e,"package.json"))?e:Ae(P.join(e,".."))}var Cr,Se,U=m(()=>{"use strict";Cr=P.dirname(gt.fileURLToPath(import.meta.url))});function oe(e){let[t,...r]=e.split("-");return[t,...r.map(B)].join("")}var ke=m(()=>{"use strict";re()});var ne,Ct=m(()=>{ne=e=>e});function Tt(e){return Object.keys(e)[0]}var bt=m(()=>{});import{dirname as Tr,join as br,sep as Et}from"path";function ie(){if(Ie!==void 0)return Ie;let e=process.argv[1];e:{if(!e.endsWith(".ts"))break e;let n=Ae(Tr(e));return br(n,"node_modules",".bin")}let t=[".bin"],r=!1;for(let n of e.split(Et).reverse()){e:{if(r)break e;if(n==="node_modules"){r=!0;break e}continue}t.unshift(n)}if(!r)throw new Error(`Could not find node_modules in path ${e}`);let o=t.join(Et);return Ie=o,o}var Ie,vt=m(()=>{"use strict";U()});import*as _t from"crypto";import*as ae from"fs/promises";import{join as se,resolve as Er}from"path";async function E(){if(E.cache!==void 0)return E.cache;let e=ie(),t=se(e,"prettier"),o=(await ae.stat(t).catch(()=>{}))?.isFile()??!1;return E.cache=o,o}async function H(){if(g(E()),H.cache!==void 0)return H.cache;let prettier=ne(void 0);e:{let prettierDirPath=Er(se(ie(),"..","prettier")),isCJS=typeof module<"u"&&module.exports;isCJS?eval(`${Tt({prettier})} = require("${prettierDirPath}")`):prettier=await new Promise(_resolve=>{eval(`import("file:///${se(prettierDirPath,"index.mjs").replace(/\\/g,"/")}").then(prettier => _resolve(prettier))`)}),g(!Ke(prettier));break e}let configHash=await(async()=>{let e=await prettier.resolveConfigFile(se(ie(),"..",".."));if(e===null)return"";let t=await ae.readFile(e);return _t.createHash("sha256").update(t).digest("hex")})(),prettierAndConfig={prettier,configHash};return H.cache=prettierAndConfig,prettierAndConfig}async function le(e){let{sourceCode:t,filePath:r}=e,o;try{let{prettier:n}=await H(),{ignored:i,inferredParser:s}=await n.getFileInfo(r,{resolveConfig:!0});if(i||s===null)return t;let d=await n.resolveConfig(r);o=await n.format(typeof t=="string"?t:t.toString("utf8"),{...d,filePath:r,parser:s})}catch(n){throw console.log(l.red("You probably need to upgrade the version of prettier in your project")),n}return typeof t=="string"?o:Buffer.from(o,"utf8")}var Re=m(()=>{"use strict";I();w();Ct();bt();vt();E.cache=ne(void 0);H.cache=ne(void 0)});var Pt={};J(Pt,{command:()=>_r});import*as b from"fs";import{dirname as vr,join as D,relative as ce}from"path";async function _r(e){let{buildContext:t}=e;console.log(l.cyan("Theme type:"));let r=await(async()=>{let h=j.filter(y=>{switch(y){case"account":return t.implementedThemeTypes.account.isImplemented;case"login":return t.implementedThemeTypes.login.isImplemented;case"admin":return t.implementedThemeTypes.admin.isImplemented}g(!1)});if(g(h.length>0,"No theme is implemented in this project"),h.length===1)return h[0];let{value:p}=await(0,Ne.default)({values:h}).catch(()=>{process.exit(-1)});return p})();console.log(`\u2192 ${r}`),console.log(l.cyan("Select the page you want to customize:"));let o="Template.vue (Layout common to every page)",n="UserProfileFormFields.vue (Renders the form of the register.ftl, login-update-profile.ftl, update-email.ftl and idp-review-user-profile.ftl)",i="The page you're looking for isn't listed here",{value:s}=await(0,Ne.default)({values:(()=>{switch(r){case"login":return[o,n,...K,i];case"account":return[o,...V,i];case"admin":return[]}g(!1)})()}).catch(()=>{process.exit(-1)});s===i&&(console.log(["To style a page not included in the base Keycloak, such as one added by a third-party Keycloak extension,","refer to the documentation: https://docs.keycloakify.dev/features/styling-a-custom-page-not-included-in-base-keycloak"].join(" ")),process.exit(0)),console.log(`\u2192 ${s}`);let d=s===o?["Template.vue"]:s===n?["UserProfileFormFields.vue","InputFieldByType.vue","LogoutOtherSessions.vue","PasswordWrapper.vue","AddRemoveButtonsMultiValuedAttribute.vue","SelectTag.vue","FieldErrors.vue","InputTag.vue","TermsAcceptance.vue","GroupLabel.vue","InputTagSelects.vue","TextareaTag.vue"]:[B(oe(s)).replace(/ftl$/,"vue")],x=s===o?".":s===n?"components":"pages";for(let h of d){let p=D(t.themeSrcDirPath,r,x,h);b.existsSync(p)&&(console.log(`${s} is already ejected, ${ce(process.cwd(),p)} already exists`),process.exit(-1));let y=b.readFileSync(D(L(),"src",r,x,h)).toString("utf8");n&&(y=y.replace(new RegExp(`from '@andreyyolkin/keycloakify-vue/login/components/(${d.join("|")})`,"g"),"from './$1"));e:{if(!await E())break e;y=await le({filePath:p,sourceCode:y})}{let Le=vr(p);b.existsSync(Le)||b.mkdirSync(Le,{recursive:!0})}b.writeFileSync(p,Buffer.from(y,"utf8")),console.log(`${l.green("\u2713")} ${l.bold(D(".",ce(process.cwd(),p)))} copy pasted from the Keycloakify source code into your project`)}e:{if(s!==o&&s!==n)break e;let h=D(t.themeSrcDirPath,r,"KcPage.vue"),p=b.readFileSync(h).toString("utf8"),y=(()=>{switch(s){case o:return p.replace(`@andreyyolkin/keycloakify-vue/${r}/Template`,"./Template");case n:return p.replace("@andreyyolkin/keycloakify-vue/login/components/UserProfileFormFields","./components/UserProfileFormFields")}g(!1)})();if(p===y){console.log(l.red("Unable to automatically update KcPage.vue, please update it manually"));return}b.writeFileSync(h,Buffer.from(y,"utf8")),console.log(`${l.green("\u2713")} ${l.bold(D(".",ce(process.cwd(),h)))} Updated`);return}console.log(["","You now need to update your page router:","",`${l.bold(D(".",ce(process.cwd(),t.themeSrcDirPath),r,"KcPage.vue"))}:`,l.grey("```"),"// ...","",...(()=>{let h=!1;return[" const page = async () => {"," switch (kcContext.pageId) {","+",` case '${s}':`,` return import('./pages/${d[0]}');`,"+"," //..."," default:"," return import('@andreyyolkin/keycloakify-vue/login/DefaultPage.vue');"," }"," }"].map(p=>(p==="+"&&(h=!h),h||p.startsWith("+")?l.green(p):p.startsWith("-")?l.red(p):l.grey(p)))})(),l.grey("```")].join(`
11
+ `))}var Ne,xt=m(()=>{"use strict";I();Ne=Fe(Oe(),1);w();re();q();U();ke();Re()});var St={};J(St,{command:()=>xr});import*as v from"fs";import{dirname as Pr,join as Me,relative as Ot}from"path";async function xr(e){let{buildContext:t}=e;console.log(l.cyan("Theme type:"));let r=await(async()=>{let d=j.filter(h=>{switch(h){case"account":return t.implementedThemeTypes.account.isImplemented;case"login":return t.implementedThemeTypes.login.isImplemented;case"admin":return!1}g(!1)});if(g(d.length>0,"No theme is implemented in this project"),d.length===1)return d[0];let{value:x}=await(0,Be.default)({values:d}).catch(()=>{process.exit(-1)});return x})();console.log(`\u2192 ${r}`),console.log(l.cyan("Select the page you want to create a Storybook for:"));let{value:o}=await(0,Be.default)({values:(()=>{switch(r){case"login":return[...K];case"account":return[...V];case"admin":return[]}g(!1)})()}).catch(()=>{process.exit(-1)});console.log(`\u2192 ${o}`);let n=B(oe(o.replace(/ftl$/,"")))+"stories.ts",i=Me(t.themeSrcDirPath,r,"pages",n);v.existsSync(i)&&(console.log(`${Ot(process.cwd(),i)} already exists`),process.exit(-1));let s=v.readFileSync(Me(L(),"stories",r,"pages",n)).toString("utf8");e:{if(!await E())break e;s=await le({filePath:i,sourceCode:s})}{let d=Pr(i);v.existsSync(d)||v.mkdirSync(d,{recursive:!0})}v.writeFileSync(i,Buffer.from(s,"utf8")),console.log([`${l.green("\u2713")} ${l.bold(Me(".",Ot(process.cwd(),i)))} copy pasted from the Keycloakify source code into your project`,`You can start storybook with ${l.bold("yarn run storybook")}`].join(`
12
+ `))}var Be,wt=m(()=>{"use strict";I();Be=Fe(Oe(),1);w();re();q();U();ke();Re()});import*as _ from"fs";import{join as Or}from"path";function At(e){let{buildContext:t,accountThemeType:r}=e;switch(t.bundler){case"vite":{let o=Or(t.projectDirPath,"vite.config.ts");if(!_.existsSync(o)){console.log(l.bold(`You must manually set the accountThemeImplementation to "${r}" in your vite config`));break}let n=_.readFileSync(o).toString("utf8"),i=n.replace(/["']?accountThemeImplementation["']?\s*:\s*["']none["']/,`accountThemeImplementation: '${r}'`);if(i===n){console.log(l.yellow(`You must manually set the accountThemeImplementation to "${r}" in your vite.config.ts`));break}_.writeFileSync(o,i)}break;case"webpack":{let o=JSON.parse(_.readFileSync(t.packageJsonFilePath).toString("utf8"));if(typeof o.keycloakify!="object"||o.keycloakify===null||Array.isArray(o.keycloakify)){console.log(l.yellow(`You must manually set the accountThemeImplementation to "${r}" in your package.json keycloakify config`));break}let n=o.keycloakify;n.accountThemeImplementation=r,_.writeFileSync(t.packageJsonFilePath,Buffer.from(JSON.stringify(o,void 0,4),"utf8"))}break}}var kt=m(()=>{"use strict";I();w();g()});import Sr from"child_process";import*as F from"fs";import{join as It,relative as Rt}from"path";async function wr(e){let{buildContext:t}=e,r=It(t.themeSrcDirPath,"account");F.existsSync(r)&&F.readdirSync(r).length>0&&(console.warn(l.red(`There is already a ${Rt(process.cwd(),r)} directory in your project. Aborting.`)),process.exit(-1));e:{let n;try{n=Sr.execSync("git status --porcelain",{cwd:t.projectDirPath}).toString().trim()!==""}catch{break e}if(!n)break e;console.warn([l.red(`Please commit or stash your changes before running this command.
13
+ `),"This command will modify your project's files so it's better to have a clean working directory","so that you can easily see what has been changed and revert if needed."].join(" ")),process.exit(-1)}let o="Multi-Page";F.cpSync(It(L(),"src","bin","initialize-account-theme","boilerplate"),r,{recursive:!0}),At({buildContext:t,accountThemeType:o}),Ce({buildContext:{...t,implementedThemeTypes:{...t.implementedThemeTypes,account:{isImplemented:!0,type:o,hasEarlyColorSchemeScript:!1}}}}),console.log([l.green(`The ${o} account theme has been initialized.`),`Directory created: ${l.bold(Rt(process.cwd(),r))}`].join(`
14
+ `))}var Nt=m(()=>{"use strict";I();U();Te();kt()});var Mt={};J(Mt,{command:()=>wr});var Bt=m(()=>{"use strict";Nt()});q();var{buildContext:ue,commandName:Ar}=ge({apiVersion:"v1"});(async()=>{switch(Ar){case"update-kc-gen":{let{command:e}=await Promise.resolve().then(()=>(Te(),Ge));await e({buildContext:ue});return}case"eject-page":{let{command:e}=await Promise.resolve().then(()=>(xt(),Pt));await e({buildContext:ue});return}case"add-story":{let{command:e}=await Promise.resolve().then(()=>(wt(),St));await e({buildContext:ue});return}case"initialize-account-theme":{let{command:e}=await Promise.resolve().then(()=>(Bt(),Mt));await e({buildContext:ue});return}default:process.exit(he)}})();
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import type { ClassKey } from 'keycloakify/account/lib/kcClsx';
3
+ import DefaultPage from '@andreyyolkin/keycloakify-vue/account/DefaultPage.vue';
4
+ import Template from '@andreyyolkin/keycloakify-vue/account/Template.vue';
5
+ import type { KcContext } from './KcContext';
6
+ import { useI18n } from './i18n';
7
+
8
+ const props = defineProps<{ kcContext: KcContext }>();
9
+
10
+ const { i18n } = useI18n({ kcContext: props.kcContext });
11
+
12
+ const classes = {} satisfies { [key in ClassKey]?: string };
13
+ </script>
14
+
15
+ <template>
16
+ <DefaultPage
17
+ :kcContext="kcContext"
18
+ :i18n="i18n"
19
+ :classes="classes"
20
+ :Template="Template"
21
+ :doUseDefaultCss="true"
22
+ />
23
+ </template>
@@ -0,0 +1,18 @@
1
+ import { createGetKcContextMock } from "keycloakify/account/KcContext";
2
+ import { kcEnvDefaults, themeNames } from "../kc.gen";
3
+ const kcContextExtension = {
4
+ themeName: themeNames[0],
5
+ properties: {
6
+ ...kcEnvDefaults
7
+ }
8
+ };
9
+ const kcContextExtensionPerPage = {};
10
+ const { getKcContextMock } = createGetKcContextMock({
11
+ kcContextExtension,
12
+ kcContextExtensionPerPage,
13
+ overrides: {},
14
+ overridesPerPage: {}
15
+ });
16
+ export {
17
+ getKcContextMock
18
+ };
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue';
3
+ import KcPage from './KcPage.vue';
4
+ import { getKcContextMock, type KcPageStoryProps } from './KcPageStory';
5
+
6
+ const props = defineProps<KcPageStoryProps>();
7
+
8
+ const kcContextMock = computed(() => getKcContextMock({ pageId: props.pageId, overrides: props.kcContext }));
9
+ </script>
10
+
11
+ <template>
12
+ <KcPage :kcContext="kcContextMock" />
13
+ </template>
@@ -0,0 +1,5 @@
1
+ import { i18nBuilder } from "@andreyyolkin/keycloakify-vue/account";
2
+ const { useI18n, ofTypeI18n } = i18nBuilder.withThemeName().build();
3
+ export {
4
+ useI18n
5
+ };
@@ -0,0 +1,167 @@
1
+ <script setup lang="ts">
2
+ import type { KcContext } from 'keycloakify/login/KcContext';
3
+ import { computed, defineAsyncComponent, type Component } from 'vue';
4
+ import DefaultUserProfileFormFields from './components/UserProfileFormFields.vue';
5
+ import type { ClassKey } from './TemplateProps';
6
+ import type { I18n } from './i18n/i18n';
7
+ import NotImplemented from './pages/NotImplemented.vue';
8
+
9
+ const Login = defineAsyncComponent(() => import('./pages/Login.vue'));
10
+ const Register = defineAsyncComponent(() => import('./pages/Register.vue'));
11
+ const Code = defineAsyncComponent(() => import('./pages/Code.vue'));
12
+ const DeleteAccountConfirm = defineAsyncComponent(() => import('./pages/DeleteAccountConfirm.vue'));
13
+ const DeleteCredential = defineAsyncComponent(() => import('./pages/DeleteCredential.vue'));
14
+ const Error = defineAsyncComponent(() => import('./pages/Error.vue'));
15
+ const FrontchannelLogout = defineAsyncComponent(() => import('./pages/FrontchannelLogout.vue'));
16
+ const IdpReviewUserProfile = defineAsyncComponent(() => import('./pages/IdpReviewUserProfile.vue'));
17
+ const Info = defineAsyncComponent(() => import('./pages/Info.vue'));
18
+ const LinkIdpAction = defineAsyncComponent(() => import('./pages/LinkIdpAction.vue'));
19
+ const LoginIdpLinkConfirm = defineAsyncComponent(() => import('./pages/LoginIdpLinkConfirm.vue'));
20
+ const LoginIdpLinkConfirmOverride = defineAsyncComponent(() => import('./pages/LoginIdpLinkConfirmOverride.vue'));
21
+ const LoginIdpLinkEmail = defineAsyncComponent(() => import('./pages/LoginIdpLinkEmail.vue'));
22
+ const LoginOauth2DeviceVerifyUserCode = defineAsyncComponent(
23
+ () => import('./pages/LoginOauth2DeviceVerifyUserCode.vue'),
24
+ );
25
+ const LoginOauthGrant = defineAsyncComponent(() => import('./pages/LoginOauthGrant.vue'));
26
+ const LoginPageExpired = defineAsyncComponent(() => import('./pages/LoginPageExpired.vue'));
27
+ const LoginUpdateProfile = defineAsyncComponent(() => import('./pages/LoginUpdateProfile.vue'));
28
+ const LoginVerifyEmail = defineAsyncComponent(() => import('./pages/LoginVerifyEmail.vue'));
29
+ const LoginX509Info = defineAsyncComponent(() => import('./pages/LoginX509Info.vue'));
30
+ const LogoutConfirm = defineAsyncComponent(() => import('./pages/LogoutConfirm.vue'));
31
+ const SamlPostForm = defineAsyncComponent(() => import('./pages/SamlPostForm.vue'));
32
+ const SelectAuthenticator = defineAsyncComponent(() => import('./pages/SelectAuthenticator.vue'));
33
+ const SelectOrganization = defineAsyncComponent(() => import('./pages/SelectOrganization.vue'));
34
+ const Terms = defineAsyncComponent(() => import('./pages/Terms.vue'));
35
+ const UpdateEmail = defineAsyncComponent(() => import('./pages/UpdateEmail.vue'));
36
+ const LoginResetOtp = defineAsyncComponent(() => import('./pages/LoginResetOtp.vue'));
37
+ const LoginRecoveryAuthnCodeInput = defineAsyncComponent(() => import('./pages/LoginRecoveryAuthnCodeInput.vue'));
38
+ const LoginOtp = defineAsyncComponent(() => import('./pages/LoginOtp.vue'));
39
+ const LoginRecoveryAuthnCodeConfig = defineAsyncComponent(() => import('./pages/LoginRecoveryAuthnCodeConfig.vue'));
40
+ const LoginResetPassword = defineAsyncComponent(() => import('./pages/LoginResetPassword.vue'));
41
+ const LoginUpdatePassword = defineAsyncComponent(() => import('./pages/LoginUpdatePassword.vue'));
42
+ const LoginPassword = defineAsyncComponent(() => import('./pages/LoginPassword.vue'));
43
+ const LoginConfigTotp = defineAsyncComponent(() => import('./pages/LoginConfigTotp.vue'));
44
+ const LoginUsername = defineAsyncComponent(() => import('./pages/LoginUsername.vue'));
45
+ const WebauthnError = defineAsyncComponent(() => import('./pages/WebauthnError.vue'));
46
+ const WebauthnRegister = defineAsyncComponent(() => import('./pages/WebauthnRegister.vue'));
47
+ const WebauthnAuthenticate = defineAsyncComponent(() => import('./pages/WebauthnAuthenticate.vue'));
48
+ const LoginPasskeysConditionalAuthenticate = defineAsyncComponent(
49
+ () => import('./pages/LoginPasskeysConditionalAuthenticate.vue'),
50
+ );
51
+
52
+ const props = withDefaults(
53
+ defineProps<{
54
+ kcContext: KcContext;
55
+ i18n: I18n;
56
+ classes?: Partial<Record<ClassKey, string>>;
57
+ Template: Component;
58
+ UserProfileFormFields?: Component;
59
+ doUseDefaultCss: boolean;
60
+ doMakeUserConfirmPassword?: boolean;
61
+ }>(),
62
+ {
63
+ classes: undefined,
64
+ UserProfileFormFields: undefined,
65
+ doMakeUserConfirmPassword: true,
66
+ },
67
+ );
68
+
69
+ const userProfileFormFields = computed<Component>(() => props.UserProfileFormFields ?? DefaultUserProfileFormFields);
70
+
71
+ const pageComponent = computed<Component>(() => {
72
+ switch (props.kcContext.pageId) {
73
+ case 'login.ftl':
74
+ return Login;
75
+ case 'register.ftl':
76
+ return Register;
77
+ case 'code.ftl':
78
+ return Code;
79
+ case 'delete-account-confirm.ftl':
80
+ return DeleteAccountConfirm;
81
+ case 'delete-credential.ftl':
82
+ return DeleteCredential;
83
+ case 'error.ftl':
84
+ return Error;
85
+ case 'frontchannel-logout.ftl':
86
+ return FrontchannelLogout;
87
+ case 'idp-review-user-profile.ftl':
88
+ return IdpReviewUserProfile;
89
+ case 'info.ftl':
90
+ return Info;
91
+ case 'link-idp-action.ftl':
92
+ return LinkIdpAction;
93
+ case 'login-idp-link-confirm.ftl':
94
+ return LoginIdpLinkConfirm;
95
+ case 'login-idp-link-confirm-override.ftl':
96
+ return LoginIdpLinkConfirmOverride;
97
+ case 'login-idp-link-email.ftl':
98
+ return LoginIdpLinkEmail;
99
+ case 'login-oauth2-device-verify-user-code.ftl':
100
+ return LoginOauth2DeviceVerifyUserCode;
101
+ case 'login-oauth-grant.ftl':
102
+ return LoginOauthGrant;
103
+ case 'login-page-expired.ftl':
104
+ return LoginPageExpired;
105
+ case 'login-update-profile.ftl':
106
+ return LoginUpdateProfile;
107
+ case 'login-verify-email.ftl':
108
+ return LoginVerifyEmail;
109
+ case 'login-x509-info.ftl':
110
+ return LoginX509Info;
111
+ case 'logout-confirm.ftl':
112
+ return LogoutConfirm;
113
+ case 'saml-post-form.ftl':
114
+ return SamlPostForm;
115
+ case 'select-authenticator.ftl':
116
+ return SelectAuthenticator;
117
+ case 'select-organization.ftl':
118
+ return SelectOrganization;
119
+ case 'terms.ftl':
120
+ return Terms;
121
+ case 'update-email.ftl':
122
+ return UpdateEmail;
123
+ case 'login-reset-otp.ftl':
124
+ return LoginResetOtp;
125
+ case 'login-recovery-authn-code-input.ftl':
126
+ return LoginRecoveryAuthnCodeInput;
127
+ case 'login-otp.ftl':
128
+ return LoginOtp;
129
+ case 'login-recovery-authn-code-config.ftl':
130
+ return LoginRecoveryAuthnCodeConfig;
131
+ case 'login-reset-password.ftl':
132
+ return LoginResetPassword;
133
+ case 'login-update-password.ftl':
134
+ return LoginUpdatePassword;
135
+ case 'login-password.ftl':
136
+ return LoginPassword;
137
+ case 'login-config-totp.ftl':
138
+ return LoginConfigTotp;
139
+ case 'login-username.ftl':
140
+ return LoginUsername;
141
+ case 'webauthn-error.ftl':
142
+ return WebauthnError;
143
+ case 'webauthn-register.ftl':
144
+ return WebauthnRegister;
145
+ case 'webauthn-authenticate.ftl':
146
+ return WebauthnAuthenticate;
147
+ case 'login-passkeys-conditional-authenticate.ftl':
148
+ return LoginPasskeysConditionalAuthenticate;
149
+ default:
150
+ return NotImplemented;
151
+ }
152
+ });
153
+ </script>
154
+
155
+ <template>
156
+ <component
157
+ :is="pageComponent"
158
+ :kcContext="kcContext"
159
+ :i18n="i18n"
160
+ :classes="classes"
161
+ :Template="Template"
162
+ :UserProfileFormFields="userProfileFormFields"
163
+ :doUseDefaultCss="doUseDefaultCss"
164
+ :doMakeUserConfirmPassword="doMakeUserConfirmPassword"
165
+ :pageId="kcContext.pageId"
166
+ />
167
+ </template>
@@ -0,0 +1,20 @@
1
+ import type { KcContext } from 'keycloakify/login/KcContext';
2
+ import { type Component } from 'vue';
3
+ import type { ClassKey } from './TemplateProps';
4
+ import type { I18n } from './i18n/i18n';
5
+ type __VLS_Props = {
6
+ kcContext: KcContext;
7
+ i18n: I18n;
8
+ classes?: Partial<Record<ClassKey, string>>;
9
+ Template: Component;
10
+ UserProfileFormFields?: Component;
11
+ doUseDefaultCss: boolean;
12
+ doMakeUserConfirmPassword?: boolean;
13
+ };
14
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
15
+ classes: Partial<Record<ClassKey, string>>;
16
+ doMakeUserConfirmPassword: boolean;
17
+ UserProfileFormFields: Component;
18
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
@@ -0,0 +1,18 @@
1
+ import { type Ref } from 'vue';
2
+ export type KcContextLike = {
3
+ url: {
4
+ resourcesCommonPath: string;
5
+ resourcesPath: string;
6
+ ssoLoginInOtherTabsUrl: string;
7
+ };
8
+ scripts?: string[];
9
+ authenticationSession?: {
10
+ authSessionIdHash: string;
11
+ };
12
+ };
13
+ export declare function useInitialize(params: {
14
+ kcContext: KcContextLike;
15
+ doUseDefaultCss: boolean;
16
+ }): {
17
+ isReadyToRender: Ref<boolean>;
18
+ };
@@ -0,0 +1,49 @@
1
+ import { assert } from "keycloakify/tools/assert";
2
+ import { watch } from "vue";
3
+ import { useInsertLinkTags } from "../tools/useInsertLinkTags";
4
+ import { useInsertScriptTags } from "../tools/useInsertScriptTags";
5
+ assert();
6
+ assert();
7
+ function useInitialize(params) {
8
+ const { kcContext, doUseDefaultCss } = params;
9
+ const { url, scripts } = kcContext;
10
+ const { areAllStyleSheetsLoaded } = useInsertLinkTags({
11
+ componentOrHookName: "Template",
12
+ hrefs: !doUseDefaultCss ? [] : [
13
+ `${url.resourcesCommonPath}/node_modules/@patternfly/patternfly/patternfly.min.css`,
14
+ `${url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly.min.css`,
15
+ `${url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly-additions.min.css`,
16
+ `${url.resourcesCommonPath}/lib/pficon/pficon.css`,
17
+ `${url.resourcesPath}/css/login.css`
18
+ ]
19
+ });
20
+ const { insertScriptTags } = useInsertScriptTags({
21
+ componentOrHookName: "Template",
22
+ scriptTags: [
23
+ { type: "module", src: `${url.resourcesPath}/js/menu-button-links.js` },
24
+ ...scripts === void 0 ? [] : scripts.map((src) => ({ type: "text/javascript", src })),
25
+ {
26
+ type: "module",
27
+ textContent: [
28
+ `import { startSessionPolling, checkAuthSession } from "${url.resourcesPath}/js/authChecker.js";`,
29
+ ``,
30
+ `startSessionPolling("${kcContext.url.ssoLoginInOtherTabsUrl}");`,
31
+ kcContext.authenticationSession === void 0 ? "" : `checkAuthSession("${kcContext.authenticationSession.authSessionIdHash}");`
32
+ ].join("\n")
33
+ }
34
+ ]
35
+ });
36
+ watch(
37
+ areAllStyleSheetsLoaded,
38
+ (isReadyToRender) => {
39
+ if (isReadyToRender) {
40
+ insertScriptTags();
41
+ }
42
+ },
43
+ { immediate: true }
44
+ );
45
+ return { isReadyToRender: areAllStyleSheetsLoaded };
46
+ }
47
+ export {
48
+ useInitialize
49
+ };
@@ -0,0 +1,239 @@
1
+ <script setup lang="ts">
2
+ import { kcSanitize } from 'keycloakify/lib/kcSanitize';
3
+ import { getKcClsx } from 'keycloakify/login/lib/kcClsx';
4
+ import { clsx } from 'keycloakify/tools/clsx';
5
+ import { computed, h, onMounted, useSlots } from 'vue';
6
+ import type { KcContext } from 'keycloakify/login/KcContext';
7
+ import type { I18n } from './i18n/i18n';
8
+ import type { TemplateProps } from './TemplateProps';
9
+ import { useInitialize } from './Template.useInitialize';
10
+ import { useSetClassName } from '../tools/useSetClassName';
11
+
12
+ const props = withDefaults(defineProps<TemplateProps<KcContext, I18n>>(), {
13
+ displayInfo: false,
14
+ displayMessage: true,
15
+ displayRequiredFields: false,
16
+ showAnotherWayIfPresent: true,
17
+ });
18
+
19
+ const { kcClsx } = getKcClsx({
20
+ doUseDefaultCss: props.doUseDefaultCss,
21
+ classes: props.classes,
22
+ });
23
+
24
+ const kcContext = props.kcContext;
25
+ const { realm, auth, url, message, isAppInitiatedAction } = kcContext;
26
+
27
+ const slots = useSlots();
28
+
29
+ onMounted(() => {
30
+ document.title = props.documentTitle ?? props.i18n.msgStr('loginTitle', kcContext.realm.displayName);
31
+ });
32
+
33
+ useSetClassName({ qualifiedName: 'html', className: kcClsx('kcHtmlClass') });
34
+ useSetClassName({
35
+ qualifiedName: 'body',
36
+ className: props.bodyClassName ?? kcClsx('kcBodyClass'),
37
+ });
38
+
39
+ const { isReadyToRender } = useInitialize({
40
+ kcContext,
41
+ doUseDefaultCss: props.doUseDefaultCss,
42
+ });
43
+
44
+ const showUsernameNode = computed(() => auth !== undefined && auth.showUsername && !auth.showResetCredentials);
45
+
46
+ const headerSection = () => {
47
+ if (!showUsernameNode.value) {
48
+ return h('h1', { id: 'kc-page-title' }, slots.header?.());
49
+ }
50
+ return h('div', { id: 'kc-username', class: kcClsx('kcFormGroupClass') }, [
51
+ h('label', { id: 'kc-attempted-username' }, auth!.attemptedUsername),
52
+ h(
53
+ 'a',
54
+ {
55
+ id: 'reset-login',
56
+ href: url.loginRestartFlowUrl,
57
+ 'aria-label': props.i18n.msgStr('restartLoginTooltip'),
58
+ },
59
+ h('div', { class: 'kc-login-tooltip' }, [
60
+ h('i', { class: kcClsx('kcResetFlowIcon') }),
61
+ h('span', { class: 'kc-tooltip-text' }, props.i18n.msgStr('restartLoginTooltip')),
62
+ ]),
63
+ ),
64
+ ]);
65
+ };
66
+
67
+ function onTryAnotherWay() {
68
+ (document.getElementById('kc-select-try-another-way-form') as HTMLFormElement).requestSubmit();
69
+ }
70
+ </script>
71
+
72
+ <template>
73
+ <div
74
+ v-if="isReadyToRender"
75
+ :class="kcClsx('kcLoginClass')"
76
+ >
77
+ <div
78
+ id="kc-header"
79
+ :class="kcClsx('kcHeaderClass')"
80
+ >
81
+ <div
82
+ id="kc-header-wrapper"
83
+ :class="kcClsx('kcHeaderWrapperClass')"
84
+ >
85
+ {{ i18n.msgStr('loginTitleHtml', realm.displayNameHtml) }}
86
+ </div>
87
+ </div>
88
+
89
+ <div :class="kcClsx('kcFormCardClass')">
90
+ <header :class="kcClsx('kcFormHeaderClass')">
91
+ <div
92
+ v-if="i18n.enabledLanguages.length > 1"
93
+ :class="kcClsx('kcLocaleMainClass')"
94
+ id="kc-locale"
95
+ >
96
+ <div
97
+ id="kc-locale-wrapper"
98
+ :class="kcClsx('kcLocaleWrapperClass')"
99
+ >
100
+ <div
101
+ id="kc-locale-dropdown"
102
+ :class="clsx('menu-button-links', kcClsx('kcLocaleDropDownClass'))"
103
+ >
104
+ <button
105
+ :tabindex="1"
106
+ id="kc-current-locale-link"
107
+ :aria-label="i18n.msgStr('languages')"
108
+ aria-haspopup="true"
109
+ aria-expanded="false"
110
+ aria-controls="language-switch1"
111
+ >
112
+ {{ i18n.currentLanguage.label }}
113
+ </button>
114
+ <ul
115
+ role="menu"
116
+ :tabindex="-1"
117
+ aria-labelledby="kc-current-locale-link"
118
+ aria-activedescendant=""
119
+ id="language-switch1"
120
+ :class="kcClsx('kcLocaleListClass')"
121
+ >
122
+ <li
123
+ v-for="(enabledLanguage, i) in i18n.enabledLanguages"
124
+ :key="enabledLanguage.languageTag"
125
+ :class="kcClsx('kcLocaleListItemClass')"
126
+ role="none"
127
+ >
128
+ <a
129
+ role="menuitem"
130
+ :id="`language-${i + 1}`"
131
+ :class="kcClsx('kcLocaleItemClass')"
132
+ :href="enabledLanguage.href"
133
+ >
134
+ {{ enabledLanguage.label }}
135
+ </a>
136
+ </li>
137
+ </ul>
138
+ </div>
139
+ </div>
140
+ </div>
141
+
142
+ <template v-if="displayRequiredFields">
143
+ <div :class="kcClsx('kcContentWrapperClass')">
144
+ <div :class="clsx(kcClsx('kcLabelWrapperClass'), 'subtitle')">
145
+ <span class="subtitle">
146
+ <span class="required">*</span>
147
+ {{ i18n.msgStr('requiredFields') }}
148
+ </span>
149
+ </div>
150
+ <div class="col-md-10">
151
+ <component :is="headerSection" />
152
+ </div>
153
+ </div>
154
+ </template>
155
+ <component
156
+ v-else
157
+ :is="headerSection"
158
+ />
159
+ </header>
160
+
161
+ <div id="kc-content">
162
+ <div id="kc-content-wrapper">
163
+ <div
164
+ v-if="displayMessage && message !== undefined && (message.type !== 'warning' || !isAppInitiatedAction)"
165
+ :class="
166
+ clsx(
167
+ `alert-${message.type}`,
168
+ kcClsx('kcAlertClass'),
169
+ `pf-m-${message?.type === 'error' ? 'danger' : message.type}`,
170
+ )
171
+ "
172
+ >
173
+ <div class="pf-c-alert__icon">
174
+ <span
175
+ v-if="message.type === 'success'"
176
+ :class="kcClsx('kcFeedbackSuccessIcon')"
177
+ ></span>
178
+ <span
179
+ v-else-if="message.type === 'warning'"
180
+ :class="kcClsx('kcFeedbackWarningIcon')"
181
+ ></span>
182
+ <span
183
+ v-else-if="message.type === 'error'"
184
+ :class="kcClsx('kcFeedbackErrorIcon')"
185
+ ></span>
186
+ <span
187
+ v-else-if="message.type === 'info'"
188
+ :class="kcClsx('kcFeedbackInfoIcon')"
189
+ ></span>
190
+ </div>
191
+ <span
192
+ :class="kcClsx('kcAlertTitleClass')"
193
+ v-html="kcSanitize(message.summary)"
194
+ ></span>
195
+ </div>
196
+
197
+ <slot />
198
+
199
+ <form
200
+ v-if="auth !== undefined && auth.showTryAnotherWayLink"
201
+ id="kc-select-try-another-way-form"
202
+ :action="url.loginAction"
203
+ method="post"
204
+ >
205
+ <div :class="kcClsx('kcFormGroupClass')">
206
+ <input
207
+ type="hidden"
208
+ name="tryAnotherWay"
209
+ value="on"
210
+ />
211
+ <a
212
+ href="#"
213
+ id="try-another-way"
214
+ @click.prevent="onTryAnotherWay"
215
+ >
216
+ {{ i18n.msgStr('doTryAnotherWay') }}
217
+ </a>
218
+ </div>
219
+ </form>
220
+
221
+ <slot name="socialProviders" />
222
+
223
+ <div
224
+ v-if="displayInfo"
225
+ id="kc-info"
226
+ :class="kcClsx('kcSignUpClass')"
227
+ >
228
+ <div
229
+ id="kc-info-wrapper"
230
+ :class="kcClsx('kcInfoAreaWrapperClass')"
231
+ >
232
+ <slot name="info" />
233
+ </div>
234
+ </div>
235
+ </div>
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </template>