@keycloakify/angular 0.0.1-rc.21 → 0.0.1-rc.23
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/account/account.d.ts +12 -0
- package/account/defaultPage.d.ts +3 -0
- package/{login/getDefaultPageComponent → account}/index.d.ts +1 -1
- package/account/providers/keycloakify-angular/keycloakify-angular.providers.d.ts +1 -1
- package/account/public-api.d.ts +1 -0
- package/bin/338.index.js +298 -0
- package/bin/755.index.js +4928 -0
- package/bin/758.index.js +130 -0
- package/bin/925.index.js +1713 -0
- package/bin/main.js +334 -105
- package/esm2022/account/account.mjs +3 -0
- package/esm2022/account/defaultPage.mjs +26 -0
- package/esm2022/account/keycloakify-angular-account.mjs +5 -0
- package/esm2022/account/pages/account/account.component.mjs +2 -3
- package/esm2022/account/pages/applications/applications.component.mjs +2 -3
- package/esm2022/account/pages/federatedIdentity/federatedIdentity.component.mjs +2 -3
- package/esm2022/account/pages/log/log.component.mjs +2 -3
- package/esm2022/account/pages/password/password.component.mjs +2 -3
- package/esm2022/account/pages/sessions/sessions.component.mjs +2 -3
- package/esm2022/account/pages/totp/totp.component.mjs +2 -3
- package/esm2022/account/providers/keycloakify-angular/keycloakify-angular.providers.mjs +2 -2
- package/esm2022/account/public-api.mjs +2 -0
- package/esm2022/login/containers/template/template.component.mjs +4 -10
- package/esm2022/login/defaultPage.mjs +77 -0
- package/esm2022/login/keycloakify-angular-login.mjs +5 -0
- package/esm2022/login/login.mjs +3 -0
- package/esm2022/login/pages/code/code.component.mjs +2 -3
- package/esm2022/login/pages/delete-account-confirm/delete-account-confirm.component.mjs +1 -1
- package/esm2022/login/pages/delete-credential/delete-credential.component.mjs +2 -3
- package/esm2022/login/pages/error/error.component.mjs +2 -3
- package/esm2022/login/pages/frontchannel-logout/frontchannel-logout.component.mjs +2 -3
- package/esm2022/login/pages/idp-review-user-profile/idp-review-user-profile.component.mjs +7 -8
- package/esm2022/login/pages/info/info.component.mjs +2 -3
- package/esm2022/login/pages/login/login.component.mjs +2 -3
- package/esm2022/login/pages/login-config-totp/login-config-totp.component.mjs +2 -3
- package/esm2022/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.mjs +2 -3
- package/esm2022/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.mjs +2 -3
- package/esm2022/login/pages/login-idp-link-email/login-idp-link-email.component.mjs +2 -3
- package/esm2022/login/pages/login-oauth-grant/login-oauth-grant.component.mjs +2 -3
- package/esm2022/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.mjs +2 -3
- package/esm2022/login/pages/login-otp/login-otp.component.mjs +2 -3
- package/esm2022/login/pages/login-page-expired/login-page-expired.component.mjs +2 -3
- package/esm2022/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.mjs +2 -3
- package/esm2022/login/pages/login-password/login-password.component.mjs +2 -3
- package/esm2022/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.mjs +2 -3
- package/esm2022/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.mjs +2 -3
- package/esm2022/login/pages/login-reset-otp/login-reset-otp.component.mjs +2 -3
- package/esm2022/login/pages/login-reset-password/login-reset-password.component.mjs +2 -3
- package/esm2022/login/pages/login-update-password/login-update-password.component.mjs +2 -3
- package/esm2022/login/pages/login-update-profile/login-update-profile.component.mjs +7 -8
- package/esm2022/login/pages/login-username/login-username.component.mjs +2 -3
- package/esm2022/login/pages/login-verify-email/login-verify-email.component.mjs +2 -3
- package/esm2022/login/pages/login-x509-info/login-x509-info.component.mjs +2 -3
- package/esm2022/login/pages/logout-confirm/logout-confirm.component.mjs +2 -3
- package/esm2022/login/pages/register/register.component.mjs +7 -8
- package/esm2022/login/pages/saml-post-form/saml-post-form.component.mjs +2 -3
- package/esm2022/login/pages/select-authenticator/select-authenticator.component.mjs +2 -3
- package/esm2022/login/pages/terms/terms.component.mjs +2 -3
- package/esm2022/login/pages/update-email/update-email.component.mjs +7 -8
- package/esm2022/login/pages/webauthn-authenticate/webauthn-authenticate.component.mjs +2 -3
- package/esm2022/login/pages/webauthn-error/webauthn-error.component.mjs +2 -3
- package/esm2022/login/pages/webauthn-register/webauthn-register.component.mjs +2 -3
- package/esm2022/login/providers/keycloakify-angular/keycloakify-angular.providers.mjs +2 -2
- package/esm2022/login/public-api.mjs +2 -0
- package/fesm2022/keycloakify-angular-account-pages-account.mjs +1 -2
- package/fesm2022/keycloakify-angular-account-pages-account.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account-pages-applications.mjs +1 -2
- package/fesm2022/keycloakify-angular-account-pages-applications.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account-pages-federatedIdentity.mjs +1 -2
- package/fesm2022/keycloakify-angular-account-pages-federatedIdentity.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account-pages-log.mjs +1 -2
- package/fesm2022/keycloakify-angular-account-pages-log.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account-pages-password.mjs +1 -2
- package/fesm2022/keycloakify-angular-account-pages-password.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account-pages-sessions.mjs +1 -2
- package/fesm2022/keycloakify-angular-account-pages-sessions.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account-pages-totp.mjs +1 -2
- package/fesm2022/keycloakify-angular-account-pages-totp.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account-providers-keycloakify-angular.mjs +2 -2
- package/fesm2022/keycloakify-angular-account-providers-keycloakify-angular.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-account.mjs +34 -0
- package/fesm2022/keycloakify-angular-account.mjs.map +1 -0
- package/fesm2022/keycloakify-angular-login-containers-template.mjs +3 -9
- package/fesm2022/keycloakify-angular-login-containers-template.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-code.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-code.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-delete-account-confirm.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-delete-credential.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-delete-credential.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-error.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-error.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-frontchannel-logout.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-frontchannel-logout.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs +6 -7
- package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-info.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-info.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-config-totp.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-config-totp.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm-override.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm-override.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-idp-link-email.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-idp-link-email.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-oauth-grant.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-oauth-grant.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-oauth2-device-verify-user-code.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-oauth2-device-verify-user-code.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-otp.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-otp.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-page-expired.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-page-expired.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-passkeys-conditional-authenticate.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-passkeys-conditional-authenticate.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-password.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-password.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-input.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-input.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-reset-otp.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-reset-otp.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-reset-password.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-reset-password.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-update-password.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-update-password.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs +6 -7
- package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-username.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-username.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-verify-email.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-verify-email.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login-x509-info.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login-x509-info.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-login.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-login.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-logout-confirm.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-logout-confirm.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-register.mjs +7 -8
- package/fesm2022/keycloakify-angular-login-pages-register.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-saml-post-form.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-saml-post-form.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-select-authenticator.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-select-authenticator.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-terms.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-terms.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-update-email.mjs +6 -7
- package/fesm2022/keycloakify-angular-login-pages-update-email.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-webauthn-authenticate.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-webauthn-authenticate.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-webauthn-error.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-webauthn-error.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-pages-webauthn-register.mjs +1 -2
- package/fesm2022/keycloakify-angular-login-pages-webauthn-register.mjs.map +1 -1
- package/fesm2022/keycloakify-angular-login-providers-keycloakify-angular.mjs +2 -2
- package/fesm2022/keycloakify-angular-login-providers-keycloakify-angular.mjs.map +1 -1
- package/fesm2022/{keycloakify-angular-login-getDefaultPageComponent.mjs → keycloakify-angular-login.mjs} +3 -1
- package/fesm2022/keycloakify-angular-login.mjs.map +1 -0
- package/login/containers/template/template.component.d.ts +2 -4
- package/login/index.d.ts +5 -0
- package/login/login.d.ts +13 -0
- package/login/pages/code/code.component.d.ts +1 -1
- package/login/pages/delete-account-confirm/delete-account-confirm.component.d.ts +1 -1
- package/login/pages/delete-credential/delete-credential.component.d.ts +1 -1
- package/login/pages/error/error.component.d.ts +1 -1
- package/login/pages/frontchannel-logout/frontchannel-logout.component.d.ts +1 -1
- package/login/pages/idp-review-user-profile/idp-review-user-profile.component.d.ts +2 -4
- package/login/pages/info/info.component.d.ts +1 -1
- package/login/pages/login/login.component.d.ts +1 -1
- package/login/pages/login-config-totp/login-config-totp.component.d.ts +1 -1
- package/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.d.ts +1 -1
- package/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.d.ts +1 -1
- package/login/pages/login-idp-link-email/login-idp-link-email.component.d.ts +1 -1
- package/login/pages/login-oauth-grant/login-oauth-grant.component.d.ts +1 -1
- package/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.d.ts +1 -1
- package/login/pages/login-otp/login-otp.component.d.ts +1 -1
- package/login/pages/login-page-expired/login-page-expired.component.d.ts +1 -1
- package/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.d.ts +1 -1
- package/login/pages/login-password/login-password.component.d.ts +1 -1
- package/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.d.ts +1 -1
- package/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.d.ts +1 -1
- package/login/pages/login-reset-otp/login-reset-otp.component.d.ts +1 -1
- package/login/pages/login-reset-password/login-reset-password.component.d.ts +1 -1
- package/login/pages/login-update-password/login-update-password.component.d.ts +1 -1
- package/login/pages/login-update-profile/login-update-profile.component.d.ts +2 -4
- package/login/pages/login-username/login-username.component.d.ts +1 -1
- package/login/pages/login-verify-email/login-verify-email.component.d.ts +1 -1
- package/login/pages/login-x509-info/login-x509-info.component.d.ts +1 -1
- package/login/pages/logout-confirm/logout-confirm.component.d.ts +1 -1
- package/login/pages/register/register.component.d.ts +2 -4
- package/login/pages/saml-post-form/saml-post-form.component.d.ts +1 -1
- package/login/pages/select-authenticator/select-authenticator.component.d.ts +1 -1
- package/login/pages/terms/terms.component.d.ts +1 -1
- package/login/pages/update-email/update-email.component.d.ts +2 -4
- package/login/pages/webauthn-authenticate/webauthn-authenticate.component.d.ts +1 -1
- package/login/pages/webauthn-error/webauthn-error.component.d.ts +1 -1
- package/login/pages/webauthn-register/webauthn-register.component.d.ts +1 -1
- package/login/providers/keycloakify-angular/keycloakify-angular.providers.d.ts +1 -1
- package/login/public-api.d.ts +1 -0
- package/package.json +21 -15
- package/src/account/DefaultPage.ts +1 -1
- package/src/account/account.ts +13 -0
- package/src/account/classes/component-reference/index.ts +1 -0
- package/src/account/containers/template/index.ts +1 -0
- package/src/account/containers/template/template.component.ts +2 -2
- package/src/account/defaultPage.ts +44 -0
- package/src/account/directives/kc-class/index.ts +1 -0
- package/src/account/index.ts +1 -0
- package/src/account/pages/account/account.component.ts +3 -4
- package/src/account/pages/account/index.ts +1 -0
- package/src/account/pages/applications/applications.component.ts +3 -4
- package/src/account/pages/applications/index.ts +1 -0
- package/src/account/pages/federatedIdentity/federatedIdentity.component.ts +3 -4
- package/src/account/pages/federatedIdentity/index.ts +1 -0
- package/src/account/pages/log/index.ts +1 -0
- package/src/account/pages/log/log.component.ts +3 -4
- package/src/account/pages/password/index.ts +1 -0
- package/src/account/pages/password/password.component.ts +3 -4
- package/src/account/pages/sessions/index.ts +1 -0
- package/src/account/pages/sessions/sessions.component.ts +3 -4
- package/src/account/pages/totp/index.ts +1 -0
- package/src/account/pages/totp/totp.component.ts +3 -4
- package/src/account/providers/keycloakify-angular/index.ts +1 -0
- package/src/account/providers/keycloakify-angular/keycloakify-angular.providers.ts +2 -4
- package/src/account/services/account-resource-injector/account-resource-injector.service.ts +1 -1
- package/src/account/services/account-resource-injector/index.ts +1 -0
- package/src/account/services/i18n/index.ts +1 -0
- package/src/account/tokens/classes/index.ts +1 -0
- package/src/account/tokens/i18n/index.ts +1 -0
- package/src/account/tokens/kc-context/index.ts +1 -0
- package/src/account/tokens/kc-context/kc-context.token.ts +1 -1
- package/src/bin/core.ts +10 -0
- package/src/bin/eject-page.ts +311 -0
- package/src/bin/initialize-account-theme/boilerplate/KcContext.ts +11 -0
- package/src/bin/initialize-account-theme/boilerplate/KcContextMock.ts +18 -0
- package/src/bin/initialize-account-theme/boilerplate/KcPage.ts +19 -0
- package/src/bin/initialize-account-theme/boilerplate/i18n.ts +11 -0
- package/src/bin/initialize-account-theme/initialize-account-theme.ts +98 -0
- package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +99 -0
- package/src/bin/main.ts +38 -0
- package/src/bin/tools/SemVer.ts +114 -0
- package/src/bin/tools/String.prototype.replaceAll.ts +37 -0
- package/src/bin/tools/crawl.ts +35 -0
- package/src/bin/tools/fs.rmSync.ts +34 -0
- package/src/bin/tools/getThisCodebaseRootDirPath.ts +19 -0
- package/src/bin/tools/kebabCaseToSnakeCase.ts +7 -0
- package/src/bin/tools/transformCodebase.ts +88 -0
- package/src/bin/tsconfig.json +20 -0
- package/src/bin/update-kc-gen.ts +135 -0
- package/src/index.ts +1 -0
- package/src/lib/directives/attributes/index.ts +1 -0
- package/src/lib/index.ts +1 -0
- package/src/lib/models/script/index.ts +1 -0
- package/src/lib/pipes/input-type/index.ts +1 -0
- package/src/lib/pipes/is-array-with-empty-object/index.ts +1 -0
- package/src/lib/pipes/kc-sanitize/index.ts +1 -0
- package/src/lib/pipes/to-array/index.ts +1 -0
- package/src/lib/pipes/to-number/index.ts +1 -0
- package/src/lib/services/resource-injector/index.ts +1 -0
- package/src/lib/tokens/use-default-css/index.ts +1 -0
- package/src/login/classes/component-reference/index.ts +1 -0
- package/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +1 -1
- package/src/login/components/add-remove-buttons-multi-valued-attribute/index.ts +1 -0
- package/src/login/components/field-errors/index.ts +1 -0
- package/src/login/components/group-label/group-label.component.ts +1 -1
- package/src/login/components/group-label/index.ts +1 -0
- package/src/login/components/input-field-by-type/index.ts +1 -0
- package/src/login/components/input-tag/index.ts +1 -0
- package/src/login/components/input-tag/input-tag.component.ts +1 -1
- package/src/login/components/input-tag-selects/index.ts +1 -0
- package/src/login/components/input-tag-selects/input-tag-selects.component.ts +1 -1
- package/src/login/components/logout-other-sessions/index.ts +1 -0
- package/src/login/components/logout-other-sessions/logout-other-sessions.component.ts +1 -1
- package/src/login/components/password-wrapper/index.ts +1 -0
- package/src/login/components/password-wrapper/password-wrapper.component.ts +1 -1
- package/src/login/components/select-tag/index.ts +1 -0
- package/src/login/components/select-tag/select-tag.component.ts +1 -1
- package/src/login/components/textarea-tag/index.ts +1 -0
- package/src/login/components/user-profile-form-fields/index.ts +1 -0
- package/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +2 -2
- package/src/login/containers/template/index.ts +1 -0
- package/src/login/containers/template/template.component.ts +2 -8
- package/src/login/{getDefaultPageComponent.ts → defaultPage.ts} +1 -1
- package/src/login/directives/kc-class/index.ts +1 -0
- package/src/login/index.ts +1 -0
- package/src/login/login.ts +14 -0
- package/src/login/pages/code/code.component.ts +4 -5
- package/src/login/pages/code/index.ts +1 -0
- package/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +3 -3
- package/src/login/pages/delete-account-confirm/index.ts +1 -0
- package/src/login/pages/delete-credential/delete-credential.component.ts +4 -5
- package/src/login/pages/delete-credential/index.ts +1 -0
- package/src/login/pages/error/error.component.ts +4 -5
- package/src/login/pages/error/index.ts +1 -0
- package/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +4 -5
- package/src/login/pages/frontchannel-logout/index.ts +1 -0
- package/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html +1 -1
- package/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +4 -6
- package/src/login/pages/idp-review-user-profile/index.ts +1 -0
- package/src/login/pages/info/index.ts +1 -0
- package/src/login/pages/info/info.component.ts +4 -5
- package/src/login/pages/login/index.ts +1 -0
- package/src/login/pages/login/login.component.ts +4 -5
- package/src/login/pages/login-config-totp/index.ts +1 -0
- package/src/login/pages/login-config-totp/login-config-totp.component.ts +4 -5
- package/src/login/pages/login-idp-link-confirm/index.ts +1 -0
- package/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +4 -5
- package/src/login/pages/login-idp-link-confirm-override/index.ts +1 -0
- package/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +4 -5
- package/src/login/pages/login-idp-link-email/index.ts +1 -0
- package/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +4 -5
- package/src/login/pages/login-oauth-grant/index.ts +1 -0
- package/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +4 -5
- package/src/login/pages/login-oauth2-device-verify-user-code/index.ts +1 -0
- package/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +4 -5
- package/src/login/pages/login-otp/index.ts +1 -0
- package/src/login/pages/login-otp/login-otp.component.ts +4 -5
- package/src/login/pages/login-page-expired/index.ts +1 -0
- package/src/login/pages/login-page-expired/login-page-expired.component.ts +4 -5
- package/src/login/pages/login-passkeys-conditional-authenticate/index.ts +1 -0
- package/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +4 -5
- package/src/login/pages/login-password/index.ts +1 -0
- package/src/login/pages/login-password/login-password.component.ts +4 -5
- package/src/login/pages/login-recovery-authn-code-config/index.ts +1 -0
- package/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +4 -5
- package/src/login/pages/login-recovery-authn-code-input/index.ts +1 -0
- package/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +4 -5
- package/src/login/pages/login-reset-otp/index.ts +1 -0
- package/src/login/pages/login-reset-otp/login-reset-otp.component.ts +4 -5
- package/src/login/pages/login-reset-password/index.ts +1 -0
- package/src/login/pages/login-reset-password/login-reset-password.component.ts +4 -5
- package/src/login/pages/login-update-password/index.ts +1 -0
- package/src/login/pages/login-update-password/login-update-password.component.ts +4 -5
- package/src/login/pages/login-update-profile/index.ts +1 -0
- package/src/login/pages/login-update-profile/login-update-profile.component.html +1 -1
- package/src/login/pages/login-update-profile/login-update-profile.component.ts +4 -6
- package/src/login/pages/login-username/index.ts +1 -0
- package/src/login/pages/login-username/login-username.component.ts +4 -5
- package/src/login/pages/login-verify-email/index.ts +1 -0
- package/src/login/pages/login-verify-email/login-verify-email.component.ts +4 -5
- package/src/login/pages/login-x509-info/index.ts +1 -0
- package/src/login/pages/login-x509-info/login-x509-info.component.ts +4 -5
- package/src/login/pages/logout-confirm/index.ts +1 -0
- package/src/login/pages/logout-confirm/logout-confirm.component.ts +4 -5
- package/src/login/pages/register/index.ts +1 -0
- package/src/login/pages/register/register.component.html +1 -1
- package/src/login/pages/register/register.component.ts +4 -6
- package/src/login/pages/saml-post-form/index.ts +1 -0
- package/src/login/pages/saml-post-form/saml-post-form.component.ts +4 -5
- package/src/login/pages/select-authenticator/index.ts +1 -0
- package/src/login/pages/select-authenticator/select-authenticator.component.ts +4 -5
- package/src/login/pages/terms/index.ts +1 -0
- package/src/login/pages/terms/terms.component.ts +4 -5
- package/src/login/pages/update-email/index.ts +1 -0
- package/src/login/pages/update-email/update-email.component.html +1 -1
- package/src/login/pages/update-email/update-email.component.ts +4 -6
- package/src/login/pages/webauthn-authenticate/index.ts +1 -0
- package/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +4 -5
- package/src/login/pages/webauthn-error/index.ts +1 -0
- package/src/login/pages/webauthn-error/webauthn-error.component.ts +4 -5
- package/src/login/pages/webauthn-register/index.ts +1 -0
- package/src/login/pages/webauthn-register/webauthn-register.component.ts +4 -5
- package/src/login/providers/keycloakify-angular/index.ts +1 -0
- package/src/login/providers/keycloakify-angular/keycloakify-angular.providers.ts +2 -2
- package/src/login/services/i18n/index.ts +1 -0
- package/src/login/services/login-resource-injector/index.ts +1 -0
- package/src/login/services/login-resource-injector/login-resource-injector.service.ts +1 -1
- package/src/login/services/submit/index.ts +1 -0
- package/src/login/services/user-profile-form/index.ts +1 -0
- package/src/login/services/user-profile-form/user-profile-form.service.ts +2 -2
- package/src/login/tokens/classes/index.ts +1 -0
- package/src/login/tokens/i18n/index.ts +1 -0
- package/src/login/tokens/kc-context/index.ts +1 -0
- package/src/login/tokens/kc-context/kc-context.token.ts +1 -1
- package/src/login/tokens/make-user-confirm-password/index.ts +1 -0
- package/esm2022/login/getDefaultPageComponent/getDefaultPageComponent.mjs +0 -77
- package/esm2022/login/getDefaultPageComponent/keycloakify-angular-login-getDefaultPageComponent.mjs +0 -5
- package/esm2022/login/getDefaultPageComponent/public-api.mjs +0 -2
- package/fesm2022/keycloakify-angular-login-getDefaultPageComponent.mjs.map +0 -1
- package/login/getDefaultPageComponent/public-api.d.ts +0 -1
- /package/login/{getDefaultPageComponent/getDefaultPageComponent.d.ts → defaultPage.d.ts} +0 -0
- /package/{stories → src/stories}/login/pages/login/login.stories.ts +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { getThisCodebaseRootDirPath } from './tools/getThisCodebaseRootDirPath';
|
|
4
|
+
import cliSelect from 'cli-select';
|
|
5
|
+
import {
|
|
6
|
+
type BuildContext,
|
|
7
|
+
LOGIN_THEME_PAGE_IDS,
|
|
8
|
+
ACCOUNT_THEME_PAGE_IDS,
|
|
9
|
+
type LoginThemePageId,
|
|
10
|
+
type AccountThemePageId,
|
|
11
|
+
THEME_TYPES,
|
|
12
|
+
type ThemeType
|
|
13
|
+
} from './core';
|
|
14
|
+
import * as fs from 'fs';
|
|
15
|
+
import {
|
|
16
|
+
join as pathJoin,
|
|
17
|
+
relative as pathRelative,
|
|
18
|
+
sep as pathSep,
|
|
19
|
+
dirname as pathDirname
|
|
20
|
+
} from 'path';
|
|
21
|
+
import { assert, Equals } from 'tsafe/assert';
|
|
22
|
+
import chalk from 'chalk';
|
|
23
|
+
import { transformCodebase } from './tools/transformCodebase';
|
|
24
|
+
import { kebabCaseToCamelCase } from './tools/kebabCaseToSnakeCase';
|
|
25
|
+
import { replaceAll } from './tools/String.prototype.replaceAll';
|
|
26
|
+
import { capitalize } from 'tsafe/capitalize';
|
|
27
|
+
|
|
28
|
+
export async function command(params: { buildContext: BuildContext }) {
|
|
29
|
+
const { buildContext } = params;
|
|
30
|
+
|
|
31
|
+
console.log(chalk.cyan('Theme type:'));
|
|
32
|
+
|
|
33
|
+
const themeType = await (async () => {
|
|
34
|
+
const values = THEME_TYPES.filter(themeType => {
|
|
35
|
+
switch (themeType) {
|
|
36
|
+
case 'account':
|
|
37
|
+
return buildContext.implementedThemeTypes.account.isImplemented;
|
|
38
|
+
case 'login':
|
|
39
|
+
return buildContext.implementedThemeTypes.login.isImplemented;
|
|
40
|
+
}
|
|
41
|
+
assert<Equals<typeof themeType, never>>(false);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
assert(values.length > 0, 'No theme is implemented in this project');
|
|
45
|
+
|
|
46
|
+
if (values.length === 1) {
|
|
47
|
+
return values[0];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const { value } = await cliSelect<ThemeType>({
|
|
51
|
+
values
|
|
52
|
+
}).catch(() => {
|
|
53
|
+
process.exit(-1);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return value;
|
|
57
|
+
})();
|
|
58
|
+
|
|
59
|
+
console.log(`→ ${themeType}`);
|
|
60
|
+
|
|
61
|
+
console.log(chalk.cyan('Select the page you want to customize:'));
|
|
62
|
+
|
|
63
|
+
const templateValue = 'template.ftl (Layout common to every page)';
|
|
64
|
+
|
|
65
|
+
const { value: pageIdOrComponent } = await cliSelect<
|
|
66
|
+
LoginThemePageId | AccountThemePageId | typeof templateValue
|
|
67
|
+
>({
|
|
68
|
+
values: (() => {
|
|
69
|
+
switch (themeType) {
|
|
70
|
+
case 'login':
|
|
71
|
+
return [templateValue, ...LOGIN_THEME_PAGE_IDS];
|
|
72
|
+
case 'account':
|
|
73
|
+
return [templateValue, ...ACCOUNT_THEME_PAGE_IDS];
|
|
74
|
+
}
|
|
75
|
+
assert<Equals<typeof themeType, never>>(false);
|
|
76
|
+
})()
|
|
77
|
+
}).catch(() => {
|
|
78
|
+
process.exit(-1);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
console.log(`→ ${pageIdOrComponent}`);
|
|
82
|
+
|
|
83
|
+
const componentDirRelativeToThemeTypePath = (() => {
|
|
84
|
+
if (pageIdOrComponent === templateValue) {
|
|
85
|
+
return pathJoin('containers', 'template');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return pathJoin('pages', pageIdOrComponent.replace(/\.ftl$/, ''));
|
|
89
|
+
})();
|
|
90
|
+
|
|
91
|
+
{
|
|
92
|
+
const componentDirRelativeToThemeTypePaths = [
|
|
93
|
+
componentDirRelativeToThemeTypePath
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
while (componentDirRelativeToThemeTypePaths.length !== 0) {
|
|
97
|
+
const componentDirRelativeToThemeTypePath_i =
|
|
98
|
+
componentDirRelativeToThemeTypePaths.pop();
|
|
99
|
+
|
|
100
|
+
assert(componentDirRelativeToThemeTypePath_i !== undefined);
|
|
101
|
+
|
|
102
|
+
const destDirPath = pathJoin(
|
|
103
|
+
buildContext.themeSrcDirPath,
|
|
104
|
+
themeType,
|
|
105
|
+
componentDirRelativeToThemeTypePath_i
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
if (fs.existsSync(destDirPath) && fs.readdirSync(destDirPath).length !== 0) {
|
|
109
|
+
if (
|
|
110
|
+
componentDirRelativeToThemeTypePath_i ===
|
|
111
|
+
componentDirRelativeToThemeTypePath
|
|
112
|
+
) {
|
|
113
|
+
console.log(
|
|
114
|
+
`${pageIdOrComponent.split('.ftl')[0]} is already ejected, ${pathRelative(
|
|
115
|
+
process.cwd(),
|
|
116
|
+
destDirPath
|
|
117
|
+
)} already exists`
|
|
118
|
+
);
|
|
119
|
+
process.exit(-1);
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const localThemeTypeDirPath = pathJoin(
|
|
125
|
+
getThisCodebaseRootDirPath(),
|
|
126
|
+
'src',
|
|
127
|
+
themeType
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
transformCodebase({
|
|
131
|
+
srcDirPath: pathJoin(
|
|
132
|
+
localThemeTypeDirPath,
|
|
133
|
+
componentDirRelativeToThemeTypePath_i
|
|
134
|
+
),
|
|
135
|
+
destDirPath,
|
|
136
|
+
transformSourceCode: ({ filePath, sourceCode }) => {
|
|
137
|
+
if (!filePath.endsWith('.ts')) {
|
|
138
|
+
return { modifiedSourceCode: sourceCode };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const fileRelativeToThemeTypePath = pathRelative(
|
|
142
|
+
localThemeTypeDirPath,
|
|
143
|
+
filePath
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
let modifiedSourceCode_str = sourceCode.toString();
|
|
147
|
+
|
|
148
|
+
const getPosixPathRelativeToFile = (params: {
|
|
149
|
+
pathRelativeToThemeType: string;
|
|
150
|
+
}) => {
|
|
151
|
+
const { pathRelativeToThemeType } = params;
|
|
152
|
+
|
|
153
|
+
const path = pathRelative(
|
|
154
|
+
pathDirname(fileRelativeToThemeTypePath),
|
|
155
|
+
pathRelativeToThemeType
|
|
156
|
+
)
|
|
157
|
+
.split(pathSep)
|
|
158
|
+
.join('/');
|
|
159
|
+
|
|
160
|
+
return path.startsWith('.') ? path : `./${path}`;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
modifiedSourceCode_str = replaceAll(
|
|
164
|
+
modifiedSourceCode_str,
|
|
165
|
+
`@keycloakify/angular/${themeType}/i18n`,
|
|
166
|
+
getPosixPathRelativeToFile({
|
|
167
|
+
pathRelativeToThemeType: 'i18n'
|
|
168
|
+
})
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
modifiedSourceCode_str = replaceAll(
|
|
172
|
+
modifiedSourceCode_str,
|
|
173
|
+
`@keycloakify/angular/${themeType}/KcContext`,
|
|
174
|
+
getPosixPathRelativeToFile({
|
|
175
|
+
pathRelativeToThemeType: 'KcContext'
|
|
176
|
+
})
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
modifiedSourceCode_str = modifiedSourceCode_str.replace(
|
|
180
|
+
new RegExp(
|
|
181
|
+
`@keycloakify/angular/${themeType}/components/([^'"]+)`,
|
|
182
|
+
'g'
|
|
183
|
+
),
|
|
184
|
+
(...[, componentDirRelativeToComponentsPath]) => {
|
|
185
|
+
const componentDirRelativeToThemeTypePath = pathJoin(
|
|
186
|
+
'components',
|
|
187
|
+
componentDirRelativeToComponentsPath
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
componentDirRelativeToThemeTypePaths.push(
|
|
191
|
+
componentDirRelativeToThemeTypePath
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
return getPosixPathRelativeToFile({
|
|
195
|
+
pathRelativeToThemeType:
|
|
196
|
+
componentDirRelativeToThemeTypePath
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
modifiedSourceCode: Buffer.from(modifiedSourceCode_str, 'utf8')
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
console.log(
|
|
208
|
+
`${chalk.green('✓')} ${chalk.bold(
|
|
209
|
+
`.${pathSep}` + pathRelative(process.cwd(), destDirPath)
|
|
210
|
+
)} moved from the @keycloakify/angular to your project`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
edit_KcPage: {
|
|
216
|
+
if (pageIdOrComponent !== templateValue) {
|
|
217
|
+
break edit_KcPage;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const kcAppTsFilePath = pathJoin(
|
|
221
|
+
buildContext.themeSrcDirPath,
|
|
222
|
+
themeType,
|
|
223
|
+
'KcPage.ts'
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
const kcAppTsCode = fs.readFileSync(kcAppTsFilePath).toString('utf8');
|
|
227
|
+
|
|
228
|
+
const modifiedKcAppTsCode = (() => {
|
|
229
|
+
const componentRelativeDirPath_posix = componentDirRelativeToThemeTypePath
|
|
230
|
+
.split(pathSep)
|
|
231
|
+
.join('/');
|
|
232
|
+
|
|
233
|
+
return kcAppTsCode.replace(
|
|
234
|
+
`@keycloakify/angular/${themeType}/${componentRelativeDirPath_posix}`,
|
|
235
|
+
`./${componentRelativeDirPath_posix}`
|
|
236
|
+
);
|
|
237
|
+
})();
|
|
238
|
+
|
|
239
|
+
if (modifiedKcAppTsCode === kcAppTsCode) {
|
|
240
|
+
console.log(
|
|
241
|
+
chalk.red(
|
|
242
|
+
'Unable to automatically update KcPage.tsx, please update it manually'
|
|
243
|
+
)
|
|
244
|
+
);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
fs.writeFileSync(kcAppTsFilePath, Buffer.from(modifiedKcAppTsCode, 'utf8'));
|
|
249
|
+
|
|
250
|
+
console.log(
|
|
251
|
+
`${chalk.green('✓')} ${chalk.bold(
|
|
252
|
+
`.${pathSep}` + pathRelative(process.cwd(), kcAppTsFilePath)
|
|
253
|
+
)} Updated`
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const pageId = pageIdOrComponent;
|
|
260
|
+
|
|
261
|
+
console.log(
|
|
262
|
+
[
|
|
263
|
+
``,
|
|
264
|
+
`You now need to update your page router:`,
|
|
265
|
+
``,
|
|
266
|
+
`${chalk.bold(
|
|
267
|
+
pathJoin(
|
|
268
|
+
'.',
|
|
269
|
+
pathRelative(process.cwd(), buildContext.themeSrcDirPath),
|
|
270
|
+
themeType,
|
|
271
|
+
'KcPage.ts'
|
|
272
|
+
)
|
|
273
|
+
)}:`,
|
|
274
|
+
chalk.grey('```'),
|
|
275
|
+
`// ...`,
|
|
276
|
+
``,
|
|
277
|
+
...[
|
|
278
|
+
` export async function getKcPage(pageId: KcContext['pageId']): Promise<KcPage> {`,
|
|
279
|
+
` switch (pageId) {`,
|
|
280
|
+
`+ case '${pageId}':`,
|
|
281
|
+
`+ return {`,
|
|
282
|
+
`+ PageComponent: (await import('./${componentDirRelativeToThemeTypePath.split(pathSep).join('/')}')).${kebabCaseToCamelCase(capitalize(pageId).replace(/\.ftl$/, ''))}Component,`,
|
|
283
|
+
`+ TemplateComponent,`,
|
|
284
|
+
...(themeType === 'login' ? [`+ doMakeUserConfirmPassword,`] : []),
|
|
285
|
+
`+ doUseDefaultCss,`,
|
|
286
|
+
`+ classes,`,
|
|
287
|
+
`+ };`,
|
|
288
|
+
` //...`,
|
|
289
|
+
` default:`,
|
|
290
|
+
` return {`,
|
|
291
|
+
` PageComponent: await getDefaultPageComponent(pageId),`,
|
|
292
|
+
` TemplateComponent,`,
|
|
293
|
+
...(themeType === 'login' ? [` doMakeUserConfirmPassword,`] : []),
|
|
294
|
+
` doUseDefaultCss,`,
|
|
295
|
+
` classes,`,
|
|
296
|
+
` };`,
|
|
297
|
+
` }`,
|
|
298
|
+
` }`
|
|
299
|
+
].map(line => {
|
|
300
|
+
if (line.startsWith('+')) {
|
|
301
|
+
return chalk.green(line);
|
|
302
|
+
}
|
|
303
|
+
if (line.startsWith('-')) {
|
|
304
|
+
return chalk.red(line);
|
|
305
|
+
}
|
|
306
|
+
return chalk.grey(line);
|
|
307
|
+
}),
|
|
308
|
+
chalk.grey('```')
|
|
309
|
+
].join('\n')
|
|
310
|
+
);
|
|
311
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExtendKcContext } from 'keycloakify/account';
|
|
2
|
+
import type { KcEnvName, ThemeName } from '../kc.gen';
|
|
3
|
+
|
|
4
|
+
export type KcContextExtension = {
|
|
5
|
+
themeName: ThemeName;
|
|
6
|
+
properties: Record<KcEnvName, string> & {};
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type KcContextExtensionPerPage = Record<string, Record<string, unknown>>;
|
|
10
|
+
|
|
11
|
+
export type KcContext = ExtendKcContext<KcContextExtension, KcContextExtensionPerPage>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createGetKcContextMock } from 'keycloakify/account/KcContext';
|
|
2
|
+
import { kcEnvDefaults, themeNames } from '../kc.gen';
|
|
3
|
+
import type { KcContextExtension, KcContextExtensionPerPage } from './KcContext';
|
|
4
|
+
|
|
5
|
+
const kcContextExtension: KcContextExtension = {
|
|
6
|
+
themeName: themeNames[0],
|
|
7
|
+
properties: {
|
|
8
|
+
...kcEnvDefaults
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const kcContextExtensionPerPage: KcContextExtensionPerPage = {};
|
|
12
|
+
|
|
13
|
+
export const { getKcContextMock } = createGetKcContextMock({
|
|
14
|
+
kcContextExtension,
|
|
15
|
+
kcContextExtensionPerPage,
|
|
16
|
+
overrides: {},
|
|
17
|
+
overridesPerPage: {}
|
|
18
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getDefaultPageComponent, type KcPage } from '@keycloakify/angular/account';
|
|
2
|
+
import { TemplateComponent } from '@keycloakify/angular/account/containers/template';
|
|
3
|
+
import type { ClassKey } from 'keycloakify/account';
|
|
4
|
+
import type { KcContext } from './KcContext';
|
|
5
|
+
|
|
6
|
+
const classes = {} satisfies { [key in ClassKey]?: string };
|
|
7
|
+
const doUseDefaultCss = true;
|
|
8
|
+
|
|
9
|
+
export async function getKcPage(pageId: KcContext['pageId']): Promise<KcPage> {
|
|
10
|
+
switch (pageId) {
|
|
11
|
+
default:
|
|
12
|
+
return {
|
|
13
|
+
PageComponent: await getDefaultPageComponent(pageId),
|
|
14
|
+
TemplateComponent,
|
|
15
|
+
doUseDefaultCss,
|
|
16
|
+
classes
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { i18nBuilder } from '@keycloakify/angular/account';
|
|
2
|
+
import { ThemeName } from '../kc.gen';
|
|
3
|
+
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5
|
+
const { getI18n, ofTypeI18n } = i18nBuilder
|
|
6
|
+
.withThemeName<ThemeName>()
|
|
7
|
+
.withExtraLanguages({}) // See: https://docs.keycloakify.dev/i18n/adding-support-for-extra-languages
|
|
8
|
+
.withCustomTranslations({}) // See: https://docs.keycloakify.dev/i18n/adding-new-translation-messages-or-changing-the-default-ones
|
|
9
|
+
.build();
|
|
10
|
+
type I18n = typeof ofTypeI18n;
|
|
11
|
+
export { getI18n, type I18n };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { BuildContext } from '../core';
|
|
2
|
+
import child_process from 'child_process';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { join as pathJoin, relative as pathRelative } from 'path';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import { updateAccountThemeImplementationInConfig } from './updateAccountThemeImplementationInConfig';
|
|
7
|
+
import { command as updateKcGenCommand } from '../update-kc-gen';
|
|
8
|
+
import { getThisCodebaseRootDirPath } from '../tools/getThisCodebaseRootDirPath';
|
|
9
|
+
|
|
10
|
+
export async function command(params: { buildContext: BuildContext }) {
|
|
11
|
+
const { buildContext } = params;
|
|
12
|
+
|
|
13
|
+
const accountThemeSrcDirPath = pathJoin(buildContext.themeSrcDirPath, 'account');
|
|
14
|
+
|
|
15
|
+
if (
|
|
16
|
+
fs.existsSync(accountThemeSrcDirPath) &&
|
|
17
|
+
fs.readdirSync(accountThemeSrcDirPath).length > 0
|
|
18
|
+
) {
|
|
19
|
+
console.warn(
|
|
20
|
+
chalk.red(
|
|
21
|
+
`There is already a ${pathRelative(
|
|
22
|
+
process.cwd(),
|
|
23
|
+
accountThemeSrcDirPath
|
|
24
|
+
)} directory in your project. Aborting.`
|
|
25
|
+
)
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
process.exit(-1);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exit_if_uncommitted_changes: {
|
|
32
|
+
let hasUncommittedChanges: boolean | undefined = undefined;
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
hasUncommittedChanges =
|
|
36
|
+
child_process
|
|
37
|
+
.execSync(`git status --porcelain`, {
|
|
38
|
+
cwd: buildContext.projectDirPath
|
|
39
|
+
})
|
|
40
|
+
.toString()
|
|
41
|
+
.trim() !== '';
|
|
42
|
+
} catch {
|
|
43
|
+
// Probably not a git repository
|
|
44
|
+
break exit_if_uncommitted_changes;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!hasUncommittedChanges) {
|
|
48
|
+
break exit_if_uncommitted_changes;
|
|
49
|
+
}
|
|
50
|
+
console.warn(
|
|
51
|
+
[
|
|
52
|
+
chalk.red(
|
|
53
|
+
'Please commit or stash your changes before running this command.\n'
|
|
54
|
+
),
|
|
55
|
+
"This command will modify your project's files so it's better to have a clean working directory",
|
|
56
|
+
'so that you can easily see what has been changed and revert if needed.'
|
|
57
|
+
].join(' ')
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
process.exit(-1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const accountThemeType = 'Multi-Page';
|
|
64
|
+
|
|
65
|
+
fs.cpSync(
|
|
66
|
+
pathJoin(
|
|
67
|
+
getThisCodebaseRootDirPath(),
|
|
68
|
+
'src',
|
|
69
|
+
'bin',
|
|
70
|
+
'initialize-account-theme',
|
|
71
|
+
'boilerplate'
|
|
72
|
+
),
|
|
73
|
+
accountThemeSrcDirPath,
|
|
74
|
+
{ recursive: true }
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
updateAccountThemeImplementationInConfig({ buildContext, accountThemeType });
|
|
78
|
+
|
|
79
|
+
updateKcGenCommand({
|
|
80
|
+
buildContext: {
|
|
81
|
+
...buildContext,
|
|
82
|
+
implementedThemeTypes: {
|
|
83
|
+
...buildContext.implementedThemeTypes,
|
|
84
|
+
account: {
|
|
85
|
+
isImplemented: true,
|
|
86
|
+
type: accountThemeType
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
console.log(
|
|
93
|
+
[
|
|
94
|
+
chalk.green(`The ${accountThemeType} account theme has been initialized.`),
|
|
95
|
+
`Directory created: ${chalk.bold(pathRelative(process.cwd(), accountThemeSrcDirPath))}`
|
|
96
|
+
].join('\n')
|
|
97
|
+
);
|
|
98
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { join as pathJoin } from 'path';
|
|
2
|
+
import { assert, type Equals } from 'tsafe/assert';
|
|
3
|
+
import type { BuildContext } from '../core';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { id } from 'tsafe/id';
|
|
8
|
+
|
|
9
|
+
export type BuildContextLike = {
|
|
10
|
+
bundler: BuildContext['bundler'];
|
|
11
|
+
projectDirPath: string;
|
|
12
|
+
packageJsonFilePath: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
assert<BuildContext extends BuildContextLike ? true : false>();
|
|
16
|
+
|
|
17
|
+
export function updateAccountThemeImplementationInConfig(params: {
|
|
18
|
+
buildContext: BuildContext;
|
|
19
|
+
accountThemeType: 'Multi-Page';
|
|
20
|
+
}) {
|
|
21
|
+
const { buildContext, accountThemeType } = params;
|
|
22
|
+
|
|
23
|
+
switch (buildContext.bundler) {
|
|
24
|
+
case 'vite':
|
|
25
|
+
{
|
|
26
|
+
const viteConfigPath = pathJoin(
|
|
27
|
+
buildContext.projectDirPath,
|
|
28
|
+
'vite.config.ts'
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
if (!fs.existsSync(viteConfigPath)) {
|
|
32
|
+
console.log(
|
|
33
|
+
chalk.bold(
|
|
34
|
+
`You must manually set the accountThemeImplementation to "${accountThemeType}" in your vite config`
|
|
35
|
+
)
|
|
36
|
+
);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const viteConfigContent = fs
|
|
41
|
+
.readFileSync(viteConfigPath)
|
|
42
|
+
.toString('utf8');
|
|
43
|
+
|
|
44
|
+
const modifiedViteConfigContent = viteConfigContent.replace(
|
|
45
|
+
/["']?accountThemeImplementation["']?\s*:\s*["']none["']/,
|
|
46
|
+
`accountThemeImplementation: '${accountThemeType}'`
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (modifiedViteConfigContent === viteConfigContent) {
|
|
50
|
+
console.log(
|
|
51
|
+
chalk.yellow(
|
|
52
|
+
`You must manually set the accountThemeImplementation to "${accountThemeType}" in your vite.config.ts`
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
fs.writeFileSync(viteConfigPath, modifiedViteConfigContent);
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
case 'webpack':
|
|
62
|
+
{
|
|
63
|
+
const parsedPackageJson = (() => {
|
|
64
|
+
type ParsedPackageJson = {
|
|
65
|
+
keycloakify: Record<string, unknown>;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const zParsedPackageJson = (() => {
|
|
69
|
+
type TargetType = ParsedPackageJson;
|
|
70
|
+
|
|
71
|
+
const zTargetType = z.object({
|
|
72
|
+
keycloakify: z.record(z.unknown())
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
|
|
76
|
+
|
|
77
|
+
return id<z.ZodType<TargetType>>(zTargetType);
|
|
78
|
+
})();
|
|
79
|
+
|
|
80
|
+
const parsedPackageJson = JSON.parse(
|
|
81
|
+
fs.readFileSync(buildContext.packageJsonFilePath).toString('utf8')
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
zParsedPackageJson.parse(parsedPackageJson);
|
|
85
|
+
|
|
86
|
+
return parsedPackageJson;
|
|
87
|
+
})();
|
|
88
|
+
|
|
89
|
+
parsedPackageJson.keycloakify.accountThemeImplementation =
|
|
90
|
+
accountThemeType;
|
|
91
|
+
|
|
92
|
+
fs.writeFileSync(
|
|
93
|
+
buildContext.packageJsonFilePath,
|
|
94
|
+
Buffer.from(JSON.stringify(parsedPackageJson, undefined, 4), 'utf8')
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/bin/main.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { readParams, NOT_IMPLEMENTED_EXIT_CODE } from './core';
|
|
4
|
+
|
|
5
|
+
const { buildContext, commandName } = readParams({ apiVersion: 'v1' });
|
|
6
|
+
|
|
7
|
+
(async () => {
|
|
8
|
+
switch (commandName) {
|
|
9
|
+
case 'add-story':
|
|
10
|
+
{
|
|
11
|
+
console.log(
|
|
12
|
+
"Not yet supported by @keycloakify/angular, we're working on it!"
|
|
13
|
+
);
|
|
14
|
+
process.exit(-1);
|
|
15
|
+
}
|
|
16
|
+
return;
|
|
17
|
+
case 'eject-page':
|
|
18
|
+
{
|
|
19
|
+
const { command } = await import('./eject-page');
|
|
20
|
+
command({ buildContext });
|
|
21
|
+
}
|
|
22
|
+
return;
|
|
23
|
+
case 'update-kc-gen':
|
|
24
|
+
{
|
|
25
|
+
const { command } = await import('./update-kc-gen');
|
|
26
|
+
command({ buildContext });
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
case 'initialize-account-theme':
|
|
30
|
+
{
|
|
31
|
+
const { command } = await import('./initialize-account-theme');
|
|
32
|
+
command({ buildContext });
|
|
33
|
+
}
|
|
34
|
+
return;
|
|
35
|
+
default:
|
|
36
|
+
process.exit(NOT_IMPLEMENTED_EXIT_CODE);
|
|
37
|
+
}
|
|
38
|
+
})();
|