@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.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/keycloakify-vue/account/DefaultPage.vue +55 -0
- package/keycloakify-vue/account/DefaultPage.vue.d.ts +14 -0
- package/keycloakify-vue/account/KcContext/index.d.ts +1 -0
- package/keycloakify-vue/account/KcContext/index.js +0 -0
- package/keycloakify-vue/account/Template.useInitialize.d.ts +13 -0
- package/keycloakify-vue/account/Template.useInitialize.js +20 -0
- package/keycloakify-vue/account/Template.vue +178 -0
- package/keycloakify-vue/account/Template.vue.d.ts +17 -0
- package/keycloakify-vue/account/TemplateProps.d.ts +9 -0
- package/keycloakify-vue/account/TemplateProps.js +0 -0
- package/keycloakify-vue/account/i18n/i18n.d.ts +11 -0
- package/keycloakify-vue/account/i18n/i18n.js +0 -0
- package/keycloakify-vue/account/i18n/i18nBuilder.d.ts +18 -0
- package/keycloakify-vue/account/i18n/i18nBuilder.js +29 -0
- package/keycloakify-vue/account/i18n/index.d.ts +1 -0
- package/keycloakify-vue/account/i18n/index.js +1 -0
- package/keycloakify-vue/account/i18n/useI18n.d.ts +28 -0
- package/keycloakify-vue/account/i18n/useI18n.js +67 -0
- package/keycloakify-vue/account/index.d.ts +4 -0
- package/keycloakify-vue/account/index.js +8 -0
- package/keycloakify-vue/account/pages/Account.vue +182 -0
- package/keycloakify-vue/account/pages/Account.vue.d.ts +9 -0
- package/keycloakify-vue/account/pages/Applications.vue +192 -0
- package/keycloakify-vue/account/pages/Applications.vue.d.ts +9 -0
- package/keycloakify-vue/account/pages/FederatedIdentity.vue +123 -0
- package/keycloakify-vue/account/pages/FederatedIdentity.vue.d.ts +9 -0
- package/keycloakify-vue/account/pages/Log.vue +64 -0
- package/keycloakify-vue/account/pages/Log.vue.d.ts +9 -0
- package/keycloakify-vue/account/pages/NotImplemented.vue +24 -0
- package/keycloakify-vue/account/pages/NotImplemented.vue.d.ts +6 -0
- package/keycloakify-vue/account/pages/PageProps.d.ts +9 -0
- package/keycloakify-vue/account/pages/PageProps.js +0 -0
- package/keycloakify-vue/account/pages/Password.vue +247 -0
- package/keycloakify-vue/account/pages/Password.vue.d.ts +9 -0
- package/keycloakify-vue/account/pages/Sessions.vue +84 -0
- package/keycloakify-vue/account/pages/Sessions.vue.d.ts +9 -0
- package/keycloakify-vue/account/pages/Totp.vue +308 -0
- package/keycloakify-vue/account/pages/Totp.vue.d.ts +9 -0
- package/keycloakify-vue/bin/index.js +14 -0
- package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcContext.js +0 -0
- package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcPage.vue +23 -0
- package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcPageStory.js +18 -0
- package/keycloakify-vue/bin/initialize-account-theme/boilerplate/KcPageStory.vue +13 -0
- package/keycloakify-vue/bin/initialize-account-theme/boilerplate/i18n.js +5 -0
- package/keycloakify-vue/login/DefaultPage.vue +167 -0
- package/keycloakify-vue/login/DefaultPage.vue.d.ts +20 -0
- package/keycloakify-vue/login/Template.useInitialize.d.ts +18 -0
- package/keycloakify-vue/login/Template.useInitialize.js +49 -0
- package/keycloakify-vue/login/Template.vue +239 -0
- package/keycloakify-vue/login/Template.vue.d.ts +26 -0
- package/keycloakify-vue/login/TemplateProps.d.ts +14 -0
- package/keycloakify-vue/login/TemplateProps.js +0 -0
- package/keycloakify-vue/login/components/AddRemoveButtonsMultiValuedAttribute.vue +59 -0
- package/keycloakify-vue/login/components/AddRemoveButtonsMultiValuedAttribute.vue.d.ts +15 -0
- package/keycloakify-vue/login/components/FieldErrors.vue +35 -0
- package/keycloakify-vue/login/components/FieldErrors.vue.d.ts +14 -0
- package/keycloakify-vue/login/components/GroupLabel.vue +68 -0
- package/keycloakify-vue/login/components/GroupLabel.vue.d.ts +14 -0
- package/keycloakify-vue/login/components/InputFieldByType.vue +94 -0
- package/keycloakify-vue/login/components/InputFieldByType.vue.d.ts +4 -0
- package/keycloakify-vue/login/components/InputFieldByTypeProps.d.ts +12 -0
- package/keycloakify-vue/login/components/InputFieldByTypeProps.js +0 -0
- package/keycloakify-vue/login/components/InputTag.vue +105 -0
- package/keycloakify-vue/login/components/InputTag.vue.d.ts +7 -0
- package/keycloakify-vue/login/components/InputTagSelects.vue +108 -0
- package/keycloakify-vue/login/components/InputTagSelects.vue.d.ts +4 -0
- package/keycloakify-vue/login/components/LogoutOtherSessions.vue +27 -0
- package/keycloakify-vue/login/components/LogoutOtherSessions.vue.d.ts +9 -0
- package/keycloakify-vue/login/components/PasswordWrapper.vue +42 -0
- package/keycloakify-vue/login/components/PasswordWrapper.vue.d.ts +20 -0
- package/keycloakify-vue/login/components/SelectTag.vue +74 -0
- package/keycloakify-vue/login/components/SelectTag.vue.d.ts +4 -0
- package/keycloakify-vue/login/components/TermsAcceptance.vue +59 -0
- package/keycloakify-vue/login/components/TermsAcceptance.vue.d.ts +13 -0
- package/keycloakify-vue/login/components/TextareaTag.vue +47 -0
- package/keycloakify-vue/login/components/TextareaTag.vue.d.ts +4 -0
- package/keycloakify-vue/login/components/UserProfileFormFields.vue +119 -0
- package/keycloakify-vue/login/components/UserProfileFormFields.vue.d.ts +33 -0
- package/keycloakify-vue/login/components/UserProfileFormFieldsProps.d.ts +22 -0
- package/keycloakify-vue/login/components/UserProfileFormFieldsProps.js +0 -0
- package/keycloakify-vue/login/components/inputLabel.d.ts +4 -0
- package/keycloakify-vue/login/components/inputLabel.js +15 -0
- package/keycloakify-vue/login/i18n/i18n.d.ts +11 -0
- package/keycloakify-vue/login/i18n/i18n.js +0 -0
- package/keycloakify-vue/login/i18n/i18nBuilder.d.ts +18 -0
- package/keycloakify-vue/login/i18n/i18nBuilder.js +29 -0
- package/keycloakify-vue/login/i18n/index.d.ts +1 -0
- package/keycloakify-vue/login/i18n/index.js +1 -0
- package/keycloakify-vue/login/i18n/useI18n.d.ts +28 -0
- package/keycloakify-vue/login/i18n/useI18n.js +67 -0
- package/keycloakify-vue/login/index.d.ts +5 -0
- package/keycloakify-vue/login/index.js +10 -0
- package/keycloakify-vue/login/lib/useUserProfileForm.d.ts +53 -0
- package/keycloakify-vue/login/lib/useUserProfileForm.js +50 -0
- package/keycloakify-vue/login/pages/Code.vue +54 -0
- package/keycloakify-vue/login/pages/Code.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/DeleteAccountConfirm.vue +69 -0
- package/keycloakify-vue/login/pages/DeleteAccountConfirm.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/DeleteCredential.vue +56 -0
- package/keycloakify-vue/login/pages/DeleteCredential.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/Error.vue +41 -0
- package/keycloakify-vue/login/pages/Error.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/FrontchannelLogout.vue +67 -0
- package/keycloakify-vue/login/pages/FrontchannelLogout.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/IdpReviewUserProfile.vue +77 -0
- package/keycloakify-vue/login/pages/IdpReviewUserProfile.vue.d.ts +14 -0
- package/keycloakify-vue/login/pages/Info.vue +61 -0
- package/keycloakify-vue/login/pages/Info.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LinkIdpAction.vue +66 -0
- package/keycloakify-vue/login/pages/LinkIdpAction.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/Login.vue +230 -0
- package/keycloakify-vue/login/pages/Login.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginConfigTotp.vue +233 -0
- package/keycloakify-vue/login/pages/LoginConfigTotp.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginIdpLinkConfirm.vue +57 -0
- package/keycloakify-vue/login/pages/LoginIdpLinkConfirm.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginIdpLinkConfirmOverride.vue +56 -0
- package/keycloakify-vue/login/pages/LoginIdpLinkConfirmOverride.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginIdpLinkEmail.vue +52 -0
- package/keycloakify-vue/login/pages/LoginIdpLinkEmail.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginOauth2DeviceVerifyUserCode.vue +82 -0
- package/keycloakify-vue/login/pages/LoginOauth2DeviceVerifyUserCode.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginOauthGrant.vue +131 -0
- package/keycloakify-vue/login/pages/LoginOauthGrant.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginOtp.vue +135 -0
- package/keycloakify-vue/login/pages/LoginOtp.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginPageExpired.vue +44 -0
- package/keycloakify-vue/login/pages/LoginPageExpired.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.useScript.d.ts +21 -0
- package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.useScript.js +74 -0
- package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.vue +255 -0
- package/keycloakify-vue/login/pages/LoginPasskeysConditionalAuthenticate.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginPassword.useScript.d.ts +23 -0
- package/keycloakify-vue/login/pages/LoginPassword.useScript.js +64 -0
- package/keycloakify-vue/login/pages/LoginPassword.vue +191 -0
- package/keycloakify-vue/login/pages/LoginPassword.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.useScript.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.useScript.js +139 -0
- package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.vue +183 -0
- package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeConfig.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeInput.vue +90 -0
- package/keycloakify-vue/login/pages/LoginRecoveryAuthnCodeInput.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginResetOtp.vue +88 -0
- package/keycloakify-vue/login/pages/LoginResetOtp.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginResetPassword.vue +114 -0
- package/keycloakify-vue/login/pages/LoginResetPassword.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginUpdatePassword.vue +145 -0
- package/keycloakify-vue/login/pages/LoginUpdatePassword.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginUpdateProfile.vue +94 -0
- package/keycloakify-vue/login/pages/LoginUpdateProfile.vue.d.ts +14 -0
- package/keycloakify-vue/login/pages/LoginUsername.useScript.d.ts +23 -0
- package/keycloakify-vue/login/pages/LoginUsername.useScript.js +64 -0
- package/keycloakify-vue/login/pages/LoginUsername.vue +263 -0
- package/keycloakify-vue/login/pages/LoginUsername.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginVerifyEmail.vue +39 -0
- package/keycloakify-vue/login/pages/LoginVerifyEmail.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LoginX509Info.vue +120 -0
- package/keycloakify-vue/login/pages/LoginX509Info.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/LogoutConfirm.vue +73 -0
- package/keycloakify-vue/login/pages/LogoutConfirm.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/NotImplemented.vue +12 -0
- package/keycloakify-vue/login/pages/NotImplemented.vue.d.ts +6 -0
- package/keycloakify-vue/login/pages/PageProps.d.ts +9 -0
- package/keycloakify-vue/login/pages/PageProps.js +0 -0
- package/keycloakify-vue/login/pages/Register.vue +158 -0
- package/keycloakify-vue/login/pages/Register.vue.d.ts +14 -0
- package/keycloakify-vue/login/pages/SamlPostForm.vue +75 -0
- package/keycloakify-vue/login/pages/SamlPostForm.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/SelectAuthenticator.vue +65 -0
- package/keycloakify-vue/login/pages/SelectAuthenticator.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/SelectOrganization.vue +89 -0
- package/keycloakify-vue/login/pages/SelectOrganization.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/Terms.vue +56 -0
- package/keycloakify-vue/login/pages/Terms.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/UpdateEmail.vue +100 -0
- package/keycloakify-vue/login/pages/UpdateEmail.vue.d.ts +14 -0
- package/keycloakify-vue/login/pages/WebauthnAuthenticate.useScript.d.ts +22 -0
- package/keycloakify-vue/login/pages/WebauthnAuthenticate.useScript.js +53 -0
- package/keycloakify-vue/login/pages/WebauthnAuthenticate.vue +186 -0
- package/keycloakify-vue/login/pages/WebauthnAuthenticate.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/WebauthnError.vue +84 -0
- package/keycloakify-vue/login/pages/WebauthnError.vue.d.ts +9 -0
- package/keycloakify-vue/login/pages/WebauthnRegister.useScript.d.ts +28 -0
- package/keycloakify-vue/login/pages/WebauthnRegister.useScript.js +75 -0
- package/keycloakify-vue/login/pages/WebauthnRegister.vue +105 -0
- package/keycloakify-vue/login/pages/WebauthnRegister.vue.d.ts +9 -0
- package/keycloakify-vue/tools/useInsertLinkTags.d.ts +12 -0
- package/keycloakify-vue/tools/useInsertLinkTags.js +47 -0
- package/keycloakify-vue/tools/useInsertScriptTags.d.ts +19 -0
- package/keycloakify-vue/tools/useInsertScriptTags.js +56 -0
- package/keycloakify-vue/tools/useSetClassName.d.ts +4 -0
- package/keycloakify-vue/tools/useSetClassName.js +16 -0
- package/package.json +553 -0
- package/src/account/DefaultPage.vue +55 -0
- package/src/account/KcContext/index.ts +1 -0
- package/src/account/Template.useInitialize.ts +34 -0
- package/src/account/Template.vue +178 -0
- package/src/account/TemplateProps.ts +11 -0
- package/src/account/i18n/i18n.ts +16 -0
- package/src/account/i18n/i18nBuilder.ts +100 -0
- package/src/account/i18n/index.ts +1 -0
- package/src/account/i18n/useI18n.ts +128 -0
- package/src/account/index.ts +4 -0
- package/src/account/pages/Account.vue +182 -0
- package/src/account/pages/Applications.vue +192 -0
- package/src/account/pages/FederatedIdentity.vue +123 -0
- package/src/account/pages/Log.vue +64 -0
- package/src/account/pages/NotImplemented.vue +24 -0
- package/src/account/pages/PageProps.ts +10 -0
- package/src/account/pages/Password.vue +247 -0
- package/src/account/pages/Sessions.vue +84 -0
- package/src/account/pages/Totp.vue +308 -0
- package/src/bin/initialize-account-theme/boilerplate/KcContext.ts +11 -0
- package/src/bin/initialize-account-theme/boilerplate/KcPage.vue +23 -0
- package/src/bin/initialize-account-theme/boilerplate/KcPageStory.ts +22 -0
- package/src/bin/initialize-account-theme/boilerplate/KcPageStory.vue +13 -0
- package/src/bin/initialize-account-theme/boilerplate/i18n.ts +8 -0
- package/src/login/DefaultPage.vue +167 -0
- package/src/login/Template.useInitialize.ts +71 -0
- package/src/login/Template.vue +239 -0
- package/src/login/TemplateProps.ts +17 -0
- package/src/login/components/AddRemoveButtonsMultiValuedAttribute.vue +59 -0
- package/src/login/components/FieldErrors.vue +35 -0
- package/src/login/components/GroupLabel.vue +68 -0
- package/src/login/components/InputFieldByType.vue +94 -0
- package/src/login/components/InputFieldByTypeProps.ts +13 -0
- package/src/login/components/InputTag.vue +105 -0
- package/src/login/components/InputTagSelects.vue +108 -0
- package/src/login/components/LogoutOtherSessions.vue +27 -0
- package/src/login/components/PasswordWrapper.vue +42 -0
- package/src/login/components/SelectTag.vue +74 -0
- package/src/login/components/TermsAcceptance.vue +59 -0
- package/src/login/components/TextareaTag.vue +47 -0
- package/src/login/components/UserProfileFormFields.vue +119 -0
- package/src/login/components/UserProfileFormFieldsProps.ts +22 -0
- package/src/login/components/inputLabel.ts +18 -0
- package/src/login/i18n/i18n.ts +16 -0
- package/src/login/i18n/i18nBuilder.ts +100 -0
- package/src/login/i18n/index.ts +1 -0
- package/src/login/i18n/useI18n.ts +128 -0
- package/src/login/index.ts +5 -0
- package/src/login/lib/useUserProfileForm.ts +121 -0
- package/src/login/pages/Code.vue +54 -0
- package/src/login/pages/DeleteAccountConfirm.vue +69 -0
- package/src/login/pages/DeleteCredential.vue +56 -0
- package/src/login/pages/Error.vue +41 -0
- package/src/login/pages/FrontchannelLogout.vue +67 -0
- package/src/login/pages/IdpReviewUserProfile.vue +77 -0
- package/src/login/pages/Info.vue +61 -0
- package/src/login/pages/LinkIdpAction.vue +66 -0
- package/src/login/pages/Login.vue +230 -0
- package/src/login/pages/LoginConfigTotp.vue +233 -0
- package/src/login/pages/LoginIdpLinkConfirm.vue +57 -0
- package/src/login/pages/LoginIdpLinkConfirmOverride.vue +56 -0
- package/src/login/pages/LoginIdpLinkEmail.vue +52 -0
- package/src/login/pages/LoginOauth2DeviceVerifyUserCode.vue +82 -0
- package/src/login/pages/LoginOauthGrant.vue +131 -0
- package/src/login/pages/LoginOtp.vue +135 -0
- package/src/login/pages/LoginPageExpired.vue +44 -0
- package/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.ts +96 -0
- package/src/login/pages/LoginPasskeysConditionalAuthenticate.vue +255 -0
- package/src/login/pages/LoginPassword.useScript.ts +88 -0
- package/src/login/pages/LoginPassword.vue +191 -0
- package/src/login/pages/LoginRecoveryAuthnCodeConfig.useScript.ts +152 -0
- package/src/login/pages/LoginRecoveryAuthnCodeConfig.vue +183 -0
- package/src/login/pages/LoginRecoveryAuthnCodeInput.vue +90 -0
- package/src/login/pages/LoginResetOtp.vue +88 -0
- package/src/login/pages/LoginResetPassword.vue +114 -0
- package/src/login/pages/LoginUpdatePassword.vue +145 -0
- package/src/login/pages/LoginUpdateProfile.vue +94 -0
- package/src/login/pages/LoginUsername.useScript.ts +88 -0
- package/src/login/pages/LoginUsername.vue +263 -0
- package/src/login/pages/LoginVerifyEmail.vue +39 -0
- package/src/login/pages/LoginX509Info.vue +120 -0
- package/src/login/pages/LogoutConfirm.vue +73 -0
- package/src/login/pages/NotImplemented.vue +12 -0
- package/src/login/pages/PageProps.ts +10 -0
- package/src/login/pages/Register.vue +158 -0
- package/src/login/pages/SamlPostForm.vue +75 -0
- package/src/login/pages/SelectAuthenticator.vue +65 -0
- package/src/login/pages/SelectOrganization.vue +89 -0
- package/src/login/pages/Terms.vue +56 -0
- package/src/login/pages/UpdateEmail.vue +100 -0
- package/src/login/pages/WebauthnAuthenticate.useScript.ts +75 -0
- package/src/login/pages/WebauthnAuthenticate.vue +186 -0
- package/src/login/pages/WebauthnError.vue +84 -0
- package/src/login/pages/WebauthnRegister.useScript.ts +109 -0
- package/src/login/pages/WebauthnRegister.vue +105 -0
- package/src/tools/useInsertLinkTags.ts +62 -0
- package/src/tools/useInsertScriptTags.ts +75 -0
- package/src/tools/useSetClassName.ts +15 -0
- package/stories/account/KcContext.ts +13 -0
- package/stories/account/KcContextMock.ts +26 -0
- package/stories/account/KcPage.vue +26 -0
- package/stories/account/KcPageStory.vue +13 -0
- package/stories/account/i18n.ts +7 -0
- package/stories/account/pages/Account.stories.ts +22 -0
- package/stories/account/pages/Applications.stories.ts +70 -0
- package/stories/account/pages/FederatedIdentity.stories.ts +64 -0
- package/stories/account/pages/Log.stories.ts +42 -0
- package/stories/account/pages/Password.stories.ts +22 -0
- package/stories/account/pages/Sessions.stories.ts +41 -0
- package/stories/account/pages/Totp.stories.ts +33 -0
- package/stories/kc.gen.ts +17 -0
- package/stories/login/KcContext.ts +13 -0
- package/stories/login/KcContextMock.ts +26 -0
- package/stories/login/KcPage.vue +28 -0
- package/stories/login/KcPageStory.vue +13 -0
- package/stories/login/i18n.ts +7 -0
- package/stories/login/pages/Code.stories.ts +50 -0
- package/stories/login/pages/DeleteAccountConfirm.stories.ts +32 -0
- package/stories/login/pages/DeleteCredential.stories.ts +23 -0
- package/stories/login/pages/Error.stories.ts +53 -0
- package/stories/login/pages/FrontchannelLogout.stories.ts +24 -0
- package/stories/login/pages/IdpReviewUserProfile.stories.ts +56 -0
- package/stories/login/pages/Info.stories.ts +52 -0
- package/stories/login/pages/LinkIdpAction.stories.ts +30 -0
- package/stories/login/pages/Login.stories.ts +76 -0
- package/stories/login/pages/LoginConfigTotp.stories.ts +53 -0
- package/stories/login/pages/LoginIdpLinkConfirm.stories.ts +34 -0
- package/stories/login/pages/LoginIdpLinkConfirmOverride.stories.ts +14 -0
- package/stories/login/pages/LoginIdpLinkEmail.stories.ts +60 -0
- package/stories/login/pages/LoginOauth2DeviceVerifyUserCode.stories.ts +42 -0
- package/stories/login/pages/LoginOauthGrant.stories.ts +95 -0
- package/stories/login/pages/LoginOtp.stories.ts +92 -0
- package/stories/login/pages/LoginPageExpired.stories.ts +29 -0
- package/stories/login/pages/LoginPasskeysConditionalAuthenticate.stories.ts +14 -0
- package/stories/login/pages/LoginPassword.stories.ts +49 -0
- package/stories/login/pages/LoginRecoveryAuthnCodeConfig.stories.ts +28 -0
- package/stories/login/pages/LoginRecoveryAuthnCodeInput.stories.ts +14 -0
- package/stories/login/pages/LoginResetOtp.stories.ts +69 -0
- package/stories/login/pages/LoginResetPassword.stories.ts +48 -0
- package/stories/login/pages/LoginUpdatePassword.stories.ts +52 -0
- package/stories/login/pages/LoginUpdateProfile.stories.ts +29 -0
- package/stories/login/pages/LoginUsername.stories.ts +25 -0
- package/stories/login/pages/LoginVerifyEmail.stories.ts +63 -0
- package/stories/login/pages/LoginX509Info.stories.ts +29 -0
- package/stories/login/pages/LogoutConfirm.stories.ts +35 -0
- package/stories/login/pages/Register.stories.ts +76 -0
- package/stories/login/pages/SamlPostForm.stories.ts +14 -0
- package/stories/login/pages/SelectAuthenticator.stories.ts +89 -0
- package/stories/login/pages/SelectOrganization.stories.ts +63 -0
- package/stories/login/pages/Terms.stories.ts +78 -0
- package/stories/login/pages/UpdateEmail.stories.ts +28 -0
- package/stories/login/pages/WebauthnAuthenticate.stories.ts +147 -0
- package/stories/login/pages/WebauthnError.stories.ts +77 -0
- 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)}})();
|
|
File without changes
|
|
@@ -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,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>
|